`
fly.net.cn
  • 浏览: 186748 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OpenSSH 密钥管理

    博客分类:
  • ssh
阅读更多
在本系列文章中,您将学习 RSA 和 DSA 认证的工作原理,以及了解如何正确设置无密码认证。在本系列的第一篇文章里,Daniel Robbins 主要介绍 RSA 和 DSA 认证协议并向您展示如何在网络上应用这些协议。在本系列文章中,您将学习 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 认证有两项重要的注意事项。第一项是我们的确只需要生成一对密钥。然后我们可以把我们的公用密钥拷贝到想要访问的那些远程机器上,它们都会根据我们的那把专用密钥进行恰当的认证。换句话说,我们并不需要为想要访问的 每个系统都准备一对密钥。只要一对就足够了。

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

ssh 的开发者们当然知道专用密钥的重要性,而且他们已经在 ssh 和 ssh-keygen 里加入了一些防范措施,以防止我们的专用密钥被滥用。首先, ssh 被设置成了如果我们的密钥的文件权限允许除我们之外的任何人读取密钥,就打印出一条大大的警告消息。其次,在我们用 ssh-keygen 创建公用/专用密钥对的时候, ssh-keygen 会要求我们输入一个密码短语。如果我们输入了密码短语, ssh-keygen 就会用该密码短语加密我们的专用密钥,这样,即使专用密钥被盗,对于那些碰巧不知道密码短语的人而言,这把专用密钥是毫无用处的。具备了这一知识后,让我们看一下如何设置 ssh 以应用 RSA 和 DSA 认证协议。

ssh-keygen 细探

设置 RSA 认证的第一步从生成一对公用/专用密钥对开始。RSA 认证是 ssh 密钥认证的最初形式,因此 RSA 应该可以用于 OpenSSH 的所有版本,尽管这样,我还是推荐您安装可用的最近版本,在我写这篇文章的时候是 openssh-2.9_p2。生成一对 RSA 密钥的方法如下:

%
ssh-keygen
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/drobbins/.ssh/identity):
(hit enter)
Enter passphrase (empty for no passphrase):
(enter a passphrase)
Enter same passphrase again:
(enter it again)
Your identification has been saved in /home/drobbins/.ssh/identity.
Your public key has been saved in /home/drobbins/.ssh/identity.pub.
The key fingerprint is:
a4:e7:f2:39:a7:eb:fd:f8:39:f1:f1:7b:fe:48:a1:09 drobbins@localbox

当 ssh-keygen 要求输入存放密钥的缺省位置时,我们敲回车键接受缺省的 /home/drobbins/.ssh/identity。 ssh-keygen 将把专用密钥保存在此路径中, 公用密钥就存在紧临它的一个叫做 identity.pub 的文件里。

还要请您注意一下 ssh-keygen 还提示过我们输入密码短语。当时我们输入了一个好的密码短语(七位或者更多位难以预测的字符)。然后 ssh-keygen 用这个密码短语加密了我们的专用密钥(~/.ssh/identity),以使我们的专用密钥对于那些不知道这个密码短语的人将变得毫无用处。

追求快速的折衷方案

当我们指定密码短语时,虽然这使得 ssh-keygen 保护我们的专用密钥以防误用,但是也带来了一点小小的不便。现在,每当我们试图用 ssh 连接到 drobbins@remotebox 帐户时, ssh 都会提示我们输入该密码短语以便它能对我们的专用密钥进行解密,并使用我们的专用密钥进行 RSA 认证。此外,我们输入的不是 remotebox上 drobbins 帐户的密码,而是在本地机器上对专用密钥进行解密所需要的密码短语。一旦我们的专用密钥被解密,我们的 ssh 客户程序就会处理其余的事情。虽然使用我们的远程密码和使用 RSA 密码短语的机制完全不同,但实际上还是会提示我们输入一个“保密的短语”给 ssh 。

#
ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity':
(enter passphrase)
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org

Welcome to remotebox!

%

这里就是人们经常会被误导而导致追求快速的折衷方案的地方。有很多时候,仅仅是为了不必输入密码,人们就会创建不加密的专用密钥。那样的话,他们只要输入 ssh 命令,立刻就会通过 RSA(或是 DSA)认证并登录。

#
ssh drobbins@remotebox
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org

Welcome to remotebox!

%

然而,尽管这样很方便,但是在还没有完全理解这种方法对安全性的影响时,您不应该使用。如果有人在某一时刻闯入了 localbox,一把不加密的专用密钥使得他们也自动有权访问 remotebox以及其它所有用这把公用密钥配置过的系统。

我知道您在想些什么。无密码认证,虽然有点冒险,可看起来的确很诱人。我完全同意。但是, 还有更好的办法!请相信我,我将向您展示如何既可以享受到无密码认证的好处,又不必牺牲专用密钥的安全性。在我的下一篇文章里,我还将向您展示如何熟练的使用 ssh-agent (正是它最先使得 安全无密码认证成为可能)。现在,让我们通过设置 RSA 和 DSA 认证为使用 ssh-agent 做好准备。下面是逐步的指导。

RSA 密钥对的生成

要设置 RSA 认证,我们需要执行生成公用/专用密钥对的一次性步骤。我们的输入如下:

%
ssh-keygen

出现提示时,请接受缺省的密钥位置(典型的情况下是 ~/.ssh/identity 和存储公用密钥的 ~/.ssh/identity.pub),并提供给 ssh-keygen 一个安全的密码短语。一旦 ssh-keygen 完成,您将会得到一把公用密钥和一把用密码短语加密的专用密钥。

RSA 公用密钥的安装

接下来,我们需要把正在运行 sshd 的远程系统设置成使用我们的 公用 RSA 密钥进行认证。典型情况下,我们通过象下面这样把公用密钥拷贝到远程系统完成这一步:

%
scp ~/.ssh/identity.pub drobbins@remotebox:

由于 RSA 认证还没有完全设置好,所以会提示我们输入 remotebox上的密码。请您照做。然后,登录到 remotebox 并把公用密钥附加到文件 ~/.ssh/authorized_keys 上,如下所示:

%
ssh drobbins@remotebox
drobbins@remotebox's password:
(enter password)
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org

Welcome to remotebox!

%
cat identity.pub >> ~/.ssh/authorized_keys
%
exit

现在,配置过 RSA 认证以后,当我们试图使用 ssh 连接到 remotebox 时,应该会提示我们输入 RSA 密码短语(而不是我们的 密码)。

%
ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity':

好哇,RSA 认证的配置完成了!如果刚才没有提示您输入密码短语,您可以试验一下以下几种情况。第一,尝试通过输入 ssh -1 drobbins@remotebox 登录。它会让 ssh 只应用 ssh 协议版本 1,如果出于某种原因远程系统缺省设置的是 DSA 认证的话,可能会要求这么做。如果不奏效的话,请确认您的 /etc/ssh/ssh_config 里没有写着这么一行 RSAAuthentication no 。如果有的话,请您在前面加上一个“#”把这行注释掉。另外,还可以试着同 remotebox 的系统管理员联络,核实一下在他们那一端已经启用了 RSA 认证,并且 /etc/ssh/sshd_config 里的设置是正确的。

DSA 密钥的生成

ssh 协议的版本 1 使用的是 RSA 密钥,而 DSA 密钥却用于协议级 2,这是 ssh 协议的最新版本。目前所有的 OpenSSH 版本都应该既能使用 RSA 密钥又能使用 DSA 密钥。DSA 密钥以如下类似于 RSA 密钥的方式使用 OpenSSH 的 ssh-keygen 生成:

%
ssh-keygen -t dsa

又会提示我们输入密码短语。输入一个安全的密码短语。还会提示我们输入保存 DSA 密钥的位置。正常情况下,缺省的 ~/.ssh/id_dsa 和 ~/.ssh/id_dsa.pub 就可以了。在我们一次性生成 DSA 密钥完成后,就该把我们的 DSA 公用密钥安装到远程系统上去了。

DSA 公用密钥的安装

DSA 公用密钥的安装又是几乎和 RSA 安装完全一样。对于 DSA,我们将要把 ~/.ssh/id_dsa.pub 文件拷贝到 remotebox,然后把它附加到 remotebox 上的 ~/.ssh/authorized_keys2 文件。请注意这个文件的名字和 RSA 的 authorized_keys 文件名不同。一旦配置完毕,输入我们的 DSA 专用密钥的密码短语就应该能登录到 remotebox,而不需要我们输入在 remotebox 上真正的密码。

分享到:
评论

相关推荐

    openssh最新升级包

    对于一个专业的IT管理员来说,了解如何正确管理和升级OpenSSH是非常必要的。这不仅涉及基本的RPM包管理知识,还需要理解安全更新的重要性和实施策略。此外,对于运行关键业务的服务器,计划和执行这种升级通常需要在...

    openssh漏洞修复

    Linux 下openssh版本升级到7.5 P1可以解决多个22端口的漏洞

    OPENSSH7.4版本到openssh9.4版本合集

    通过这个合集,IT管理员和开发者可以研究不同版本间的差异,理解OpenSSH如何随着时间和安全威胁的变化而演进。同时,对于那些需要在旧系统上运行OpenSSH或者进行版本回溯测试的用户来说,这个合集也非常有价值。总之...

    Toolkit for OpenSSH Key Administration-开源

    OpenSSH Key Administration Toolkit(简称TOSKA)是一个专门针对网络管理员设计的开源项目,它解决了OpenSSH密钥管理的痛点,为用户提供了一种集中、高效且安全的方式来管理公钥基础设施。本文将深入探讨TOSKA的...

    openssh9.0p1的rpm文件

    在描述中提到的“内含openssh9.0p1版的所有rpm文件”,这表明这是一个针对 RPM 包管理系统的软件包集合。RPM(Red Hat Package Manager)是Linux发行版如Fedora、CentOS、RHEL等常用的软件包格式,用于安装、升级、...

    openssh-7.4p1.tar.gz

    使用ssh-add, ssh-keysign, ssh-keyscan和 ssh-keygen进行密钥管理 。 服务 端由sshd, sftp-server和 ssh-agent组成。 OpenSSH是由OpenBSD项目的一些开发人员开发的, 并且可以使用BSD格式的许可证。 ...

    openssh-server离线安装包

    OpenSSH Server允许管理员和用户通过加密通道进行远程访问,执行各种系统管理任务,如文件传输、命令执行等。 2. **Ubuntu中的OpenSSH Server**:Ubuntu是一个基于Debian的Linux发行版,其软件包管理系统Apt包含...

    openssh-9.7p1的rpm包

    4. **密钥管理**:`ssh-keygen` 工具用于生成公私钥对,`ssh-copy-id` 可将公钥复制到远程服务器,简化登录过程。`ssh-agent` 和 `ssh-add` 帮助管理密钥,减少用户输入密码的次数。 5. **服务器配置**:`sshd` 是 ...

    openssh8.9的rpm包

    openssh 是一个安全的网络连接工具,用于在不同的系统之间建立加密的远程登录和其他网络服务。这个"openssh8.9的rpm包"是专为...同时,了解和掌握RPM包管理和openssh的相关知识,对于Linux系统的日常运维至关重要。

    openssh-8.6p1 rpm安装包

    OpenSSH广泛应用于远程管理、文件传输和自动化任务。它的安全特性包括:使用公钥/私钥对进行身份验证、数据传输的加密、防止中间人攻击等。为保持系统的安全性,建议定期更新OpenSSH到最新版本,避免使用弱密码,并...

    OpenSSH升级至OpenSSH7.7版本

    1. **备份现有配置**:在进行任何系统更改之前,备份现有的OpenSSH配置文件(通常是`/etc/ssh/sshd_config`)和密钥文件,以防万一需要恢复。 2. **更新系统**:确保你的系统已经更新到最新版本,以避免升级过程中...

    openssh7.8p1RPM包

    1. 安全性增强:OpenSSH 7.8p1着重提升了安全性能,包括对密钥交换协议的支持,例如Curve25519算法的加入,可以提供更强大的加密保护。 2. 支持多线程:在这一版本中,OpenSSH引入了多线程支持,提高了处理大量并发...

    离线升级openssh ,升级目标版本openssh 7.8

    OpenSSH作为远程连接和安全管理的重要工具,其版本的更新与维护对于系统的安全防护至关重要。本教程将详细介绍如何在离线环境下,将OpenSSH升级到7.8版本,并使用提供的资源包进行依赖包的安装与使用案例。 一、...

    openssh-5.1p1

    2. 密钥管理:OpenSSH 支持多种密钥类型,如 RSA、DSA 和 ECDSA,允许用户生成和管理公钥/私钥对,进行身份验证。5.1p1 版本可能进一步优化了密钥交换过程,降低了被破解的风险。 3. 配置灵活性:OpenSSH 提供了...

    openssh rpm升级包

    4. **安全性和改进**:OpenSSH 6.5版本引入了若干安全修复,例如对某些加密算法的支持限制,提升了密钥交换的安全性。此外,可能会包含性能优化和新的配置选项。 5. **文件列表**:在提供的"Open SSH"压缩包中,...

    OpenSSH升级包、依赖包

    它的主要功能包括加密数据传输、密钥管理以及身份验证。OpenSSH_7.7p1是OpenSSH的一个特定版本,它在安全性和性能方面进行了优化和增强。 升级OpenSSH到7.7p1时,有两个重要的依赖包需要考虑:ZLIB和OpenSSL。ZLIB...

    openssh-9.4p1-ky10.tgz

    5. **密钥认证**:OpenSSH支持公钥/私钥对的认证方式,用户可以通过生成和管理公钥来实现无密码登录,进一步提升安全性。 6. **ssh-copy-id命令**:这个命令是OpenSSH的一部分,用于将用户的公钥复制到远程主机,...

    OpenEuler22.03 LTS 升级openssh9.6p1解决openssh中高危漏洞(亲测有效)

    保持OpenSSH的更新对于维护系统的安全至关重要,定期检查并应用安全更新是每个系统管理员的必要职责。在OpenEuler这样的开源操作系统中,用户可以通过社区获得及时的安全支持,以确保系统的稳定和安全。

    openssh-8.8p1.tar.gz

    此外,OpenSSH还提供了密钥管理和访问控制功能,例如限制用户只允许从特定IP地址或使用特定密钥登录,以及使用Chroot Jail技术隔离用户环境,提高系统安全性。 OpenSSH的持续更新和维护对于保障网络服务的安全性至...

    openssh包.rar

    在实际使用中,了解OpenSSH的高级特性也很重要,如密钥管理、端口转发、X11转发等。对于管理员来说,定期更新OpenSSH到最新版本以获取安全补丁是必要的。此外,合理配置防火墙和限制不必要的SSH服务(如关闭root用户...

Global site tag (gtag.js) - Google Analytics