122.5. 使用 Ansible 配置 Web 控制台,以允许通过智能卡进行身份验证的用户运行 sudo,而无需再次进行身份验证
在登录到 RHEL web 控制台中的用户帐户后,可能需要以 Identity Management (IdM)系统管理员的身份使用超级用户权限运行命令。您可以使用 受限委派 功能在系统中运行 sudo
,而无需再次进行身份验证。
按照以下流程,使用 ipaservicedelegationrule
和 ipaservicedelegationtarget
ansible-freeipa
模块将 Web 控制台配置为使用受限的委托。在以下示例中,web 控制台会话在 myhost.idm.example.com 主机上运行。
先决条件
-
您已通过使用智能卡向 web 控制台会话进行身份验证来获取 IdM
admin
ticket-granting ticket (TGT)。 - Web 控制台服务已注册到 IdM 。
- IdM 中存在 myhost.idm.example.com 主机。
-
您已为 IdM 服务器 上的域管理员启用了
admin
sudo
访问权限。 web 控制台在用户会话中创建了一个
S4U2Proxy
Kerberos ticket。要验证这种情况,以 IdM 用户身份登录 web 控制台,打开Terminal
页面,输入:$ klist Ticket cache: FILE:/run/user/1894000001/cockpit-session-3692.ccache Default principal: user@IDM.EXAMPLE.COM Valid starting Expires Service principal 07/30/21 09:19:06 07/31/21 09:19:06 HTTP/myhost.idm.example.com@IDM.EXAMPLE.COM 07/30/21 09:19:06 07/31/21 09:19:06 krbtgt/IDM.EXAMPLE.COM@IDM.EXAMPLE.COM for client HTTP/myhost.idm.example.com@IDM.EXAMPLE.COM
您已配置了 Ansible 控制节点以满足以下要求:
- 您使用 Ansible 版本 2.14 或更高版本。
-
您已在 Ansible 控制器上安装了
ansible-freeipa
软件包。 - 示例假定在 ~/MyPlaybooks/ 目录中,您已创建了一个 Ansible 清单文件,其中包含您要配置受限委托的 IdM 服务器的完全限定域名(FQDN)。
-
示例假定 secret.yml Ansible 库存储了
ipaadmin_password
。
-
目标节点(这是执行
ansible-freeipa
模块的节点)是 IdM 域的一部分,作为 IdM 客户端、服务器或副本的一部分。
流程
在 Ansible 控制节点上,导航到 ~/MyPlaybooks/ 目录:
$ cd ~/MyPlaybooks/
使用以下内容创建
web-console-smart-card-sudo.yml
playbook:创建确保存在委派目标的任务:
--- - name: Playbook to create a constrained delegation target hosts: ipaserver vars_files: - /home/user_name/MyPlaybooks/secret.yml tasks: - name: Ensure servicedelegationtarget named sudo-web-console-delegation-target is present ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-target
添加将目标主机添加到委托目标的任务:
- name: Ensure that a member principal named host/myhost.idm.example.com@IDM.EXAMPLE.COM is present in a service delegation target named sudo-web-console-delegation-target ipaservicedelegationtarget: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-target principal: host/myhost.idm.example.com@IDM.EXAMPLE.COM action: member
添加确保存在委派规则的任务:
- name: Ensure servicedelegationrule named sudo-web-console-delegation-rule is present ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule
添加一个任务,以确保 web 控制台服务的 Kerberos 主体是受限委托规则的成员:
- name: Ensure the Kerberos principal of the web console service is added to the service delegation rule named sudo-web-console-delegation-rule ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule principal: HTTP/myhost.idm.example.com action: member
添加一个任务,以确保受限的委派规则与 sudo-web-console-delegation-target delegation 目标关联:
- name: Ensure a constrained delegation rule is associated with a specific delegation target ipaservicedelegationrule: ipaadmin_password: "{{ ipaadmin_password }}" name: sudo-web-console-delegation-rule target: sudo-web-console-delegation-target action: member
- 保存该文件。
运行 Ansible playbook。指定 playbook 文件、存储密码的文件保护 secret.yml 文件以及清单文件:
$ ansible-playbook --vault-password-file=password_file -v -i inventory web-console-smart-card-sudo.yml
启用
pam_sss_gss
,这是通过通用安全服务应用程序接口(GSSAPI)验证用户身份的 PAM 模块,并与系统安全服务守护进程(SSSD)协同工作:-
打开
/etc/sssd/sssd.conf
文件进行编辑。 指定
pam_sss_gss
可以在 IdM 域中为sudo
和sudo -i
命令提供身份验证:[domain/idm.example.com] pam_gssapi_services = sudo, sudo-i
- 保存并退出文件。
-
打开
/etc/pam.d/sudo
文件进行编辑。 在
#%PAM-1.0
列表的顶部插入以下行以允许,但不需要sudo
命令进行 GSSAPI 身份验证:auth sufficient pam_sss_gss.so
- 保存并退出文件。
-
打开
重启
SSSD
服务,以便上述更改立即生效:$ systemctl restart sssd
其它资源
- 身份管理中的受限委托
-
README-servicedelegationrule.md
和README-servicedelegationtarget.md
(位于/usr/share/doc/ansible-freeipa/
目录中) -
/usr/share/doc/ansible-freeipa/playbooks/servicedelegationtarget
和/usr/share/doc/ansible-freeipa/playbooks/servicedelegationrule
目录中的 playbook 示例