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

相关推荐
lolo大魔王3 小时前
Linux列出文件和目录
linux·运维·服务器
H Journey3 小时前
网络编程:Boost.Asio实现跨平台的TCP服务器
服务器·网络·tcp/ip·boost.asio
zadyd4 小时前
vLLM Linux 双卡部署大模型服务器指南
linux·人工智能·python·机器学习·vllm
j_xxx404_4 小时前
Linux命名管道:跨进程通信实战指南|附源码
linux·运维·服务器·人工智能·ai
楼田莉子4 小时前
仿Muduo的高并发服务器:Http协议模块
linux·服务器·c++·后端·学习
斯班奇的好朋友阿法法10 小时前
中科方德(NFSChina)离线安装 RPM 包
运维
H Journey10 小时前
网络编程-创建SOCKET套接字
网络·socket
milo.qu10 小时前
RockyLinux9.7 docker部署Jisti Meet
linux·docker·容器
GanGanGanGan_10 小时前
CentOS 7.9 glibc 2.17 源码编译升级到 glibc 2.31
linux·运维·centos·glibc
一袋米扛几楼9810 小时前
【高级网络】虚拟化与云计算 (Virtualization & Cloud) 深度解析
网络·网络工程