本页内容
- 先决条件
- 允许 FreeIPA 用户完全执行 Sudo 验证 FreeIPA 用户与连接 在 SSSD 服务上启用 Sudo 功能 设置 Sudo 规则 验证 Sudoers 与 FreeIPA 的集成
- 允许 FreeIPA 用户针对特定命令执行 Sudo 创建 FreeIPA 用户与组 创建主机组 创建 HBAC (Host-Based Access Control) 规则 创建 Sudo 规则 创建 Sudo 命令组 验证 Sudoers 与 FreeIPA 的集成
- 结论
- 验证 FreeIPA 用户与连接
- 在 SSSD 服务上启用 Sudo 功能
- 设置 Sudo 规则
- 验证 Sudoers 与 FreeIPA 的集成
- 创建 FreeIPA 用户与组
- 创建主机组
- 创建 HBAC (Host-Based Access Control) 规则
- 创建 Sudo 规则
- 创建 Sudo 命令组
- 验证 Sudoers 与 FreeIPA 的集成
Sudo 是一款应用程序,允许你在 Linux 和 Unix 操作系统上获取 root 或管理员权限。Sudo 在大多数 Linux 发行版中默认都已安装,你也可以通过 /etc/sudoers 文件配置用户授权,并允许非特权用户以 root 用户身份执行特定命令。
Sudo 可以通过多种方式进行配置。你可以在本地计算机/服务器上设置 sudo,也可以通过第三方软件设置集中式 sudo。在本示例中,你将使用 FreeIPA 服务器来搭建集中式 sudo 部署。
FreeIPA 内置了多种工具,可让管理员的工作更轻松,其中包括 sudo 集成。你可以为 FreeIPA 用户设置完全的 sudo 访问权限,也可以针对特定命令设置 sudo,这其中包括 HBAC (Host-based Access Control) 规则以及 Sudo Command Group。
在本教程中,你将学习如何通过两种场景将 Sudoers 与 FreeIPA 集成。你还将学习用于管理用户、用户组、主机组、Sudo Rule、HBAC Rule 和 Sudo Command Group 的 'ipa' 命令工具的基本用法。本教程还涵盖了如何在客户端机器上将 SSSD 服务配置并与 Sudo 和 FreeIPA 集成。
先决条件
要完成本教程,必须已安装并完整配置好 FreeIPA 服务器。你可以在此处找到适用于 Debian、Ubuntu 和 Rocky Linux 的教程:
- https://www.howtoforge.com/how-to-add-ubuntu-system-to-freeipa-server/
- https://www.howtoforge.com/how-to-install-freeipa-on-rocky-linux-9/
- https://www.howtoforge.com/how-to-install-freeipa-server-with-docker-on-debian/
你还必须拥有一个 FreeIPA 用户,以及一台已配置为 FreeIPA 客户端的客户端机器。此外,在 FreeIPA 服务器和客户端上都需要一个具有 sudo/root 管理员权限的非 root 用户。
本示例使用两台 Rocky Linux 服务器,详情如下:
Hostname IP Address Used as -------------------------------------------------- ipa.hwdomain.lan 192.168.5.20 FreeIPA Server client.hwdomain.lan 192.168.5.75 FreeIPA Client
当上述这些要求准备就绪后,即可开始将 Sudoers 与 FreeIPA 集成。
允许 FreeIPA 用户完全执行 Sudo
首先,你将学习如何通过创建一个允许用户执行 'sudo' 的特定 Sudo Rule,将 Sudoers 与 FreeIPA 服务器集成。在本示例中,你将配置一个名为 'rocky' 的现有 FreeIPA 用户,使其能够在每台客户端机器上执行 'sudo' 命令并获得 root 权限。
以下是你为实现将 Sudoers 与 FreeIPA 服务器集成所需执行的步骤:
- 验证用户与连接
- 在 SSSD 服务上启用 Sudo 功能(在客户端机器上)
- 设置 Sudo 规则
- 验证 Sudoers 集成
现在让我们开始吧。
验证 FreeIPA 用户与连接
在本节中,你将验证并确保 FreeIPA 用户 'rocky' 在 FreeIPA 服务器上可用,并确保该用户能够连接到客户端机器 'client.hwdomain.lan'。
本示例使用 FreeIPA 用户 'rocky',输入以下 'ipa' 命令来确保用户 'rocky' 在 FreeIPA 服务器上可用。
ipa user-find rocky
输出 '1 user matched' 确认用户 'rocky' 在 FreeIPA 服务器上可用。

