第 12 章 在受控环境中部署身份管理:概念验证
在安全、隔离的沙箱环境中探索 RHEL (IdM) 中身份管理的基本功能和概念。
获得以下方面的实践经验:
- 通过使用 Ansible 自动化安装由 IdM 服务器、副本和客户端组成的最小 IdM 群集。
-
通过 IdM Web UI 配置身份验证和各种访问控制,侧重于基于主机的访问控制、基于角色的访问控制和
sudo规则。IdM Web UI 很直观,因此提供了与 IdM 交互的最佳起点。 - 使用 Ansible 执行相同的身份验证和访问控制配置,发现 Ansible 攻略为系统管理带来的简单性、自动化和可扩展性。
在受控环境中部署身份管理:概念验证旨在帮助您测试和熟悉各种 IdM 功能,为您在生产环境中部署做好准备。它不打算直接用于生产。
12.1. 在受控环境中安装 RHEL Identity Management 复制链接链接已复制到粘贴板!
要在生产部署前评估和测试身份管理(IdM),您可以在 RHEL 中执行身份管理(IdM)的基本安装。使用 Ansible playbook 部署软件可确保方便的可重复配置过程。
12.1.1. 先决条件 复制链接链接已复制到粘贴板!
- 运行红帽企业 Linux (RHEL) 的系统,内存为 16 GB 或以上。
- RHEL订阅。
术语和假设
-
ansible_user是托管节点上的帐户,用于执行 Ansible 攻略中定义的操作。此用户具有 sudo 特权来运行需要 root 访问权限的命令。 - controller.idm.example.com 是 Ansible 控制节点的名称,即存储和运行 Ansible 攻略的主机。
- server.idm.example.com、replica.idm.example.com 和 client.idm.example.com 是安装和配置 RHEL 中 Identity Management 的托管节点。
- 控制节点和管理节点正在虚拟机上运行。所有这些虚拟机都安装在一个运行RHEL的物理系统上。
12.1.2. 在虚拟机上安装 RHEL for IdM 作为概念证明 复制链接链接已复制到粘贴板!
要为 IdM 集群部署准备虚拟机(VM),请在虚拟机上安装和配置 RHEL 客户机操作系统。
先决条件
- 您已从红帽客户门户下载了最新的 RHEL 8、9 或 10 ISO 映像。
流程
使用 ISO 映像为控制器系统安装新虚拟机。有关详细信息,请参阅 从安装介质交互式安装 RHEL。在安装过程中,请注意以下几点:
- 如果要使用虚拟机管理器(VMM)安装虚拟机,请命名控制器、服务器、副本和客户端中的主机,以便您可以将VMM UI中的名称与CLI上的主机的名称相匹配。
- 在要安装 IdM 服务器和副本的虚拟机上至少保留 4 GB RAM。对于客户端系统,1 GB 就足够了。
- 在 IdM 服务器、副本和客户端上保留 30 GB 的存储空间。
- 选择安装,而不是测试和安装。
-
在安装过程中在控制器上创建本地
ansible_user用户。 -
为
ansible_user用户设置易于记忆的密码,例如 12345。 - 在根密码部分,输入易于记忆的密码,例如 1234。
-
选中
允许根 SSH 使用密码登录 复选框。
安装完成后,配置控制器虚拟机的主机名:
-
在控制器VM CLI上,输入
nmtui。 - 使用向下箭头键,选择设置系统主机名。
在新打开的窗口中,输入 controller.idm.example.com。
主机名必须是完全限定域名,如 controller.idm.example.com。有关详细信息,请参阅安装身份管理中的满足 DNS 主机名和 DNS 对 IdM 的要求。
-
使用向下和向右箭头键,选择
确定。 -
再次单击
确定以确认新主机名。 -
在较高级的界面中,使用向下和向右箭头键选择
确定和退出。 [可选]要验证主机名,在您要安装的系统中使用
hostname工具:$ hostnamecontroller.idm.example.comhostname的输出不能是localhost或localhost6。
-
在控制器VM CLI上,输入
- 对所有其他虚拟机重复上述步骤:服务器、复制机和客户端。
在所有虚拟机上为
ansible_user配置 sudo 权限:SSH 以
根身份到控制器:your-physical-system]$ ssh root@controller通过创建
/etc/sudoers.d/ansible_user文件为ansible_user配置无密码的 sudo:# echo "ansible_user ALL=(ALL) NOPASSWD: ALL" | tee /etc/sudoers.d/ansible_user- 在所有托管节点、服务器、复制器和客户机上重复。
注意在整个本章中,在控制器上以
ansible_user身份登录时,需要在需要root权限的命令之前使用sudo。使用主机名而不是 IP 地址配置对单个系统的对等登录:
在控制器 CLI 上,输入:
$ ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:b7:e6:ac brd ff:ff:ff:ff:ff:ff inet 192.168.122.86/24 brd 192.168.122.255 scope global dynamic noprefixroute enp1s0 valid_lft 3106sec preferred_lft 3106sec inet6 fe80::5054:ff:feb7:e6ac/64 scope link noprefixroute valid_lft forever preferred_lft forever请注意以 192.168.X.X 开头的 IP 地址。
- 在所有其他虚拟主机上执行相同的操作。
在控制器上,使用
sudo将所有虚拟系统的主机名和 IP 地址添加到/etc/hosts文件中。文件类似如下:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.122.86 controller.idm.example.com controller 192.168.122.42 server.idm.example.com server 192.168.122.103 replica.idm.example.com replica 192.168.122.200 client.idm.example.com client-
以相同的方式更新物理系统上的
/etc/hosts文件。
确保控制器上的操作系统是最新的:
从本地系统到控制器上的
ansible_user帐户的 SSH:your-physical-system]$ ssh ansible_user@controller使用红帽的订阅管理服务注册控制器虚拟机:
$ sudo subscription-manager register --username <your_user_name> --password <your_password>确保您使用的是最新的软件包:
$ sudo yum update- 对所有其他虚拟机重复前面的步骤。
验证
使用其完全限定域名(
FQDN)或简称测试物理系统与其中一个虚拟系统之间的连通性:your-physical-system]$ ping controllerPING controller.idm.example.com (192.168.122.86) 56(84) bytes of data. 64 bytes from controller.idm.example.com (192.168.122.86): icmp_seq=1 ttl=64 time=0.353 ms 64 bytes from controller.idm.example.com (192.168.122.86): icmp_seq=2 ttl=64 time=0.398 ms 64 bytes from controller.idm.example.com (192.168.122.86): icmp_seq=3 ttl=64 time=0.453 ms
12.1.3. 准备使用 Ansible 攻略安装 IdM 的控制节点 复制链接链接已复制到粘贴板!
要为您的环境在受管节点上自动安装和配置 IdM,请相应地配置 Ansible 控制节点。
先决条件
- 您已在 IdM 的虚拟机上安装 RHEL 作为概念证明。
流程
在控制器系统上,以
ansible_user身份登录并创建SSH公钥和私钥:[ansible_user@controller]$ ssh-keygenGenerating public/private rsa key pair. Enter file in which to save the key (/home/ansible_user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): [Enter] Enter same passphrase again: [Enter] ...为密钥文件使用推荐的默认位置。由于这是一个PoC环境,所以将密码短语留空。
使用以下内容创建
~/.ansible.cfg文件:[defaults] inventory = /home/ansible_user/inventory remote_user = ansible_user [privilege_escalation] become = True become_method = sudo become_user = root注意~/.ansible.cfg文件中的设置具有更高的优先级,并覆盖全局/etc/ansible/ansible.cfg文件中的设置。使用这些设置,Ansible 执行以下操作:
- 管理指定清单文件中的主机。
-
当帐户建立到受管节点的
SSH连接时,使用remote_user参数中设置的帐户。 -
在运行需要提升权限的任务时,使用
sudo将特权提升为root。由于ansible_user配置了无密码 sudo (NOPASSWD),Ansible 不会提示输入密码。
创建 INI 或 YAML 格式的
~/inventory文件,其中列出托管主机的主机名和所需安装变量的值:[ipaserver] server.idm.example.com [ipaserver:vars] ipaserver_domain=idm.example.com ipaserver_realm=IDM.EXAMPLE.COM ipaserver_setup_dns=True ipaserver_auto_forwarders=True ipaadmin_password=Secret123 ipadm_password=Secret123 [ipareplicas] replica.idm.example.com [ipareplicas:vars] ipareplica_setup_dns=true ipareplica_auto_forwarders=true ipaadmin_password=Secret123 ipareplica_servers=server.idm.example.com [ipaclients] client.idm.example.com [ipaclients:vars] ipaadmin_password=Secret123 ipaclient_domain=idm.example.com ipaclient_configure_dns_resolver=true ipaclient_dns_servers=192.168.122.1 ipaclient_servers=server.idm.example.com创建包含以下内容的
install-cluster.yml文件:--- - name: Play to configure IPA server hosts: ipaserver become: true roles: - role: freeipa.ansible_freeipa.ipaserver state: present - name: Play to configure IPA clients with username/password hosts: ipaclients become: true roles: - role: freeipa.ansible_freeipa.ipaclient state: present - name: Play to configure IPA replicas hosts: ipareplicas serial: 1 become: true roles: - role: freeipa.ansible_freeipa.ipareplica state: present该剧本包含三部戏:
- 第一个安装主 IdM 服务器。
- 第二个安装IdM客户端。
-
第三个安装IdM副本。
serial: 1指令指示 Ansible 一次只能针对同一 IdM 服务器部署一个副本。
使用
sudo权限,安装ansible-freeipa集合:[ansible_user@controller]$ sudo dnf install ansible-freeipa[...] Transaction Summary ======================================================================================================================================================================== Install 11 Packages Total download size: 9.8 M Installed size: 42 M Is this ok [y/N]: y [...]
12.1.4. 准备使用 Ansible 攻略安装 IdM 的托管节点 复制链接链接已复制到粘贴板!
要准备安装 IdM 部署,您可以将虚拟机配置为 Ansible 管理的节点。
先决条件
- 您已在 IdM 的虚拟机上安装 RHEL 作为概念证明。
流程
将
ansible_user用户的SSH公钥安装到服务器托管节点上的ansible_user帐户上:以
ansible_user身份登录到控制节点,并将SSH公钥复制到服务器上的ansible_user帐户:[ansible_user@controller]$ ssh-copy-id ansible_user@server.idm.example.com/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ansible_user/.ssh/id_rsa.pub" The authenticity of host 'server.idm.example.com (192.168.122.42)' can't be established. ECDSA key fingerprint is SHA256:9bZ33GJNODK3zbNhybokN/6Mq7hu3vpBXDrCxe7NAvo.当提示时,输入 yes 进行连接:
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys出现提示时,在服务器上输入
ansible_user的密码:ansible_user@server.idm.example.com's password: 12345Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'ansible_user@server.idm.example.com'" and check to make sure that only the key(s) you wanted were added.通过在 服务器 上远程运行命令 来验证
SSH连接:[ansible_user@controller]$ ssh ansible_user@server.idm.example.com whoamiansible_user
- 在所有其他托管节点、复制器和客户机上重复。
为每个托管节点上的
ansible_user创建sudo配置:在每个托管节点(服务器、副本和客户端)上,以 root 身份登录(或者如果您有其他具有 sudo 访问权限的用户,请使用 sudo),然后使用 visudo 命令创建和编辑
/etc/sudoers.d/ansible_user文件:# visudo /etc/sudoers.d/ansible_user在普通编辑器中使用
visudo的好处是该工具提供基本的检查,如在安装文件之前解析错误。在
/etc/sudoers.d/ansible_user文件中配置sudoers策略:ansible_user ALL=(ALL) NOPASSWD: ALL要向
ansible_user授予权限,以便在不输入ansible_user密码的情况下以该主机上任何用户(或任何其他用户)的身份运行所有命令。由于控制器上的 Ansible 配置指定了become_user = root,Ansible 会在运行需要升级权限的任务时使用此 sudo 特权来升级到 root。
验证
验证您可以在所有受管节点上运行来自控制节点的命令:
[ansible_user@controller]$ ansible all -m pingBECOME password: client.idm.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } server.idm.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } replica.idm.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }硬编码的所有组会动态包含清单文件中列出的所有主机。
验证权限提升是否正常工作。使用 Ansible
命令模块与become在所有托管节点上运行whoami实用程序:[ansible_user@controller]$ ansible all -m command -a whoami --becomeBECOME password: <password> client.idm.example.com | CHANGED | rc=0 >> root server.idm.example.com | CHANGED | rc=0 >> root replica.idm.example.com | CHANGED | rc=0 >> root如果命令返回
root,则您在受管节点上正确地配置了sudo。-- become标志告诉 Ansible 使用 sudo 提升权限。
12.1.5. 在虚拟机中安装 IdM 群集 复制链接链接已复制到粘贴板!
要在虚拟机上安装 IdM 主服务器、客户端和副本,您可以从控制节点运行单个 Ansible 命令。
流程
安装 IdM 群集:
[ansible_user@controller]$ ansible-playbook -i inventory -vv install-cluster.yml重要如果您在安装服务器、客户端或副本时遇到重复的错误,最好擦除主机并执行干净的重新安装,而不是尝试排除安装失败。