16.13.使用 sudo 管理权限

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

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

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

# pkg install sudo

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

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

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

用户现在可以使用以下命令启动 webservice

% sudo /usr/sbin/service webservice start

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

# pw groupadd -g 6001 -n webteam

还可以使用相同作用的 pw(8) 命令将添加用户到 webteam 组:

# pw groupmod -m user1 -n webteam

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

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

su(1) 不同,sudo 只需要一般用户密码。这增加了一个优势,用户无需共享密码,这是大多数安全审计中的发现——共用密码这种问题普遍存在且一直很糟糕。

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

技巧

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

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

16.13.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 *

从此时起,将记录所有更改 webservice 软件状态的 webteam 成员。可以通过以下方式显示以前和当前会话的列表:

# sudoreplay -l

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

# sudoreplay user1/00/00/02

警告

当会话被记录下来时,任何管理员都能够删除会话,使得没人知道它们做了什么事情。值得通过入侵检测系统(IDS)或类似的软件增加一个日常检查,以便在有人为修改时通知其他管理人员。

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