14.14.使用 sudo 管理权限

系统管理员通常需要向用户授予增强的权限,以便他们可以执行特权任务。团队成员可以访问 FreeBSD 系统来执行他们的特定任务,这给每个管理员带来了独特的挑战。这些团队成员只需要超出正常最终用户级别的访问权限子集;但是,他们几乎总是告诉管理层,如果没有超级用户访问权限,他们就无法执行任务。值得庆幸的是,没有理由向最终用户提供此类访问权限,因为存在用于管理此确切要求的工具。

到目前为止,安全章节已涵盖允许授权用户访问以及尝试防止未经授权的访问。授权用户有权访问系统资源后,会出现另一个问题。在许多情况下,某些用户可能需要访问应用程序启动脚本,或者管理员团队需要维护系统。传统上,标准用户和组、文件权限,甚至 su(1)open in new window 命令都会管理这种访问。而且,由于应用程序需要更多的访问权限,并且由于更多的用户需要使用系统资源,因此需要更好的解决方案。目前最常用的应用程序是 sudo。

sudo 允许管理员配置对系统命令的更严格的访问,并提供一些高级日志记录功能。作为一个工具。它可通过 ports 的 security/sudoopen in new window 使用,也可以通过使用 pkg(8)open in new window 实用程序获得。要使用 pkg(8)open in new window 工具:

# pkg install sudo

安装完成后,安装的 visudo 将使用文本编辑器打开配置文件。强烈建议使用visudo,因为它带有内置的语法检查器,用于在保存文件之前验证没有错误。

配置文件由几个小部分组成,允许进行广泛的配置。在下面的例子中,web 应用程序维护者 user1 需要启动、停止和重新启动 web 应用程序,即 webservice。要授予此用户执行这些任务的权限,请将以下行添加到 /usr/local/etc/sudoers 的末尾:

user1   ALL=(ALL)       /usr/sbin/service webservice *

用户现在可以使用以下命令启动 Web 服务

% sudo /usr/sbin/service webservice start

虽然此配置允许单个用户访问 Web 服务服务;但是,在大多数组织中,有一个完整的 Web 团队负责管理服务。单行还可以授予对整个组的访问权限。以下步骤将创建一个 Web 组,将用户添加到此组,并允许该组的所有成员管理服务:

# pw groupadd -g 6001 -n webteam

使用相同的 pw(8)open in new window 命令。用户被添加到 webteam 组:

# pw groupmod -m user1 -n webteam

最后,/usr/local/etc/sudoers 中的这一行允许 webteam 组的任何成员管理 webservice

%webteam   ALL=(ALL)       /usr/sbin/service webservice *

su(1)open in new window 不同,sudo 只需要最终用户密码。这增加了一个优势,用户不需要共享密码,这是大多数安全审核中的发现,并且一直很糟糕。

允许使用 sudo 运行应用程序的用户只需输入自己的密码。这比su(1)更安全,并能提供更好的控制,在 su(1)open in new window 中,用户输入根密码,就能获得所有根权限。

技巧

大多数组织正在或已经转向双因素认证模式。在这些情况下,用户可能没有密码需要输入。sudo 为这些情况提供了 NOPASSWD 变量。将它添加到上述配置中,将允许 webteam 组的所有成员在没有密码要求的情况下管理该服务。

%webteam   ALL=(ALL)       NOPASSWD: /usr/sbin/service webservice *

14.14.1. 日志记录输出

实现 sudo 的一个优点是能够启用会话日志记录。使用内置的日志机制和随附的 sudoreplay 命令,将记录通过 sudo 启动的所有命令以供以后验证。若要启用此功能,请添加默认日志目录条目,此示例使用用户变量。还存在其他几种日志文件名约定,有关其他信息,请参阅 sudoreplay 的手册页。

Defaults iolog_dir=/var/log/sudo-io/%{user}

技巧

这个目录将在配置好日志后自动创建。为了安全起见,最好让系统以默认权限创建目录。此外,这个条目还将记录使用 sudoreplay 命令的管理员。要改变这种行为,请阅读并取消对 sudoers 里面的日志选项的注释。

将此指令添加到 sudoers 文件后,可以使用日志访问请求更新任何用户配置。在所示的示例中,更新后的 webteam 条目将具有以下附加更改:

%webteam ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: /usr/sbin/service webservice *

从此时起,将记录所有更改 Web 服务 应用程序状态的 web 团队 成员。可以通过以下方式显示以前和当前会话的列表:

# sudoreplay -l

在输出中,要重播特定会话,请搜索 TSID= 条目,然后将其传递给 sudoreplay,没有其他选项以正常速度重播会话。例如:

# sudoreplay user1/00/00/02

警告

在记录会话时,任何管理员都可以删除会话,而只留下他们为什么这样做的问题。通过入侵检测系统(IDS)或类似软件添加每日检查是值得的,以便其他管理员收到手动更改的警报。

sudoreplay 是非常具有可扩展性的。有关详细信息,请参阅文档。