如何组织SSH密钥?

Jer*_*say 4 ssh ssh-agent

我一直在 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_rsaBitbucket的密钥。)

我做这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 密钥?

Sat*_*ura 5

首先,为不同的帐户使用不同的密钥没有错。这对于交互式 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'件事”,那么身份验证代理在您注销后仍会运行很长时间,并且它们可以(并且最终将)用于未经授权的访问。

编辑:试试这个小实验:

  1. eval $(ssh-agent -s)
  2. 注销或终止终端
  3. 重新登录,或者打开一个新的终端
  4. pgrep ssh-agent

没有人会杀死这些ssh-agents,它们会一直待到下一个reboot,准备被最新的恶意软件使用。