接下来,输入以下命令,使用用户 'rocky' 登录到 FreeIPA 客户端机器。这将确保该用户能够连接到 FreeIPA 客户端机器。在本示例中,名为 'client.hwdomain.lan' 的服务器被用作 FreeIPA 客户端机器。
ssh
[email protected]
输入用户 'rocky' 的密码。登录到客户端机器后,输入以下命令来确认当前用户。
whoami
id

输入以下 'sudo su' 命令以获取 root 访问权限或特权。输入密码后,你应该会看到类似 'rocky is not in the sudoers file. This incident will be reported.' 的错误。
sudo su
在 SSSD 服务上启用 Sudo 功能
在为 FreeIPA 配置 Sudoers 之前,你必须在客户端机器的 SSSD 服务上启用 'with-sudo' 功能。在本节中,你将通过 'authselect' 工具启用 SSSD 的 'sudo' 功能。因此请务必在客户端机器 'client.hwdomain.lan' 上运行这些命令。
输入以下命令 'authselect' 以在 SSSD 服务上启用 'sudo'。你必须在 SSSD 上启用 'sudo' 功能,这样 FreeIPA 用户才能在客户端机器上执行 'sudo' 命令。
sudo authselect enable-feature with-sudo
接下来,通过以下 systemctl 命令工具重启 SSSD 服务。然后,验证 SSSD 服务以确保其正在运行。
sudo systemctl restart sssd
sudo systemctl status sssd
输出 'active (running)' 确认 SSSD 服务正在客户端机器上运行。

最后,输入以下命令来显示当前认证源上已启用的功能列表。在 FreeIPA 客户端机器上,SSSD 默认作为认证源启用。
authselect current
在 'Enabled features' 部分下,你应该能看到参数 'with-sudo'。这确认了 'sudo' 功能已在 SSSD 认证配置文件中启用。

设置 Sudo 规则
Sudo 是一款允许你以 root 用户身份执行命令,或者也可以通过它获取 root 用户的应用程序。默认情况下,FreeIPA 支持 Sudo,并提供了一个命令行工具用于将 Sudo 与 FreeIPA 服务器集成。
在本节中,你将通过创建一个 Sudo Rule 将 Sudo 与 FreeIPA 集成。你将首先设置用户组,然后设置该 Sudo Rule,以允许特定组内的任何用户访问并执行 Sudo。
在 FreeIPA 服务器上,输入以下命令在 FreeIPA 服务器上创建一个名为 'sysadmin' 的新组。然后,验证 'sysadmin' 组的详细信息。
ipa group-add --desc='Sysadmin Team' sysadmin
ipa group-find sysadmin
输出 'Added group "sysadmin"' 确认新组已在 FreeIPA 服务器上创建。执行 'ipa group-find' 命令后,你应该会看到类似 '1 group matched' 的输出,这意味着组 'sysadmin' 已被添加并可用。

接下来,输入以下命令创建一个名为 'sysadmin_sudo' 的新 Sudo Rule。'ipa sudorule-add' 是一个可用于向 FreeIPA 服务器添加 sudo 规则的工具。同时,你正在使用一些参数 '--hostcat=all --runasusercat=all --runasgroupcat=all --cmdcat=all' 创建一条新 sudo 规则,这些参数允许该规则在每台客户端机器上执行 sudo,并适用于任何属于 'sysadmin_sudo' 规则的用户或组。
ipa sudorule-add sysadmin_sudo \
--hostcat=all --runasusercat=all --runasgroupcat=all --cmdcat=all
输出 'Added Sudo Rule "sysadmin_sudo"' 确认新的 sudo 规则已创建。

现在输入以下命令将组 'sysadmin' 添加到 sudo 规则 'sysadmin_sudo' 中。这将允许 'sysadmin' 组内的任何 FreeIPA 用户在每台 FreeIPA 客户端机器上执行 sudo 命令。
ipa sudorule-add-user sysadmin_sudo --group sysadmin

使用以下命令验证 sudo 规则 'sysadmin_sudo' 的详细信息。在 'User Grous' 部分下,你应该能看到 'sysadmin' 组已被添加并在 'sysadmin_sudo' 上可用。
ipa sudorule-show sysadmin_sudo

最后,输入以下命令将 FreeIPA 用户 'rocky' 添加到组 'sysadmin' 中。然后,验证 'sysadmin' 组的详细信息,以确保你的用户已被添加。
ipa group-add-member --user=rocky sysadmin
ipa group-show sysadmin
在 'sysadmin' 组的详细信息中,你应该能看到用户 'rocky' 已添加,并且该组也是 sudo 规则 'sysadmin_sudo' 的一部分。

