有没有一种理想的方法来限制服务器管理员的访问权限,限制他们可以使用 sudo 做什么和不能做什么?我希望拥有从基本命令行操作到更高级功能(如服务控制)的访问级别。我也不希望他们有能力接触 root 或编辑日志。
我在机器上运行着带有 CPanel 的 CentOS 6。
答案1
您可以使用命令别名来允许或禁止此类操作,例如:
Cmnd_Alias OPS = /usr/sbin/shutdown,\
/usr/sbin/reboot,\
/bin/su,\
/bin/sh,\
/bin/csh
%dev ALL = (ALL:ALL) ALL, !OPS
基本上,%dev
意味着开发组的任何人都可以作为任何用户做任何事情,除了OPS
提供你不希望他们以 sudo 身份运行的命令列表。
或者,您可以创建自己的 Cmnd_Alias 并执行%dev ALL=OPS
仅允许使用列出的操作。
答案2
您可以为每个用户定义单独的允许 sudo 命令。例如,我们可以授予某个名为 testing 的用户使用 sudo 重新启动 Web 服务器的权限,而不是授予他们所有命令:
testing ALL=/etc/init.d/httpd restart
(这应该在你的 sudoers 文件中)
答案3
此外sudo
,您可以编写脚本来执行设置了 suid 位(不一定是 suid root,可能是 suid www-data 甚至 suid nobody)和组执行位的操作,并允许人们通过将他们添加到拥有该脚本的适当组来运行它。
sudo
更好,因为它会留下详细的审计线索,而且非常灵活,尽管sudoers(5)
手册页不太人性化,而且充满了 Backus-Naur 意大利面条。并且sudo
往往会在 /etc/sudoers 中的任何语法错误时抛出并停止工作,因此您最好在设置sudoers
文件时为自己设置一个真正的 root 密码,否则您可能会发现自己被损坏的 锁定了sudo
。
sudo
或者不sudo
,在设计脚本、解析命令行参数、写入管理员可控制的文件时要非常小心。
举个例子,假设您有一个在特权帐户(root 或其他)下调用的脚本,顺便说一下,它使用截断(>)写入一个文件,您的管理员可以用指向您从未想到的地方的符号链接替换该文件。
另一个例子是,编辑 /etc/network/interfaces(或者您发行版中的类似程序),然后 ifup 一个接口,这看起来似乎没什么问题,但是有一些 pre/post-up/down 脚本是以 root 身份调用的。哎呀。