第34章 Ansible を使用した IdM での HBAC ルールおよび sudo ルールの設定

Identity Management (IdM) でホストベースのアクセス制御 (HBAC) を使用すると、以下に基づいてホストまたはサービスへのアクセスを制限するポリシーを定義できます。

  • ログインを試行しているユーザーおよびこのユーザーのグループ
  • ユーザーがアクセスしようとしているホストおよびそのホストが属するホストグループ
  • ホストへのアクセスに使用されるサービス

sudo を使用すると、ユーザーは root 権限などの別の権限で、別のユーザーとしてプログラムを実行できます。IdM では、sudo ルールを一元管理できます。sudo ルールは、ユーザーグループ、ホストグループ、コマンドグループのほか、個々のユーザー、個々のホスト、個々のコマンドに基づいて定義できます。

以下の手順を実行し、IdM ユーザーに対して以下の HBAC ルールおよび sudo ルールが設定されていることを確認します。

  • jane はホスト client01.idm.example.com のみにアクセスできます。
  • john は、ホスト 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 パッケージをインストールしている。
    • ~/MyPlaybooks/ ディレクトリーに、IdM サーバーの完全修飾ドメイン名 (FQDN) を使用して Ansible インベントリーファイル を作成した。
    • ipaadmin_passwordSecret.yml Ansible Vault に保存している。
  • IdM に、ユーザー janejohnalice が存在する。これらのアカウントにはパスワードが設定されます。

手順

  1. 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
  2. Playbook を実行します。

    $ 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 コマンドを実行できることが確認できます。