如何获得加密的 SSH 密钥以供主动使用?

如何获得加密的 SSH 密钥以供主动使用?

我使用带有私钥/公钥的无密码 SSH 密钥。

我读了 O'reilly 的 SSH 书,其中提到你可以使用以下方法获得无需密码的加密 SSH 密钥:

  1. SSH 代理,
  2. 基于主机的身份验证,或
  3. Kerberos 身份验证

我不完全确定他们说这些是什么意思。

如何拥有一个可供主动使用的加密 SSH?

答案1

运行 SSH 代理(临时为您保存未锁定的密钥的进程):

eval $(ssh-agent)

然后将受密码保护的密钥添加到代理(以便它可以在被询问时出示密钥):

ssh-add ~/.ssh/my_protected_key

(提示时输入您的密码)

然后,当您尝试登录到想要使用受密码保护的密钥的系统时,代理将提供该密钥,而您无需手动输入密码。

完成后,您可以再次停止代理:

ssh-agent -k

这将防止某人访问您的帐户(和正在运行的代理)并使用密钥。

答案2

Nugget 关于公钥认证的一般论文

为什么我要使用公钥认证?

密码并不是世界上最安全的东西。即使用户选择了比狗的名字还要强大的“安全”密码,该密码仍然容易受到暴力攻击。通过 ssh 对用户密码进行暴力攻击在互联网上非常常见,几种流行的蠕虫和僵尸不断对任何连接互联网的主机进行自动攻击。即使是安全的密码也有可能受到这些攻击,无论是手动攻击还是蠕虫攻击。允许密码访问具有许多用户的系统会引发安全漏洞。

此外,如果您在大量主机上拥有帐户,您可能会在多个主机上重复使用相同的密码,以减少您必须记住的密码数量。远程系统上的每个共享密码都会使您面临更大的主机密码文件遭受暴力攻击的风险,这意味着如果一台主机受到攻击,则共享相同密码的所有其他主机的安全性都会大大降低。哎呀,您可能会在某天不小心将密码“erp”到 IRC 频道中,然后花一下午的时间查找所有重复使用该密码的系统,以便在别人发现之前更改密码。这可不是什么好事(至少我听说过!)

值得庆幸的是,有一个解决方案!OpenSSH 内置了一个强大且经过充分测试的公钥身份验证系统。如果设置正确,它不仅比使用密码更安全,而且使用起来也容易得多。这种情况经常发生吗?

公钥到底是什么意思?

公钥认证(或 PKI——公钥基础设施)是一种依赖于生成的公钥/私钥对的认证方法。使用 PKI 会生成一个特殊的“密钥”,它具有一个非常有用的特性:任何能够读取密钥公钥部分的人都可以加密数据,而这些数据只有能够访问密钥私钥部分的人才能读取。这样,能够访问密钥公钥部分的人就可以向任何拥有私钥部分的人发送秘密信息,还可以验证某人是否确实有权访问私钥部分。很容易看出这种技术如何用于认证。

作为用户,您可以生成密钥对,然后将密钥的公钥部分放在远程系统上。然后,该远程系统可以验证您的身份,或者证明您确实是您,并且只需让您证明您有权访问密钥对的私钥部分,即可允许您登录。此操作在 SSH 内部的协议级别完成,并且会自动发生。

但这确实意味着您需要保护私钥的隐私。在没有 root 权限的共享系统上,可以通过使用密码加密私钥来实现,密码的作用类似于密码。在 SSH 读取您的私钥以执行公钥身份验证之前,您需要提供密码,以便解密私钥。在更安全的系统上(例如只有您一个人使用的机器,或者家里没有陌生人可以物理访问的机器),您可以通过创建未加密的公钥(没有密码)或输入一次密码,然后在您使用计算机期间将密钥缓存在内存中来简化此过程。OpenSSH 包含一个名为 ssh-agent 的工具,可简化此过程。

我该如何设置?

首先需要使用 OpenSSH 中的 ssh-keygen 工具生成密钥对。使用 PuTTY 的 Windows 用户也可以使用相关的 putty-keygen.exe 程序。SecureCRT 也内置了密钥对生成器。以下是创建密钥对的日志:

