在身份管理中使用 vault
在 IdM 中存储和管理敏感数据
摘要
让开源更具包容性
红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
在身份管理中,计划中的术语变化包括:
- 使用 block list 替换 blacklist
- 使用 allow list 替换 whitelist
- 使用 secondary 替换 slave
master 会根据上下文被替换为其他更适当的术语:
- 使用 IdM server 替换 IdM master
- 使用 CA renewal server 替换 CA renewal master
- 使用 CRL publisher server 替换 CRL master
- 使用 multi-supplier 替换 multi-master
对红帽文档提供反馈
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 JIRA 提交反馈(需要帐户)
- 登录到 JIRA 网站。
- 单击顶部导航栏中的 Create。
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您的建议以改进。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 IdM 中的 vault
本章论述身份管理(IdM)中的库。它包括以下主题:
1.1. vaults 及其优势
对于那些希望安全存储但便捷地存储所有敏感数据的 Identity Management(IdM)用户来说,密码库是一个非常有用的功能。 有各种类型的 vault,您应该根据您的要求选择使用哪个 vault。
vault 是一个安全的位置(IdM),用于存储、检索、共享和恢复 secret。机密是安全性敏感数据,通常是身份验证凭据,只有一组有限的人或实体才能访问。例如,secret 包括:
- 密码
- pins
- 专用 SSH 密钥
库与密码管理器比较。正如密码管理器一样,库通常需要用户生成并记住一个主密码,以解锁和访问存储在密码库中的任何信息。但是,用户也可以决定使用标准的密码库。标准 vault 不需要用户输入任何密码来访问密码库中存储的 secret。
IdM 中的 vaults 的目的是存储身份验证凭证,可让您向外部的非 IdM 相关的服务进行身份验证。
IdM 库的其他重要特性包括:
- vault 只能由 vault owner 以及 vault owner 选择为 vault 成员访问的 IdM 用户访问。另外,IdM 管理员可以访问 vault。
- 如果用户没有足够的权限来创建密码库,IdM 管理员可以创建密码库,并将用户设置为其所有者。
- 用户和服务可从 IdM 域中注册的任何机器访问存储在密码库中的 secret。
- 一个 vault 只能包含一个 secret,例如一个文件。但是,该文件本身可以包含多个 secret,如密码、keytab 或证书。
Vault 只能通过 IdM 命令行(CLI)提供,不能从 IdM Web UI 中提供。
1.2. Vault 所有者、成员和管理员
身份管理(IdM)可区分以下 vault 用户类型:
- Vault 所有者
vault 所有者是具有密码库上基本管理特权的用户或服务。例如,库所有者可以修改 vault 的属性或添加新的 vault 成员。
每个 vault 必须至少有一个所有者。库也可以有多个所有者。
- Vault 成员
- vault 成员是一种用户或服务,可访问由其他用户或服务创建的密码库。
- Vault 管理员
Vault 管理员对所有库具有不受限制的访问权限,允许执行所有 vault 操作。
注意对称和非对库进行保护,并应用特殊的访问控制规则(请参阅 Vault 类型)。管理员必须满足这些规则才能:
- 访问对称和非对称的密码库。
- 更改或重置 vault 密码或密钥。
vault 管理员是具有
Vault Administrators
特权的任何用户。在 IdM 中基于角色的访问控制(RBAC)的情况下,一个权限是您可以应用到某一角色的权限集。- Vault 用户
vault 用户代表其 vault 所在的用户。
Vault 用户
信息显示在特定命令的输出中,如ipa vault-show
:$ ipa vault-show my_vault Vault name: my_vault Type: standard Owner users: user Vault user: user
如需有关 vault 容器和用户 vaults 的详细信息,请参阅 Vault 容器。
其他资源
- 如需有关 vault 类型的详情,请参阅 标准的、对称的和非对称的vault 。
1.3. 标准、对称和非对称库
根据安全性和访问控制的级别,IdM 将 vault 分类到以下类型:
- 标准库
- Vault 所有者和 vault 成员可以归档和检索机密,而不必使用密码或密钥。
- 对称库
- 库中的机密通过对称密钥进行保护。Vault 所有者和成员可以归档和检索机密,但它们必须提供 vault 密码。
- 非对称库
- 库中的机密通过非对称密钥进行保护。用户使用公钥归档机密,并使用私钥检索该 secret。Vault 成员只能归档机密,而 vault 所有者可以同时进行归档和检索机密。
1.4. 用户、服务和共享库
基于所有权,IdM 将密码库化为多种类型。下表包含 关于每种类型、其所有者和使用的信息。
表 1.1. 基于所有权的 IdM 库
Type | 描述 | 所有者 | 备注 |
---|---|---|---|
用户 vault | 用户使用私有库 | 单个用户 | 如果 IdM 管理员允许,任何用户都可以拥有一个或多个用户 vault |
Service vault | 服务的私有库 | 单个服务 | 如果 IdM 管理员允许,任何服务都可以拥有一个或多个用户 vault |
共享库 | 由多个用户和服务共享的密码库 | 创建密码库的 vault 管理员 | 如果 IdM 管理员允许,用户和服务可以拥有一个或多个用户 vault。除了创建 vault 的人,vault 管理员也有访问 vault 的全部权限。 |
1.5. Vault 容器
vault 容器是密码库的集合。下表列出了 Identity Management (IdM) 提供的默认 vault 容器。
表 1.2. IdM 中的默认 vault 容器
Type | 描述 | 目的 |
---|---|---|
用户容器 | 用户的私有容器 | 为特定用户存储用户密码库 |
服务容器 | 服务的私有容器 | 为特定服务存储服务库 |
共享容器 | 用于多个用户和服务的容器 | 存储可由多个用户或服务共享的 vault |
当为用户或服务创建第一个私有密码库时,IdM 会自动为每个用户或服务创建用户和服务容器。删除用户或服务后,IdM 会删除容器及其内容。
1.6. 基本 IdM vault 命令
您可以使用以下介绍的基本命令来管理身份管理(IdM)vault。下表 包含 ipa vault-*
命令的列表,并解释了它们的用途。
在运行任何 ipa vault-*
命令前,请将密钥恢复授权 (KRA) 证书系统组件安装到 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
表 1.3. 基本 IdM vault 命令解释
命令 | 目的 |
---|---|
| 显示有关 IdM 库和示例密码库命令的概念信息。 |
|
在特定的 |
| 在将密码库作为 vault 成员访问时,您必须指定 vault 所有者。如果您没有指定 vault 所有者,IdM 会通知您没有找到密码库: [admin@server ~]$ ipa vault-show user_vault ipa: ERROR: user_vault: vault not found |
| 在访问共享密码库时,您必须指定您要访问的 vault 是共享密码库。否则,IdM 会通知您没有找到密码库: [admin@server ~]$ ipa vault-show shared_vault ipa: ERROR: shared_vault: vault not found |
1.7. 在 IdM 中安装密钥恢复授权
按照以下流程,通过在特定的 IdM 服务器上安装密钥恢复授权(KRA)证书系统(CS)组件来在身份管理(IdM)中启用 vault。
先决条件
-
您已以
root
身份登录到 IdM 服务器。 - IdM 证书颁发机构已安装在 IdM 服务器上。
-
您有
目录管理器
凭证。
步骤
安装 KRA:
# ipa-kra-install
您可以在隐藏的副本上安装 IdM 集群的第一个 KRA。但是,在在非隐藏的副本上安装 KRA 克隆前,安装额外的 KRA 克隆需要临时激活隐藏的副本。然后您可以再次隐藏原始隐藏的副本。
要使密码库服务高可用且具有弹性,请在两个或多个 IdM 服务器上安装 KRA。维护多个 KRA 服务器可防止数据丢失。
其他资源
- 请参阅 降级或提升隐藏的副本。
- 请参阅 隐藏的副本模式。
第 2 章 使用 IdM 用户库:存储和检索 secret
本章论述了如何在身份管理中使用用户库。具体来说,它描述了如何在 IdM 库中存储 secret,以及用户如何检索它。用户可以通过两个不同的 IdM 客户端进行存储和检索。
先决条件
- 密钥恢复授权中心 (KRA) 证书系统组件已安装在您的 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
2.1. 在用户密码库中存储 secret
按照以下流程创建带有一个或多个私有 vault 的 vault 容器,以安全地存储具有敏感信息的文件。在下面的流程中使用的示例中,idm_user 用户创建标准类型的密码库。标准 vault 类型可确保在访问文件时不需要 idm_user 验证。idm_user 用户可以从用户登录的任何 IdM 客户端中检索该文件。
在此过程中:
- idm_user 是想要创建密码库的用户。
- my_vault 是用于存储用户证书的 vault。
-
vault 类型
是标准的
,因此访问存档证书不需要用户提供 vault 密码。 - secret.txt 是包含用户在密码库中存储的证书的文件。
先决条件
- 您知道 idm_user 的密码。
- 已登陆到一个 IdM 客户端的主机。
步骤
为
idm_user
获取授予 ticket(TGT)的 Kerberos ticket:$ kinit idm_user
使用
ipa vault-add
命令和--type standard
选项创建标准 vault:$ ipa vault-add my_vault --type standard ---------------------- Added vault "my_vault" ---------------------- Vault name: my_vault Type: standard Owner users: idm_user Vault user: idm_user
重要确保为用户创建第一个用户 vault。为用户创建第一个库也会创建用户的 vault 容器。创建代理将成为 vault 容器的所有者。
例如,如果其他用户(如
admin
)为user1
创建第一个用户 vault,则用户的 vault 容器的拥有者也将是admin
,user1
无法访问用户 vault 或创建新用户 vault。使用
ipa vault-archive
命令和--in
选项将secret.txt
文件归档到密码库中:$ ipa vault-archive my_vault --in secret.txt ----------------------------------- Archived data into vault "my_vault" -----------------------------------
2.2. 从用户 vault 检索 secret
作为 Identity Management(IdM),您可以从用户私有 vault 中检索到您登录的任何 IdM 客户端的 secret。
按照以下流程,以名为 idm_user 的 IdM 用户身份,将名为 my_vault 的用户私有 vault 中的 secret 检索到 idm_client.idm.example.com。
先决条件
- idm_user 是 my_vault 的所有者。
- idm_user 在 vault 中已归档了一个 secret。
- my_vault 是一个标准的 vault,这意味着 idm_user 不需要输入任何密码来访问密码库的内容。
步骤
以 idm_user 身份通过 SSH 连接到 idm_client :
$ ssh idm_user@idm_client.idm.example.com
以
idm_user
身份登录:$ kinit user
使用
ipa vault-retrieve --out
命令和--out
选项获取 vault 的内容,并将它们保存到secret_exported.txt
文件中。$ ipa vault-retrieve my_vault --out secret_exported.txt -------------------------------------- Retrieved data from vault "my_vault" --------------------------------------
2.3. 其他资源
第 3 章 使用 Ansible 管理 IdM 用户库:存储和检索 secret
本章论述了如何使用 Ansible vault
模块在身份管理中管理用户密码库。具体来说,它描述了用户可以如何使用 Ansible playbook 执行以下三个连续操作:
用户可以通过两个不同的 IdM 客户端进行存储和检索。
先决条件
- 密钥恢复授权中心 (KRA) 证书系统组件已安装在您的 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
3.1. 使用 Ansible 在 IdM 中存在标准用户库
按照以下流程,使用 Ansible playbook 创建带有一个或多个私有 vault 的 vault 容器,来安全地存储敏感信息。在以下步骤中使用的示例中,idm_user 用户创建名为 my_vault 的标准类型库。标准 vault 类型可确保在访问文件时不需要 idm_user 验证。idm_user 用户可以从用户登录的任何 IdM 客户端中检索该文件。
先决条件
- 您已在 Ansible 控制器上安装了 ansible-freeipa 软件包,这是您在该流程中执行步骤的主机。
- 您知道 idm_user 的密码。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
创建一个清单文件,如 inventory.file :
$ touch inventory.file
打开 inventory.file,并在
[ipaserver]
部分中定义您要配置的 IdM 服务器。例如,要指示 Ansible 配置 server.idm.example.com,请输入:[ipaserver] server.idm.example.com
生成 ensure-standard-vault-is-present.yml Ansible playbook 文件的副本。例如:
$ cp ensure-standard-vault-is-present.yml ensure-standard-vault-is-present-copy.yml
- 打开 ensure-standard-vault-is-present-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来调整文件:-
将
ipaadmin_principal
变量设置为 idm_user。 -
将
ipaadmin_password
变量设置为 idm_user 密码。 -
将
user
变量设置为 idm_user。 -
将
name
变量设置为 my_vault。 将
vault_type
变量设置为 standard。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault vault_type: standard
-
将
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-standard-vault-is-present-copy.yml
3.2. 使用 Ansible 将 secret 归档到 IdM 中的标准用户库中
按照以下流程,使用 Ansible playbook 将敏感信息存储在个人 vault 中。在使用的示例中,idm_user 用户在名为 my_vault 的库中归档含有名为 password.txt 的敏感信息的文件。
先决条件
- 您已在 Ansible 控制器上安装了 ansible-freeipa 软件包,这是您在该流程中执行步骤的主机。
- 您知道 idm_user 的密码。
- idm_user 是所有者,或者至少是 my_vault 的成员用户。
- 您可以访问 password.txt,这是要在 my_vault 中存档的机密。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
打开清单文件,并确保
[ipaserver]
部分中列出了您要配置的 IdM 服务器。例如,要指示 Ansible 配置 server.idm.example.com,请输入:[ipaserver] server.idm.example.com
制作 data-archive-in-symmetric-vault.yml Ansible playbook 文件的副本,但将"symmetric"替换为 "standard"。例如:
$ cp data-archive-in-symmetric-vault.yml data-archive-in-standard-vault-copy.yml
- 打开 data-archive-in-standard-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来调整文件:-
将
ipaadmin_principal
变量设置为 idm_user。 -
将
ipaadmin_password
变量设置为 idm_user 密码。 -
将
user
变量设置为 idm_user。 -
将
name
变量设置为 my_vault。 -
将
in
变量设置为包含敏感信息的文件的完整路径。 将
action
变量设置为 member。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault in: /usr/share/doc/ansible-freeipa/playbooks/vault/password.txt action: member
-
将
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-standard-vault-copy.yml
3.3. 使用 Ansible 从 IdM 中的标准用户库检索 secret
按照以下流程,使用 Ansible playbook 从用户个人 vault 中检索 secret。在下面的流程中使用的示例中,idm_user 用户从名为 my_vault 的标准类型的密码库中检索包含敏感数据的文件到名为 host01 的 IdM 客户端。idm_user 在访问文件时不需要进行身份验证。idm_user 可以使用 Ansible 从安装 Ansible 的任何 IdM 客户端中检索该文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
- 您知道 idm_user 的密码。
- idm_user 是 my_vault 的所有者。
- idm_user 已将 secret 存储在 my_vault 中。
- Ansible 可以写入要检索该 secret 的 IdM 主机上的 目录。
- idm_user 可以从要检索 secret 的 IdM 主机上的 目录读取。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
打开清单文件,并在一个明确定义的部分中提到您要检索该 secret 的 IdM 客户端。例如,要指示 Ansible 在 host01.idm.example.com 上检索 secret,请输入:
[ipahost] host01.idm.example.com
生成 retrive-data-symmetric-vault.yml Ansible playbook 文件的副本。将 "symmetric" 替换为 "standard"。例如:
$ cp retrive-data-symmetric-vault.yml retrieve-data-standard-vault.yml-copy.yml
- 打开 retrieve-data-standard-vault.yml-copy.yml 文件进行编辑。
-
通过将
hosts
变量设置为 ipahost 来调整 文件。 通过在
ipavault
任务部分设置以下变量来调整文件:-
将
ipaadmin_principal
变量设置为 idm_user。 -
将
ipaadmin_password
变量设置为 idm_user 密码。 -
将
user
变量设置为 idm_user。 -
将
name
变量设置为 my_vault。 -
将
out
变量设置为您要将 secret 导出到的文件的完整路径。 将
state
变量设置为 retrieve。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipahost gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_principal: idm_user ipaadmin_password: idm_user_password user: idm_user name: my_vault out: /tmp/password_exported.txt state: retrieved
-
将
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-standard-vault.yml-copy.yml
验证步骤
以 user01 身份通过
SSH
连接到 host01:$ ssh user01@host01.idm.example.com
查看 Ansible playbook 文件中
out
变量指定的文件:$ vim /tmp/password_exported.txt
现在,您可以看到导出的 secret。
-
有关使用 Ansible 管理 IdM vaults 和用户 secret 以及 playbook 变量的更多信息,请参阅
/usr/share/doc/ansible-freeipa/
目录中的 README-vault.md Markdown 文件,和/usr/share/doc/ansible-freeipa/playbooks/vault/
目录中的示例 playbook。
第 4 章 管理 IdM 服务 secret:存储和检索 secret
本节介绍管理员可以如何使用 ansible-freeipa
vault
模块安全地将服务 secret 存储在集中式位置。示例中使用的 vault 是非对称的,这意味着要使用它,管理员需要执行以下步骤:
-
使用
openssl
实用程序生成私钥。 - 根据私钥生成公钥。
当管理员将服务 secret 归档到密码库时,会用公钥对其进行加密。之后,托管在域中特定计算机上的服务实例使用私钥检索该 secret。只有服务和管理员可以访问该 secret。
如果该机密泄露,管理员可以在服务 vault 中替换它,然后将它重新分发到尚未遭入侵的服务实例。
先决条件
- 密钥恢复授权中心 (KRA) 证书系统组件已安装在您的 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
本节包括这些步骤
使用的术语
在流程中:
- admin 是管理服务密码的管理员。
- private-key-to-an-externally-certificate.pem 是包含服务 secret 的文件,本例中为外部签名证书的私钥。请勿将此私钥与用于从密码库检索机密的私钥混淆。
- secret_vault 是为该服务创建的密码库。
- HTTP/webserver.idm.example.com 是存档 secret 的服务。
- service-public.pem 是用于加密 password_vault 中存储的密码的服务公钥。
- service-private.pem 是用于解密 secret_vault 中存储的密码的服务私钥。
4.1. 将 IdM 服务 secret 存储在非对称的密码库中
按照以下流程创建非对称 vault,并使用它来归档服务 secret。
先决条件
- 您知道 IdM 管理员密码。
步骤
以管理员身份登录:
$ kinit admin
获取服务实例的公钥。例如,使用
openssl
工具:生成
service-private.pem
私钥。$ openssl genrsa -out service-private.pem 2048 Generating RSA private key, 2048 bit long modulus .+++ ...........................................+++ e is 65537 (0x10001)
根据私钥生成
service-public.pem
公钥。$ openssl rsa -in service-private.pem -out service-public.pem -pubout writing RSA key
创建非对称库作为服务实例 vault,并提供公钥:
$ ipa vault-add secret_vault --service HTTP/webserver.idm.example.com --type asymmetric --public-key-file service-public.pem ---------------------------- Added vault "secret_vault" ---------------------------- Vault name: secret_vault Type: asymmetric Public key: LS0tLS1C...S0tLS0tCg== Owner users: admin Vault service: HTTP/webserver.idm.example.com@IDM.EXAMPLE.COM
存储在密码库中的密码将通过密钥进行保护。
将服务 secret 归档到服务 vault 中:
$ ipa vault-archive secret_vault --service HTTP/webserver.idm.example.com --in private-key-to-an-externally-signed-certificate.pem ----------------------------------- Archived data into vault "secret_vault" -----------------------------------
这会使用服务实例公钥加密机密。
为每个需要 secret 的服务实例重复这些步骤。为每个服务实例创建一个新的非对称库。
4.2. 为 IdM 服务实例检索服务 secret
按照以下流程,使用服务实例检索使用本地存储的服务私钥的服务 vault secret。
先决条件
- 您可以访问拥有服务 vault 的服务主体的 keytab,如 HTTP/webserver.idm.example.com。
- 您已创建了非对称库,并在密码库中存档一个机密。
- 您可以访问用于检索服务 vault secret 的私钥。
步骤
以管理员身份登录:
$ kinit admin
为该服务获取 Kerberos ticket:
# kinit HTTP/webserver.idm.example.com -k -t /etc/httpd/conf/ipa.keytab
检索服务 vault 密码:
$ ipa vault-retrieve secret_vault --service HTTP/webserver.idm.example.com --private-key-file service-private.pem --out secret.txt ------------------------------------ Retrieved data from vault "secret_vault" ------------------------------------
4.3. 在被破坏时更改 IdM 服务 vault secret
按照以下流程,通过更改服务 vault secret 来隔离有危险的服务实例。
先决条件
- 您知道 IdM 管理员密码。
- 您已创建了非对称密码库用于存储服务机密。
- 您已生成了新 secret 并有权访问该 secret,例如在 new-private-key-to-an-externally-signed-certificate.pem 文件中。
步骤
将新 secret 存档到服务实例 vault 中:
$ ipa vault-archive secret_vault --service HTTP/webserver.idm.example.com --in new-private-key-to-an-externally-signed-certificate.pem ----------------------------------- Archived data into vault "secret_vault" -----------------------------------
这会覆盖存储在密码库中的当前 secret。
- 仅检索非共享服务实例上的新机密。详情请参阅 为 IdM 服务实例检索服务 secret。
4.4. 其他资源
第 5 章 使用 Ansible 管理 IdM 服务库:存储和检索 secret
本节介绍管理员可以如何使用 ansible-freeipa
vault
模块安全地将服务 secret 存储在集中式位置。示例中使用的 vault 是非对称的,这意味着要使用它,管理员需要执行以下步骤:
-
使用
openssl
实用程序生成私钥。 - 根据私钥生成公钥。
当管理员将服务 secret 归档到密码库时,会用公钥对其进行加密。之后,托管在域中特定计算机上的服务实例使用私钥检索该 secret。只有服务和管理员可以访问该 secret。
如果该机密泄露,管理员可以在服务 vault 中替换它,然后将它重新分发到尚未遭入侵的服务实例。
先决条件
- 密钥恢复授权中心 (KRA) 证书系统组件已安装在您的 IdM 域中的一个或多个服务器上。详情请参阅在 IdM 中安装密钥恢复授权。
本节包括以下步骤:
在流程中:
- admin 是管理服务密码的管理员。
- private-key-to-an-externally-certificate.pem 是包含服务 secret 的文件,本例中为外部签名证书的私钥。请勿将此私钥与用于从密码库检索机密的私钥混淆。
- secret_vault 是为存储服务 secret 而创建的库。
- HTTP/webserver1.idm.example.com 是密码库的所有者服务。
- HTTP/webserver2.idm.example.com 和 HTTP/webserver3.idm.example.com 是 vault 成员服务。
- service-public.pem 是用于加密 password_vault 中存储的密码的服务公钥。
- service-private.pem 是用于解密 secret_vault 中存储的密码的服务私钥。
5.1. 使用 Ansible 在 IdM 中存在非对称服务库
按照以下流程,使用 Ansible playbook 创建一个具有一个或多个私有 vault 的服务 vault 容器,以安全地存储敏感信息。在以下流程中使用的示例中,管理员创建名为 secret_vault 的非对称库。这样可确保 vault 成员必须使用私钥进行身份验证,以检索密码库中的 secret。vault 成员能够从任何 IdM 客户端检索 文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
- 您知道 IdM 管理员密码。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
获取服务实例的公钥。例如,使用
openssl
工具:生成
service-private.pem
私钥。$ openssl genrsa -out service-private.pem 2048 Generating RSA private key, 2048 bit long modulus .+++ ...........................................+++ e is 65537 (0x10001)
根据私钥生成
service-public.pem
公钥。$ openssl rsa -in service-private.pem -out service-public.pem -pubout writing RSA key
可选:如果不存在清单文件,如 inventory.file :
$ touch inventory.file
打开清单文件,并在
[ipaserver]
部分中定义您要配置的 IdM 服务器。例如,要指示 Ansible 配置 server.idm.example.com,请输入:[ipaserver] server.idm.example.com
生成 ensure-asymmetric-vault-is-present.yml Ansible playbook 文件的副本。例如:
$ cp ensure-asymmetric-vault-is-present.yml ensure-asymmetric-service-vault-is-present-copy.yml
- 打开 ensure-asymmetric-vault-is-present-copy.yml 文件进行编辑。
- 添加一个任务,该任务将 service-public.pem 公钥从 Ansible 控制器复制到 server.idm.example.com 服务器。
通过在
ipavault
任务部分设置以下变量来修改文件的其余部分:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
使用
name
变量定义 vault 的名称,如 secret_vault。 -
将
vault_type
变量设置为非 对称。 -
将
service
变量设置为拥有密码库的服务主体,如 HTTP/webserver1.idm.example.com。 将
public_key_file
设置为您的公钥的位置。这是当前示例修改的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Copy public key to ipaserver. copy: src: /path/to/service-public.pem dest: /usr/share/doc/ansible-freeipa/playbooks/vault/service-public.pem mode: 0600 - name: Add data to vault, from a LOCAL file. ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault vault_type: asymmetric service: HTTP/webserver1.idm.example.com public_key_file: /usr/share/doc/ansible-freeipa/playbooks/vault/service-public.pem
-
将
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file ensure-asymmetric-service-vault-is-present-copy.yml
5.2. 使用 Ansible 将成员服务添加到非对称库
按照以下流程,使用 Ansible playbook 向服务 vault 中添加成员服务,以便它们都可以检索 vault 中存储的 secret。在以下流程中使用的示例中,IdM 管理员将 HTTP/webserver2.idm.example.com 和 HTTP/webserver3.idm.example.com 服务主体添加到由 HTTP/webserver1.idm.example.com 所有的 secret_vault vault 中。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
- 您知道 IdM 管理员密码。
- 您已创建了非对称密码库用于存储服务机密。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
可选:如果不存在清单文件,如 inventory.file :
$ touch inventory.file
打开清单文件,并在
[ipaserver]
部分中定义您要配置的 IdM 服务器。例如,要指示 Ansible 配置 server.idm.example.com,请输入:[ipaserver] server.idm.example.com
生成 data-archive-in-asymmetric-vault.yml Ansible playbook 文件的副本。例如:
$ cp data-archive-in-asymmetric-vault.yml add-services-to-an-asymmetric-vault.yml
- 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来修改该文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
定义您要使用
services
变量访问 vault 机密的服务。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com services: - HTTP/webserver2.idm.example.com - HTTP/webserver3.idm.example.com action: member
-
将
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file add-services-to-an-asymmetric-vault.yml
5.3. 使用 Ansible 将 IdM 服务 secret 存储在非对称库中
按照以下流程,使用 Ansible playbook 将 secret 存储在服务 vault 中,以便稍后由服务检索。在以下流程中使用的示例中,管理员将带有 secret 的 PEM
文件存储在名为 secret_vault 的非对称库中。这样可确保服务必须使用私钥进行身份验证,以便从 vault 中检索 secret。vault 成员能够从任何 IdM 客户端检索 文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
- 您知道 IdM 管理员密码。
- 您已创建了非对称密码库用于存储服务机密。
- secret 存储在 Ansible 控制器上,例如 /usr/share/doc/ansible-freeipa/playbooks/vault/private-key-to-an-externally-certificate.pem 文件中。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
可选:如果不存在清单文件,如 inventory.file :
$ touch inventory.file
打开清单文件,并在
[ipaserver]
部分中定义您要配置的 IdM 服务器。例如,要指示 Ansible 配置 server.idm.example.com,请输入:[ipaserver] server.idm.example.com
生成 data-archive-in-asymmetric-vault.yml Ansible playbook 文件的副本。例如:
$ cp data-archive-in-asymmetric-vault.yml data-archive-in-asymmetric-vault-copy.yml
- 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来修改该文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
将
in
变量设置为 "{{ lookup('file', 'private-key-to-an-externally-certificate.pem')| b64encode }}"。这可确保 Ansible 使用私钥从 Ansible 控制器上的工作目录检索文件,而不是从 IdM 服务器检索。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com in: "{{ lookup('file', 'private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
-
将
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
5.4. 使用 Ansible 为 IdM 服务检索服务 secret
按照以下流程,使用 Ansible playbook 代表服务从服务 secret 中检索 secret。在以下流程中使用的示例中,运行 playbook 从名为 secret_vault 的非对称库检索带有 secret 的 PEM
文件,并将它存储在 Ansible 清单文件中列出的所有主机上的指定位置,存为 ipaservers
。
服务使用 keytabs 验证 IdM,并使用私钥与密码库进行身份验证。您可以代表服务从安装 ansible-freeipa
的任何 IdM 客户端检索 文件。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
- 您知道 IdM 管理员密码。
- 您已创建了非对称密码库用于存储服务机密。
- 您已在密码库中存档了机密。
-
您已将用于检索服务 vault secret 的私钥存储在 Ansible 控制器上的
private_key_file
变量指定的位置。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
可选:如果不存在清单文件,如 inventory.file :
$ touch inventory.file
打开清单文件并定义以下主机:
-
在
[ipaserver]
部分中定义您的 IdM 服务器。 -
在
[webservers]
部分中定义要检索机密的主机。例如,要指示 Ansible 获取到 webserver1.idm.example.com、webserver2.idm.example.com 和 webserver3.idm.example.com 的 secret,请输入:
[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com webserver3.idm.example.com
-
在
生成 retrieve-data-asymmetric-vault.yml Ansible playbook 文件的副本。例如:
$ cp retrieve-data-asymmetric-vault.yml retrieve-data-asymmetric-vault-copy.yml
- 打开 retrieve-data-asymmetric-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来修改该文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
将
private_key_file
变量设置为用于检索服务 vault secret 的私钥的位置。 -
将
out
变量设置为 IdM 服务器上您要检索 private-key-to-an-externally-certificate.pem 机密的位置,如当前工作目录。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: private-key-to-an-externally-signed-certificate.pem state: retrieved
-
将
在 playbook 中添加一个部分,它将从 IdM 服务器检索数据文件到 Ansible 控制器:
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: private-key-to-an-externally-signed-certificate.pem dest: ./ flat: yes mode: 0600
在 playbook 中添加 部分,将检索到的 private-key-to-an-externally-certificate.pem 文件从 Ansible 控制器传输到清单文件的
webservers
部分中列出的 webservers 部分:--- - name: Send data file to webservers become: no gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml
5.5. 在使用 Ansible 泄露时更改 IdM 服务 vault secret
当服务实例有危险时,按照此流程重新使用 Ansible playbook 来更改存储在服务 vault 中的 secret。以下示例中的情景假定 webserver3.idm.example.com 上的,检索的机密已被入侵,而不是将密钥存储该 secret。在示例中,管理员重复利用在非对称库中存储一个 secret 时,以及从非对称库中获取一个 secret 导入到 IdM 主机 时使用的 Ansible playbook。在流程开始时,IdM 管理员将具有新机密的新 PEM
文件存储在非对称密码库中,对清单文件进行相应的调整,因此不会将新 secret 检索到受破坏的 Web 服务器(web 服务器 webserver3.idm.example.com ),然后重新运行这两个程序。
先决条件
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了
ipaadmin_password
。
- 您知道 IdM 管理员密码。
- 您已创建了非对称密码库用于存储服务机密。
-
您已为在 IdM 主机中运行的 Web 服务生成了一个新的
httpd
密钥,以取代损坏的旧密钥。 -
新的
httpd
密钥保存在 Ansible 控制器上,例如在 /usr/share/doc/ansible-freeipa/playbooks/vault/private-key-to-an-externally-signed-certificate.pem 文件中。
步骤
导航到
/usr/share/doc/ansible-freeipa/playbooks/vault
目录:$ cd /usr/share/doc/ansible-freeipa/playbooks/vault
打开清单文件,并确保正确定义以下主机:
-
[ipaserver]
部分中的 IdM 服务器。 要在
[webservers]
部分中检索 secret 的主机。例如,要指示 Ansible 检索到 webserver1.idm.example.com 和 webserver2.idm.example.com 的 secret,请输入:[ipaserver] server.idm.example.com [webservers] webserver1.idm.example.com webserver2.idm.example.com
重要确保该列表在当前示例 webserver3.idm.example.com 中不包含已破坏的 webserver。
-
- 打开 data-archive-in-asymmetric-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来修改该文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为 vault 的服务所有者,如 HTTP/webserver.idm.example.com。 -
将
in
变量设置为 "{{ lookup('file', 'new-private-key-to-an-externally-signed.pem')| b64encode }}".这可确保 Ansible 使用私钥从 Ansible 控制器上的工作目录检索文件,而不是从 IdM 服务器检索。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Tests hosts: ipaserver gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver.idm.example.com in: "{{ lookup('file', 'new-private-key-to-an-externally-signed-certificate.pem') | b64encode }}" action: member
-
将
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file data-archive-in-asymmetric-vault-copy.yml
- 打开 retrieve-data-asymmetric-vault-copy.yml 文件进行编辑。
通过在
ipavault
任务部分设置以下变量来修改该文件:-
将
ipaadmin_password
变量设置为 IdM 管理员密码。 -
将
name
变量设置为 vault 的名称,如 secret_vault。 -
将
service
变量设置为密码库的服务所有者,如 HTTP/webserver1.idm.example.com。 -
将
private_key_file
变量设置为用于检索服务 vault secret 的私钥的位置。 -
将
out
变量设置为您要检索 new-private-key-to-an-externally-signed-certificate.pem secret 中的位置,如当前工作目录。 将
action
变量设置为member
。对于当前示例为修改过的 Ansible playbook 文件:
--- - name: Retrieve data from vault hosts: ipaserver become: no gather_facts: false vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Retrieve data from the service vault ipavault: ipaadmin_password: "{{ ipaadmin_password }}" name: secret_vault service: HTTP/webserver1.idm.example.com vault_type: asymmetric private_key: "{{ lookup('file', 'service-private.pem') | b64encode }}" out: new-private-key-to-an-externally-signed-certificate.pem state: retrieved
-
将
在 playbook 中添加一个部分,它将从 IdM 服务器检索数据文件到 Ansible 控制器:
--- - name: Retrieve data from vault hosts: ipaserver become: true gather_facts: false tasks: [...] - name: Retrieve data file fetch: src: new-private-key-to-an-externally-signed-certificate.pem dest: ./ flat: yes mode: 0600
在 playbook 中添加一个部分,将检索到的 new-private-key-to-an-externally-signed-certificate.pem 文件从 Ansible 控制器传输到清单文件的
webservers
部分中列出的 webservers:--- - name: Send data file to webservers become: true gather_facts: no hosts: webservers tasks: - name: Send data to webservers copy: src: new-private-key-to-an-externally-signed-certificate.pem dest: /etc/pki/tls/private/httpd.key mode: 0444
- 保存这个文件。
运行 playbook:
$ ansible-playbook --vault-password-file=password_file -v -i inventory.file retrieve-data-asymmetric-vault-copy.yml
5.6. 其他资源
-
请参阅
/usr/share/doc/ansible-freeipa/
目录中的 README-vault.md Markdown 文件。 -
请参阅
/usr/share/doc/ansible-freeipa/playbooks/vault/
目录中的 playbook 示例。