全部博文(2005)
分类: 系统运维
2008-01-18 20:25:26
OpenSSH 特性之一是它能够使用基于一对互补的数字式密钥的 RSA 和 DSA 认证协议来认证用户。
RSA 和 DSA 认证承诺不必提供密码就能够同远程系统建立连接,这是它的主要魅力之一。
虽然这非常吸引人,但是 OpenSSH 的新用户们常常以一种快速却不完善的方式配置 RSA/DSA,
结果虽然实现了无密码登录,却也在此过程中开了一个很大的安全漏洞
RSA/DSA 密钥的工作原理
1.生成一对密钥,一把专用密钥和一把公用密钥,公用密钥用于对消息进行加密,只有拥有专用密钥的人才能对该消息进行解密。
公用密钥只能用于加密,而专用密钥只能用于对由匹配的公用密钥编码的消息进行解密。
2.公用密钥拷贝到 remotebox,把它放在一个专门的文件(~/.ssh/authorized_keys)里
3.ssh 告诉 remotebox 的 sshd 它想使用 RSA 认证协议。Remotebox 的 sshd 会生成一个随机数,
并用公用密钥对这个随机数进行加密。然后, sshd 把加密了的随机数发回给正在 localbox 上运行的 ssh。
接下来, ssh 用专用密钥对这个随机数进行解密后,再把它发回给 remotebox。 sshd 得出结论,既然持有匹配的专用密钥,
就应当允许登录
注意事项
ssh 被设置成了文件权限允许除用户之外的任何人读取密钥,就打印出一条大大的警告消息。
其次,用 ssh-keygen 创建公用/专用密钥对的时候,ssh-keygen 会要求输入一个密码短语。
错误的做法
密码短语设置为空,以实现无密码认证。
操作步骤:
1.RSA 密钥对的生成
% ssh-keygen
2.RSA 公用密钥的安装
% scp ~/.ssh/identity.pub
% cat identity.pub >> ~/.ssh/authorized_keys
% exit
3.错误排除:
第一,尝试通过输入 ssh -1 登录。它会让 ssh 只应用 ssh 协议版本 1
第二,确认 /etc/ssh/ssh_config 里没有写着这么一行 RSAAuthentication no。如果有的话,请在前面加上一个“#”把这行注释掉
DSA 密钥的生成
ssh 协议的版本 1 使用的是 RSA 密钥,而 DSA 密钥却用于协议级 2。
% ssh-keygen -t dsa
DSA 公用密钥的安装
~/.ssh/authorized_keys2
介绍 ssh-agent
不同于 ssh,ssh-agent 是个长时间持续运行的守护进程(daemon),设计它的唯一目的就是对解密的专用密钥进行高速缓存。
对于 ssh-agent,您只要使用 ssh-add 把专用密钥添加到 ssh-agent 的高速缓存中。这是个一次性过程;用过 ssh-add 之后,ssh 将从 ssh-agent 获取您的专用密钥,而不会提示要密码短语来烦您了。
使用 ssh-agent
% ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XX4LkMJS/agent.26916; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26917; export SSH_AGENT_PID;
echo Agent pid 26917;
使之确定,我们可以象下面这样调用 ssh-agent:
eval `ssh-agent`
使用 ssh-add
把 ~/.ssh/identity 专用 RSA 密钥添加到 ssh-agent 的高速缓存中:
# ssh-add ~/.ssh/identity
ssh-agent 的不足之处
首先,~/.bash_profile 中的 eval `ssh-agent` 使每次登录会话都会启动一个新的 ssh-agent 副本;
每次新打开控制台都需要键入密码短语。
同 cron 作业不兼容。
解决方法
使用keychain
http://www-900.ibm.com/developerWorks/cn/linux/security/openssh/part1/index.shtml
http://www-900.ibm.com/developerWorks/cn/linux/security/openssh/part2/index.shtml
http://www-900.ibm.com/developerWorks/cn/linux/security/openssh/part3/index.shtml