OpenSSH 密钥管理
2013-11-01 14:08
155 查看
ssh-agent简介
ssh-agent是专为既令人愉快又安全的处理 RSA 和 DSA 密钥而设计的特殊程序,它包括在 OpenSSH分发内(请参阅 本系列文章的第
1 部分以得到关于 RSA 和 DSA 认证的介绍)。不同于
ssh,
ssh-agent是个长时间持续运行的守护进程(daemon),设计它的唯一目的就是对解密的专用密钥进行高速缓存。
ssh包含的内建支持允许它同
ssh-agent通信,允许
ssh不必每次新连接时都提示您要密码才能获取解密的专用密钥。对于
ssh-agent,您只要使用
ssh-add把专用密钥添加到
ssh-agent的高速缓存中。这是个一次性过程;用过
ssh-add之后,
ssh将从
ssh-agent获取您的专用密钥,而不会提示要密码短语来烦您了。
使用ssh-agent
让我们看一下整个
ssh-agent密钥高速缓存系统的工作过程。
ssh-agent启动时,在脱离 shell(外壳程序)并继续在后台运行之前它会输出一些重要的环境变量。以下是
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的输出是一系列 bash 命令;如果这些命令被执行,则将设置两个环境变量:SSH_AUTH_SOCK 和 SSH_AGENT_PID。内含的 export 命令使这些环境变量对之后运行的任何附加命令都可用。唔, 如果 shell 真对这些行进行计算,这一切才会发生,但是此时它们只是被打印到标准输出(stdout)而已。要使之确定,我们可以象下面这样调用
ssh-agent:
eval `ssh-agent` |
ssh-agent后对
ssh-agent的输出进行计算。shell 以这种调用方式(使用反引号,而不是普通的单引号)设置并导出 SSH_AGENT_PID 及 SSH_AUTH_SOCK 变量,使这些变量对于您在登录会话期间启动的所有新进程都可用。
启动
ssh-agent的最佳方式就是把上面这行添加到您的 ~/.bash_profile 中;这样,在您的登录 shell 中启动的所有程序都将看到环境变量,而且能够定位
ssh-agent,并在需要的时候向其查询密钥。尤其重要的环境变量是 SSH_AUTH_SOCK;SSH_AUTH_SOCK 包含有
ssh和
scp可以用来同
ssh-agent建立对话的 UNIX
域套接字的路径。
使用ssh-add
但是
ssh-agent启动时高速缓存当然是空的,里面不会有解密的专用密钥。在我们真能使用
ssh-agent之前,首先还需要使用
ssh-add命令把我们的专用密钥添加到
ssh-agent的高速缓存中。下面的示例中,我使用
ssh-add把我的 ~/.ssh/identity 专用 RSA 密钥添加到
ssh-agent的高速缓存中:
# ssh-add ~/.ssh/identity Need passphrase for /home/drobbins/.ssh/identity Enter passphrase for /home/drobbins/.ssh/identity (enter passphrase) |
ssh-add要我的密码短语来对专用密钥进行解密并存储在
ssh-agent的高速缓存中以备使用。一旦您已经用
ssh-add把专用密钥(或多个密钥)添加到
ssh-agent的高速缓存中, 并在当前的 shell 中(如果您在 ~/.bash_profile 中启动
ssh-agent,情况应当是这样)定义 SSH_AUTH_SOCK,那么您可以使用
scp和
ssh同远程系统建立连接而不必提供密码短语。
ssh-agent不足
ssh-agent确实棒,但是其缺省配置还是会留给我们一些小小的不便。让我们来看一下这些不足吧。
首先,~/.bash_profile 中的
eval `ssh-agent`使每次登录会话都会启动一个新的
ssh-agent副本;这不仅仅是有一丁点儿浪费,而且还意味着您得使用
ssh-add向每个新的
ssh-agent副本添加专用密钥。如果您只想打开系统上的一个终端或控制台,这没什么大不了的,但是我们中大多数人打开相当多的终端,每次新打开控制台都需要键入密码短语。从技术角度讲,既然一个
ssh-agent进程的确应当足够了,要是我们还需这样做,这毫无道理。
有关
ssh-agent的缺省设置的另外一个问题是它同 cron 作业不兼容。由于 cron 作业是 cron 进程启动的,这些作业无法从它们的环境中继承 SSH_AUTH_SOCK 变量,因而也无从知道
ssh-agent进程正在运行以及如何同它联系。事实证明这个问题也是可以修补的。
开始用到 keychain
为了解决这些问题,我编写了一个有用的
ssh-agent前端,它基于 bash,叫做
keychain。
keychain的特别之处在于它允许 每个系统使用一个
ssh-agent进程,而非每次登录会话。这意味着您只需对每个专用密钥执行一次
ssh-add,就一次。正如我们稍后将要看到的一样,
keychain甚至有助于优化
ssh-add,而这只要它试图向那些正在运行的
ssh-agent添加其高速缓存中没有的专用密钥。
以下对
keychain如何工作从头到尾浏览一遍。从 ~/.bash_profile 中启动时,
keychain将首先查看
ssh-agent是否已经在运行了。如果没有,它就启动
ssh-agent并把重要的 SSH_AUTH_SOCK 和 SSH_AGENT_PID 变量记录在 ~/.ssh-agent 文件中,一方面为了安全而保存,另一方面也是为了以后的使用。这是启动
keychain的最佳途径;同使用平淡无奇的老式
ssh-agent一样,我们在
~/.bash_profile 内部执行必要的配置:
#!/bin/bash #example ~/.bash_profile file /usr/bin/keychain ~/.ssh/id_rsa #redirect ~/.ssh-agent output to /dev/null to zap the annoying #"Agent PID" message source ~/.ssh-agent > /dev/null |
keychain我们用 source 命令读入并执行 ~/.ssh-agent 文件,而不是象我们直接使用
ssh-agent时所做的对输出进行计算。但是,结果是一样的:定义了非常重要的 SSH_AUTH_SOCK,而且正运行
ssh-agent以备使用。同时,因为 SSH_AUTH_SOCK 被记录在 ~/.ssh-agent 里,只要用 source 命令读入并执行 ~/.ssh-agent 文件,就可以轻易的把我们的
shell 脚本及 cron 作业同
ssh-agent连接起来。
keychain本身也利用了这个文件;您应该记住
keychain启动时,它会查看现有的
ssh-agent是否正在运行。如果是,则它使用 ~/.ssh-agent 文件来获得适当的 SSH_AUTH_SOCK 设置,这样就使
keychain能使用现有的代理程序而不必新启动一个。只有在 ~/.ssh-agent
文件无效(指向一个不存在的
ssh-agent)或 ~/.ssh-agent 文件本身不存在时,
keychain才会启动新的
ssh-agent进程。
安装 keychain
http://www.ibm.com/developerworks/cn/linux/security/openssh/part1/index.html
http://www.ibm.com/developerworks/cn/linux/security/openssh/part2/
相关文章推荐
- OpenSSH 密钥管理:RSA/DSA 认证
- 通用线程: OpenSSH 密钥管理,第 1 部分
- OpenSSH 密钥管理:RSA/DSA 认证
- OpenSSH 密钥管理:ssh-agent和keychain
- OpenSSH 密钥管理:ssh-agent和keychain
- OpenSSH 密钥管理,第 1 部分
- OpenSSH 密钥管理,第 2 部分
- OpenSSH 密钥管理,第 3 部分
- OpenSSH 密钥管理:RSA/DSA 认证
- 通用线程: OpenSSH 密钥管理,第 1 部分
- OpenSSH 密钥管理:ssh-agent和keychain
- 通用线程: OpenSSH 密钥管理,第 2 部分
- OpenSSH 密钥管理:RSA/DSA 认证
- OpenSSH 密钥管理:ssh-agent和keychain
- openssh的密钥管理
- OpenSSH 密钥管理:RSA/DSA 认证(转载)
- openssh tip (沉睡不醒blog)
- 编译安装 openssl & openssh
- 在windows下使用OpenSSH
- [转载]putty使用密钥登陆OpenSSH