至此,你已通过组 'sysadmin' 和 Sudo Rule 'sysadmin_sudo' 配置并允许了用户 'rocky' 在所有客户端机器上执行 Sudo。在下一步中,你将验证 Sudo 与 FreeIPA 服务器的集成。
验证 Sudoers 与 FreeIPA 的集成
在本节中,你将确保 Sudo 与 FreeIPA 的集成正常工作。可以通过以用户 'rocky' 身份登录到客户端机器,然后执行 'sudo' 命令来获取 root 权限来实现。
输入以下命令,使用用户 'rocky' 连接到 FreeIPA 客户端机器 'client.hwdomain.lan'。当提示时,输入用户 'rocky' 的密码。
ssh
[email protected]
登录到客户端机器后,执行以下命令来确认当前用户。你应该能看到你是以用户 'rocky' 身份登录的。
id
whoami
现在输入以下 'sudo' 命令来验证 FreeIPA 用户 'rocky' 的 'sudo' root 权限。当提示时,输入用户 'rocky' 的密码。
sudo id
sudo su
当操作成功时,你应该会看到你的 shell 提示符变为 'root@hostname ...'。这确认你现在已经获得 root 权限,并以 root 用户身份登录。
使用以下命令确认当前用户。你应该能看到你当前是以 'root' 用户身份登录的。
id
whoami

至此,你已成功将 Sudoers 与 FreeIPA 服务器集成。'sysadmin' 组内的任何用户现在都可以在每台客户端机器上执行 'sudo' 命令并获得 root 权限。
允许 FreeIPA 用户针对特定命令执行 Sudo
对于此场景,你将设置一个新的 FreeIPA 用户,该用户将能够登录到客户端机器并针对特定命令执行 Sudo。
在本示例中,你将设置一个名为 'max' 的新用户,该用户将能够通过 SSH 登录到客户端机器 'client.hwdomain.lan',并执行 Sudo,但仅限于用于管理 LEMP Stack 的一些命令。
要实现这一点,你需要执行以下步骤:
- 创建 FreeIPA 用户与组
- 创建主机组
- 创建 HBAC (Host-Based Access Control) 规则
- 创建 Sudo 规则
- 创建 Sudo 命令组
- 验证与 FreeIPA 的 Sudo 集成
现在让我们开始吧。
创建 FreeIPA 用户与组
首先,你需要创建并定义一个特定的用户和组。在本示例中,你将在 FreeIPA 服务器上创建一个新用户 'max' 和用户组 'systemadmin'。你还将验证新用户 'max',以确保该用户能够访问并登录到客户端机器 'client.hwdomain.lan'。
通过输入以下 'ipa user-add' 命令创建一个名为 'max' 的新 FreeIPA 用户。当提示时,输入新用户的密码并重复确认。
ipa user-add max --first=Max --last=Rods --password

现在使用以下命令验证用户 'max' 的详细信息。你应该能看到用户 'max' 的默认详细配置。
ipa user-find max

接下来,输入以下命令添加一个新组 'systemadmin'。然后,将用户 'max' 添加到组 'sysadmin' 中。
ipa group-add --desc='System Admin Team' systemadmin
ipa group-add-member --user=max systemadmin
使用以下命令验证组 'systemadmin' 的详细配置。你应该能看到用户 'max' 已被添加并在组 'systemadmin' 中可用。
ipa group-show systemadmin


为确保新用户能够登录到客户端机器,输入以下 ssh 命令。在本示例中,用户 'max' 将登录到客户端机器 'client.hwdomain.lan'。
ssh
[email protected]
当提示时,输入你的密码。然后你还会被要求更改默认密码。因此,输入你当前的密码,然后输入新密码并重复确认。

登录后,使用以下命令确认当前用户。
id
whoami
你应该能看到你是以用户 'max' 身份登录到 'client.hwdomain.lan' 的。
创建主机组
在创建用户和组之后,你现在将在 FreeIPA 上创建并设置 Host group。你将创建一个名为 'appserver' 的新主机组,该组的成员将是 'client.hwdomain.lan'。
使用以下命令验证 FreeIPA 上可用的主机列表。这将显示 FreeIPA 上可用的机器列表。在本示例中,FreeIPA 服务器上有两个主机可用:'ipa.hwdomain.lan' 和 'client.hwdomain.lan'。
ipa host-find

现在创建一个名为 'appserver' 的新主机组。然后,将主机 'client.hwdomain.lan' 添加到主机组 'appserver' 中。
ipa hostgroup-add appserver
ipa hostgroup-add-member appserver --hosts=client.hwdomain.lan


