第 35 章 使用 Ansible 在 IdM 中配置 HBAC 和 sudo 规则
在身份管理(IdM)中使用基于主机的访问控制(HBAC),您可以定义根据以下内容限制访问主机或服务的策略:
- 尝试登录的用户以及此用户的组
- 用户尝试访问的主机以及该主机所属的主机组
- 用于访问主机的服务
使用 sudo,用户可以以其它具有不同特权的用户的身份运行程序,如 root 特权。在 IdM 中,您可以集中管理 sudo 规则。您可以根据用户组、主机组和命令组以及单个用户、主机和命令定义 sudo 规则。
完成这个流程以确保 IdM 用户的以下 HBAC 和 sudo 规则存在:
- jane 只能访问主机 client01.idm.example.com。
- john 只能访问主机 client02.idm.example.com。
-
包括默认的
admin用户的admins组的成员以及常规 alice 用户可以访问任何 IdM 主机。 admins组的成员可以在任何 IdM 主机上运行带有以下命令的sudo:-
/usr/sbin/reboot -
/usr/bin/less -
/usr/sbin/setenforce
-
下图显示了上述所需的配置:
图 35.1. IdM HBAC 和 SUDO 规则图
- 注意
-
该流程演示了使用操作组,通过
module_defaults简化了模块的使用。您可以使用名为freeipa.ansible_freeipa.modules的action_group将默认值设置为应用到 playbook 中使用的集合的所有模块。在示例中,以这种方法定义 IdM 管理员密码。
先决条件
在控制节点上:
- 您在使用 Ansible 版本 2.15 或更高版本。
-
已安装
freeipa.ansible_freeipa集合。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个具有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
示例假定 secret.yml Ansible vault 存储了您的
ipaadmin_password,并且您可以访问存储了保护 secret.yml 文件的密码的文件。
-
目标节点(这是执行
freeipa.ansible_freeipa模块的节点)是作为 IdM 客户端、服务器或副本的 IdM 域的一部分。 - jane、john 和 alice 在 IdM 中存在。为这些帐户配置密码。
流程
使用以下内容创建您的 Ansible playbook 文件 add-hbac-and-sudo-rules-to-idm.yml :
--- - name: Playbook to manage IPA HBAC and SUDO rules hosts: ipaserver become: false gather_facts: false vars_files: - /home/<user_name>/MyPlaybooks/secret.yml module_defaults: group/freeipa.ansible_freeipa.modules: ipaadmin_password: "{{ ipaadmin_password }}" tasks: - name: HBAC Rule for Jane - can log in to client01 freeipa.ansible_freeipa.ipahbacrule: # Creates the rule name: Jane_rule hbacsvc: - sshd - login host: # Host name - client01.idm.example.com user: - jane - name: HBAC Rule for John - can log in to client02 freeipa.ansible_freeipa.ipahbacrule: # Creates the rule name: john_rule hbacsvc: - sshd - login host: # Host name - client02.idm.example.com user: - john - name: Add user member alice to group admins freeipa.ansible_freeipa.ipagroup: name: admins action: member user: - alice - name: HBAC Rule for IdM administrators freeipa.ansible_freeipa.ipahbacrule: # Rule to allow admins full access name: admin_access # Rule name servicecat: all # All services hostcat: all # All hosts group: # User group - admins - name: Add reboot command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/sbin/reboot state: present - name: Add less command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/bin/less state: present - name: Add setenforce command to SUDO freeipa.ansible_freeipa.ipasudocmd: name: /usr/sbin/setenforce state: present - name: Create a SUDO command group freeipa.ansible_freeipa.ipasudocmdgroup: name: cmd_grp_1 description: "Group of important commands" sudocmd: - /usr/sbin/setenforce - /usr/bin/less - /usr/sbin/reboot action: sudocmdgroup state: present - name: Create a SUDO rule with a SUDO command group freeipa.ansible_freeipa.ipasudorule: name: sudo_rule_1 allow_sudocmdgroup: - cmd_grp_1 group: admins state: present - name: Disable allow_all HBAC Rule freeipa.ansible_freeipa.ipahbacrule: # Rule to allow admins full access name: allow_all # Rule name state: disabled # Disables rule to allow everyone the ability to login运行 playbook:
$ ansible-playbook --vault-password-file=password_file -i inventory add-hbac-and-sudo-rules-to-idm.yml
验证
以 jane 用户身份连接到 client01:
~]$ ssh jane@client01 Password: Last login: Fri Aug 11 15:32:18 2023 from 192.168.122.1 [jane@client01 ~]$输出证明 jane 已登录到 client01。
尝试以 jane 用户身份连接到 client02 :
~]$ ssh jane@client02 Password: Connection closed by 192.168.122.47 port 22输出证明 jane 无法登录到 client02。
以 alice 用户身份连接到 client02 :
~]$ ssh alice@client02 Password: Last login: Fri Aug 10 16:13:43 2023 from 192.168.122.1输出证明 alice 已登录到 client02。
尝试使用
less查看/etc/sssd/sssd.conf文件的内容,而无需调用超级用户特权:[alice@client02 ~]$ less /etc/sssd/sssd.conf /etc/sssd/sssd.conf: Permission denied尝试失败,因为该文件对除了文件的所有者(即
root用户)之外的任何人都不可读。调用
root特权以使用less查看/etc/sssd/sssd.conf文件的内容:[alice@client02 ~]$ sudo less /etc/sssd/sssd.conf [sudo] password for alice: [domain/idm.example.com] id_provider = ipa ipa_server_mode = True [...]输出证明 alice 可以对
/etc/sssd/sssd.conf文件执行less命令。