luser@localhost:~$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/luser/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/luser/.ssh/id_dsa.
Your public key has been saved in /home/luser/.ssh/id_dsa.pub.
The key fingerprint is:
f3:77:56:58:a8:bb:08:59:67:15:2c:0e:1d:d0:40:a3 [email protected]
luser@localhost:~$ 

现在您有了组成密钥对的两部分。文件 id_dsa 是私有部分,文件 id_dsa.pub 是公共部分。您需要确保只有您可以读取私有文件。这一点至关重要,因为 OpenSSH 将拒绝使用世界或群组可读的密钥文件。请按如下方式验证:

luser@localhost:~$ chmod 700 $HOME/.ssh
luser@localhost:~$ chmod 600 $HOME/.ssh/id_dsa*
luser@localhost:~$ ls -la .ssh
total 10
drwx------   2 luser  luser   512 Nov 15 16:12 .
drwx-----x  12 luser  luser  1024 Jun 24  2004 ..
-rw-------   1 luser  luser  1264 Nov 15 16:12 id_dsa
-rw-------   1 luser  luser  1123 Nov 15 16:12 id_dsa.pub
luser@localhost:~$ 

现在我们已经完成了一半。您已经获得了密钥对,但我们需要将密钥的公共部分放在远程机器上。如果您在自己喜欢的编辑器中查看 id_dsa.pub 文件,您会发现它只是一大堆数字和字母。这意味着它很容易剪切和粘贴,这比尝试使用 sftp 或 scp 等文件传输协议将其发送到远程机器更简单。通常最简单的方法是打开另一个终端窗口并将其粘贴到另一台主机。无论哪种情况,您都需要获取 id_dsa.pub 的内容并将其塞入远程主机上名为 $HOME/.ssh/authorized_keys 的文件中。与以前一样,确保 .ssh 目录仅可由您读取(chmod 700),并且 authorized_keys 文件也是如此(chmod 600)。您最终应该得到类似以下内容:

luser@remotehost:~$ls -la .ssh
total 16
drwx------  2 luser  luser   512 Jul 11 19:01 .
drwx--x--x  7 luser  luser  1024 Nov 14 18:01 ..
-rw-------  1 luser  luser  1123 Nov 15 16:21 authorized_keys

现在,您已准备好使用公钥身份验证登录。远程主机不再要求您输入密码,而是要求您输入用于加密本地私钥的密码。试一试:

luser@localhost:~$ssh remotehost.example.com
Enter passphrase for key '/home/luser/.ssh/id_dsa': 
Last login: Tue Nov 15 16:20:50 2005 from localhost.example.com

luser@remotehost:~$ 就是这样!实际上,远程主机端的用户帐户甚至不需要密码。没有密码(与 NULL 密码不同)甚至不可能在没有私钥的情况下登录远程系统。这使帐户完全免受暴力密码攻击。不过,还有其他好处。您实际上可以将多个公钥放入远程主机上的 authorized_keys 文件中。这意味着如果您经常从多个位置进行 ssh,则可以生成多个私钥。例如,您可以为家里的计算机和办公室的计算机创建单独的密钥对。远程主机在 authorized_keys 文件中可能只有一个或两个密钥。您可以为工作笔记本电脑创建第三个密钥对。

为什么需要多个密钥?想象一下,如果您的笔记本电脑丢失或被盗。您只需登录远程主机并从您的 authorized_keys 文件中删除该特定公钥,笔记本电脑将无法登录远程主机,即使有人设法破解或猜出保护私钥的密码。这样,“撤销”密钥对就很简单了。

您还会发现,您不再想与多个远程主机共享一个密码,这会大大提高您的整体安全性,因为如果一个远程主机上的帐户受到威胁,它就无法链接到其他主机上的任何其他帐户。

高级用法:ssh 代理

实际上,您可以将公钥身份验证更进一步,通过在本地缓存私钥,让您的工作更加轻松。OpenSSH 包含一个名为“ssh-agent”的工具,可用于实现此目的。这在无密码私钥的易用性和加密私钥的安全性之间提供了一种折衷方案,以防有人未经授权访问实际文件。您可以在本地计算机上运行 ssh-agent,并使用它来缓存私钥以供重复使用。