使用以下命令验证主机组 'appserver' 的详细信息。你应该能看到主机 'client.hwdomain.lan' 已被添加并在 'appserver' 主机组中可用。
ipa hostgroup-show appserver
创建 HBAC (Host-Based Access Control) 规则
在创建了主机组 'appserver' 之后,你现在将在 FreeIPA 服务器上设置 HBAC (Host-based Access Control) 规则。借助 HBAC 规则,你可以设置并定义策略,根据尝试登录的用户及其所属组、他们试图访问的主机(或其主机组),以及(可选)正在访问的服务,来限制对主机或服务的访问。
在本节中,你将禁用默认的 HBAC 规则,并设置一个名为 'operation_admin' 的自定义 HBAC 规则,该规则允许用户 'max' 或组 'systemadmin' 通过 SSH 管理主机组 'appserver' 内的任何主机。此外,该用户或组将能够运行 'sudo' 和 'sudo -l' 命令。
输入以下命令以禁用默认的 HBAC 规则 'allow_all'。然后,验证 HBAC 规则 'allow_all' 的详细信息。
ipa hbacrule-disable allow_all
ipa hbacrule-show allow_all
输出 'Disabled HBAC rule "allow_all"' 确认该规则已被禁用。此外,在 'Enabled' 部分下,你应该能看到值已变为 'false'。

在默认的 HBAC 规则 'allow_all' 被禁用后,将没有任何用户能够登录到客户端机器。
接下来,使用以下 'ipa hbacrule-add' 命令创建一个名为 'operation_admin' 的新自定义 HBAC 规则。
ipa hbacrule-add operation_admin

现在,通过命令 'ipa hbacrule-add-host' 将主机组 'appserver' 添加到 HBAC 规则 'operation_admin' 中,并通过命令 'ipa hbacrule-add-user' 将用户组 'sysadmin' 添加进去。
ipa hbacrule-add-host operation_admin --hostgroup appserver
ipa hbacrule-add-user operation_admin --group systemadmin

接下来,将诸如 'sshd'、'sudo' 和 'su' 等服务添加到 HBAC 规则 'operation_admin' 中。HBAC 规则 'operation_admin' 内的任何主机或主机组都将受到影响,并被允许访问或运行这些命令。
ipa hbacrule-add-service operation_admin --hbacsvcs=sshd
ipa hbacrule-add-service operation_admin --hbacsvcs=sudo --hbacsvcs=su-l

使用以下命令验证 HBAC 规则 'operation_admin' 的详细信息。你应该能看到三个服务 'sshd'、'sudo' 和 'su-l' 已被添加并在 'operation_admin' 上可用。
ipa hbacrule-show operation_admin

至此,只有规则 'operation_admin' 内的用户/组才能够登录到客户端机器。用户 'rocky' 无法登录到客户端机器 'client.hwdomain.lan',但用户 'max' 可以登录到 'client.hwdomain.lan'。这是因为用户 'max' 是组 'systemadmin' 的一部分,而该组已应用到 HBAC 规则 'operation_admin'。
以用户 'rocky' 身份登录的情况将由客户端机器决定。
ssh
[email protected]
以用户 'max' 身份登录是被允许的,因为它是 'systemadmin' 组的一部分。
ssh
[email protected]

创建 Sudo 规则
在本节中,你将在 FreeIPA 上创建并设置一个新 Sudo Rule。然后,你还将把该 Sudo Rule 分配给特定的组 'systemadmin' 和主机组 'appserver'。
输入以下命令添加一个名为 'systemadmin_sudo' 的新 Sudo Rule。在本示例中,你正在创建一条新的 sudo 规则,该规则将仅通过参数 '--runasusercat=all --runasgroupcat=all' 应用于用户和组。这样,并非所有命令都能以 sudo 或 root 身份运行,并且该规则可以应用于特定的客户端或主机。
ipa sudorule-add systemadmin_sudo \
--runasusercat=all --runasgroupcat=all

现在输入以下命令,将用户组 'systemadmin' 和主机组 'appserver' 添加到 sudo 规则 'systemadmin_sudo' 中。这样一来,'systemadmin_sudo' 将仅应用于组 'systemadmin' 内的用户以及属于 'appserver' 的主机/客户端。
ipa sudorule-add-user systemadmin_sudo --group systemadmin
ipa sudorule-add-host systemadmin_sudo --hostgroup appserver

