Linux 系统相比其他操作系统具有更高的安全性,其安全机制的核心之一在于用户管理策略和权限控制--普通用户默认无权执行任何系统级操作。
若普通用户需要进行系统级变更,必须通过su
或sudo
命令提权。
1.su
与sudo
的本质区别
su
要求直接共享 root 密码,而 sudo
允许用户在不知晓 root 密码的情况下执行系统命令。
sudo
通过验证用户自身密码来委派系统权限。
2.什么是sudo
?
sudo
是一个具有 setuid 位的 root 二进制程序,允许授权用户以 root 身份执行命令,执行时需输入用户自身密码(后接命令)。
3.谁可以执行 sudo
通过/usr/sbin/visudo
可添加/删除可以执行 sudo
的用户列表。
$ sudo /usr/sbin/visudo
默认情况下,sudo列表类似以下字符串(需root权限编辑visudo文件):
root ALL=(ALL) ALL
4.授予sudo访问权限
新手系统管理员常误将root ALL=(ALL) ALL
作为模板,盲目授予用户无限制权限(如下所示),这将导致严重安全隐患:
root ALL=(ALL) ALL
adam ALL=(ALL) ALL
tom ALL=(ALL) ALL
mark ALL=(ALL) ALL
5.sudo
配置参数
合理的sudo
配置兼具灵活性与精确性,其语法结构为:
用户名 主机名=(有效用户) 命令
以上语法分为四个部分,解释如一:
-
用户名:sudo授权用户。
-
主机名:该sudo权限生效的主机(适用于多主机环境)。
-
有效用户:允许执行命令的 '有效用户',此列允许用户执行系统命令。
-
命令:用户可以运行的命令或一组命令。
6.典型场景配置示例
场景1:授予数据库管理员mark仅在数据库服务器(mydb_server.com)的完整权限
mark mydb_server.com=(ALL) ALL
场景2:允许用户tom以非root身份执行命令(在mydb_server.com数据库上)
tom mydb_server.com=(tom) ALL
场景3:限制用户cat 在mydb_server.com数据库上仅能执行特定命令dog
cat mydb_server.com=(cat) dog
场景4:多个命令授权(10条以内)
mark mydb_server.com=(cat) /usr/bin/command1 /usr/sbin/command2...
当需要授权的命令数量过多时(例如多到无法逐一手动输入),就需要使用命令别名(Aliases)机制。
以下是可在sudo
配置文件中使用的别名示例:
User_Alias ADMINS=tom,jerry,adam
user_Alias WEBMASTER=henry,mark
WEBMASTERS WEBSERVERS=(www) APACHE
Cmnd_Alias PROC=/bin/kill,/bin/killall, /usr/bin/top
可以通过在组名前添加%
前缀来指定系统用户组(而非单独用户),格式如下:
%apacheadmin WEBSERVERS=(www) APACHE
场景5:免密码执行sudo(通过NOPASSWD标记)
adam ALL=(ALL) NOPASSWD: PROCS
在此配置下,用户"adam"无需输入密码即可执行"PROCS"命令别名组中的所有命令。
7.为什么选择sudo
?
相比su
,sudo
提供更安全的权限管控环境且配置简便,现在 Linux 发行版大多默认启用sudo
作为安全实践。
添加用户至sudo组(如用户bob):
adduser bob sudo
8.最佳实践示例
8.1典型生产环境配置
# 用户别名组定义
User_Alias SYSADMINS = admin1,admin2
User_Alias DBADMINS = db1,db2
User_Alias WEBADMINS = %nginx
# 命令别名组定义
Cmnd_Alias DISK_CMD = /bin/df, /bin/mount, /bin/umount
Cmnd_Alias PROCESS_CMD = /bin/kill, /usr/bin/killall
Cmnd_Alias NETWORK_CMD = /sbin/ifconfig, /usr/sbin/iptables
# 权限分配
SYSADMINS ALL=(ALL) ALL
DBADMINS ALL=(DB) /usr/bin/mysql*, /usr/bin/psql
WEBADMINS WEBSERVERS=(www-data) /usr/sbin/nginx
%developers ALL=(ALL) NOPASSWD: /usr/bin/git, /usr/bin/docker
8.2企业级安全配置
# 基础安全策略
Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults logfile="/var/log/sudo.log"
Defaults log_host, log_year
# 角色化权限定义
User_Alias SECURITY_TEAM = sarah,john
Runas_Alias UNPRIVILEGED = nobody,www-data
Cmnd_Alias FIREWALL_CMD = /usr/sbin/iptables, /usr/sbin/firewalld
Cmnd_Alias AUDIT_CMD = /usr/bin/ausearch, /usr/sbin/aureport
# 精细化授权
SECURITY_TEAM ALL=(root) FIREWALL_CMD, AUDIT_CMD
%backup_operators ALL=(UNPRIVILEGED) /usr/bin/rsync
zabbix ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart zabbix-agent
定期审计:
sudo -l
查看用户权限。