第 34 章 使用 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
-
下图显示了上述所需的配置:
图 34.1. IdM HBAC 和 SUDO 规则图
先决条件
在控制节点上:
- 您使用 Ansible 版本 2.13 或更高版本。
-
您已安装了
ansible-freeipa
软件包。 - 您已在 ~/MyPlaybooks/ 目录中创建了一个带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件。
-
您已将
ipaadmin_password
存储在 secret.yml Ansible vault 中。
- 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: ipahbacrule: ipaadmin_password: "{{ ipaadmin_password }}" ipagroup: ipaadmin_password: "{{ ipaadmin_password }}" ipasudocmd: ipaadmin_password: "{{ ipaadmin_password }}" ipasudocmdgroup: ipaadmin_password: "{{ ipaadmin_password }}" ipasudorule: ipaadmin_password: "{{ ipaadmin_password }}" tasks: - name: HBAC Rule for Jane - can log in to client01 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 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 ipagroup: name: admins action: member user: - alice - name: HBAC Rule for IdM administrators 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 ipasudocmd: name: /usr/sbin/reboot state: present - name: Add less command to SUDO ipasudocmd: name: /usr/bin/less state: present - name: Add setenforce command to SUDO ipasudocmd: name: /usr/sbin/setenforce state: present - name: Create a SUDO command group 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 ipasudorule: name: sudo_rule_1 allow_sudocmdgroup: - cmd_grp_1 group: admins state: present - name: Disable allow_all HBAC Rule 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
命令。