使用 ssh-agent 的关键是将其作为用户会话本身的父进程启动。许多 Unix 已经为您执行此操作,如果您检查进程列表,您可能会发现 ssh-agent 已在运行以提供此功能。使用 PuTTY 的 Windows 用户可以使用 PuTTY 的“pagaent.exe”工具,而 Mac OS X 用户可以下载第三方工具(如 SSHKeyChain)或使用命令行 ssh-agent,就像使用任何其他 Unix 一样。[编辑:OS X 10.5“Leopard”内置了 ssh 代理支持。如果您运行的是 Leopard,则无需安装任何其他软件] 如果您的操作系统没有为您运行 ssh-agent,您需要将其作为登录过程的一部分进行调用。例如,您可以将 gdm 或 xdm 登录更改为调用“ssh-agent gnome-session”,而不仅仅是“gnome-session”,以便 ssh-agent 可以位于您的会话之上。关键是确保 SSH_AUTH_SOCK 和 SSH_AGENT_PID 环境变量对于主机上的会话是全局的。使用 ssh-agent 驻留,您可以手动运行它并使用 ssh-add 将您的私钥存储在其中:

luser@localhost:~$ ssh-add ~/.ssh/id_dsa
Need passphrase for /home/luser/.ssh/id_dsa ([email protected]).
Enter passphrase:
luser@localhost:~$

完成上述操作后,您现在应该能够通过 ssh 连接到任何远程主机,而无需输入密码。OpenSSH 将与本地 ssh-agent 守护进程通信并自动从中检索私钥。该身份验证甚至可以(可选)通过隧道传输到远程主机,这意味着如果您从该远程主机通过 ssh 跳转到第三个主机,身份验证可以传递回您的本地 ssh-agent,并且仍然不需要输入密码或密码。

请注意,使用 ssh-agent 会使您的私钥面临风险,任何在 ssh-agent 所在机器上具有 root 访问权限的人都可能获取您的私钥。在您不是或不信任管理员的机器上使用 ssh-agent 是不明智的。允许 OpenSSH 将身份验证转发到您不是或不信任管理员的机器上也是不明智的。您可以使用命令行中的 -A 或 -a 开关或通过在 $HOME/.ssh/config 文件中设置选项来控制是否进行此代理转发,如下所示:

#
# .ssh/config file for luser@localhost
#

# Forward X11 and Auth to slacker.com hosts, they can be trusted
Host *.slacker.com 
ForwardAgent              yes
ForwardX11                yes

# Forward X11 and Auth to my trusted example.com hosts
Host *.example.com
ForwardAgent              yes
ForwardX11                yes

# All hosts which haven't been matched above, paranoid settings
Host *
ForwardAgent              no 
ForwardX11                no
Compression               yes
KeepAlive                 yes

就是这样!

一旦你习惯了使用公钥身份验证,你就会想知道如果没有它你是如何生活的。它真的很棒。它不仅更安全,而且使使用 SSH 变得更简单、更强大。尽情享受吧!

该文本是我个人网站上的一份文档的转发,但我无法链接到它,因为我是 serverfault 上的新用户。

答案3

使用 ssh-agent,您可以输入密码来解锁您的私钥,这样您就可以远程连接到任意数量的不同远程机器,而无需一遍又一遍地询问您的密码。

在 Mac OS X 这样的系统上,ssh-agent 与 Keychain 绑定,您只需输入您的登录钥匙串密码,ssh-agent 将自动使用您钥匙串中的密码。

答案4

对于交互式使用,请勿使用没有密码的密钥。请改用 ssh-agent/ssh-add,因为这将允许您在会话开始时仅输入一次密码。这非常方便,而且比不使用密码安全得多。

仅有的我认为,有时使用不带密码的密钥可以用于特殊用途的服务器间通信,例如备份服务器与备份客户端通信(反之亦然)。对于这些情况,不使用密码,但使用单独的用户名,并限制其使用 ssh 的 ForceCommand 等可以执行的操作。

相关内容