34장. Ansible을 사용하여 IdM에서 HBAC 및 sudo 규칙 구성
IdM(Identity Management)에서 HBAC(Host-based Access Control)를 사용하여 다음을 기반으로 호스트 또는 서비스에 대한 액세스를 제한하는 정책을 정의할 수 있습니다.
- 로그인하려는 사용자 및 이 사용자의 그룹
- 사용자가 액세스하려고 하는 호스트 및 해당 호스트가 속하는 호스트 그룹
- 호스트에 액세스하는 데 사용되는 서비스
sudo
를 사용하여 사용자는 다른 권한이 있는 다른 사용자로 프로그램을 실행할 수 있습니다(예: root
권한). IdM에서는 sudo 규칙을 중앙에서 관리할 수 있습니다. 사용자 그룹, 호스트 그룹 및 명령 그룹과 개별 사용자, 호스트 및 명령을 기반으로 sudo
규칙을 정의할 수 있습니다.
IdM 사용자에 대해 다음 HBAC 및 sudo
규칙이 있는지 확인하려면 다음 절차를 완료합니다.
- Jane 은 호스트 client01.idm.example.com 에만 액세스할 수 있습니다.
- 존은 호스트 client02.idm.example.com 에만 액세스할 수 있습니다.
-
기본
admin
사용자와 일반 alice 사용자를 포함하는admins
그룹의 멤버는 IdM 호스트에 액세스할 수 있습니다. admins
그룹의 멤버는 IdM 호스트에서 다음 명령을 사용하여sudo
를 실행할 수 있습니다.-
/usr/sbin/reboot
-
/usr/bin/less
-
/usr/sbin/setenforce
-
다음 다이어그램은 위에서 설명한 원하는 구성을 나타냅니다.
그림 34.1. IdM HBAC 및 SUDO 규칙 다이어그램

- 참고
-
이 절차에서는
ansible-freeipa rpm
이 아닌freeipa.ansible_freeipa
컬렉션에서만 사용할 수 있는module_defaults
로 모듈 사용을 간소화하는 작업 그룹을 사용하는 방법을 보여줍니다. 이름이freeipa.ansible_freeipa.modules
인action_group
을 사용하여 플레이북에서 사용되는 컬렉션의 모든 모듈에 기본값을 적용할 수 있습니다. 이 예제에서는 IdM 관리자 암호가 이러한 방식으로 정의됩니다.ansible-freeipa-collection
은 RHEL 9.5 이상의rhel-9-for-x86_64-appstream-rpms
리포지토리의 일부입니다.
사전 요구 사항
제어 노드에서 다음을 수행합니다.
- Ansible 버전 2.14 이상을 사용하고 있습니다.
- RHEL 버전 9.5 이상을 사용하고 있습니다.
-
ansible-freeipa-collection
하위 패키지를 설치했습니다. - ~/MyPlaybook/ 디렉터리에 IdM 서버의 FQDN(정규화된 도메인 이름)을 사용하여 Ansible 인벤토리 파일을 생성했습니다.
-
ipaadmin_password
를 secret.yml Ansible 자격 증명에 저장했습니다.
- 사용자 jane,john 및 alice 는 IdM에 있습니다. 이러한 계정에 대해 암호가 구성됩니다.
절차
다음 콘텐츠를 사용하여 Ansible 플레이북 파일 add-hbac-and-sudo-rules-to-idm.yml 을 생성합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --- - name: Playbook to manage IPA HBAC and SUDO rules hosts: ipaserver become: false gather_facts: false collections: freeipa.ansible_freeipa 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 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
--- - name: Playbook to manage IPA HBAC and SUDO rules hosts: ipaserver become: false gather_facts: false collections: freeipa.ansible_freeipa 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 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
플레이북을 실행합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ansible-playbook --vault-password-file=password_file -i inventory add-hbac-and-sudo-rules-to-idm.yml
$ ansible-playbook --vault-password-file=password_file -i inventory add-hbac-and-sudo-rules-to-idm.yml
검증
jane 사용자로 client01에 연결합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ ssh jane@client01 Password: Last login: Fri Aug 11 15:32:18 2023 from 192.168.122.1 [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에 연결을 시도합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ ssh jane@client02 Password: Connection closed by 192.168.122.47 port 22
~]$ ssh jane@client02 Password: Connection closed by 192.168.122.47 port 22
jane이 client02에 로그인할 수 없는지 확인합니다.
alice 사용자로 client02에 연결합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ ssh alice@client02 Password: Last login: Fri Aug 10 16:13:43 2023 from 192.168.122.1
~]$ 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
파일의 내용을 봅니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
파일의 내용을 봅니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow sudo 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
명령을 실행할 수 있는지 확인합니다.