我一直在 Debian 中为不同的帐户(即 Digital Ocean、GitHub 和 Bitbucket)创建多个 SSH 密钥,但它很快就会变得混乱。
列出 .ssh 文件夹中的内容,我得到:
digOcn digOcn.pub github github.pub id_rsa id_rsa.pub
(我使用id_rsa
Bitbucket 的密钥。)
我做了这eval 'ssh-agent -s'
件事,然后“添加”键,如下所示:
ssh-add ~/.ssh/github
(然后输入密码)ssh-add ~/.ssh/id_rsa
(然后输入密码)ssh-add ~/.ssh/digOcn
(当我尝试添加 时digOcn
,它显示“权限被拒绝”。我不会试图sudo
避免弄乱某些东西,而且因为其他键不需要sudo
。)
这是令人困惑的部分:表演ssh-add -l
给了我这个:
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 /home/USER/.ssh/id_rsa (RSA)
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 /home/USER/.ssh/github (RSA)
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 github (RSA)
2048 so:me:nu:mb:er:s0:an:d9:le:tt:er:s0 USER@COMPUTER_NAME (RSA)
是的,我过去添加过 SSH 密钥,但我无法追溯我所做的事情。这可能就是为什么两者都有/home/USER/.ssh/github
和 github
。
我做错了什么?我应该如何组织我的 SSH 密钥?
答案1
首先,不同的账户使用不同的密钥并没有什么问题。对于交互式 shell 来说,这几乎是大材小用,但是当您处理其他非交互式服务时,这样做是有正当理由的。例如,几年前 GitHub 开始允许使用更强的 SSH 密钥,而 Bitbucket 则坚持使用较弱的密钥一段时间。当时正确的做法是使用不同的密钥来访问 GitHub 和 Bitbucket。
另一个例子是rsync
。例如,如果您用于rsync
将文件部署到 Web 服务器,那么您可能需要专用的 SSH 密钥。这些允许您设置与交互式帐户通常使用的权限不同的权限。
回到关于管理多个密钥的问题:SSH 允许您为不同的目的地设置不同的选项。为此,您需要编辑~/.ssh/config
如下文件:
Host bitbucket.org
User hg
IdentitiesOnly yes
IdentityFile /home/user/.ssh/bitbucket
Host github.com gist.github.com
User git
IdentitiesOnly yes
IdentityFile /home/user/.ssh/github
该文件~/.ssh/config
应该具有权限 0600(我现在不记得这是否是由 SSH 强制执行的,但这肯定不会有什么坏处)。
当然,您也可以对交互式 shell 使用相同的机制,因此请设置远程用户名(如果与本地用户名不同)、远程端口、缩短主机名等内容。例如:
Host sm
Hostname sphygmomanometer.example.com
User human
Port 2222
然后你就可以运行
ssh sm
代替
ssh -p 2222 [email protected]
还允许使用通配符:
Host *
ControlPath ~/.ssh/ctl-%u-%r-%h-%p
ControlMaster auto
ControlPersist 5m
请阅读手册了解更多详细信息。
最后但并非最不重要的:不“做事eval 'ssh-agent -s'
”。与普遍看法相反,这会带来严重的安全隐患。正确的做法是这样的:
ssh-agent /bin/bash
ssh-add
(然后在出现提示时输入您的密钥密码)。仅此而已,不要逐个按键或任何其他方式进行操作。
这会运行一个新的 shell,在其中加载您的密钥,当您想要撤销访问权限时,只需使用exit
此 shell。如果您“执行该eval 'ssh-agent -s'
操作”,那么身份验证代理将在您注销后长时间运行,并且它们可以(并且最终将)用于未经授权的访问。
编辑:尝试这个小实验:
eval $(ssh-agent -s)
- 注销,或终止终端
- 重新登录,或打开新终端
pgrep ssh-agent
没有人会杀死这些ssh-agent
s,它们会一直徘徊直到下一次reboot
,准备被最新的恶意软件使用。