看过delphij的实现安全的三种途径这篇文章后决定将FreeBSD服务器的SSH登录改为使用密钥认证的方式;另外也是因为看到 /var/log/messages 里满是这样的记录:
May 1 13:00:12 stone sshd[12296]: error: PAM: authentication error for illegal user admin from 220.173.60.209
May 1 13:01:24 stone sshd[12301]: error: PAM: authentication error for illegal user admin from 204.8.216.165
May 1 13:01:57 stone sshd[12307]: error: PAM: authentication error for illegal user admin from 77.243.236.32
测试环境:FreeBSD 7.0-RELEASE Putty 0.60
OpenSSH 是一组用于安全地访问远程计算机的连接工具。它可以作为 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持,以及其他网络级的攻击。
1. 确保sshd正常启用
查看 /etc/rc.conf 是否存在 sshd_enable=”YES” ;如果没有添加进去并人工方式启动#/etc/rc.d/sshd start ;然后查询 22端口是否启动:#sockstat -4l
root sshd 8085 4 tcp4 *:22 *:*
2. 配置 OpenSSH
针对 OpenSSH 服务程序和客户端的系统级配置文件在 /etc/ssh 目录中。ssh_config 用于配置客户端的设定, 而 sshd_config 则用于配置服务器端。
现在来说通过配置 OpenSSH 使服务器接受公钥(public-key)认证。sshd_config 这个文件指定的一些默认值都是生效的,虽然这些选项被注释掉了,如果你想改变默认值的话,那就取消注释更改值或者直接添加相同的选项和值覆盖默认值的作用。
#vi /etc/ssh/sshd_config
#默认 SSH 端口为 22 ,如果需要可以更改
Port 22#仅接受版本2的密钥,默认值
Protocol 2#绝对不要允许 root 用户直接通过网络登录,默认值
PermitRootLogin no
StrictModes yes
MaxAuthTries 6#启用公钥认证
RSAAuthentication no #默认值为 yes
PubkeyAuthentication yes #默认值#不使用基于主机的认证,加强 OpenSSH 的安全性
RhostsRSAAuthentication no #默认值
HostbasedAuthentication no #默认值
IgnoreUserKnownHosts yes #默认值为 no
PermitEmptyPassword no #默认值#禁用 PAM 认证即口令形式认证 默认值为yes
ChallengeResponseAuthentication no
编辑完成后重启 sshd 进程:`#/etc/rc.d/sshd restart` ;Linux 系统上一般是 `/etc/init.d/ssh restart`
注意:因为是通过 SSH 口令认证的方式连接到服务器来操作,操作ChallengeResponseAuthentication 这个选项改为 no 后不能退出登陆,继续下面操作,或者也可以在成功验证了密钥后再改这个选项。以免出错导致无法远程SSH登录服务器。
3. 生成公钥(public key)和私钥(private key)
用需要生成密钥的用户通过 SSH 密码认证的方式登录
FreeBSD 使用 ssh-keygen 来生成 DSA 或 RSA 密钥对用于验证用户的身份:
% ssh-keygen -t rsa
Generating public/private dsa key pair.#不输入即使用默认
Enter file in which to save the key (/home/user/.ssh/id_rsa):
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_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com
ssh-keygen 会生成一个包含公私钥对用于验证身份。 私钥将保存到 ~/.ssh/id_dsa 或 ~/.ssh/id_rsa, 而公钥则被存放到 ~/.ssh/id_dsa.pub 或 ~/.ssh/id_rsa.pub,文件名取决于您选择的 DSA 和 RSA 密钥类型。RSA 或者 DSA 公钥必须被存放到远程机器上的 ~/.ssh/authorized_keys 才能够使系统正确运转,因此 `#cp id_rsa.pub authorized_keys`
将公钥复制一份为 authorized_keys 此文件既可。将私钥 id_rsa 复制到 Windows 客户端。
4. 转换 OpenSSH 生成的私钥 id_rsa 到 putty 能使用的文件
这里需要借助一个工具 puttygen.exe ,从 Putty 的网站上可以下载。
执行 puttygen.exe 后,点击 Load 按钮,打开从远程服务器下载的 id_rsa ,这时要求输入生成密钥时输入的密钥密码。
验证成功后显示密钥文件,然后点击 Save private key,就可以将文件另存为 “id_rsa.ppk” 这样的 putty 能够使用的私钥文件了。
5. 配置和使用 Putty
打开 Putty 程序,点击边栏的 SSH ,在 “Preferred SSH protocol version”下选择“2 only”,表示只使用 SSH 版本2;
点击 SSH 下的 Auth,然后点击 Browse(浏览),打开刚才的转换好的“id_rsa.ppk”私钥;
最后回到 Session ,在 Host Name 下填入服务器的IP地址或者域名,Saved Sessions 下填入这个会话的会话名称(任意你喜欢的命名),然后点Save保存就设置好了。
接着双击会话名称就打开了登陆界面,与采用口令认证的提示不同,然后输入生成密码时设置的密钥密码既可登陆:
Login as: test
Authenticating with public key “imported-openssh-key”
Passphrase for key “imported-openssh-key”:
Last login: Wed May 31 12:35:00 2006 from 192.168.1.10
test@server:~$
Tips:你应该定期地同时更改公钥和私钥。
Ps:如果本身是FreeBSD,Linux或者Mac OS客户端,使用密钥更加简单,只需要将id_rsa放入~/.ssh文件夹并且确保.ssh文件夹的权限为700,id_rsa的权限为600即可正常登陆。
参考资料:
Using Putty on Windows to login Linux securely via OpenSSH
FreeBSD Handbook:OpenSSH