SSH(Secure Shell)是一种通用的、功能强大的、基于软体的网路安全解决方案。计算机每次向网路传送数据时,SSH都会自动对其进行加密。数据到达目的地时,SSH自动对加密数据进行解密。整个过程都是透明的,使用OpenSSH工具将会增进你的系统安全性。谈到网路安全访问,相信大家首先想到的就是安全Shell,也就是Secure Shell,通常简写为SSH。这是因为SSH安装容易、使用简单,而且比较常见,一般的Unix系统、Linux系统、FreeBSD系统都附带有支持SSH的应用程式包。
基本介绍
- 中文名:Secure Shell
- 类型:基于软体的网路安全解决方案
- 优点:安装容易、使用简单
- 内容:传输层协定
什幺是Secure?
SSH为Secure Shell的缩写,由IETF的网路工作小组(Network Working Group)所制定;SSH为创建在套用层和传输层基础上的安全协定。
传统的网路服务程式,如FTP、POP和Telnet其本质上都是不安全的;因为它们在网路上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的伺服器接收用户传给伺服器的数据,然后再冒充用户把数据传给真正的伺服器。
而SSH是目前较可靠,专为远程登录会话和其他网路服务提供安全性的协定。利用SSH协定可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
SSH之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。
什幺是SSH ?
传统的网路服务程式,如FTP、Pop和Telnet在传输机制和实现原理上是没有考虑安全机制的,其本质上都是不安全的;因为它们在网路上用明文传送数据、用户帐号和用户口令,别有用心的人通过窃听等网路攻击手段非常容易地就可以截获这些数据、用户帐号和用户口令。而且,这些网路服务程式的简单安全验证方式也有其弱点,那就是很容易受到"中间人"(man-in-the-middle)这种攻击方式的攻击。所谓"中间人"的攻击方式,就是"中间人"冒充真正的伺服器接收你的传给伺服器的数据,然后再冒充你把数据传给真正的伺服器。伺服器和你之间的数据传送被"中间人"一转手做了手脚之后,就会出现很严重的问题。
SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、Pop、甚至为PPP提供一个安全的"通道"。
最初的SSH是由芬兰的一家公司开发的。但是因为受着作权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH是SSH的替代软体包,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH。
最后,SSH在运行方式上也很有特色。不像其他的TCP/IP套用,SSH被设计为工作于自己的基础之上,而不是利用包装(wrappers)或通过Internet守护进程inetd。但是许多人想通过TCP包装来运行SSH守护进程。虽然你可以通过tcpd(从inetd上运行启动)来运行SSH进程,但这完全没有必要。
SSH协定的内容
SSH协定是建立在套用层和传输层基础上的安全协定,它主要由以下三部分组成,共同实现SSH的安全保密机制。
传输层协定,它提供诸如认证、信任和完整性检验等安全措施,此外它还可以任意地提供数据压缩功能。通常情况下,这些传输层协定都建立在面向连线的TCP数据流之上。
用户认证协定层,用来实现伺服器的跟客户端用户之间的身份认证,它运行在传输层协定之上。
连线协定层,分配多个加密通道至一些逻辑通道上,它运行在用户认证层协定之上。
当安全的传输层连线建立之后,客户端将传送一个服务请求。当用户认证层连线建立之后将传送第二个服务请求。这就允许新定义的协定可以和以前的协定共存。连线协定提供可用作多种目的通道,为设定安全互动Shell会话和传输任意的TCP/IP连线埠和X11连线提供标準方法。
SSH的安全验证
从客户端来看,SSH提供两种级别的安全验证。
第一种级别(基于口令的安全验证),只要你知道自己的帐号和口令,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,这种验证方式不能保证你正在连线的伺服器就是你想连线的伺服器。可能会有别的伺服器在冒充真正的伺服器,也就是受到"中间人"这种攻击方式的攻击。
第二种级别(基于密匙的安全验证),需要依靠密匙,也就是你必须为自己创建一对密匙,并把公有密匙放在需要访问的伺服器上。如果你要连线到SSH伺服器上,客户端软体就会向伺服器发出请求,请求用你的密匙进行安全验证。伺服器收到请求之后,先在你在该伺服器的用户根目录下寻找你的公有密匙,然后把它和你传送过来的公有密匙进行比较。如果两个密匙一致,伺服器就用公有密匙加密"质询"(challenge)并把它传送给客户端软体。客户端软体收到"质询"之后就可以用你的私人密匙解密再把它传送给伺服器。
与第一种级别相比,第二种级别不需要在网路上传送用户口令。另外,第二种级别不仅加密所有传送的数据,而"中间人"这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能慢一些。
SSH的套用
首先,SSH最常见的套用就是,用它来取代传统的Telnet、FTP等网路应用程式,通过SSH登录到远方机器执行你想进行的工作与命令。在不安全的网路通讯环境中,它提供了很强的验证(authentication)机制与非常安全的通讯环境。实际上,SSH开发者的原意是设计它来取代原UNIX系统上的rcp、rlogin、rsh等指令程式的;但经过适当包装后,发现它在功能上完全可以取代传统的Telnet、FTP等应用程式。
传统 BSD 风格的 r 系列指令(如 rcp,rsh,rlogin)往往都被视为不安全的,很容易就被各种网路攻击手段所破解,几乎所有找得到有关UNIX安全的书或档案,都会一而再、再而三地警告系统管理者,留心r系列指令的设定,甚至要求系统管理者将r系列指令通通关闭。
而用来替代r系列指令的SSH,则在安全方面做了极大的强化,不但对通讯内容可以进行极为安全的加密保护,同时也强化了对身份验证的安全机制,它套用了在密码学(Cryptography)中已发展出来的数种安全加密机制,如 Symmetric Key Cryptography,Asymmetric Key Cryptography, One-way Hash Function,Random-number Generation等,来加强对于身份验证与通讯内容的安全保护。通讯时资料的加密有IDEA,three-key triple DES,DES,RC4-128,TSS,Blowfish 等数种多种安全加密算法可供选择,加密的key则是通过 RSA 进行交换的。资料的加密可以对抗IP spoofing,RSA这种非对称性的加密机制则可用来对抗DNS spoofing与IP routing spoofing,同时RSA也可以进行对主机身份的验证。
其次,通过使用用SSH可以在本地主机和远程伺服器之间设定"加密通道",并且这样设定的"加密通道"可以跟常见的Pop应用程式、X应用程式、Linuxconf应用程式相结合,提供安全保障。
SSH的"加密通道"是通过"连线埠转发"来实现的。你可以在本地连线埠(没有用到的)和在远程伺服器上运行的某个服务的连线埠之间建立"加密通道"。然后只要连线到本地连线埠。所有对本地连线埠的请求都被SSH加密并且转发到远程伺服器的连线埠。当然只有远程伺服器上运行SSH伺服器软体的时候"加密通道"才能工作。
OpenSSH
OpenSSH 是 SSH (Secure SHell) 协定的免费开源实现。它用安全、加密的网路连线工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持 SSH 协定的版本 1.3、1.5、和 2。自从 OpenSSH 的版本 2.9 以来,默认的协定是版本 2,该协定默认使用 RSA 钥匙。
1. 为什幺使用 SSH?
使用 OpenSSH 工具将会增进你的系统安全性。 所有使用 OpenSSH 工具的通讯,包括口令,都会被加密。 telnet 和 ftp 使用纯文本口令,并被明文传送。这些信息可能会被截取,口令可能会被检索,然后未经授权的人员可能会使用截取的口令登录进你的系统而对你的系统造成危害。你应该儘可能地使用 OpenSSH 的工具集合来避免这些安全问题。
另一个使用 OpenSSH 的原因是,它自动把 DISPLAY 变数转发给客户机器。换一句话说,如果你在本地机器上运行 X 视窗系统,并且使用 ssh 命令登录到了远程机器上,当你在远程机器上执行一个需要 X 的程式时,它会显示在你的本地机器上。如果你偏爱图形化系统管理工具,却不能够总是亲身访问该伺服器,这就会为你的工作大开方便之门。
2. 配置 OpenSSH 伺服器
要运行 OpenSSH 伺服器,你必须首先确定你安装了正确的 RPM 软体包。openssh-server 软体包是必不可少的,并且它依赖于 openssh 软体包的安装与否。
OpenSSH 守护进程使用 /etc/ssh/sshd_config 配置档案。Red Hat Linux 9 安装的默认配置档案在多数情况下应该足以胜任。如果你想使用没有被默认的 sshd_config 档案提供的方式来配置守护进程,请阅读 sshd 的说明书(man)页来获取能够在配置档案中定义的关键字列表。
要启动 OpenSSH 服务,使用 /sbin/service sshd start 命令。要停止 OpenSSH 伺服器,使用 /sbin/service sshd stop 命令。如果你想让守护进程在引导时自动启动,请参阅相关资料来获取关于如何管理服务的信息。
如果你重新安装了 Red Hat Linux 系统,任何在它被重装前使用 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.
重装后的系统会为自己创建一组新的身份标识钥匙;因此客户会看到 RSA 主机钥匙改变的警告。如果你想保存系统原有的主机钥匙,备份 /etc/ssh/ssh_host*key* 档案,然后在系统重装后恢复它。该过程会保留系统的身份。当客户机在该系统重装后试图连线它,它们就不会看到以上的警告信息。(还有一种解决方法见:http://chinaunix.net/forum/viewtopic.php?t=109562&start=0)
3. 配置 OpenSSH 客户
要从客户机连线到 OpenSSH 伺服器上,你必须在客户机器上装有 openssh-clients 和 openssh 软体包。
3.1. 使用 ssh 命令
ssh 命令是 rlogin、rsh 和 telnet 命令的安全替换。它允许你在远程机器上登录并在其上执行命令。
使用 ssh 来登录到远程机器和使用 telnet 相似。要登录到一个叫做 penguin.example.net 的远程机器,在 shell 提示下键入下面的命令:
ssh penguin.example.net
第一次使用 ssh 在远程机器上登录时,你会看到和下面相仿的讯息:
The authenticity of host 'penguin.example.net' can't be established.
DSA 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.net' (RSA) to the list of known hosts.
下一步,你会看到向你询问远程主机口令的提示。在输入口令后,你就会在远程主机的 shell 提示下了。如果你没有指定用户名,你在本地客户机器上登录用的用户名就会被传递给远程机器。如果你想指定不同的用户名,使用下面的命令:
ssh username@penguin.example.net
你还可以使用 ssh -l username penguin.example.net。
ssh 命令可以用来在远程机器上不经 shell 提示登录而执行命令。它的语法格式是: ssh hostname command。譬如,如果你想在远程主机 penguin.example.net 上执行 ls /usr/share/doc 命令,在 shell 提示下键入下面的命令:
ssh penguin.example.net ls /usr/share/doc
在你输入了正确的口令之后, /usr/share/doc 这个远程目录中的内容就会被显示,然后你就会被返回到你的本地 shell 提示下。
3.2. 使用 scp 命令
scp 命令可以用来通过安全、加密的连线在机器间传输档案。它与 rcp 相似。
把本地档案传输给远程系统的一般语法是:
scp localfile username@tohostname:/newfilename
localfile 指定源档案,username@tohostname:/newfilename 指定目标档案。
要把本地档案 shadowman 传送到你在 penguin.example.net 上的账号内,在 shell 提示下键入(把 username 替换成你的用户名):
scp shadowman username@penguin.example.net:/home/username
这会把本地档案 shadowman 传输给 penguin.example.net 上的 /home/username/shadowman 档案。
把远程档案传输给本地系统的一般语法是:
scp username@tohostname:/remotefile /newlocalfile
remotefile 指定源档案,newlocalfile 指定目标档案。
源档案可以由多个档案组成。譬如,要把目录 /downloads 的内容传输到远程机器 penguin.example.net 上现存的 uploads 目录,在 shell 提示下键入下列命令:
scp /downloads/* username@penguin.example.net:/uploads/
3.3. 使用 sftp 命令
sftp 工具可以用来打开一次安全互动的 FTP 会话。它与 ftp 相似, 只不过,它使用安全、加密的连线。它的一般语法是:sftp username@hostname.com。一旦通过 验证,你可以使用一组和使用 FTP 相似的命令。请参阅 sftp 的说明书页(man)来获取这些 命令的列表。要阅读说明书页,在 shell 提示下执行 man sftp 命令。sftp 工具只在 OpenSSH 版本 2.5.0p1 以上才有。
3.4. 生成钥匙对
如果你不想每次使用 ssh、scp 或 sftp 时都要输入口令来连线远程机器,你可以生成一对授权钥匙。
钥匙必须为每个用户生成。要为某用户生成钥匙,用想连线到远程机器的用户身份来遵循下面的步骤。如果你用根用户的身份完成了下列步骤,就只有根用户才能使用这对钥匙。
从 OpenSSH 版本 3.0 开始,~/.ssh/authorized_keys2、~/.ssh/known_hosts2 和 /etc/ssh_known_hosts2 就会过时。SSH 协定 1 和 2 共享 ~/.ssh/authorized_keys、~/.ssh/known_hosts 和 /etc/ssh/ssh_known_hosts 档案。
Red Hat Linux 9 默认使用 SSH 协定 2 和 RSA 钥匙。
窍门
如果你重装了 Red Hat Linux,但是想保留现有的钥匙对,备份你的主目录中的 .ssh 目录。重装后,把该目录複製回主目录。该进程可为系统上的所有用户进行,包括根用户。
3.4.1. 为版本 2 生成 RSA 钥匙对
使用下列步骤来为 SSH 协定的版本 2 生成 RSA 钥匙对。从 OpenSSH 2.9 开始,它已成为默认设定。
1. 要生成 RSA 钥匙对与协定的版本 2 合作,在 shell 提示下键入下列命令:
ssh-keygen -t rsa
接受 ~/.ssh/id_rsa 的默认位置。输入一个与你的帐号口令不同的口令句,再输入一次来确认。
公钥被写入 ~/.ssh/id_rsa.pub。密钥被写入 ~/.ssh/id_rsa。决不能把密钥出示给任何人。
2. 使用 chmod 755 ~/.ssh 命令改变你的 .ssh 目录的许可许可权。
3. 把 ~/.ssh/id_rsa.pub 的内容複製到你想连线的机器上的 ~/.ssh/authorized_keys 档案中。如果 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/id_rsa.pub 档案複製到那个机器上的 ~/.ssh/authorized_keys 档案中。
4. 如果你运行的是 GNOME,跳到第 3.4.4 节。如果你没在运行 X 视窗系统,跳到第 3.4.5 节。
3.4.2. 为版本 2 生成 DSA 钥匙对
使用下面的步骤来为 SSH 协定的版本 2 生成 DSA 钥匙对。
1. 要生成用于协定的版本 2 的 DSA 钥匙对,在 shell 提示下键入下面的命令:
ssh-keygen -t dsa
接受 ~/.ssh/id_dsa 的默认位置。输入一个与你的帐号口令不同的口令句,再输入一次来确认。
窍门
口令句是用来验证用户的一串辞彙和字元。 口令句和一般口令的不同之处在于:在口令句中你可以使用空格或制表符。口令句通常比一般口令长,因为它们通常使用短语而不仅仅用一个词。
公钥被写入 ~/.ssh/id_dsa.pub。密钥被写入 ~/.ssh/id_dsa。决不能把密钥出示给任何人,这一点很重要。
2. 使用 chmod 755 ~/.ssh 命令改变你的 .ssh 目录的许可许可权。
3. 把 ~/.ssh/id_dsa.pub 的内容複製到你想连线的机器中的 ~/.ssh/authorized_keys 档案中。如果档案 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/id_dsa.pub 档案複製到那个机器上的 ~/.ssh/authorized_keys档案中。
4. 如果你运行的是 GNOME,跳到第 3.4.4 节。如果你没在运行 X 视窗系统,跳到 第 3.4.5 节。
3.4.3. 为版本 1.3 和 1.5 生成 DSA 钥匙对
使用下面的步骤来生成用于 SSH 协定版本 1 的 RSA 钥匙对。如果你只在使用 DSA 的系统间连线,则不需要 RSA 版本 1.3 或 RSA 版本 1.5 钥匙对。
1. 要生成 RSA (版本 1.3 和 1.5 协定)钥匙对,在 shell 提示下键入下列命令:
ssh-keygen -t rsa1
接受默认的位置 (~/.ssh/identity)。输入和你的帐号口令不同的口令句。再输入一次来确认。
公钥被写入 ~/.ssh/identity.pub。密钥被写入 ~/.ssh/identity。不要把你的密钥出示给任何人。
2. 使用 chmod 755 ~/.ssh 和 chmod 644 ~/.ssh/identity.pub 命令改变你的 .ssh 目录和密钥的许可许可权。
3. 把 ~/.ssh/identity.pub 的内容複製到你想连线的机器中的 ~/.ssh/authorized_keys 档案中。如果档案 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/identity.pub 档案複製到远程机器上的 ~/.ssh/authorized_keys 档案中。
4. 如果你运行的是 GNOME,跳到第 3.4.4 节。如果你没在运行 GNOME, 跳到第 3.4.5 节。
3.4.4. 在 GNOME 中配置 ssh-agent
ssh-agent 工具可以用来保存你的口令句,因此你不必在每次引发 ssh 或 scp 连线时都输入口令。如果你在使用 GNOME,openssh-askpass-gnome 工具可以用来在你登录到 GNOME 时提示你输入口令句,并把它一直保留到你从 GNOME 中注销之时。你不必为本次 GNOME 会话中任何 ssh 或 scp 连线输入口令或口令句。如果你不打算使用 GNOME,请参阅第 3.4.5 节。
要在 GNOME 会话中保存口令句,遵循下列步骤:
1. 你需要安装 openssh-askpass-gnome 软体包;你可以使用 rpm -q openssh-askpass-gnome 命令来判定该软体包是否已被安装。如果它没有被安装,从你的 Red Hat Linux 光碟集合、Red Hat FTP 镜像站点、或使用 Red Hat 网路 来安装它。
2. 点击「主选单」(在面板上)=> 「首选项」 => 「更多首选项」 => 「会话」。然后点击「启动程式」标籤。点击「增加」,在「启动命令」文本栏位内输入 /usr/bin/ssh-add。把它的优先权设为比任何现存命令都高的数字以确保它最后才执行。ssh-add 的优先权数字最好是 70 或更高。优先权数字越高,优先权越低。如果你列出了其它程式,该程式的优先权应该最低。点击「关闭」来退出该程式。
3. 注销后再登录进 GNOME;换一句话说,重新启动 X 伺服器。在 GNOME 启动后,一个提示你输入口令句的对话框就会出现。输入要求的口令句。如果你把 DSA 和 RSA 两者都配置了,你会被提示两者都输入。从现在起,你就不会被 ssh、 scp 或 sftp 提示输入口令了。
3.4.5. 配置 ssh-agent
ssh-agent 可以用来储存你的口令句,因此你在每次使用 ssh 或 scp 连线时就不必总是输入它。如果你不在运行 X 视窗系统,则在 shell 提示中遵循这些步骤。如果你在运行 GNOME,但是不想配置它来在你登录时提示你输入口令(参阅第 3.4.4 节),这个过程可以在类似 xterm 的终端视窗中进行。如果你在运行 X 却不是 GNOME,这个过程可以在终端中进行。可是,你的口令只能在该终端视窗中被记住,它不是全局设定。
1. 在 shell 提示下,键入下面的命令:
exec /usr/bin/ssh-agent $SHELL
2. 然后,键入下面的命令:
ssh-add
接着,输入你的口令。如果你配置了不止一个钥匙对,你会被提示输入每个口令。
3. 当你注销后,口令句就会被忘记。你必须在每次登录到虚拟控制台或打开终端视窗时都执行这两条命令。
4. 其它资料
OpenSSH 和 OpenSSL 工程处于不断地开发中,因此关于它们的最新信息通常位于它们的官方网站中。OpenSSH 和 OpenSSL 工具的说明书(man)页也是个获取详细信息的好地方。
4.1. 安装了的文档
* ssh、scp、sftp、sshd 和 ssh-keygen 的说明书(man)页 — 关于它们的说明书页包括如何使用这些命令的信息,以及所有能与它们一起使用的参数。
4.2. 有用的网站