理解 RSA/DSA 认证
Daniel Robbins (drobbins@gentoo.org)
总裁/首席执行官,Gentoo Technologies,Inc.
2001 年 7 月

在本系列文章中,您将学习 RSA 和 DSA 认证的工作原理,连同了解如何正确配置无密码认证。在本系列的第一篇文章里,Daniel Robbins 主要介绍 RSA 和 DSA 认证协议并向您展示如何在网络上应用这些协议。

我们中有许多人把优秀的 OpenSSH(参见本文后面的参考资料)用作古老的 telnet 和 rsh 命令的替代品,OpenSSH 不但是安全的而且是加密的。OpenSSH 更加吸引人的特性之一是他能够使用基于一对互补的数字式密钥的 RSA 和 DSA 认证协议来认证用户。RSA 和 DSA 认证承诺不必提供密码就能够同远程系统建立连接,这是他的主要魅力之一。虽然这很吸引人,但是 OpenSSH 的新用户们常常以一种快速却不完善的方式配置 RSA/DSA,结果虽然实现了无密码登录,却也在此过程中开了一个很大的安全漏洞。



什么是 RSA/DSA 认证?
SSH,特别是 OpenSSH(完全免费的 SSH 的实现),是个不可思议的工具。类似于 telnet 或 rsh,ssh 客户程式也能够用于登录到远程机器。所需要的只是该远程机器正在运行 sshd,即 ssh 服务器进程。但是,和 telnet 不同的是,ssh 协议很安全。加密数据流,确保数据流的完整性,甚至安全可靠的进行认证他都使用了专门的算法。

然而,虽然 ssh 的确很棒,但还是有一个 ssh 功能组件常常被忽略、被危险的误用或简直就是被误解。这个组件就是 OpenSSH 的 RSA/DSA 密钥认证系统,他能够代替 OpenSSH 缺省使用的标准安全密码认证系统。

OpenSSH 的 RSA 和 DSA 认证协议的基础是一对专门生成的密钥,分别叫做专用密钥和公用密钥。使用这些基于密钥的认证系统的优势在于:在许多情况下,有可能不必手工输入密码就能建立起安全的连接。

尽管基于密钥的认证协议相当安全,但是当用户并不完全了解这些简化操作对安全性的影响,为了方便而使用某些简化操作时,就会出现问题。本文中,我们将周详讨论如何正确使用 RSA 和 DSA 认证协议,使我们不会冒任何不必要的安全性风险。在我的下一篇文章里,我将向您展示如何使用 ssh-agent 隐藏已解密的专用密钥,还将介绍 keychain,他是 ssh-agent 的前端,能够在不牺牲安全性的前提下提供许多便利。假如您一直想要掌控 OpenSSH 更高级的认证功能的话,那么就请您继续往下读吧。

RSA/DSA 密钥的工作原理
下面从整体上粗略的介绍了 RSA/DSA 密钥的工作原理。让我们从一种假想的情形开始,假定我们想用 RSA 认证允许一台本地的 Linux 工作站(称作 localbox)打开 remotebox 上的一个远程 shell,remotebox 是我们的 ISP 的一台机器。此刻,当我们试图用 ssh 客户程式连接到 remotebox 时,我们会得到如下提示:

% ssh drobbins@remotebox
drobbins@remotebox's password:

此处我们看到的是 ssh 处理认证的缺省方式的一个示例。换句话说,他需要我们输入 remotebox 上的 drobbins 这个帐户的密码。假如我们输入我们在 remotebox 上的密码,ssh 就会用安全密码认证协议,把我们的密码传送给 remotebox 进行验证。但是和 telnet 的情况不同,这里我们的密码是加密的,因此他不会被偷看到我们的数据连接的人截取。一旦 remotebox 把我们提供的密码同他的密码数据库相对照进行认证,成功的话,我们就会被允许登录,还会有一个 remotebox 的 shell 提示欢迎我们。虽然 ssh 缺省的认证方法相当安全,RSA 和 DSA 认证却为我们开创了一些新的潜在的机会。

但是,和 ssh 安全密码认证不同的是,RSA 认证需要一些初始配置。我们只需要执行这些初始配置步骤一次。之后,localbox 和 remotebox 之间的 RSA 认证就毫不费力了。要配置 RSA 认证,我们首先得生成一对密钥,一把专用密钥和一把公用密钥。这两把密钥有一些很有趣的性质。公用密钥用于对消息进行加密,只有拥有专用密钥的人才能对该消息进行解密。公用密钥只能用于加密,而专用密钥只能用于对由匹配的公用密钥编码的消息进行解密。RSA(和 DSA)认证协议利用密钥对的这些特别性质进行安全认证,并且无需在网上传输任何保密的信息。

要应用 RSA 或 DSA 认证,我们要执行一步一次性的配置步骤。我们把公用密钥拷贝到 remotebox。公用密钥之所以被称作是“公用的”有一个原因。因为他只能用于对那些给我们的消息进行 加密,所以我们无需太担心他会落入其他人手中。一旦我们的公用密钥已被拷贝到 remotebox 并且为了 remotebox 的 sshd 能够定位他而把他放在一个专门的文档(~/.ssh/authorized_keys)里,我们就为使用 RSA 认证登录到 remotebox 上做好了准备。

要用 RSA 登录的时候,我们只要在 localbox 的控制台键入 ssh drobbins@remotebox,就象我们常做的相同。可这一次,ssh 告诉 remotebox 的 sshd 他想使用 RSA 认证协议。接下来发生的事情很有趣。Remotebox 的 sshd 会生成一个随机数,并用我们先前拷贝过去的公用密钥对这个随机数进行加密。然后, sshd 把加密了的随机数发回给正在 localbox 上运行的 ssh。接下来,轮到我们的 ssh 用专用密钥对这个随机数进行解密后,再把他发回给 remotebox,实际上等于在说:“瞧,我确实有匹配的专用密钥;我能成功的对您的消息进行解密!”最后, sshd 得出结论,既然我们持有匹配的专用密钥,就应当允许我们登录。因此,我们有匹配的专用密钥这一事实授权我们访问 remotebox。

两项注意事项
关于 RSA 和 DSA 认证有两项重要的注意事项。第一项是我们的确只需要生成一对密钥。然后我们能够把我们的公用密钥拷贝到想要访问的那些远程机器上,他们都会根据我们的那把专用密钥进行恰当的认证。换句话说,我们并无需为想要访问的每个系统都准备一对密钥。只要一对就足够了。

另一项注意事项是专用密钥不应落入其他人手中。正是专用密钥授权我们访问远程系统,任何拥有我们的专用密钥的人都会被授予和我们完全相同的特权。如同我们不想让陌生人有我们的住处的钥匙相同,我们应该保护我们的专用密钥以防未授权的使用。在比特和字节的世界里,这意味着没有人是本来就应该能读取或是拷贝我们的专用密钥的。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!