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 규칙 다이어그램

다른 사용자의 다양한 호스트 액세스 및 sudo 권한을 표시하는 IdM 사용자 및 호스트의 이미지

사전 요구 사항

  • 제어 노드에서 다음을 수행합니다.

    • Ansible 버전 2.14 이상을 사용하고 있습니다.
    • ansible-freeipa 패키지가 설치되어 있습니다.
    • ~/MyPlaybook/ 디렉터리에 IdM 서버의 FQDN(정규화된 도메인 이름)을 사용하여 Ansible 인벤토리 파일을 생성했습니다.
    • ipaadmin_passwordsecret.yml Ansible 자격 증명에 저장했습니다.
  • 사용자 jane,johnalice 는 IdM에 있습니다. 이러한 계정에 대해 암호가 구성됩니다.

절차

  1. 다음 콘텐츠를 사용하여 Ansible 플레이북 파일 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
  2. 플레이북을 실행합니다.

    $ ansible-playbook --vault-password-file=password_file -i inventory add-hbac-and-sudo-rules-to-idm.yml

검증

  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에 로그인했는지 확인합니다.

  2. jane 사용자로 client02에 연결을 시도합니다.

    ~]$ ssh jane@client02
    Password:
    Connection closed by 192.168.122.47 port 22

    jane이 client02에 로그인할 수 없는지 확인합니다.

  3. alice 사용자로 client02에 연결합니다.

    ~]$ ssh alice@client02
    Password:
    
    Last login: Fri Aug 10 16:13:43 2023 from 192.168.122.1

    출력에서 alice가 client02에 로그인했는지 확인합니다.

  4. 슈퍼유저 권한을 호출하지 않고 less 를 사용하여 /etc/sssd/sssd.conf 파일의 내용을 봅니다.

    [alice@client02 ~]$ less /etc/sssd/sssd.conf
    /etc/sssd/sssd.conf: Permission denied

    root 인 파일의 소유자를 제외한 모든 사람이 파일을 읽을 수 없으므로 시도에 실패합니다.

  5. 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 명령을 실행할 수 있는지 확인합니다.