【运维实战】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 查看用户权限。

相关推荐
bestcxx2 分钟前
(二十六)、Kuboard 部署网络问题 &k8s 使用本地镜像 & k8s使用 register本地镜像站 综合应用
网络·容器·kubernetes
tryCbest9 分钟前
Linux系统下安装使用Redis
linux·运维·redis
红米饭配南瓜汤1 小时前
WebRTC 发送端 SSRC 生成流程总结
网络·网络协议·音视频·webrtc·媒体
AuroBreeze1 小时前
xv6-2023 - primes Lab
linux·运维·服务器
DIY机器人工房2 小时前
NAT 模式、命令行版、桥接模式方式给ubuntu虚拟机配网步骤:
linux·网络协议·ubuntu·嵌入式·桥接模式·diy机器人工房
wdfk_prog3 小时前
[Linux]学习笔记系列 -- lib/sort.c 通用的排序库(Generic Sorting Library) 为内核提供标准的、高效的排序功能
linux·运维·c语言·笔记·stm32·学习·bug
jump_jump3 小时前
前端部署工具 PinMe
运维·前端·开源
黑马金牌编程3 小时前
简易分析慢 SQL 的流程和方法
linux·数据库·mysql·性能优化·性能分析·慢日志
什么半岛铁盒3 小时前
C++项目:仿muduo库高并发服务器---------LoopThreadPool模块和TcpServer模块的实现
linux·服务器·c++·mysql·ubuntu
wanhengidc3 小时前
云手机和网盘之间的关系
网络·游戏·智能手机·架构·云计算