OpenSSH 是一组用于安全地访问远程计算机的连接工具。
它可以作为 rlogin
、
rsh
rcp
以及
telnet
的直接替代品使用。
更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。
OpenSSH 对所有的传输进行加密,
从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。
OpenSSH 由 OpenBSD project 维护, 它基于 SSH v1.2.12 并包含了最新的错误修复和更新。 它同时兼容 SSH 协议的 1 和 2 两个版本。
一般说来, 在使用 telnet(1) 或 rlogin(1) 时, 数据是以未经加密的明文的形式发送的。 这样一来, 在客户机和服务器之间的网络上运行的听包程序, 便可以在会话中窃取到传输的用户名/密码和数据。 OpenSSH 提供了多种的身份验证和加密方法来防止这种情况的发生。
sshd 的启用是作为 FreeBSD 安装中
Standard
安装过程中的一步来进行的。 要查看
sshd 是否已被启用, 请检查
rc.conf
文件中的:
sshd_enable="YES"
这表示在下次系统启动时加载 OpenSSH
的服务程序 sshd(8)。 此外, 也可以手动使用 rc(8)
脚本 /etc/rc.d/sshd
来启动 OpenSSH:
/etc/rc.d/sshd start
#
ssh [email protected]
Host key not found from the list of known hosts. Are you sure you want to continue connecting (yes/no)?yes
Host 'example.com' added to the list of known hosts. [email protected]'s password:*******
登录过程和使用
rlogin
或
telnet
建立的会话非常类似。
在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。
只有在第一次连接时, 用户会被要求输入
yes
。 之后的连接将会验证预先保存下来的密钥指纹。
如果保存的指纹与登录时接收到的不符, 则将会给出警告。
指纹保存在 ~/.ssh/known_hosts
中, 对于 SSH v2 指纹, 则是
~/.ssh/known_hosts2
。
默认情况下, 较新版本的
OpenSSH 只接受 SSH v2
连接。 如果能用版本 2 则客户程序会自动使用,
否则它会返回使用版本 1 的模式。 此外,
也可以通过命令行参数 -1
或
-2
来相应地强制使用版本 1 或 2。
保持客户端的版本 1 能力是为了考虑较早版本的兼容性。
scp(1) 命令和 rcp(1); 的用法类似, 它用于将文件复制到远程的机器上, 或复制过来, 区别是它是安全的。
#
scp [email protected]:/COPYRIGHT COPYRIGHT
[email protected]'s password:*******
COPYRIGHT 100% |*****************************| 4735 00:00#
由于先前的例子中已经保存了指纹, 使用 scp(1) 时会自动地加以验证。
scp(1) 使用的参数同
cp(1) 类似。 第一个参数是一个或一组文件,
然后是复制的目标。 由于文件是通过 SSH 在网上传递的,
因此某些文件的名字需要写成
用户名@主机名:<远程文件路径>
。
针对 OpenSSH 服务程序和客户端的系统级配置文件在
/etc/ssh
目录中。
ssh_config
用于配置客户端的设定,
而 sshd_config
则用于配置服务器端。
另外 sshd_program
(默认是 /usr/sbin/sshd
), 以及
sshd_flags
这两个 rc.conf
选项提供了更多的配置选择。
用于取代口令的一种方法是使用 ssh-keygen(1) 来生成 DSA 或 RSA 密钥对用于验证用户的身份:
%
ssh-keygen -t dsa
Generating public/private dsa key pair. Enter file in which to save the key (/home/user/.ssh/id_dsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_dsa. Your public key has been saved in /home/user/.ssh/id_dsa.pub. The key fingerprint is: bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 [email protected]
ssh-keygen(1) 会生成一个包含公私钥对用于验证身份。 私钥将保存到
~/.ssh/id_dsa
或
~/.ssh/id_rsa
, 而公钥则被存放到
~/.ssh/id_dsa.pub
或
~/.ssh/id_rsa.pub
, 文件名取决于您选择的
DSA 和 RSA
密钥类型。 RSA 或者 DSA
公钥必须被存放到远程机器上的
~/.ssh/authorized_keys
才能够使系统正确运转。
这将允许从远程连接时以基于 SSH 密钥的验证来代替口令验证。
如果在 ssh-keygen(1) 中使用了通行字, 则每次使用私钥时都需要输入它。 ssh-agent(1) 能够缓解多次输入长通行字的压力, 并将在接下来的 第 15.10.7 节 “ssh-agent 和 ssh-add” 予以详述。
选项和配置文件可能随 OpenSSH 的版本不同而不同; 为了避免出现问题, 您应参考 ssh-keygen(1) 联机手册。
这将使到远程机器的连接基于 SSH 密钥而不是口令。
如果在运行 ssh-keygen(1) 时使用了通行字, 每次使用私钥的时候用户都将被要求输入通行字。 ssh-agent(1) 能够减缓重复输入较长通行字的负担, 有关更详细的探究在 第 15.10.7 节 “ssh-agent 和 ssh-add” 下一节 .
随着你系统上的 OpenSSH 版本的不同,各种选项和配置文件也会不同; 为了避免此类问题, 你需要参阅 ssh-keygen(1) 联机手册。
ssh-agent(1) 和 ssh-add(1) 这两个工具, 提供了一种将 SSH 秘钥加载到内存中以便使用, 而不必每次都输入通行字的方法。
ssh-agent(1) 工具能够使用加载到其中的私钥来处理验证过程。 ssh-agent(1) 应被用于启动另一个应用程序。 最基本的用法是, 使用它来启动 shell, 而高级一些的用法则是用它来启动窗口管理器。
要在 shell 中使用 ssh-agent(1), 首先应把 shell 作为参数来启动它。 随后, 应通过 ssh-add(1) 并输入通行字, 来向它提供身份验证信息。 一旦这些步骤都做完了, 用户就应该能够 ssh(1) 到任何一个安装了对应公钥的机器了。 例如:
%
ssh-agentcsh
%
ssh-add Enter passphrase for /home/user/.ssh/id_dsa: Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)%
要在 X11 中使用 ssh-agent(1), 调用
ssh-agent(1) 的过程应置于
~/.xinitrc
之中。 这将把
ssh-agent(1) 服务提供给所有在 X11 中运行的程序。
下面是一个 ~/.xinitrc
文件的实例:
exec ssh-agent startxfce4
这将启动 ssh-agent(1), 而后者将在每次 X11 启动时运行 XFCE。 作完这些之后就可以重启 X11 以便使修改生效。 随后您就可以运行 ssh-add(1) 来加载全部 SSH 密钥了。
OpenSSH 能够创建隧道以便用加密的会话来封装其他协议。
下面的命令告诉 ssh(1) 为 telnet 创建一个隧道:
%
ssh -2 -N -f -L 5023:localhost:23 [email protected]
%
上述 ssh
命令使用了下面这些选项:
-2
强制 ssh
使用第2版的协议
(如果需要和较老的 SSH 一同工作请不要使用这个选项)。
-N
表示不使用命令行, 或者说只使用隧道。 如果省略,
ssh
将同时初始化会话。
-f
强制 ssh
在后台执行。
-L
表示产生一条
本地端口:远程主机:远程端口
形式的隧道。
[email protected]
远程 SSH 服务器。
SSH 隧道通过监听
localhost
上面指定端口来完成工作。
它将把本机主机/端口上接收到的连接通过 SSH 连接转发到远程主机/端口。
本例中, 位于 localhost
的 5023
端口
被用于转发 localhost
的连接到远程主机的
23
端口。
由于 23
是 telnet 使用的,
因此它将通过 SSH 隧道完成 telnet 会话。
这可以用来封装任意不安全的 TCP 协议, 例如 SMTP、 POP3、 FTP等等。
%
ssh -2 -N -f -L 5025:localhost:25 [email protected]
[email protected]'s password:*****
%
telnet localhost 5025
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailserver.example.com ESMTP
这可以与 ssh-keygen(1) 以及额外的用户帐号配合来建立一个更透明的 SSH 隧道环境。 密钥可以被用在需要输入口令的地方, 而且可以为不同的用户配置不同的隧道。
工作时, 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络, 或从您家到办公室的网络可能不, 或不完全可信。 基于这样的原因, 您需要以安全的方式来查看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接, 并通过这个连接来访问 POP3 服务:
%
ssh -2 -N -f -L 2110:mail.example.com:110 [email protected]
[email protected]'s password:******
当这个通道连上时, 您可以把 POP3 请求发到
localhost
端口 2110。
这个连接将通过通道安全地转发到
mail.example.com
。
一些大脑长包的网络管理员会使用一些极端的防火墙策略, 不仅过滤进入的连接, 而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行 SSH 和网页浏览。
您可能希望访问一些其它的 (也许与工作无关的) 服务, 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐, 则您将无法访问它。
解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。
%
ssh -2 -N -f -L 8888:music.example.com:8000 [email protected]
[email protected]'s password:*******
现在您可以把客户程序指定到
localhost
的 8888 端口, 它将把请求转发给
music.example.com
的 8000
端口, 从而绕过防火墙。
通常限制哪些用户能够登录, 以及从何处登录会是好主意。
采用 AllowUsers
选项能够方便地达到这一目的。
例如, 想要只允许 root
用户从
192.168.1.32
登录, 就可以在
/etc/ssh/sshd_config
文件中加入下述设置:
AllowUsers [email protected]
要允许用户 admin
从任何地方登录,
则只需列出用户名:
AllowUsers admin
可以在同一行指定多个用户, 例如:
AllowUsers [email protected] admin
列出需要登录机器的用户很重要; 否则他们将被锁在外面。
在完成对
/etc/ssh/sshd_config
的修改之后您必须告诉
sshd(8) 重新加载其配置文件, 方法是执行:
#
/etc/rc.d/sshd reload
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<[email protected]>.
关于本文档的问题请发信联系
<[email protected]>.