创建 Sudo 命令组
在创建 Sudo Rule 之后,你现在将在 FreeIPA 上设置并定义 Sudo Command Group。借助它,你可以将多个命令绑定到某个特定的 Sudo Command Group,然后可以将该 Sudo Command Group 应用到特定的 Sudo Rule。
对于本示例,你将在 FreeIPA 上定义一些用于启动和重启 LEMP Stack 服务的命令。然后,你将创建一个名为 'systemadmin_cmds' 的新 Sudo Command Group,并将你的命令添加到其中。最后,你将把 Sudo Command Group 'systemadmin_cmds' 分配给 Sudo Rule 'systemadmin_sudo'。
输入以下命令以向 FreeIPA 服务器添加新命令。在本示例中,你将添加可用于管理 LEMP Stack 的命令。你可以启动和重启 Nginx、MariaDB 和 PHP-FPM 服务。
ipa sudocmd-add "/usr/bin/systemctl start nginx"
ipa sudocmd-add "/usr/bin/systemctl restart nginx"
ipa sudocmd-add "/usr/bin/systemctl start php-fpm"
ipa sudocmd-add "/usr/bin/systemctl restart php-fpm"
ipa sudocmd-add "/usr/bin/systemctl start mariadb"
ipa sudocmd-add "/usr/bin/systemctl restart mariadb"

接下来,添加一个名为 'systemadmin_cmds' 的新 sudo 命令组。然后,将所有用于管理 LEMP Stack 的命令添加到 sudo 命令组 'systemadmin_cmds' 中。
ipa sudocmdgroup-add systemadmin_cmds
ipa sudocmdgroup-add-member systemadmin_cmds \
--sudocmds "/usr/bin/systemctl start nginx" \
--sudocmds "/usr/bin/systemctl restart nginx" \
--sudocmds "/usr/bin/systemctl start php-fpm" \
--sudocmds "/usr/bin/systemctl restart php-fpm" \
--sudocmds "/usr/bin/systemctl start mariadb" \
--sudocmds "/usr/bin/systemctl restart mariadb"
输出 'Added Sudo Command Group "systemadmin_cmds"' 确认新的 sudo 命令组已创建。此外,输出 'Number of members added 6' 确认你已向 'systemadmin_cmds' sudo 命令组添加了 6 条命令。

最后,输入以下命令将 sudo 命令组 'systemadmin_cmds' 添加到 sudo 规则 'systemadmin_sudo' 中。这样,sudo 规则 'systemadmin_sudo' 内的用户将能够执行 'systemadmin_cmds' sudo 命令组中可用的 6 条 sudo 命令。
ipa sudorule-add-allow-command systemadmin_sudo --sudocmdgroups systemadmin_cmds

验证 Sudoers 与 FreeIPA 的集成
要在此场景中验证 Sudo 的实现及其与 FreeIPA 的集成,你将通过新用户 'max' 登录到 'client.hwdomain.lan'。然后,你将执行一些用于管理 LEMP Stack 服务的命令。
使用以下 ssh 命令,以用户 'max' 身份登录到 client.hwdomain.lan。当提示时输入密码。
ssh
[email protected]
登录后,输入以下命令确认当前用户。你将看到你是以用户 'max' 身份登录的。
id
whoami

接下来,输入以下命令重启 LEMP Stack 服务。当提示时,输入用户 'max' 的密码。该操作应该会成功,因为用户 'max' 被允许以 'sudo' 身份执行这些命令。
sudo /usr/bin/systemctl restart nginx
sudo /usr/bin/systemctl restart php-fpm
sudo /usr/bin/systemctl restart mariadb

现在,如果你尝试 'systemctl stop' 命令,操作应该会失败,并且你会看到一个类似 'Sorry, user max is now allowed to execute ... as root on the client.hwdomain.lan' 的错误。
sudo /usr/bin/systemctl stop nginx
sudo /usr/bin/systemctl stop php-fpm
sudo /usr/bin/systemctl stop mariadb

至此,你已完成 Sudoers 与 FreeIPA 服务器的配置,以允许以 sudo 或 root 身份执行特定命令。
结论
本教程向你讲解了如何将 Sudoers 与 FreeIPA 服务器集成。你还学习了一些用于管理用户、组、主机组、sudo 规则、HBAC (Host-Based Access Control) 规则以及 sudo 命令组的 'ipa' 工具的基本命令。你学习了通过两种不同场景将 Sudoers 与 FreeIPA 服务器进行基本集成:允许用户在所有的命令和主机上执行 sudo,以及允许用户在特定的主机/客户端上仅针对特定命令运行 sudo。
除此之外,你还学习了 SSSD 服务的基本配置,并通过 FreeIPA 服务器将其与 Sudo 集成。
借助此 Sudo 实现,你可以在你的部署服务器上实施这两种场景。要了解更多信息,请访问 FreeIPA 和 Sudoer 的官方文档。