【运维实战】Linux 中su和sudo之间的区别以及如何配置sudo!

Linux 系统相比其他操作系统具有更高的安全性,其安全机制的核心之一在于用户管理策略和权限控制--普通用户默认无权执行任何系统级操作。

若普通用户需要进行系统级变更,必须通过susudo命令提权。

1.susudo的本质区别

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

相比susudo提供更安全的权限管控环境且配置简便,现在 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 查看用户权限。

相关推荐
树℡独1 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
小小管写大大码2 小时前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
嵩山小老虎2 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模2 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
zhang133830890752 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
a41324472 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.3 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
物联网软硬件开发-轨物科技3 小时前
【轨物洞见】告别“被动维修”!预测性运维如何重塑老旧电站的资产价值?
运维·人工智能
程序员允诺4 小时前
[DevOps实战] 彻底解决依赖地狱:如何编译全静态、可移植的 Xorriso 工具
运维·devops
酣大智4 小时前
接口模式参数
运维·网络·网络协议·tcp/ip