译自Fedora 17文档System Administrator's Guide中的OpenSSH一节。
目录
1 前言
SSH(安全Shell,Secure Shell)是一个使用客户/服务器架构,实现两个系统间安全通信的协议,它允许用户远程登录服务器主机系统。和FTP或Telnet等其他远程通信协议不同,SSH会把登录会话加密,让入侵者难以收集未加密的密码。
ssh这个程序被设计用来取代老旧的、较不安全的用来登录远端主机的终端程序,如telnet或rsh。一个相关的叫做scp的程序取代了原有的在主机间拷贝文件的程序如rcp。由于这些陈旧的程序不会加密客户端和主机间传输的密码,尽可能不要使用它们。用安全的手段登录远端系统可以同时降低客户端系统和远端主机所面临的风险。
Fedora包含公共OpenSSH软件包(openssh)、OpenSSH服务器(openssh-server)以及客户端(openssh-clients)软件包。OpenSSH软件包需要用到OpenSSL软件包(openssl)。OpenSSL软件包会安装一些重要的用来加密的库文件,以便OpenSSH可以实现通信加密。
2 SSH协议
2.1 为什么使用SSH
潜在的入侵者有着可自由支配的多种工具,用来中断、拦截以及重定向网络通信,以便获取系统访问权限。笼统地说,这些威胁可以这样分类:
拦截两个系统间的通信
攻击者可在通信者之间的某个网络上,拷贝所有在他们之间传递的信息。他可以拦截并保存信息,或者修改并把信息发给目标接收者。
攻击通常是用数据包嗅探器(packet sniffer)进行的。数据包嗅探器是相当常见的工具,用来捕获通过网络的每个软件包,并分析其内容。
伪装成特定主机
攻击者的系统可以冒充为某个网络传输的目标接收者。如果这个策略起作用了,用户的系统会无法发现自己其实是在与一个错误的主机通信。
这种攻击可以使用DNS毒害(DNS poisoning)这一技术,或IP欺骗(IP spoofing)实现。在第一种方式中,入侵者用一台已攻破的DNS服务器,使客户端系统指向一台复制出的恶意主机。在第二种方式中,入侵者发送看起来像是从可信任主机发出的,其实是被篡改的数据包。
两种技术都可以拦截敏感信息。如果拦截是出于恶意,其后果可能是灾难性的。如果SSH被用来远端shell登录和拷贝文件,可以极大减小这些安全威胁。这是由于SSH客户端和服务器使用数字签名来验证它们的身份。此外客户端和服务器间的所有通信都是加密的。对任何一边进行身份欺骗的尝试都是没有作用的,因为每个数据包都是用只有本地和远端系统才知道的密钥加密的。
2.2 主要特性
SSH协议提供下述安全保护:
没有人可以冒充他是目标服务器
初始连接发生之后,客户端可以验证它现在连接的先前连接的是同一台服务器。
没有人可以获取鉴定(authentication)信息
客户端使用128位强加密手段加密发送到服务器的鉴定信息。
没有人可以拦截通信
会话中发送和接收的信息都使用128位加密手段加密,使得拦截到的数据极难解密及阅读。
此外,它还提供以下选项:
以加密的方式访问网络上的图形应用程序
使用X11转发(X11 forwarding)技术,客户端可以从服务器转发X11(X窗口系统,X Window System)应用程序。
以某种方式保护不安全的协议
SSH协议可以加密它发送和接受的任何数据。使用端口转发(port forwarding)技术,SSH服务器可以称为保护其他不安全协议(例如POP)的管道,从而增加系统和数据的整体安全性。
可用来创建安全通道(channel)
OpenSSH服务器和客户端可设置用来创建一个类似于虚拟私有网络(virtual private network)的隧道(tunnel),用来在服务器和客户端机器间传递数据。
支持Kerberos鉴定
OpenSSH服务器和客户端可设置使用Kerberos网络鉴定协议的GSSAPI(通用安全服务应用程序接口,Generic Security Services Application Program Interface)实现进行身份鉴定。
2.3 协议版本
目前存在SSH的两个变体:第一版和更新的第二版。Fedora的OpenSSH软件套装使用SSH第二版协议。第二版协议有加强的密钥交换算法,改进了第一版所有已知的易受攻击的弱点。不过,为了保持兼容,OpenSSH套件也支持使用第一版协议进行连接。
为了最大程度上确保连接的安全性,建议尽可能只使用兼容SSH第二版协议的服务器和客户端。
2.4 SSH连接的事件顺序
下面一系列的事件用来保护两台主机间SSH通信的完整性。
- 产生一个加密握手,让客户端可以验证他是和正确的服务器通信。
- 客户端和远端主机间网络连接的传输层使用对称密码加密。
- 客户端向服务器鉴定它自己。
- 远端客户端和远端主机使用加密连接交互。
2.4.1 传输层
传输层的主要角色就是为两台主机的鉴定以及后续的通信提供安全的通信手段。传输层通过处理数据的加密解密、提供数据包的完整性保护来达到这一目的。传输层还可以压缩数据,加速信息传递。
一旦SSH客户端开始连接一台服务器,密钥信息就会交换,这样这两个系统间就能正确地创建传输层。下面是在这个交换过程中发生的步骤:
- 密钥被交换
- 决定公钥和加密算法
- 决定对称加密算法
- 决定信息鉴定算法
- 决定散列(hash)算法
在密钥交换过程中,服务器使用一个唯一的主机密钥(host key)向客户端确定自己的身份。如果客户端以前从没与这个服务器通信过,且不知道这个服务器的主机密钥,则不会进行连接。OpenSSH通过接受服务器的主机密钥来解决这个问题。在用户被告知且接受并验证了这个新的主机密钥之后,连接就可以建立。在以后的连接中,客户端会对比检查服务器的主机密钥和它自己保存的版本,确人客户端的确是在同想要联系的那台服务器通信。如果将来主机密钥不在匹配,用户在链接前必须要删掉自己保存的那个版本。
在最初的连接过程中,因为本地系统不知道目的服务器和攻击者建立的错误服务器的区别,攻击者可以伪装成一个SSH服务器。为了阻止其发生,请在第一次连接前,或服务器主机密钥不匹配的情况发生的时候,联系服务器管理员来验证SSH服务器的完整性。
SSH几乎可以使用任意一种公钥算法或编码格式。初始的密钥交换会建立用来交换信息的散列值以及一个共享的保密值。在这之后,两个系统会立即开始计算新的密钥和算法来保护鉴定过程和将要传输的数据。
当使用一个密钥和算法传输了一定量的数据(精确的数据量取决于具体的SSH实现)之后,会发生另一个密钥交换,生成另外的一套散列值和新的共享保密值。即使攻击者可以确定散列值和共享保密值,这些信息也只在有限的时间段内起作用。
2.4.2 鉴定
一旦传输层建立了在两系统间传递信息的安全隧道,服务器会告诉客户端它支持的不同的鉴定方式,例如使用私钥编码的签名,或输入一串密码。客户端接下来会尝试使用这些手段中的一种向服务器鉴定自己。
SSH服务器和客户端可设置允许使用不同种类的鉴定方式,这可以让每一端都有最佳的控制权。服务器可以根据自己的安全模型决定它所支持的加密手段,客户机可以从现有的选项中选择鉴定手段的尝试顺序。
2.4.3 通道
通过SSH传输层鉴定成功后,会使用复用(multiplexing。复用连接由共享的公用媒介上传输的一些信号组成。对SSH来说,不同的通道是通过一个公用的加密连接发送的。)技术打开多个通道。每一个通道处理不同终端的会话通信,或者用来转发X11会话。
客户端和服务器都可以建立新的通道。每个通道的连接两端都会被分配一个不同的编号。当客户端试图打开一个新通道的时候,会把通道编号连同打开通道的请求一起发给服务器。服务器会存储并使用这些信息把通信指向这个通道。这样一来,不同类型的会话不会互相影响,当一个会话结束的时候,它的通道也能在不打扰主SSH连接的情况下关闭。
通道还支持流量控制(flow-control),这样可保证发送和接收数据时的秩序。只有在客户端收到通道已打开的消息之后,信息才会在通道上传递。
客户端和服务器会根据客户端所请求的服务类型以及用户连接到网络的方式自动协商每一个通道的特征。这可在不改变协议基础架构的基础上提供处理不同远程连接类型的强大便利性。
3 布置一个OpenSSH
为了执行这一节描述的内容,你必须拥有超级用户权限。可通登录root用户获取此权限:
su -
3.1 配置文件
有两套不同的配置文件:客户端程序的(ssh、scp和sftp),和服务器的(sshd守护程序)。
全局SSH配置信息储存在/etc/ssh/目录中。下表描述了它们的内容。
配置文件 | 描述 |
---|---|
/etc/ssh/moduli |
包含用来进行Diffie-Hellman密钥交换的Diffie-Hellman组,它对建立一个安全的传输层非常关键。在SSH会话一开始交换密钥之后,会建立一个不能由任一端单独决定的共享保密值。这个值用来提供主机鉴定。 |
/etc/ssh/ssh_config |
默认SSH客户端配置文件。注意如果~/.ssh/config 存在,它里面的设置会被覆盖掉。 |
/etc/ssh/sshd_config |
sshd 守护程序的配置文件。 |
/etc/ssh/ssh_host_dsa_key |
sshd 守护程序使用的DSA私钥。 |
/etc/ssh/ssh_host_dsa_key.pub |
sshd 守护程序使用的DSA公钥。 |
/etc/ssh/ssh_host_key |
sshd 守护程序第一版SSH协议使用的RSA私钥。 |
/etc/ssh/ssh_host_key.pub |
sshd 守护程序第一版SSH协议使用的RSA公钥。 |
/etc/ssh/ssh_host_rsa_key |
sshd 守护程序第二版SSH协议使用的RSA私钥。 |
/etc/ssh/ssh_host_rsa_key.pub |
sshd 守护程序第二版SSH协议使用的RSA公钥。 |
用户自己的SSH配置信息储存在家目录的~/.ssh/文件夹中。下表是这些配置文件的描述。
配置文件 | 描述 |
---|---|
~/.ssh/authorized_keys |
已验证服务器的公钥列表。客户端连接服务器的时候,服务器通过检查这个文件中存储的已签名公钥鉴定客户端。 |
~/.ssh/id_dsa |
包含用户的DSA私钥。 |
~/.ssh/id_dsa.pub |
用户的DSA公钥。 |
~/.ssh/id_rsa |
ssh 程序的第二版SSH协议使用的RSA私钥。 |
~/.ssh/id_rsa.pub |
ssh 程序的第二版SSH协议使用的RSA公钥。 |
~/.ssh/identity |
ssh 程序的第一版SSH协议使用的RSA私钥。 |
~/.ssh/identity.pub |
ssh 程序的第一版SSH协议使用的RSA公钥。 |
~/.ssh/known_hosts |
包含用户已访问SSH服务器的DSA主机密钥。这个文件非常重要,它确保SSH客户端连接的是正确的SSH服务器。 |
查看ssh_config和sshd_config的man page,获取SSH配置文件中每个指令的详细信息。
3.2 运行一个OpenSSH服务器
运行sshd守护程序,在shell输入以下命令:
systemctl start sshd.service
停止sshd守护程序,用到以下命令:
systemctl stop sshd.service
如果想在系统启动的时候自动运行守护程序,输入:
systemctl enable sshd.service
注意如果你重装系统,会创建一套新的身份鉴定密钥。如果重装系统前使用任何OpenSSH工具连接过这台服务器的客户端再次连接,会收到以下信息:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed.
重装系统前备份/etc/ssh/目录下相应的文件,重装系统后恢复,可以避免此问题。
3.3 要求远端连接使用SSH
为了让SSH真正起到作用,必须禁止不安全的连接协议。否则,在一个会话中使用SSH保护的用户密码,很可能在后来的telnet登录过程中被窃取。需要禁用的服务包括telnet、rsh、rlogin和vsftpd。
为确保这些服务没有运行,在shell提示符输入以下内容:
systemctl stop telnet.service systemctl stop rsh.service systemctl stop rlogin.service systemctl stop vsftpd.service
为防止服务器启动的时候运行这些服务,输入:
systemctl disable telnet.service systemctl disable rsh.service systemctl disable rlogin.service systemctl disable vsftpd.service
3.4 使用基于密钥的鉴定方式
为了更进一步改善系统安全性,你可以通过禁用密码鉴定的方式强制使用基于密钥的鉴定。为了做到这一点,需要编辑/etc/ssh/sshd_config配置文件,把PasswordAuthentication选项设置成下面的样子:
PasswordAuthentication no
为了能让客户端使用ssh,scp或sftp连接服务器,需要用下面步骤生成验证密钥对。注意每个用户的密钥对都需要单独生成。
Fedora 17默认使用SSH第二版协议以及RSA密钥对。
不要使用root用户生成密钥对。如果以root用户身份完成这些步骤,那么也只有root才能使用这些密钥。
备份你的~/.ssh/目录。如果你要重装系统但是想保留先前生成的密钥,请备份~/.ssh/目录。重装系统后,把它拷贝回你的家目录即可。这个过程对系统中的所有用户(包括root)适用。
3.4.1 生成密钥对
生成SSH第二版协议的RSA密钥对,遵循以下步骤:
- 在shell提示符输入以下命令生成RSA密钥对:
~]$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/john/.ssh/id_rsa):
- 按回车键确认新生成密钥的默认的位置(~/.ssh/id_rsa)。
- 输入一个密码,并在提示重新输入之后再输一次,以确认这个密码。为了安全起见,不要使用和账户登录相同的密码。在这之后,你会看到类似下面这样的信息:
Your identification has been saved in /home/john/.ssh/id_rsa. Your public key has been saved in /home/john/.ssh/id_rsa.pub. The key fingerprint is: e7:97:c7:e2:0e:f9:0e:fc:c4:d7:cb:e5:31:11:92:14 john@penguin.example.com The key's randomart image is: +--[ RSA 2048]----+ | E. | | . . | | o . | | . .| | S . . | | + o o ..| | * * +oo| | O +..=| | o* o.| +-----------------+
- 修改~/.ssh/目录的权限(这里建议设置的权限是700。如果sshd_config的StrictModes选项的值是“yes”,当此目录对其他用户可写时,sshd会拒绝进行登录认证——译者注):
~]$ chmod 755 ~/.ssh
- 把~/.ssh/id_rsa.pub的内容,拷贝到你想连接的那台机器上的~/.ssh/authorized_keys里面。如果里面已经有内容,附加在文件末尾即可。
- 修改~/.ssh/authorized_keys文件的权限(这里建议设置的权限是600。如果sshd_config的StrictModes选项的值是“yes”,当此文件对其他用户可写时,sshd会拒绝进行登录认证——译者注):
~]$ chmod 644 ~/.ssh/authorized_keys
为SSH第二版协议生成DSA密钥对,遵循以下步骤:
- 在shell提示符输入下面命令生成DSA密钥对:
~]$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/john/.ssh/id_dsa):
- 按回车键确认新生成密钥的默认位置(~/.ssh/id_dsa)。
- 输入一个密码,并在提示重新输入之后再输一次,以确认这个密码。为了安全起见,不要使用和账户登录相同的密码。在这之后,你会看到类似下面这样的信息:
Your identification has been saved in /home/john/.ssh/id_dsa. Your public key has been saved in /home/john/.ssh/id_dsa.pub. The key fingerprint is: 81:a1:91:a8:9f:e8:c5:66:0d:54:f5:90:cc:bc:cc:27 john@penguin.example.com The key's randomart image is: +--[ DSA 1024]----+ | .oo*o. | | ...o Bo | | .. . + o. | |. . E o | | o..o S | |. o= . | |. + | | . | | | +-----------------+
- 修改~/.ssh/目录的权限(这里建议设置的权限是700。如果sshd_config的StrictModes选项的值是“yes”,当此目录对其他用户可写时,sshd会拒绝进行登录认证——译者注):
~]$ chmod 755 ~/.ssh
- 把~/.ssh/id_dsa.pub的内容,拷贝到你想连接的那台机器上的~/.ssh/authorized_keys里面。如果里面已经有内容,附加在文件末尾即可。
- 修改~/.ssh/authorized_keys文件的权限(这里建议设置的权限是600。如果sshd_config的StrictModes选项的值是“yes”,当此文件对其他用户可写时,sshd会拒绝进行登录认证——译者注):
~]$ chmod 644 ~/.ssh/authorized_keys
为SSH第一版协议生成RSA密钥对,遵循以下步骤:
- 在shell提示符输入以下命令生成RSA密钥对:
~]$ ssh-keygen -t rsa1 Generating public/private rsa1 key pair. Enter file in which to save the key (/home/john/.ssh/identity):
- 按回车键确认新生成密钥的默认的位置(~/.ssh/identity)。
- 输入一个密码,并在提示重新输入之后再输一次,以确认这个密码。为了安全起见,不要使用和账户登录相同的密码。在这之后,你会看到类似下面这样的信息:
Your identification has been saved in /home/john/.ssh/identity. Your public key has been saved in /home/john/.ssh/identity.pub. The key fingerprint is: cb:f6:d5:cb:6e:5f:2b:28:ac:17:0c:e4:62:e4:6f:59 john@penguin.example.com The key's randomart image is: +--[RSA1 2048]----+ | | | . . | | o o | | + o E | | . o S | | = + . | | . = . o . .| | . = o o..o| | .o o o=o.| +-----------------+
- 修改~/.ssh/目录的权限(这里建议设置的权限是700。如果sshd_config的StrictModes选项的值是“yes”,当此目录对其他用户可写时,sshd会拒绝进行登录认证——译者注):
~]$ chmod 755 ~/.ssh
- 把~/.ssh/identity.pub的内容,拷贝到你想连接的那台机器上的~/.ssh/authorized_keys里面。如果里面已经有内容,附加在文件末尾即可。
- 修改~/.ssh/authorized_keys文件的权限(这里建议设置的权限是600。如果sshd_config的StrictModes选项的值是“yes”,当此文件对其他用户可写时,sshd会拒绝进行登录认证——译者注):
~]$ chmod 644 ~/.ssh/authorized_keys
查看3.4.2 设置SSH代理(ssh-agent),了解如何设置可让你的系统记住密钥的密码。
不要共享你的私钥。私钥只供个人使用,永远不要把它给其他人,这一点很重要。
3.4.2 设置SSH代理(ssh-agent)
为了不在每一次初始化远程连接的时候都输入私钥的密码,你可以使用ssh-agent这个鉴定代理存储密码。在某个shell 提示符下存储你的密码,请使用下述命令:
~]$ ssh-add Enter passphrase for /home/john/.ssh/id_rsa:
译者注:若ssh-add提示“Could not open a connection to your authentication agent.”,则需要先运行ssh-agent -s
,会显示类似下面的内容:
$ ssh-agent -s SSH_AUTH_SOCK=/tmp/ssh-K8Rnbn4QJexg/agent.6208; export SSH_AUTH_SOCK; SSH_AGENT_PID=6368; export SSH_AGENT_PID; echo Agent pid 6368;
在shell提示符先后输入上面显示出的中间两行并回车(设置环境变量),之后即可正常使用ssh-add命令:
$ SSH_AUTH_SOCK=/tmp/ssh-K8Rnbn4QJexg/agent.6208; export SSH_AUTH_SOCK; $ SSH_AGENT_PID=6368; export SSH_AGENT_PID;
需要注意的是,在你登出的时候,密码会被丢掉。你必须在每一次登录进虚拟控制台或终端窗口的时候,输入一次这个命令。
4 OpenSSH客户端
4.1 使用ssh工具
ssh允许你登录远端机器并在其上执行命令。它是rlogin,rsh和telnet的安全替代品。
像telnet那样,登陆远程机器penguin.example.com,在shell提示符输入下面命令:
~]$ ssh penguin.example.com
这会使用你本地系统当前正在使用的用户名进行登录。如果你想指定其他用户名,用ssh 用户名@主机名
这种形式。比如以john这个用户名登录,输入:
~]$ ssh john@penguin.example.com
第一次初始化一个连接的时候,你会收到类似下面这样一条信息:
The authenticity of host 'penguin.example.com' can't be established. RSA key fingerprint is 94:68:3a:3a:bc:f3:9a:9b:01:5d:b3:07:38:e2:11:0c. Are you sure you want to continue connecting (yes/no)?
输入yes来确认。然后你会看到提示说这个服务器已经被添加到已知主机列表,还有一个让你输入密码的提示:
Warning: Permanently added 'penguin.example.com' (RSA) to the list of known hosts. john@penguin.example.com's password:
更新SSH服务器的主机密钥。如果SSH服务器的主机密钥发生改变,客户端会通知用户,除非从~/.ssh/known_hosts文件删除服务器的主及密钥,否则无法连接。要删除密钥,用文本编辑器打开这个文件,删除以远端服务器机器名(或IP地址)打头的那一行内容并保存即可。不过在这样做之前,需要先联系SSH服务器的系统管理员,确定系统没有被黑。
输入密码以后,你会进入远端服务器的shell环境。
ssh还可以在不登录远方机器shell环境的情况下执行它上面的命令。这一操作的格式是ssh [username@]hostname command
。例如,如果你想执行penguin.example.com上面的whoami命令,输入:
~]$ ssh john@penguin.example.com whoami john@penguin.example.com's password: john
输入正确的密码以后,将会显示用户名,然后你会回到本地shell环境。
4.2 使用scp工具
scp可通过加密的安全连接在机器间传输文件。在设计上,它和rcp非常相似。
把本地的一个文件传到远端系统,使用下面的命令格式:
scp localfile username@hostname:remotefile
比如你想吧taglist.vim文件传输到机器名为penguin.example.com的远端主机上,输入下面命令:
~]$ scp taglist.vim john@penguin.example.com:.vim/plugin/taglist.vim john@penguin.example.com's password: taglist.vim 100% 144KB 144.5KB/s 00:00
可一次性指定多个文件。要把.vim/plugin/里面的所有文件传到名为penguin.example.com的远端服务器的相同目录下,输入以下命令:
~]$ scp .vim/plugin/* john@penguin.example.com:.vim/plugin/ john@penguin.example.com's password: closetag.vim 100% 13KB 12.6KB/s 00:00 snippetsEmu.vim 100% 33KB 33.1KB/s 00:00 taglist.vim 100% 144KB 144.5KB/s 00:00
把远端系统上的文件传到本地,使用下面格式:
scp username@hostname:remotefile localfile
比如,要下载远端机器上的.vimrc配置文件,输入:
~]$ scp john@penguin.example.com:.vimrc .vimrc john@penguin.example.com's password: .vimrc 100% 2233 2.2KB/s 00:00
4.3 使用sftp工具
sftp工具用来打开一个安全的交互FTP会话。在设计上,它和ftp相似,区别是它使用加密的安全连接。
为了连接一个远端系统,使用下述命令形式:
sftp username@hostname
例如,为了使用john这个用户名登入名为penguin.example.com
的远端系统,输入:
~]$ sftp john@penguin.example.com john@penguin.example.com's password: Connected to penguin.example.com. sftp>
输入正确的密码之后,你会进入一个提示符环境。sftp工具可以接受一系列和ftp工具相似的命令,下表是其部分命令:
命令 | 描述 |
---|---|
ls [directory ] |
列出远端目录directory 的内容。如果没有提供,则列出当前工作目录的内容。 |
cd directory |
把远端工作目录切换到directory 。 |
mkdir directory |
创建远端目录directory 。 |
rmdir path |
删除远端目录directory 。 |
put localfile [remotefile ] |
把本地文件localfile 传到远端机器。 |
get remotefile [localfile ] |
把远端文件remotefile 下载到本地。 |
可访问sftp的man page,获取命令的完整列表。
5 不只是安全Shell
安全的命令行接口只是开始,SSH还有其他众多使用方式。如果带宽足够,X11会话可以通过SSH通道进行。或者,使用TCP/IP转发,先前不安全的系统间端口连接可被映射到特定的SSH通道上。
5.1 X11转发
通过SSH连接打开一个X11会话,使用下面命令形式:
ssh -Y username@hostname
例如,为了使用用户名john登录名为penguin.example.com的远端机器,输入:
~]$ ssh -Y john@penguin.example.com john@penguin.example.com's password:
如果从安全shell环境运行一个X程序,SSH客户端和服务器会创建一个新的通道,X程序的数据会通过那个通道透明(使用者无法感知,觉得和平时用起来没差别)地传递给客户端。
X11转发可以非常有用。例如,可用来为打印机设置工具创立一个安全的交互式会话。要做到这一点,使用ssh连接服务器,并输入:
~]$ system-config-printer &
打印机设置工具会出现,允许用户安全地设置远端系统的打印选项。
5.2 端口转发
SSH能凭借端口转发保护平时不安全的TCP/IP协议。使用这个技术的时候,SSH服务器变成了一条通向SSH客户端的加密管道。
端口转发是把客户端的一个端口映射到到远端服务器的端口上。SSH能把服务器的任意端口映射到客户端上。要让这一技术运作起来,不需要相同的端口号。
使用保留的端口号。需要root权限才能让端口转发监听小于1024的端口号。
建立一个TCP/IP转发通道,监听本地的连接,使用以下命令形式:
ssh -L local-port:remote-hostname:remote-port username@hostname
例如,要使用POP3通过加密连接检查名为mail.example.com
的服务器上的邮件,使用下述命令:
~]$ ssh -L 1100:mail.example.com:110 mail.example.com
一旦客户机和邮件服务器间的端口转发通道准备就绪,即可把POP3邮件客户端的通信指向本地的1100端口检查新邮件。所有发往客户端系统1100端口的请求都会被安全的发往mail.example.com服务器。
如果mail.example.com没有运行SSH服务器,但是相同网络的另一台机器运行了,SSH依然可以被用来保护部分连接。不过,这需要一个稍微有些不同的命令:
~]$ ssh -L 1100:mail.example.com:110 other.example.com
在这个例子里,客户机上发往1100端口的POP3请求会通过SSH连接发到服务器other.example.com的22端口。然后other.example.com连接mail.example.com服务器的110端口检查新邮件。需要注意的是,使用这一技术的时候,只有客户端和other.example.com的SSH服务器之间的连接是安全的。
端口转发同样也能用来安全的通过网络防火墙获取数据。如果防火墙设置为拦截除SSH默认22端口外其他所有端口的通讯,借助已建立的SSH连接,两台主机间依然可以通过重定向让被拦截端口间进行通讯。
客户端系统决定了连接的安全性。用这种方式使用端口转发,允许客户端系统上的任何一个用户连接到那个服务。如果客户端系统被攻破,攻击者就有了对已转发服务的访问权。在意这一点的系统管理员可以在服务器上关闭这个功能。方法是在/etc/ssh/sshd_config配置文件中把AllowTcpForwarding选项的参数设置为no,然后重启sshd服务。
6 附加资源
OpenSSH和OpenSSH工程都在持续开发,最新的信息都可从他们的网站上获取。OpenSSH和OpenSSL工具的手册页(man page)也是一个很好的信息资源。
6.1 已安装文档
man ssh
ssh手册页,包含它的所有用法。
man scp
scp手册页,包含它的所有用法。
man sftp
sftp手册页,包含它的所有用法。
man sshd
sshd手册页,包含它的所有用法。
man ssh-keygen
ssh-keygen手册页,包含它的所有用法。
man ssh_config
ssh_config配置文件手册页,包含SSH客户端所有设置选项的说明。
man sshd_config
ssh_config配置文件手册页,包含SSH守护程序所有设置选项的说明。
6.2 有用的网站
OpenSSH主页,包含更深入的文档,常见问题,邮件列表链接,bug反馈,及其他有用的资源。
OpenSSL主页,包含更深入的文档,常见问题,邮件列表链接,bug反馈,及其他有用的资源。
SSH服务器的另一实现。
Visits: 2531