20.11. 使用 Ansible playbook 来确保 IdM 客户端上 IdM 用户的 sudo 访问权限

在身份管理(IdM)中,您可以确保对特定命令的sudo 访问权限被授予给特定 IdM 主机上的 IdM 用户帐户。

完成此流程以确保名为 idm_user_rebootsudo 规则存在。该规则授予 idm_useridmclient 机器上运行 /usr/sbin/reboot 命令的权限。

先决条件

  • 您已配置了 Ansible 控制节点以满足以下要求:

    • 您使用 Ansible 版本 2.14 或更高版本。
    • 您已在 Ansible 控制器上安装了 ansible-freeipa 软件包。
    • 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个带有 IdM 服务器的完全限定域名(FQDN)的 Ansible 清单文件
    • 示例假定 secret.yml Ansible vault 存储了 ipaadmin_password
  • 目标节点(这是执行 ansible-freeipa 模块的节点)是 IdM 域的一部分,作为 IdM 客户端、服务器或副本的一部分。
  • 您已 确保 IdM 中存在 idm_user 用户帐户,并通过为用户创建密码解锁了帐户。有关使用命令行界面添加新 IdM 用户的详情,请参考链接:使用命令行添加用户
  • idmclient 中没有本地 idm_user 帐户。idm_user 用户未列在 idmclient 上的 /etc/passwd 文件中。

流程

  1. 创建一个清单文件,如 inventory.file,并在其中定义 ipaservers

    [ipaservers]
    server.idm.example.com
  2. 添加一个或多个 sudo 命令:

    1. 创建一个 ensure-reboot-sudocmd-is-present.yml Ansible playbook,以确保在 sudo 命令的 IdM 数据库中存在 /usr/sbin/reboot 命令。要简化此步骤,您可以复制并修改 /usr/share/doc/ansible-freeipa/playbooks/sudocmd/ensure-sudocmd-is-present.yml 文件中的示例:

      ---
      - name: Playbook to manage sudo command
        hosts: ipaserver
      
        vars_files:
        - /home/user_name/MyPlaybooks/secret.yml
        tasks:
        # Ensure sudo command is present
        - ipasudocmd:
            ipaadmin_password: "{{ ipaadmin_password }}"
            name: /usr/sbin/reboot
            state: present
    2. 运行 playbook:

      $ ansible-playbook --vault-password-file=password_file -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-reboot-sudocmd-is-present.yml
  3. 创建引用命令的 sudo 规则:

    1. 创建一个 ensure-sudorule-for-idmuser-on-idmclient-is-present.yml Ansible playbook,其使用 sudo 命令条目来确保存在 sudo 规则。sudo 规则允许 idm_user 重新启动 idmclient 机器。要简化此步骤,您可以复制并修改 /usr/share/doc/ansible-freeipa/playbooks/sudorule/ensure-sudorule-is-present.yml 文件中的示例:

      ---
      - name: Tests
        hosts: ipaserver
      
        vars_files:
        - /home/user_name/MyPlaybooks/secret.yml
        tasks:
        # Ensure a sudorule is present granting idm_user the permission to run /usr/sbin/reboot on idmclient
        - ipasudorule:
            ipaadmin_password: "{{ ipaadmin_password }}"
            name: idm_user_reboot
            description: A test sudo rule.
            allow_sudocmd: /usr/sbin/reboot
            host: idmclient.idm.example.com
            user: idm_user
            state: present
    2. 运行 playbook:

      $ ansible-playbook -v -i path_to_inventory_directory/inventory.file path_to_playbooks_directory/ensure-sudorule-for-idmuser-on-idmclient-is-present.yml

验证步骤

通过验证 idm_user 能够使用 sudo 重新启动 idmclient,来测试您在 IdM 服务器上已确认存在的 sudo 规则可以在 idmclient 上正常工作。请注意,服务器上所做的更改可能需要几分钟才能在客户端上生效。

  1. idm_user 用户身份登录到 idmclient
  2. 使用 sudo 重新启动计算机。在提示时输入 idm_user 的密码:

    $ sudo /usr/sbin/reboot
    [sudo] password for idm_user:

如果正确配置了 sudo,则机器将重新启动。

其它资源

  • 请参阅 /usr/share/doc/ansible-freeipa/ 目录中的 README-sudocmd.md ,README-sudocmdgroup.mdREADME-sudorule.md 文件。