最核心方式是通过visudo编辑/etc/sudoers文件实现命令级权限控制。首先定义命令别名(如Cmnd_Alias NGINX_RESTART),再为用户或组(如devuser或%devops)分配精确执行权限,支持NOPASSWD选项提升效率。推荐使用白名单机制明确允许特定命令,避免黑名单遗漏风险。配置时需警惕shell逃逸、环境变量操纵、通配符滥用和符号链接绕过等安全陷阱。可通过sudo -l验证权限分配,实际测试允许与禁止命令的执行效果。务必使用visudo确保语法正确,并备份原文件以防失效。若sudo失效,可借助单用户模式或Live USB修复。基于用户组的权限管理更利于企业环境维护,规则应按顺序合理排列,防止宽泛规则覆盖具体限制。

在Linux系统里,要限制用户通过
sudo
/etc/sudoers
sudo
限制
sudo
/etc/sudoers
root
visudo
sudo
基本思路是:
举个例子,假设我们有一个开发人员
devuser
nginx
首先,打开终端并运行
sudo visudo
sudo visudo
在文件里,你可以找到类似这样的行:
# User privilege specification root ALL=(ALL:ALL) ALL
这表示
root
现在,我们来为
devuser
场景一:允许特定命令,禁止其他
如果
devuser
nginx
# 定义一个命令别名,包含允许执行的命令 Cmnd_Alias NGINX_RESTART = /usr/bin/systemctl restart nginx # 为 devuser 分配权限,允许他以root身份执行 NGINX_RESTART 中的命令,且无需密码 devuser ALL=(root) NOPASSWD: NGINX_RESTART
这里
NOPASSWD:
devuser
NOPASSWD
场景二:禁止特定命令
有时候,你可能想给用户大部分
sudo
rm -rf /
# 定义一个命令别名,包含禁止执行的命令 Cmnd_Alias DANGEROUS_CMDS = /usr/bin/rm, /usr/bin/sh, /usr/bin/bash, /usr/sbin/fdisk, /usr/sbin/mkfs # 假设 devuser 已经有了一些权限,我们可以在其权限行后加上禁止的命令 # 注意:DENY 规则通常要放在 ALLOW 规则之前,或者使用 ! 符号 # 这是一个更常见的做法,先允许所有,再排除特定命令 devuser ALL=(ALL) ALL, ! DANGEROUS_CMDS
这条规则的意思是
devuser
DANGEROUS_CMDS
配置完成后,保存并退出
visudo
visudo

sudo
说实话,配置
sudoers
Shell 逃逸 (Shell Escapes):这是最经典的陷阱。你可能允许用户
sudo vi /etc/hosts
vi
vi
less
more
vi
:!bash
sudo vi
vi
root
环境变量操纵 (Environment Variables):用户可以通过设置
PATH
sudo
sudo /usr/bin/ls
ls
PATH
sudo ls
sudo
secure_path
通配符的滥用 (Wildcard Misuse):使用通配符(如
*
Cmnd_Alias MY_SCRIPTS = /usr/local/bin/*
/usr/local/bin
devuser
符号链接 (Symlinks):用户可能会创建符号链接来绕过命令限制。比如你禁止
sudo /bin/bash
ln -s /bin/bash /tmp/mybash
sudo /tmp/mybash
sudo
不完整的限制:你可能只限制了
rm
shred
dd
我个人在配置
sudoers

sudo
在实际的企业环境中,给每个用户单独配置
sudo
sudoers
基本语法是使用
%
假设我们有两个用户组:
devops
dba
devops
nginx
php-fpm
redis
dba
mysqladmin
pg_ctl
首先,确保这些用户组已经在系统中创建,并且相应的用户已经加入到这些组中。
# 创建用户组(如果不存在) sudo groupadd devops sudo groupadd dba # 将用户添加到组中 sudo usermod -aG devops your_devops_user sudo usermod -aG dba your_dba_user
然后,再次使用
sudo visudo
/etc/sudoers
我们可以这样定义:
# 定义 devops 组的命令别名
Cmnd_Alias SERVICE_RESTARTS = /usr/bin/systemctl restart nginx, \
                               /usr/bin/systemctl restart php-fpm, \
                               /usr/bin/systemctl restart redis
# 定义 dba 组的命令别名
Cmnd_Alias DB_ADMIN_CMDS = /usr/bin/mysqladmin *, \
                           /usr/bin/pg_ctl *, \
                           /usr/bin/mysqldump *
# 为 devops 组分配权限
%devops ALL=(root) NOPASSWD: SERVICE_RESTARTS
# 为 dba 组分配权限
%dba ALL=(root) NOPASSWD: DB_ADMIN_CMDS这里有几点值得注意:
\
NOPASSWD:
NOPASSWD:
NOPASSWD
sudoers
ALL=(ALL) ALL
通过这种方式,当有新成员加入
devops
sudo
sudoers

sudoers
配置完
sudoers
sudo
使用 sudo -l
su - target_user
sudo -l
这个命令会列出当前用户(或指定用户)被允许执行的所有
sudo
例如,如果你为
devuser
NGINX_RESTART
# 以 devuser 身份运行 sudo -l
你可能会看到类似这样的输出:
User devuser may run the following commands on this host:
    (root) NOPASSWD: /usr/bin/systemctl restart nginx这表明
devuser
root
systemctl restart nginx
实际执行命令测试: 光看
sudo -l
devuser
sudo /usr/bin/systemctl restart nginx
rm
devuser
sudo rm /etc/hosts
注意 visudo
visudo
/etc/sudoers
visudo
visudo
sudo
备份 sudoers
/etc/sudoers
sudo cp /etc/sudoers /etc/sudoers.bak
如果 sudo
visudo
visudo
sudo
root
root
/etc/sudoers
/etc/sudoers
总的来说,对
sudoers
以上就是Linux怎么限制用户sudo执行特定命令的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                
                                
                                
                                
                                
                                
                                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号