我一直在 Debian 中为不同的帐户(即 Digital Ocean、GitHub 和 Bitbucket)创建多个 SSH 密钥,但它很快变得混乱。
列出我的 .ssh 文件夹中的内容,我得到:
digOcn digOcn.pub github github.pub id_rsa id_rsa.pub
Run Code Online (Sandbox Code Playgroud)
(我使用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)
Run Code Online (Sandbox Code Playgroud)
是的,我过去曾添加过 SSH 密钥,但我无法追溯我所做的事情。这可能就是为什么同时存在/home/USER/.ssh/github
和的原因 github
。
我做错了什么?我应该如何组织我的 SSH 密钥?
首先,为不同的帐户使用不同的密钥没有错。这对于交互式 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
Run Code Online (Sandbox Code Playgroud)
该文件~/.ssh/config
应该具有权限 0600(我现在不记得是否由 SSH 强制执行,但它肯定不会受到伤害)。
当然,您也可以对交互式 shell 使用相同的机制,因此可以设置诸如远程用户名(如果与本地用户名不同)、远程端口、缩短主机名等内容。例如:
Host sm
Hostname sphygmomanometer.example.com
User human
Port 2222
Run Code Online (Sandbox Code Playgroud)
然后你可以运行
ssh sm
Run Code Online (Sandbox Code Playgroud)
代替
ssh -p 2222 human@sphygmomanometer.example.com
Run Code Online (Sandbox Code Playgroud)
还允许使用通配符:
Host *
ControlPath ~/.ssh/ctl-%u-%r-%h-%p
ControlMaster auto
ControlPersist 5m
Run Code Online (Sandbox Code Playgroud)
阅读手册了解更多详情。
最后但并非最不重要的一点:不要“做那eval 'ssh-agent -s'
件事”。与流行的看法相反,这有严重的安全隐患。正确的做法是这样的:
ssh-agent /bin/bash
ssh-add
Run Code Online (Sandbox Code Playgroud)
(然后在提示时输入您的密钥密码)。就是这样,不要一键一键地做,或以任何其他方式。
这将运行一个新的 shell,您的密钥在其中加载,当您想撤销访问时,您只需使用exit
这个 shell。如果您“做这eval 'ssh-agent -s'
件事”,那么身份验证代理在您注销后仍会运行很长时间,并且它们可以(并且最终将)用于未经授权的访问。
编辑:试试这个小实验:
eval $(ssh-agent -s)
pgrep ssh-agent
没有人会杀死这些ssh-agent
s,它们会一直待到下一个reboot
,准备被最新的恶意软件使用。