安全的让普通用户执行 sudo

目录

  在生产环境中,我们难免需要让普通用户执行一些需要 root 权限的程序(比如 nginx),我们常用 sudo 来实现,但是 sudo 如果没设置好可能是一个严重的安全问题,因为
sudo 只做命令格式的检查,不检查我们执行的到底是什么命令。

不安全的 sudo 配置

假如我们配置的 sudo 是这样的:
Defaults:admin !requiretty
admin ALL=(ALL) NOPASSWD: /nginx/sbin/nginx

这样 admin 用户就可以 root 身份执行 nginx 命令,但是这里有一个严重的安全隐患。
假如一个入侵者得到了 admin 权限,他可以轻松的利用这个漏洞进行提权。
比如:
mv /nginx/sbin/nginx /tmp/
cp vim /nginx/sbin/nginx
/nginx/sbin/nginx /etc/sudoers
这几个简单的命令就可以让入侵者以 root 身份编辑/etc/sudoers 这样可以获取任意的权限了。

如何提升 sudo 的安全性

1. 对 sudo 里的命令,尽量明确给出参数,比如上面的例子我们可以改为
   Defaults:admin !requiretty
   admin ALL=(ALL) NOPASSWD: /nginx/sbin/nginx -t
   admin ALL=(ALL) NOPASSWD: /nginx/sbin/nginx -s reload
   这样普通用户执行的时候只有加上给出的这些参数,而不是任何其他内容
2. 对 sudo 里面的命令,都加上 chattr 属性,比如 chattr +i /nginx/sbin/nginx
   这样普通用户将无法修改/nginx/sbin/nginx 也无法执行 mv /nginx/sbin/nginx /tmp/
3.对/etc/sudoers 加上 chattr,比如 chattr +i /etc/sudoers 这样普通用户将无法修改/etc/sudoers


做到上面 3 点就可以相对安全的使用 sudo 命令给普通用户以 root 权限执行命令了,但是也不要太乐观。

目录