很多地方都强制要求你停止使用Telnet连接到系统,而使用SSH。其理由是更大的安全性。当你使用Telnet登录时,你的密码以及任何其他数据都会以清晰的文本发送。任何有网络分析仪的人都可以读取你发送的内容。而SSH则是将所有数据加密,使其无法读取。假设Telnet和SSH守护进程呈现出一种可互换的用户体验;这是不正确的。
首先,有许多不同的SSH和Telnet客户端。这些客户端有不同的用户界面,可能使用不同的终端类型。即使使用相同的终端类型,它们也可能表现不同,因为它们是在模拟终端,而模拟并不完美。但是,即使不考虑客户端软件的差异,连接到Telnet守护进程(telnetd或telnet_msd)的会话和连接到SSH守护进程的会话之间也有一些细微和不细微的差异。还有一些错误,我将会介绍这些错误。请记住,我使用的是Internet Security Pack (ISP)2.1.0k版本的SSH守护进程。这是我写这篇文章时的最新版本。
用户名称:
在你登录之前,Telnet和SSH处理你的用户名的方式是不同的。Telnet守护进程将允许你用你的用户名的任何独特的变化来登录,而且这个名字是不区分大小写的。给定用户名Noah_Davids,当使用Telnet时,我可以以Noah_D、noah_d、NoAh_D或NoAh_DaViDs的身份登录,但在SSH中唯一能用的是Noah_Davids。我的nd的别名也是这样的。在Telnet中,我可以使用nd、ND或nD,但在SSH中只有nd能用。
集团名称:
Telnet连接时出现的登录提示允许我指定一个 组名
telnet 164.152.77.217 试图... 连接到164.152.77.217。 转义字符是"^]"。 OpenVOS 17.1.0ax版本,模块%phx_vos#m17。 请登录 15:24:14 登录 nd。SysAdmin 密码?[在此输入密码] Noah_Davids.SysAdmin于12-12-12 15:24:55 mst.登录%phx_vos#m17。 |
图1 - 使用组名Telnet登录 |
但SSH协议只允许输入用户名。如果我加入组名,它将被视为用户名的一部分,登录失败。
>system>openssl>bin>ssh [email protected] [email protected]的密码:[在此输入密码]SysAdmin@164.152.77.217的密码:[在此输入密码] 。 权限拒绝,请重试。 [email protected]'s password: |
图2 - 用组名登录SSH |
一旦你登录,你可以用一个子登录来改变你的组(但请看下面关于ssl-403的部分,以了解当前的限制)。
密码差异。
Telnet和SSH连接在密码处理上最大的区别是,SSH不需要密码来进行验证。你可以设置一个公钥/私钥对,跳过整个密码输入步骤。关于如何设置,请看Setting upStratus STCP SSH to use public key authentication的说明。
如果你使用的是密码,就必须要处理一些不同的问题。首先,密码过期的处理方式不同。使用Telnet,当你的密码即将过期时,登录提示会警告你,并允许你更改密码。
telnet 164.152.77.217
试图...
连接到164.152.77.217。
转义字符是"^]"。
OpenVOS 17.1.0ax版本,模块%phx_vos#m17。
请登录 14:04:40
登录 nd
密码?[此处输入当前密码]
您的密码将在5天后失效。
新密码(第一次输入)?
|
图3 - Telnet连接密码到期警告/提示 |
SSH会警告你,但你没有选择更改密码。你必须使用change_password命令使你的密码无效,这将迫使你在下次登录时更改密码。
ssh [email protected] [email protected]的密码:[此处输入当前密码] 您的密码将在5天后失效。 Noah_Davids.CAC于13-01-09 13:06:35 mdt登录%phx_vos#m17。 欢迎你的到来 准备好了 13: 06: 35 更改密码 您的密码不再有效。您必须在下次登录时更改密码。 准备就绪 13:06:49 |
图4 - SSH连接密码到期警告 和change_password命令 |
一旦你的密码过期(或者你用change_password命令使其无效),你会被提示更改密码。与Telnet不同的是,这并不是可有可无的,你必须在此时更改你的密码。更改密码后,你会自动注销,必须重新登录。
ssh [email protected] [email protected] 的密码。 警告:您的密码已过期。 您必须立即更改密码并重新登录! 当前密码?[此处输入当前密码] 新密码(第一次输入)?[在此输入新密码] 新密码(第二次输入)?[在此输入新密码] 164.152.77.217的连接已关闭。 |
图5 - 在SSH连接期间更改密码 |
另一个区别是,SSH连接不支持挑战-响应密码,而Telnet连接支持。
子系统:
当您第一次用Telnet连接到一个模块时,登录命令允许您选择一个新的模块。 子系统
OpenVOS版本17.1.0ax,模块%phx_vos#m17。
请登录 11:23:40
登录 -表格 -使用
--------------------------------- login -------------------------------
user_name:
-privileged: as registered
-password:
-password: -change_password: no
-优先级: -home_dir:
-home_dir:
-module:
-子系统。
|
图6 - Telnet连接允许你指定一个子系统名称 |
ssh协议没有指定子系统名称的机制。如果在注册数据库条目中设置了must_use_subsystem标志,那么就会自动使用注册条目中指定的第一个子系统。如果该位没有设置,则不使用子系统。(请注意,在ISP 2.1.0j发布之前,即使没有设置must_use_subsystem位,第一个子系统也会被使用。)虽然在实际登录前,登录命令的参数中包含了指定子系统的方法(见图6),但一旦你登录后,该选项就不再可用了(见图7)。
登录 -表格 -使用 --------------------------------- login ------------------------------- 集团名称:CAC -特权:是 -优先级: -密码: -模块: |
图7 - 子登录命令行参数 |
登录后进入子系统的唯一方法是Telnet回系统,再登录。
telnet 127.0.0.1 正在尝试... 连接到127.0.0.1。 转义字符是'^]'。 OpenVOS 17.1.0ax版本,模块%phx_vos#m17。 请登录 11:37:34 登录 nd -subsystem test_ss 密码? Noah_Davids.CAC于12-12-13 11:37:49 mst登录%phx_vos#m17。 这是测试子系统 11:37:49 |
图8 - Telnet到环回地址,再登录进入子系统。 |
访问控制;
Telnet和SSH连接都支持TCP Wrappers,允许你根据IP地址限制访问,但是Telnet守护进程的默认情况是不启用TCP Wrappers,你必须使用-tcpwrapper_check控制参数明确启用它。而在SSH守护进程中,TCP Wrappers是默认启用的,没有办法禁用它。你可以通过在TCP Wrappers hosts.allow配置文件中允许所有SSH连接来有效地禁用它。
telnetd -form -usage
------------------------------- telnetd ------------------------------
-service_file。 服务文件: >system>stcp>telnetservice。
-tcpwrapper_check: no
-数字:是
|
图9 - 在telnetd守护进程中启用TCP封装器 |
telnet_msd -form -usage
------------------------------ telnet_msd ----------------------------
-network_port: 24
-max_sessions。 28
-误差严重程度:2
-separate_log: yes
-log_dir: >system>stcp>logs。
-vterm_starname: telnet*。
-vterm_login: yes
-vterm_slave_id:
-extension: 133
-force_edit: yes
-EC_十进制值:8
-EL_decimal_value: 21。
-tcpwrapper_check: no
-数字:无
|
图10 - 在telnet_msd守护进程中启用TCP Wrappers。 |
sshd守护进程也支持sshd_config文件中的选项,允许你指定允许使用ssh访问的用户或组(AllowUsers和AllowGroups指令)或拒绝使用ssh访问的用户或组(DenyUsers和DenyGroups指令)。这些指令允许你指定用户名,或源域或组合。可以允许从corp.stratus.com访问noah_davids,但拒绝从az.stratus.com访问。
AllowUsers *@*.stratus.com DenyUsers *@*az.stratus.com |
图11 - sshd_config中的AllowUsers和DenyUsers指令示例。 |
>system>openssl>bin>ssh [email protected] [email protected] 的密码。 允许被拒绝,请重试。 [email protected] 的密码。 |
图12 - 由于DenyUsers指令,从phxtest-m15.az.stratus.com登录被拒绝。 |
命令环境。
一旦登录Telnet连接,就会呈现出标准的VOS命令环境。SSH允许管理员指定标准命令环境或bash shell环境。这是根据端口号来完成的。
d sshservices %phx_vos#m17_mas>opt>openssl>etc>sshservices 12-12-13 12:31:31 mst ssh "window_term" "" "login" 1 1 s$pt_log.m16 ssh2200 "window_term" "-壳" "bash" 1 1 s$pt_log.m16 |
图13 - sshservices文件,22端口是标准的VOS命令行。 2200端口是bash shell |
>system>openssl>bin>ssh [email protected] -p 2200 [email protected] 的密码。 欢迎你的到来 Sh-2.05美元 |
图14 - 使用2200端口连接SSH并获取bash shell |
环境变量。
默认情况下,Telnet连接只设置了6个环境变量,而SSH连接则设置了12个。
环境 HOME=/SYSAdmin/Noah_Davids LOGNAME=root PATH=.:/system/command_library:/system/applications_library:/system/maint_librar。 +y:/system/nio/command_library:/system/tools_library:/opt/apache/bin:/opt/libxml。 +2/bin:/opt/php/bin:/opt/openssl/bin:/opt/mysql/bin:/system/stcp/command_library。 +:/system.17.1/gnu_library/bin VOS_INCLUDE_PATH=.:/opt/apache/include:/opt/openssl/include:/opt/mysql/include/m。 +ysql:/system/stcp/include_library/compat:/system/include_library。 VOS_OBJECT_PATH=.:/opt/apache/lib:/opt/openssl/lib:/opt/mysql/lib/mysql:/system/。 +stcp/object_library/complib:/system/posix_object_library/thread:/system/posix_object_library。 +object_library:/system/c_object_library:/system/object_library。 TERM=vt100 |
图15 - Telnet连接中设置的环境变量 |
环境 HOME=/SYSAdmin/Noah_Davids PATH=.:/system/command_library:/system/applications_library:/system/maint_librar。 +y:/system/nio/command_library:/system/tools_library:/opt/apache/bin:/opt/libxml。 +2/bin:/opt/php/bin:/opt/openssl/bin:/opt/mysql/bin:/system/stcp/command_library。 +:/system.17.1/gnu_library/bin VOS_INCLUDE_PATH=.:/opt/apache/include:/opt/openssl/include:/opt/mysql/include/m。 +ysql:/system/stcp/include_library/compat:/system/include_library。 VOS_OBJECT_PATH=.:/opt/apache/lib:/opt/openssl/lib:/opt/mysql/lib/mysql:/system/。 +stcp/object_library/complib:/system/posix_object_library/thread:/system/posix_object_library。 +object_library:/system/c_object_library:/system/object_library。 TERM=vt100 TZ=mst+07:00:00 USER=Noah_Davids LOGNAME=Noah_Davids(诺亚) MAIL=/var/spool/mail/Noah_Davids。 SHELL=/bin/sh SSH_CONNECTION=164.152.77.34 49573 164.152.77.217 22。 SSH_TTY=#s$pt_log.m16_3 |
图16 - 在SSH连接中设置的环境变量 |
设备类型:
最后,这其实不是Telnet和SSH的区别,而是telnetd和sshd守护进程和telnet_msd守护进程的区别。telnetd和sshd都使用window_term设备,而telnet_msd使用vterm设备。vterms和window_term设备在处理命令行中的一些功能键(如cancel)和处理原始屏幕输出的方式上有一些不同。一些创建了自己的窗体并且没有更新为使用新的s$control OP_CODES的应用程序在使用window_term设备时不能正确地呈现这些窗体。处理这些应用程序的第二种最好的方法是使用SSH隧道连接到系统,然后将隧道配置为连接到telnet_msd守护进程。当然,处理应用程序的最好方法是更新它,使其使用新的OP_CODES。
除了以上Telnet和SSH固有的差异外,还有一些bug会在未来的版本中修复。
ssl-403可用组。
当使用Telnet连接时,所有在你的注册条目中指定的组都可用于子登录,但使用ssh时只有前5个组可用。
鉴于我注册的组,CAC,SysAdmin,Group_3,Group_4,Group_5,Group_6。我可以通过Telnet连接使用任何一个组进行子登录。
telnet 164.152.77.217 试图... 连接到164.152.77.217。 转义字符是"^]"。 OpenVOS 17.1.0ax版本,模块%phx_vos#m17。 请登录 15:38:02 登录 nd 密码?[此处输入当前密码] Noah_Davids.CAC于12-12-12 15:38:08 mst登录%phx_vos#m17。 登录组_5 Noah_Davids.Group_5 于 12-12-12 15:39:39 mst.登录 %phx_vos#m17。 准备就绪 15:39:39 登出 登录组_6 Noah_Davids.Group_6 于 12-12-12 15:40:13 mst.登录 %phx_vos#m17。 准备就绪 15:40:13 |
图17 - 使用Telnet连接的子登录。 |
然而,在使用ssh时,当我尝试使用Group_6时,我得到一个错误。
>system>openssl>bin>ssh [email protected] [email protected] 的密码。 Noah_Davids.CAC于12-12-12 15:41:02 mst.登录%phx_vos#m17。 准备就绪 15:41:02 登录组_5 Noah_Davids.Group_5 于 12-12-12 15:41:24 mst.登录 %phx_vos#m17。 准备就绪 15:41:24 登出 登录组_6 登录。参数中的无效格式。group_name不允许使用group_6。 准备 15:41:59 |
图18 - 使用SSH连接的子登录。 |
ssl-418 - 子进程级。
通过Telnet登录的子进程级别为0,而通过SSH登录的子进程级别为3。
telnet 164.152.77.217
试图...
连接到164.152.77.217。
转义字符是"^]"。
OpenVOS 17.1.0ax版本,模块%phx_vos#m17。
请登录 14:15:34
登录 nd
密码?[此处输入当前密码]
Noah_Davids.CAC于12-12-13 14:15:39 mst.登录%phx_vos#m17。
准备就绪 14:15:39
display_line (process_info sub_process_level)
0
准备好了 14: 15: 49
|
图19 - Telnet连接中设置的子进程级别 |
>system>openssl>bin>ssh [email protected] [email protected] 的密码:[此处输入当前密码] Noah_Davids.CAC于12-12-13 14:12:23 mst.登录%phx_vos#m17。 准备就绪 14:12:23 display_line (process_info sub_process_level) 3 准备好了 14: 12: 37 |
图20 - SSH连接中设置的子进程级别 |
2013年1月14日更新。结果发现这是一个功能,而不是一个错误。当start_process启动监听进程时,sshd进程第一次被分叉,第二次是在sshd接受连接时,第三次是在创建用户登录进程时。Telnet使用不同的机制来启动用户进程,不会导致任何分叉进程。
时区问题。
最后我想说的是,在夏令时和标准时间之间的改变,或者更普遍的只是改变时区时,出现了一些相关问题。通过SSH登录的会话不能反映新的默认值。这些问题应该在最新的版本(2.1.0k)中都得到了解决。