13.14. 使用Sudo分享管理权限

Contributed by Tom Rhodes.

系统管理者通常会要能够授予额外的权限给其他使用者,以让这些使用者可以执行需权限的工作。要让团队成员可以存取FreeBSD系统来完成其特定的工作对所有管理者都会带来挑战,这些团队成员通常只需要比一般使用者多出一些存取权限便可作业,但他们总是会告诉管理者若没有超级使用者的存取权便无法完成其工作。幸好,有工具可以管理这类的需求,这样便不需提供这么大的权限给一般使用者。

到目前为止,安全性章节已说明了如何允许已授权的使用者存取以及尝试防止未经授权的存取,而现在有另一个问题,是由已授权的使用者拥有权限存取系统资源造成的。在很多的情况,使用者会需要存取应用程序启动Script的权限或是管理者团队需要维护系统,以往会使用标准的使用者与群组、档案权限、甚至是su(1)指令来管理存取权,但当应用程序需要更多存取权,更多使用者需要使用系统资源时,便需要更好的解决方案,目前最常用来解决此问题的应用程序便是Sudo

Sudo让管理者可以对系统指令的存取设下更严格的限制并提供进阶的记录功能。如同其他工具,它可自Port套件集取得,于其中的security/sudo,或使用pkg(8)工具取得,若要使用pkg(8)工具可:

# pkg install sudo

安装完成之后,可用安装的visudo以文字编辑器开启配置文件,强烈建议使用visudo来编辑配置文件,由于它有内置的语法检查程序可在档案储存之前检验是否有误。

配置文件由个小节所组成,透过这些小节可做常广泛的设定,在以下的示例中,网站应用程序维护人员user1需要启动、停止与重新启动名称为webservice的网站应用程序。要授权此使用者执行这些工作的权限,可加入此行到/usr/local/etc/sudoers的最后:

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

现在使用者可使用此指令来启动webservice

% sudo /usr/sbin/service webservice start

虽然这项设定可以让一位使用者存取webservice服务,但在大部份组织中会有一整个网站小组负责管理该服务,因此也可以一行来授予整个群组存取权,以下步骤会建立一个网站群组、加入使用者到这个群组,然后让该群组中的所有成员能够管理服务:

# 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权限。

提示:

大多数组织已正在导入或已导入双重认证(Two factor authentication),在这个情境下使用者可以不用输入密码,Sudo提供了NOPASSWD变数来供这个情境使用,可将该设定加入到上述的设定将可允许所有webteam群组的成员不需要输入密码便可管理该服务:

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

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

从此之后,所有webteam修改webservice应用程序状态的成员将会被记录下来。要列出先前与目前联机阶段的记录可:

# sudoreplay -l

在输出结果中要回放指定联机阶段的记录可搜寻TSID=项目,然后传送给sudoreplay且不加其他选项便可以一般速度回放联机阶段,例如:

# sudoreplay user1/00/00/02

警告:

虽然所有联机阶段都会被记录,但任何管理者都可以移除联机阶段,使得没人知道它们做了什么事,所以非常值得在入侵侦测系统(IDS)或类似的软件加入每日检查,以便在有人为修改时通知其他管理人员。

sudoreplay的扩充空间非常大,请参考说明文件来取得更多资讯。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.