本页内容

  • 先决条件
  • 允许 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 服务器上可用。

如何将 Sudoers 与 FreeIPA 服务器集成

接下来,输入以下命令,使用用户 'rocky' 登录到 FreeIPA 客户端机器。这将确保该用户能够连接到 FreeIPA 客户端机器。在本示例中,名为 'client.hwdomain.lan' 的服务器被用作 FreeIPA 客户端机器。

ssh 
[email protected]

输入用户 'rocky' 的密码。登录到客户端机器后,输入以下命令来确认当前用户。

whoami
id

如何将 Sudoers 与 FreeIPA 服务器集成

输入以下 '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 服务正在客户端机器上运行。

如何将 Sudoers 与 FreeIPA 服务器集成

最后,输入以下命令来显示当前认证源上已启用的功能列表。在 FreeIPA 客户端机器上,SSSD 默认作为认证源启用。

authselect current

在 'Enabled features' 部分下,你应该能看到参数 'with-sudo'。这确认了 'sudo' 功能已在 SSSD 认证配置文件中启用。

如何将 Sudoers 与 FreeIPA 服务器集成

设置 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' 已被添加并可用。

如何将 Sudoers 与 FreeIPA 服务器集成

接下来,输入以下命令创建一个名为 '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 规则已创建。

如何将 Sudoers 与 FreeIPA 服务器集成

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

ipa sudorule-add-user sysadmin_sudo --group sysadmin

如何将 Sudoers 与 FreeIPA 服务器集成

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

ipa sudorule-show sysadmin_sudo

如何将 Sudoers 与 FreeIPA 服务器集成

最后,输入以下命令将 FreeIPA 用户 'rocky' 添加到组 'sysadmin' 中。然后,验证 'sysadmin' 组的详细信息,以确保你的用户已被添加。

ipa group-add-member --user=rocky sysadmin
ipa group-show sysadmin

在 'sysadmin' 组的详细信息中,你应该能看到用户 'rocky' 已添加,并且该组也是 sudo 规则 'sysadmin_sudo' 的一部分。

如何将 Sudoers 与 FreeIPA 服务器集成

至此,你已通过组 '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 服务器集成

至此,你已成功将 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

如何将 Sudoers 与 FreeIPA 服务器集成

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

ipa user-find max

如何将 Sudoers 与 FreeIPA 服务器集成

接下来,输入以下命令添加一个新组 '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

如何将 Sudoers 与 FreeIPA 服务器集成

如何将 Sudoers 与 FreeIPA 服务器集成

为确保新用户能够登录到客户端机器,输入以下 ssh 命令。在本示例中,用户 'max' 将登录到客户端机器 'client.hwdomain.lan'。

ssh 
[email protected]

当提示时,输入你的密码。然后你还会被要求更改默认密码。因此,输入你当前的密码,然后输入新密码并重复确认。

如何将 Sudoers 与 FreeIPA 服务器集成

登录后,使用以下命令确认当前用户。

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

如何将 Sudoers 与 FreeIPA 服务器集成

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

ipa hostgroup-add appserver
ipa hostgroup-add-member appserver --hosts=client.hwdomain.lan

如何将 Sudoers 与 FreeIPA 服务器集成

如何将 Sudoers 与 FreeIPA 服务器集成

使用以下命令验证主机组 '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'。

如何将 Sudoers 与 FreeIPA 服务器集成

在默认的 HBAC 规则 'allow_all' 被禁用后,将没有任何用户能够登录到客户端机器。

接下来,使用以下 'ipa hbacrule-add' 命令创建一个名为 'operation_admin' 的新自定义 HBAC 规则。

ipa hbacrule-add operation_admin

如何将 Sudoers 与 FreeIPA 服务器集成

现在,通过命令 '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

如何将 Sudoers 与 FreeIPA 服务器集成

接下来,将诸如 '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

如何将 Sudoers 与 FreeIPA 服务器集成

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

ipa hbacrule-show operation_admin

如何将 Sudoers 与 FreeIPA 服务器集成

至此,只有规则 'operation_admin' 内的用户/组才能够登录到客户端机器。用户 'rocky' 无法登录到客户端机器 'client.hwdomain.lan',但用户 'max' 可以登录到 'client.hwdomain.lan'。这是因为用户 'max' 是组 'systemadmin' 的一部分,而该组已应用到 HBAC 规则 'operation_admin'。

以用户 'rocky' 身份登录的情况将由客户端机器决定。

ssh 
[email protected]

以用户 'max' 身份登录是被允许的,因为它是 'systemadmin' 组的一部分。

ssh 
[email protected]

如何将 Sudoers 与 FreeIPA 服务器集成

创建 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

如何将 Sudoers 与 FreeIPA 服务器集成

现在输入以下命令,将用户组 '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

如何将 Sudoers 与 FreeIPA 服务器集成

创建 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"

如何将 Sudoers 与 FreeIPA 服务器集成

接下来,添加一个名为 '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 条命令。

如何将 Sudoers 与 FreeIPA 服务器集成

最后,输入以下命令将 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 服务器集成

验证 Sudoers 与 FreeIPA 的集成

要在此场景中验证 Sudo 的实现及其与 FreeIPA 的集成,你将通过新用户 'max' 登录到 'client.hwdomain.lan'。然后,你将执行一些用于管理 LEMP Stack 服务的命令。

使用以下 ssh 命令,以用户 'max' 身份登录到 client.hwdomain.lan。当提示时输入密码。

ssh 
[email protected]

登录后,输入以下命令确认当前用户。你将看到你是以用户 'max' 身份登录的。

id
whoami

如何将 Sudoers 与 FreeIPA 服务器集成

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

sudo /usr/bin/systemctl restart nginx
sudo /usr/bin/systemctl restart php-fpm
sudo /usr/bin/systemctl restart mariadb

如何将 Sudoers 与 FreeIPA 服务器集成

现在,如果你尝试 '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 服务器集成

至此,你已完成 Sudoers 与 FreeIPA 服务器的配置,以允许以 sudo 或 root 身份执行特定命令。

结论

本教程向你讲解了如何将 Sudoers 与 FreeIPA 服务器集成。你还学习了一些用于管理用户、组、主机组、sudo 规则、HBAC (Host-Based Access Control) 规则以及 sudo 命令组的 'ipa' 工具的基本命令。你学习了通过两种不同场景将 Sudoers 与 FreeIPA 服务器进行基本集成:允许用户在所有的命令和主机上执行 sudo,以及允许用户在特定的主机/客户端上仅针对特定命令运行 sudo。

除此之外,你还学习了 SSSD 服务的基本配置,并通过 FreeIPA 服务器将其与 Sudo 集成。

借助此 Sudo 实现,你可以在你的部署服务器上实施这两种场景。要了解更多信息,请访问 FreeIPA 和 Sudoer 的官方文档。