12.5. 管理主机的公共 SSH 密钥
OpenSSH 使用 公钥 对主机进行身份验证。一台计算机尝试访问另一台计算机并显示其密钥对。主机第一次进行身份验证时,目标计算机上的管理员必须手动批准请求。然后,机器将主机的公钥存储在
known_hosts
文件中。每当远程机器再次尝试访问目标机器时,目标机器只需检查其 known_hosts
文件,然后自动授予对批准的主机的访问权限。
这个系统有几个问题:
known_hosts
文件将主机条目存储在主机 IP 地址、主机名和密钥的 triplet 中。如果 IP 地址发生更改(在虚拟环境和数据中心中很常见)或更新密钥,此文件可以快速过时。- SSH 密钥必须手动分发给环境中的所有计算机。
- 管理员必须批准主机密钥才能将它们添加到配置中,但很难正确验证主机或密钥问题者,这可能会导致安全问题。
在 Red Hat Enterprise Linux 上,系统安全服务守护进程(SSSD)可以配置为缓存和检索主机 SSH 密钥,以便应用程序和服务必须只查找主机密钥的一个位置。由于 SSSD 可以使用身份管理作为其身份信息提供商之一,因此身份管理提供了密钥的通用和集中存储库。管理员无需担心分发、更新或验证主机 SSH 密钥。
12.5.1. 关于 SSH 密钥格式
当密钥上传到 IdM 条目时,密钥格式可以是 OpenSSH 样式的密钥或 原始 RFC 4253 风格的 Blob。任何 RFC 4253 风格的密钥都会自动转换为 OpenSSH 样式的密钥,然后再导入并保存到 IdM LDAP 服务器中。
IdM 服务器可以从上传的密钥 blob 中识别密钥类型,如 RSA 或 DSA 密钥。但是,在文件(如
~/.ssh/known_hosts
)中,密钥条目由服务器的主机名和 IP 地址标识,然后输入密钥本身。例如:
host.example.com,1.2.3.4 ssh-rsa AAA...ZZZ==
这与用户公钥条目稍有不同,后者中含有 类型为 key== 注释 的元素:
"ssh-rsa ABCD1234...== ipaclient.example.com"
可以将密钥文件中的所有三个部分上传到,再查看主机条目。在这种情况下,需要重新排序
~/.ssh/known_hosts
文件中的主机公钥条目,以匹配用户密钥的格式,输入 key== comment :
ssh-rsa AAA...ZZZ== host.example.com,1.2.3.4
可以从公钥的内容中自动确定密钥类型,注释是可选的,从而更轻松地识别单个密钥。唯一必需的元素是公钥 Blob 本身。
12.5.2. 关于 ipa-client-install 和 OpenSSH
默认情况下,ipa-client-install 脚本在 IdM 客户端机器上配置 OpenSSH 服务器和客户端。它还将 SSSD 配置为执行主机和用户密钥缓存。基本上,只需配置客户端即可执行主机使用 SSSD、OpenSSH 和身份管理进行密钥缓存和检索所需的所有配置。
如果使用客户端安装(默认值)启用了 SSH 服务(默认值),则在 ssh 服务首次启动时会创建一个 RSA 密钥。
注意
当使用 ipa-client-install 将机器添加为 IdM 客户端时,会创建带有两个 SSH 密钥 RSA 和 DSS 的客户端。
还有额外的客户端配置选项
--ssh-trust-dns
,可以使用 ipa-client-install 运行,并自动配置 OpenSSH 来信任存储密钥指纹的 IdM DNS 记录。
或者,也可以使用
--no-sshd
选项,在安装客户端时禁用 OpenSSH。这可防止安装脚本配置 OpenSSH 服务器。
另一个选项
--no-dns-sshfp
可防止主机使用自己的 DNS 条目创建 DNS SSHFP 记录。这可与 --no-sshd 选项或不带 --no-sshd
选项一起使用。
12.5.3. 通过 Web UI 上传主机 SSH 密钥
- 主机的密钥可以从
~/.ssh/known_hosts
检索。例如:server.example.com,1.2.3.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEApvjBvSFSkTU0WQW4eOweeo0DZZ08F9Ud21xlLy6FOhzwpXFGIyxvXZ52+siHBHbbqGL5+14N7UvElruyslIHx9LYUR/pPKSMXCGyboLy5aTNl5OQ5EHwrhVnFDIKXkvp45945R7SKYCUtRumm0Iw6wq0XD4o+ILeVbV3wmcB1bXs36ZvC/M6riefn9PcJmh6vNCvIsbMY6S+FhkWUTTiOXJjUDYRLlwM273FfWhzHK+SSQXeBp/zIn1gFvJhSZMRi9HZpDoqxLbBB9QIdIw6U4MIjNmKsSI/ASpkFm2GuQ7ZK9KuMItY2AoCuIRmRAdF8iYNHBTXNfFurGogXwRDjQ==
如有必要,生成主机密钥。在使用 OpenSSH 工具时,请确保使用空白密码短语,并将密钥保存到与用户的~/.ssh/
目录不同的位置,因此它不会覆盖任何现有密钥。[jsmith@server ~]$ ssh-keygen -t rsa -C "server.example.com,1.2.3.4" Generating public/private rsa key pair. Enter file in which to save the key (/home/jsmith/.ssh/id_rsa): /home/jsmith/.ssh/host_keys Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/jsmith/.ssh/host_keys. Your public key has been saved in /home/jsmith/.ssh/host_keys.pub. The key fingerprint is: SHA256:GAUIDVVEgly7rs1lTWP6oguHz8BKvyZkpqCqVSsmi7c server.example.com The key's randomart image is: +--[ RSA 2048]----+ | .. | | .+| | o .* | | o . .. *| | S + . o+| | E . .. .| | . = . o | | o . ..o| | .....| +-----------------+
- 从 密钥文件复制公钥。full key 条目的格式为 主机名,IP 类型 key==。仅需要 key==,但可以存储整个条目。若要使用 条目中的所有元素,请重新排列条目,使其顺序为 key== [host name,IP]
[jsmith@server ~]$ cat /home/jsmith/.ssh/host_keys.pub ssh-rsa AAAAB3NzaC1yc2E...tJG1PK2Mq++wQ== server.example.com,1.2.3.4
- 打开 Identity 选项卡,然后选择 Hosts 子选项卡。
- 单击要编辑的主机的名称。
图 12.4. 主机列表
- 在 Settings 选项卡的 Host Settings 区域,单击 SSH 公钥 旁边的 Add。
图 12.5. 添加 SSH 密钥
- 粘贴主机的公钥,然后单击。
图 12.6. 设置 SSH 密钥
SSH 公钥 区域现在显示新密钥。单击 Show/Set key 将打开提交的密钥。 - 要上传多个密钥,请单击公钥列表下的 Add 链接,并上传其他密钥。
- 提交所有密钥后,单击主机页面顶部的 Save 以保存更改。
保存公钥后,条目将显示为密钥指纹、注释(如果包含公钥)和密钥类型[2].
上传主机密钥后,将 SSSD 配置为使用身份管理作为其身份域之一,并设置 OpenSSH 以使用 SSSD 工具来管理主机密钥,如 第 22.6 节 “配置 SSSD 为 OpenSSH 服务提供缓存” 所述。
12.5.4. 从命令行添加主机密钥
主机 SSH 密钥添加到 IdM 中的主机条目中,可以是使用 host-add 创建或稍后修改条目时。
注意
RSA 和 DSS 主机密钥由
ipa-client-install
命令创建,除非安装脚本中明确禁用了 SSH 服务。
- 使用
--sshpubkey
选项运行 host-mod 命令,将 base64 编码的公钥上传到主机条目。添加主机密钥也会更改主机的 DNS SSHFP 条目,因此也使用--updatedns
选项来更新主机的 DNS 条目。例如:[jsmith@server ~]$ ipa host-mod --sshpubkey="ssh-rsa RjlzYQo==" --updatedns host1.example.com
实际密钥通常也以等号(=)结尾,但时间较长。要上传多个密钥,请输入多个--sshpubkey
命令行参数:--sshpubkey="RjlzYQo==" --sshpubkey="ZEt0TAo=="
注意个主机可以有多个公钥。 - 上传主机密钥后,将 SSSD 配置为使用身份管理作为其身份域之一,并设置 OpenSSH 以使用 SSSD 工具来管理主机密钥,如 第 22.6 节 “配置 SSSD 为 OpenSSH 服务提供缓存” 所述。
12.5.5. 删除主机密钥
主机密钥在过期或不再有效后可将其删除。
要删除单个主机密钥,最简单的方法是通过 Web UI 删除该密钥:
- 打开 Identity 选项卡,然后选择 Hosts 子选项卡。
- 单击要编辑的主机的名称。
图 12.7. 主机列表
- 在 SSH 公钥 区域中,点 Delete by the key 的指纹将其移除。
图 12.8. 公钥删除
- 单击主机页面顶部的 Save,以保存更改。
命令行工具可用于删除所有密钥。这可以通过运行 ipa host-mod,并将
--sshpubkey=
设置为空白值;这将删除主机 的所有 公钥。此外,使用 --updatedns
选项更新主机的 DNS 条目。例如:
[jsmith@server ~]$ kinit admin [jsmith@server ~]$ ipa host-mod --sshpubkey= --updatedns host1.example.com