本文档风哥主要介绍Linux权限管理相关知识,包括su命令身份切换、sudo命令权限管控、sudo配置文件详解、不同场景sudo配置案例等内容,参考Red Hat Enterprise Linux 10官方文档,适合运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 su与sudo概念与区别
su(Switch User)和sudo(SuperUser DO)是Linux系统中用于身份切换和权限提升的两个重要命令。su命令用于切换用户身份,sudo命令用于以其他用户身份执行命令。
- su:切换用户身份,需要目标用户密码
- sudo:以其他用户身份执行命令,需要当前用户密码
- 安全性:sudo更安全,可以精确控制权限
- 审计:sudo有完整的审计日志
# 1. su命令特点
– 切换用户身份
– 需要目标用户密码
– 切换后获得目标用户所有权限
– 适合完全切换用户身份
# 2. sudo命令特点
– 以其他用户身份执行命令
– 需要当前用户密码
– 可以精确控制权限
– 有完整的审计日志
– 适合临时提升权限
# 3. su与sudo对比
特性 su sudo
密码需求 目标用户密码 当前用户密码
权限控制 全部权限 精确控制
审计日志 无 有
安全性 较低 较高
使用场景 完全切换用户 临时提升权限
# 4. su使用场景
– 管理员切换到普通用户
– 普通用户切换到root用户
– 服务账号切换
# 5. sudo使用场景
– 普通用户执行管理命令
– 应用用户执行系统命令
– 开发用户执行部署命令
– 运维用户执行运维命令
# 6. 安全建议
– 生产环境优先使用sudo
– 限制su命令使用
– 配置sudo审计日志
– 定期审计sudo使用记录
1.2 Linux权限管理机制
Linux权限管理机制包括用户权限、组权限和特殊权限。
# 1. 用户权限类型
– 普通用户:UID >= 1000
– 系统用户:UID < 1000
- root用户:UID = 0
# 2. 权限提升方式
- su:切换用户身份
- sudo:以其他用户身份执行命令
- SUID/SGID:特殊权限位
# 3. sudo权限模型
用户 主机=(运行身份) 命令
fgedu ALL=(ALL) ALL
# 4. sudo权限字段说明
字段1:用户或组(%group)
字段2:主机(ALL表示所有主机)
字段3:运行身份(ALL表示所有用户)
字段4:命令(ALL表示所有命令)
# 5. sudo权限示例
# 允许fgedu用户以root身份执行所有命令
fgedu ALL=(ALL) ALL
# 允许fgedu用户以root身份执行特定命令
fgedu ALL=(ALL) /usr/bin/systemctl, /usr/bin/yum
# 允许fgedu用户以root身份执行命令且不需要密码
fgedu ALL=(ALL) NOPASSWD: ALL
# 允许developers组以root身份执行特定命令
%developers ALL=(ALL) /usr/bin/systemctl restart nginx
# 6. 权限管理最佳实践
- 最小权限原则
- 定期审计权限
- 记录权限变更
- 使用sudo替代su
1.3 sudo配置文件详解
sudo配置文件是/etc/sudoers,需要使用visudo命令编辑。
# 1. 查看sudo配置文件
# cat /etc/sudoers
Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults always_query_group_plugin
Defaults env_reset
Defaults env_keep = “COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS”
Defaults env_keep += “MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE”
Defaults env_keep += “LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES”
Defaults env_keep += “LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE”
Defaults env_keep += “LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY”
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
# 2. 配置文件格式
用户 主机=(运行身份) 命令
# 3. 常用配置项
# Defaults配置项
Defaults !visiblepw # 不显示密码
Defaults env_reset # 重置环境变量
Defaults env_keep # 保留环境变量
# 用户权限配置
root ALL=(ALL) ALL # root用户可以执行所有命令
%wheel ALL=(ALL) ALL # wheel组用户可以执行所有命令
# 4. 配置文件包含
# 包含其他配置文件
#includedir /etc/sudoers.d
# 5. 查看sudo配置
# sudo -l
Matching Defaults entries for root on localhost:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep=”COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS”,
env_keep+=”MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE”,
env_keep+=”LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES”,
env_keep+=”LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE”,
env_keep+=”LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY”
User root may run the following commands on localhost:
(ALL) ALL
# 6. 编辑sudo配置文件
# 使用visudo命令编辑
# visudo
# 检查配置语法
# visudo -c
/etc/sudoers: parsed OK
# 7. 配置文件目录
# ls -l /etc/sudoers.d/
total 0
# 8. 创建自定义配置文件
# visudo -f /etc/sudoers.d/custom
Part02-生产环境规划与建议
2.1 权限规划原则
在生产环境中,权限规划应遵循最小权限原则:
# 1. 最小权限原则
– 只授予必要的权限
– 避免授予过多权限
– 定期审计权限
– 及时回收权限
# 2. 权限分层原则
# 运维人员
– 系统管理员:ALL权限
– 应用管理员:应用相关权限
– 监控管理员:监控相关权限
# 开发人员
– 部署权限:应用部署相关
– 日志查看:日志查看权限
– 服务重启:特定服务重启权限
# 普通用户
– 无sudo权限
– 使用su切换到应用用户
# 3. 权限矩阵示例
用户类型 权限范围 命令示例
系统管理员 ALL ALL
应用管理员 应用相关 /usr/bin/systemctl, /usr/bin/yum
监控管理员 监控相关 /usr/bin/systemctl restart zabbix-agent
开发人员 部署相关 /usr/bin/systemctl restart app
普通用户 无 无
# 4. 权限配置位置
# 系统级配置
/etc/sudoers
# 自定义配置
/etc/sudoers.d/
# 5. 权限配置优先级
/etc/sudoers.d/* > /etc/sudoers
# 6. 权限审计建议
– 定期审计sudo配置
– 定期审计sudo日志
– 记录权限变更
– 监控异常使用
2.2 sudo安全建议
生产环境sudo安全建议:
- 使用visudo编辑配置文件
- 遵循最小权限原则
- 避免使用NOPASSWD
- 配置sudo日志
- 定期审计sudo使用
- 限制su命令使用
# 1. 配置sudo日志
# vim /etc/sudoers
Defaults logfile=/var/log/sudo.log
Defaults log_year, log_host, log_input, log_output
# 2. 配置sudo超时
# vim /etc/sudoers
Defaults timestamp_timeout=5
# 3. 配置sudo尝试次数
# vim /etc/sudoers
Defaults passwd_tries=3
# 4. 配置sudo密码提示
# vim /etc/sudoers
Defaults passwd_prompt=”Password for %p@%h: ”
# 5. 配置sudo环境变量
# vim /etc/sudoers
Defaults env_reset
Defaults env_keep += “HOME PATH”
# 6. 配置sudo安全选项
# vim /etc/sudoers
Defaults !visiblepw
Defaults requiretty
Defaults umask=0027
# 7. 限制su命令
# vim /etc/pam.d/su
auth required pam_wheel.so use_uid
# 8. 检查sudo配置
# visudo -c
/etc/sudoers: parsed OK
# 9. 查看sudo日志
# cat /var/log/sudo.log
Apr 2 10:00:00 : fgedu : TTY=pts/0 ; PWD=/home/fgedu ; USER=root ; COMMAND=/bin/ls
# 10. 监控sudo使用
# auditctl -w /etc/sudoers -p wa -k sudo_config_changes
# ausearch -k sudo_config_changes
2.3 权限审计策略
定期审计权限是系统安全的重要环节:
# 1. 创建权限审计脚本
# cat > /tmp/privilege_audit.sh << 'EOF'
#!/bin/bash
REPORT="/tmp/privilege_audit_report.txt"
echo "========================================" > $REPORT
echo “Privilege Audit Report – $(date)” >> $REPORT
echo “========================================” >> $REPORT
echo “” >> $REPORT
# 1. 检查sudo配置
echo “1. Sudo Configuration” >> $REPORT
echo “———————” >> $REPORT
cat /etc/sudoers >> $REPORT
echo “” >> $REPORT
# 2. 检查sudoers.d目录
echo “2. Sudoers.d Configuration” >> $REPORT
echo “—————————” >> $REPORT
ls -l /etc/sudoers.d/ >> $REPORT
for file in /etc/sudoers.d/*; do
if [ -f “$file” ]; then
echo “File: $file” >> $REPORT
cat “$file” >> $REPORT
echo “” >> $REPORT
fi
done
# 3. 检查wheel组成员
echo “3. Wheel Group Members” >> $REPORT
echo “———————-” >> $REPORT
groupmems -g wheel -l >> $REPORT
echo “” >> $REPORT
# 4. 检查sudo日志
echo “4. Sudo Log” >> $REPORT
echo “———–” >> $REPORT
if [ -f /var/log/sudo.log ]; then
tail -n 20 /var/log/sudo.log >> $REPORT
else
echo “No sudo log found” >> $REPORT
fi
echo “” >> $REPORT
# 5. 检查用户sudo权限
echo “5. User Sudo Privileges” >> $REPORT
echo “———————–” >> $REPORT
for user in $(awk -F: ‘$3 >= 1000 && $3 != 65534 {print $1}’ /etc/passwd); do
echo “User: $user” >> $REPORT
sudo -U $user -l >> $REPORT 2>&1
echo “” >> $REPORT
done
echo “Audit completed. Report saved to $REPORT”
EOF
# 2. 执行审计脚本
# chmod +x /tmp/privilege_audit.sh
# /tmp/privilege_audit.sh
Audit completed. Report saved to /tmp/privilege_audit_report.txt
# 3. 查看审计报告
# cat /tmp/privilege_audit_report.txt
Part03-生产环境项目实施方案
3.1 su命令基础操作
su命令用于切换用户身份:
# 1. 切换到root用户
# su
Password:
# id
uid=0(root) gid=0(root) groups=0(root)
# 2. 切换到root用户(带环境变量)
# su –
Password:
# pwd
/root
# 3. 切换到指定用户
# su – fgedu
Password:
$ id
uid=1000(fgedu) gid=1000(fgedu) groups=1000(fgedu)
# 4. 以指定用户执行命令
# su – fgedu -c “whoami”
fgedu
# 5. 切换用户并执行多个命令
# su – fgedu -c “pwd; ls -l”
/home/fgedu
total 0
# 6. 切换到系统用户
# su – postgres -c “psql -c ‘SELECT version();'”
version
———————————————————————————————————-
PostgreSQL 16.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4), 64-bit
(1 row)
# 7. 查看当前用户
# whoami
root
# 8. 查看用户ID
# id
uid=0(root) gid=0(root) groups=0(root)
# 9. 查看用户所属组
# groups
root
# 10. 切换用户并保持环境变量
# export MY_VAR=”test”
# su – fgedu -c “echo \$MY_VAR”
(无输出,环境变量未传递)
# su fgedu -c “echo \$MY_VAR”
test
# 11. 切换用户并设置环境变量
# su – fgedu -c “export MY_VAR=’test’; echo \$MY_VAR”
test
# 12. 切换用户并执行脚本
# cat > /tmp/test_script.sh << 'EOF'
#!/bin/bash
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
echo "Home directory: $HOME"
EOF
# chmod +x /tmp/test_script.sh
# su - fgedu -c "/tmp/test_script.sh"
Current user: fgedu
Current directory: /home/fgedu
Home directory: /home/fgedu
# 13. 检查su配置
# cat /etc/pam.d/su
#%PAM-1.0
auth sufficient pam_rootok.so
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so
# 14. 限制su使用
# vim /etc/pam.d/su
auth required pam_wheel.so use_uid
# 15. 查看wheel组成员
# groupmems -g wheel -l
fgedu user1
3.2 sudo命令基础操作
sudo命令用于以其他用户身份执行命令:
# 1. 以root身份执行命令
# sudo ls /root
[sudo] password for fgedu:
anaconda-ks.cfg initial-setup-ks.cfg
# 2. 以指定用户身份执行命令
# sudo -u fgedu whoami
fgedu
# 3. 以root身份执行命令(交互式)
# sudo -i
# whoami
root
# 4. 以root身份执行命令(非交互式)
# sudo -S ls /root <<< "password"
anaconda-ks.cfg initial-setup-ks.cfg
# 5. 查看当前用户sudo权限
# sudo -l
Matching Defaults entries for fgedu on localhost:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
User fgedu may run the following commands on localhost:
(ALL) ALL
# 6. 查看指定用户sudo权限
# sudo -U fgedu -l
User fgedu may run the following commands on localhost:
(ALL) ALL
# 7. 以root身份编辑文件
# sudo vim /etc/hosts
# 8. 以root身份执行多条命令
# sudo sh -c "ls /root; ls /home"
anaconda-ks.cfg
initial-setup-ks.cfg
fgedu
# 9. 以root身份执行后台命令
# sudo -b sleep 100
[1] 12345
# 10. 以root身份执行命令并保持环境变量
# sudo -E env | grep MY_VAR
MY_VAR=test
# 11. 以root身份执行命令并设置环境变量
# sudo MY_VAR=test env | grep MY_VAR
MY_VAR=test
# 12. 刷新sudo时间戳
# sudo -v
[sudo] password for fgedu:
# 13. 清除sudo时间戳
# sudo -k
# 14. 验证sudo配置
# sudo -l -U fgedu
User fgedu may run the following commands on localhost:
(ALL) ALL
# 15. 以root身份执行脚本
# cat > /tmp/test_sudo.sh << 'EOF'
#!/bin/bash
echo "Current user: $(whoami)"
echo "Effective user: $(id -un)"
echo "Real user: $(id -run)"
EOF
# chmod +x /tmp/test_sudo.sh
# sudo /tmp/test_sudo.sh
Current user: root
Effective user: root
Real user: root
3.3 sudo高级配置
sudo的高级配置和技巧:
# 1. 配置用户权限
# visudo
# 添加以下内容
fgedu ALL=(ALL) ALL
# 2. 配置组权限
# visudo
# 添加以下内容
%developers ALL=(ALL) /usr/bin/systemctl, /usr/bin/yum
# 3. 配置无密码权限
# visudo
# 添加以下内容
fgedu ALL=(ALL) NOPASSWD: ALL
# 4. 配置特定命令无密码
# visudo
# 添加以下内容
fgedu ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# 5. 配置命令别名
# visudo
# 添加以下内容
Cmnd_Alias SOFTWARE = /usr/bin/rpm, /usr/bin/yum, /usr/bin/dnf
Cmnd_Alias SERVICES = /usr/bin/systemctl, /usr/sbin/service
Cmnd_Alias PROCESSES = /usr/bin/kill, /usr/bin/killall, /usr/bin/top
fgedu ALL=(ALL) SOFTWARE, SERVICES, PROCESSES
# 6. 配置用户别名
# visudo
# 添加以下内容
User_Alias ADMINS = fgedu, user1, user2
User_Alias WEBMASTERS = web1, web2
ADMINS ALL=(ALL) ALL
WEBMASTERS ALL=(ALL) /usr/bin/systemctl restart nginx
# 7. 配置主机别名
# visudo
# 添加以下内容
Host_Alias WEBSERVERS = web1, web2, web3
Host_Alias DBSERVERS = db1, db2
fgedu WEBSERVERS=(ALL) /usr/bin/systemctl restart nginx
fgedu DBSERVERS=(ALL) /usr/bin/systemctl restart mysql
# 8. 配置运行身份别名
# visudo
# 添加以下内容
Runas_Alias APP = app, nginx, mysql
fgedu ALL=(APP) /usr/bin/systemctl
# 9. 配置sudo日志
# visudo
# 添加以下内容
Defaults logfile=/var/log/sudo.log
Defaults log_year, log_host, log_input, log_output
# 10. 配置sudo超时
# visudo
# 添加以下内容
Defaults timestamp_timeout=5
# 11. 配置sudo密码尝试次数
# visudo
# 添加以下内容
Defaults passwd_tries=3
# 12. 配置sudo安全选项
# visudo
# 添加以下内容
Defaults !visiblepw
Defaults requiretty
Defaults umask=0027
# 13. 配置sudo环境变量
# visudo
# 添加以下内容
Defaults env_reset
Defaults env_keep += “HOME PATH”
# 14. 配置sudo包含文件
# visudo
# 添加以下内容
#includedir /etc/sudoers.d
# 15. 创建自定义配置文件
# cat > /etc/sudoers.d/custom << 'EOF'
# Custom sudo configuration
fgedu ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
%developers ALL=(ALL) /usr/bin/systemctl, /usr/bin/yum
EOF
# chmod 440 /etc/sudoers.d/custom
Part04-生产案例与实战讲解
4.1 不同场景sudo配置案例
不同场景下的sudo配置案例:
# 1. 运维人员sudo配置
# cat > /etc/sudoers.d/ops << 'EOF'
# 运维人员权限配置
User_Alias OPS = ops1, ops2, ops3
# 系统管理权限
Cmnd_Alias SYSTEM = /usr/bin/systemctl, /usr/sbin/service, /usr/bin/journalctl
# 软件管理权限
Cmnd_Alias SOFTWARE = /usr/bin/yum, /usr/bin/rpm, /usr/bin/dnf
# 网络管理权限
Cmnd_Alias NETWORK = /usr/sbin/ip, /usr/sbin/ifconfig, /usr/sbin/route
# 存储管理权限
Cmnd_Alias STORAGE = /usr/sbin/lvm, /usr/sbin/mkfs, /usr/bin/mount, /usr/bin/umount
OPS ALL=(ALL) SYSTEM, SOFTWARE, NETWORK, STORAGE
EOF
# 2. 开发人员sudo配置
# cat > /etc/sudoers.d/dev << 'EOF'
# 开发人员权限配置
User_Alias DEVS = dev1, dev2, dev3
# 应用管理权限
Cmnd_Alias APP = /usr/bin/systemctl restart app, /usr/bin/systemctl status app
# 日志查看权限
Cmnd_Alias LOGS = /usr/bin/tail -f /var/log/app/*, /usr/bin/less /var/log/app/*
# 部署权限
Cmnd_Alias DEPLOY = /opt/app/bin/deploy.sh, /opt/app/bin/rollback.sh
DEVS ALL=(ALL) APP, LOGS, DEPLOY
EOF
# 3. 数据库管理员sudo配置
# cat > /etc/sudoers.d/dba << 'EOF'
# 数据库管理员权限配置
User_Alias DBAS = dba1, dba2
# 数据库管理权限
Cmnd_Alias DATABASE = /usr/bin/systemctl restart mysql, /usr/bin/systemctl restart postgresql
# 备份权限
Cmnd_Alias BACKUP = /usr/bin/mysqldump, /usr/bin/pg_dump, /usr/bin/pg_restore
DBAS ALL=(ALL) DATABASE, BACKUP
EOF
# 4. 监控管理员sudo配置
# cat > /etc/sudoers.d/monitor << 'EOF'
# 监控管理员权限配置
User_Alias MONITOR = monitor1, monitor2
# 监控服务权限
Cmnd_Alias MONITORING = /usr/bin/systemctl restart zabbix-agent, /usr/bin/systemctl restart prometheus
# 日志查看权限
Cmnd_Alias LOGS = /usr/bin/tail -f /var/log/zabbix/*, /usr/bin/tail -f /var/log/prometheus/*
MONITOR ALL=(ALL) MONITORING, LOGS
EOF
# 5. 应用用户sudo配置
# cat > /etc/sudoers.d/app << 'EOF'
# 应用用户权限配置
app ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart app
app ALL=(ALL) NOPASSWD: /usr/bin/systemctl status app
EOF
# 6. Web服务器sudo配置
# cat > /etc/sudoers.d/web << 'EOF'
# Web服务器权限配置
User_Alias WEBMASTERS = web1, web2
# Nginx管理权限
Cmnd_Alias NGINX = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx
# 日志查看权限
Cmnd_Alias LOGS = /usr/bin/tail -f /var/log/nginx/*, /usr/bin/less /var/log/nginx/*
WEBMASTERS ALL=(ALL) NGINX, LOGS
EOF
# 7. 安全加固sudo配置
# cat > /etc/sudoers.d/security << 'EOF'
# 安全加固配置
Defaults logfile=/var/log/sudo.log
Defaults log_year, log_host, log_input, log_output
Defaults timestamp_timeout=5
Defaults passwd_tries=3
Defaults !visiblepw
Defaults requiretty
Defaults umask=0027
EOF
# 8. 审计配置
# cat > /etc/sudoers.d/audit << 'EOF'
# 审计配置
Defaults logfile=/var/log/sudo.log
Defaults log_year, log_host, log_input, log_output
EOF
# 9. 测试配置
# visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/app: parsed OK
/etc/sudoers.d/audit: parsed OK
/etc/sudoers.d/custom: parsed OK
/etc/sudoers.d/dba: parsed OK
/etc/sudoers.d/dev: parsed OK
/etc/sudoers.d/monitor: parsed OK
/etc/sudoers.d/ops: parsed OK
/etc/sudoers.d/security: parsed OK
/etc/sudoers.d/web: parsed OK
# 10. 验证用户权限
# sudo -U fgedu -l
User fgedu may run the following commands on localhost:
(ALL) ALL
(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
4.2 sudo安全加固案例
对系统进行sudo安全加固:
# 1. 系统级sudo加固
# cat > /tmp/harden_sudo.sh << 'EOF'
#!/bin/bash
echo "Hardening sudo configuration..."
# 备份原配置
cp /etc/sudoers /etc/sudoers.bak
# 添加安全配置
cat >> /etc/sudoers << 'SUDOERS'
# Security hardened sudo configuration
Defaults logfile=/var/log/sudo.log
Defaults log_year, log_host, log_input, log_output
Defaults timestamp_timeout=5
Defaults passwd_tries=3
Defaults !visiblepw
Defaults requiretty
Defaults umask=0027
SUDOERS
# 创建sudo日志文件
touch /var/log/sudo.log
chmod 600 /var/log/sudo.log
# 验证配置
visudo -c
echo "Sudo hardened"
EOF
# 2. 限制su命令
# cat > /tmp/restrict_su.sh << 'EOF'
#!/bin/bash
echo "Restricting su command..."
# 备份原配置
cp /etc/pam.d/su /etc/pam.d/su.bak
# 添加限制
sed -i '/^#auth required pam_wheel.so use_uid/a auth required pam_wheel.so use_uid' /etc/pam.d/su
# 检查wheel组成员
echo "Wheel group members:"
groupmems -g wheel -l
echo "Su command restricted"
EOF
# 3. 创建sudo审计脚本
# cat > /tmp/audit_sudo.sh << 'EOF'
#!/bin/bash
REPORT="/tmp/sudo_audit_report.txt"
echo "Sudo Audit Report - $(date)" > $REPORT
# 检查sudo配置
echo “” >> $REPORT
echo “Sudo Configuration:” >> $REPORT
cat /etc/sudoers >> $REPORT
# 检查sudoers.d目录
echo “” >> $REPORT
echo “Sudoers.d Configuration:” >> $REPORT
for file in /etc/sudoers.d/*; do
if [ -f “$file” ]; then
echo “File: $file” >> $REPORT
cat “$file” >> $REPORT
echo “” >> $REPORT
fi
done
# 检查sudo日志
echo “” >> $REPORT
echo “Sudo Log:” >> $REPORT
if [ -f /var/log/sudo.log ]; then
tail -n 50 /var/log/sudo.log >> $REPORT
else
echo “No sudo log found” >> $REPORT
fi
echo “Audit completed. Report saved to $REPORT”
EOF
# 4. 监控sudo使用
# cat > /tmp/monitor_sudo.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/sudo_monitor.log"
# 监控sudo使用
auditctl -w /usr/bin/sudo -p x -k sudo_usage
auditctl -w /etc/sudoers -p wa -k sudo_config_changes
auditctl -w /etc/sudoers.d/ -p wa -k sudo_config_changes
echo "Sudo monitoring enabled" >> $LOG_FILE
EOF
# 5. 完整sudo安全加固
# cat > /tmp/full_sudo_hardening.sh << 'EOF'
#!/bin/bash
echo "Starting full sudo hardening..."
# 1. 系统级sudo加固
./harden_sudo.sh
# 2. 限制su命令
./restrict_su.sh
# 3. 创建sudo审计脚本
./audit_sudo.sh
# 4. 监控sudo使用
./monitor_sudo.sh
echo "Full sudo hardening completed"
EOF
# chmod +x /tmp/full_sudo_hardening.sh
# /tmp/full_sudo_hardening.sh
4.3 权限故障排查案例
权限相关故障的排查和解决:
# 案例1:sudo命令执行失败
# 症状:用户执行sudo命令提示”Sorry, user is not allowed to execute”
# 排查步骤:
# 1. 检查用户sudo权限
# sudo -l
Sorry, user fgedu may not run sudo on localhost.
# 2. 检查sudo配置
# grep “fgedu” /etc/sudoers
(无输出)
# 3. 检查用户组
# groups fgedu
fgedu : fgedu
# 解决:添加sudo权限
# visudo
fgedu ALL=(ALL) ALL
# 案例2:sudo密码验证失败
# 症状:输入密码后提示”Sorry, try again”
# 排查步骤:
# 1. 检查用户密码
# passwd fgedu
# 2. 检查sudo配置
# grep “Defaults” /etc/sudoers
# 3. 检查PAM配置
# cat /etc/pam.d/sudo
# 解决:确保用户密码正确,检查PAM配置
# 案例3:sudo命令执行缓慢
# 症状:sudo命令执行非常缓慢
# 排查步骤:
# 1. 检查DNS解析
# cat /etc/resolv.conf
# 2. 检查主机名解析
# hostname
localhost.localdomain
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain
# 解决:确保主机名可以正确解析
# 案例4:sudo配置语法错误
# 症状:visudo提示语法错误
# 排查步骤:
# 1. 检查配置语法
# visudo -c
/etc/sudoers: syntax error near line 100
# 2. 查看错误行
# sed -n ‘100p’ /etc/sudoers
fgedu ALL=(ALL) ALL ALL
# 解决:修复语法错误
# visudo
fgedu ALL=(ALL) ALL
# 案例5:sudo日志不记录
# 症状:sudo.log文件为空
# 排查步骤:
# 1. 检查sudo日志配置
# grep “logfile” /etc/sudoers
Defaults logfile=/var/log/sudo.log
# 2. 检查日志文件权限
# ls -l /var/log/sudo.log
-rw——-. 1 root root 0 Apr 2 10:00 /var/log/sudo.log
# 3. 检查日志配置
# grep “log_” /etc/sudoers
Defaults log_year, log_host, log_input, log_output
# 解决:确保日志配置正确,文件权限正确
# 案例6:su命令被拒绝
# 症状:执行su命令提示”Permission denied”
# 排查步骤:
# 1. 检查PAM配置
# grep “pam_wheel” /etc/pam.d/su
auth required pam_wheel.so use_uid
# 2. 检查用户组
# groups fgedu
fgedu : fgedu
# 解决:添加用户到wheel组
# usermod -aG wheel fgedu
# 案例7:sudo环境变量丢失
# 症状:sudo执行命令时环境变量丢失
# 排查步骤:
# 1. 检查环境变量
# export MY_VAR=”test”
# sudo env | grep MY_VAR
(无输出)
# 2. 检查sudo配置
# grep “env_keep” /etc/sudoers
Defaults env_keep += “HOME PATH”
# 解决:添加环境变量到env_keep
# visudo
Defaults env_keep += “MY_VAR”
# 案例8:sudo命令被拦截
# 症状:执行sudo命令提示”command not found”
# 排查步骤:
# 1. 检查sudo路径
# which sudo
/usr/bin/sudo
# 2. 检查PATH环境变量
# echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
# 解决:确保sudo在PATH中
# 案例9:sudo权限过大
# 症状:用户拥有过多权限
# 排查步骤:
# 1. 检查用户权限
# sudo -l
User fgedu may run the following commands on localhost:
(ALL) ALL
# 解决:限制用户权限
# visudo
fgedu ALL=(ALL) /usr/bin/systemctl, /usr/bin/yum
# 案例10:sudo时间戳问题
# 症状:每次执行sudo都需要输入密码
# 排查步骤:
# 1. 检查时间戳配置
# grep “timestamp_timeout” /etc/sudoers
Defaults timestamp_timeout=5
# 2. 检查时间戳文件
# ls -l /run/sudo/ts/
total 0
# 解决:确保时间戳配置正确,检查时间戳目录权限
Part05-风哥经验总结与分享
5.1 权限管理最佳实践
# 1. 权限设置原则
– 最小权限原则
– 定期审计权限
– 记录权限变更
– 及时回收权限
# 2. sudo配置原则
– 使用visudo编辑配置
– 避免使用NOPASSWD
– 配置sudo日志
– 定期审计sudo使用
# 3. su配置原则
– 限制su命令使用
– 只允许wheel组成员使用su
– 记录su使用日志
– 定期审计su使用
# 4. 权限审计原则
– 定期检查sudo配置
– 定期检查sudo日志
– 定期检查用户权限
– 监控异常使用
# 5. 权限安全原则
– 使用sudo替代su
– 配置sudo日志
– 限制su命令使用
– 定期审计权限
5.2 常见问题与解决
# 问题1:sudo命令执行失败
# 解决:检查用户sudo权限
# sudo -l
# visudo
# 问题2:sudo密码验证失败
# 解决:确保用户密码正确
# passwd username
# 问题3:sudo命令执行缓慢
# 解决:检查DNS解析和主机名解析
# cat /etc/resolv.conf
# cat /etc/hosts
# 问题4:sudo配置语法错误
# 解决:使用visudo检查语法
# visudo -c
# 问题5:sudo日志不记录
# 解决:检查日志配置
# grep “logfile” /etc/sudoers
# 问题6:su命令被拒绝
# 解决:检查PAM配置和用户组
# grep “pam_wheel” /etc/pam.d/su
# groups username
# 问题7:sudo环境变量丢失
# 解决:添加环境变量到env_keep
# visudo
# Defaults env_keep += “MY_VAR”
# 问题8:sudo命令被拦截
# 解决:检查sudo路径和PATH
# which sudo
# echo $PATH
# 问题9:sudo权限过大
# 解决:限制用户权限
# visudo
# fgedu ALL=(ALL) /usr/bin/systemctl, /usr/bin/yum
# 问题10:sudo时间戳问题
# 解决:检查时间戳配置
# grep “timestamp_timeout” /etc/sudoers
5.3 权限管理工具推荐
- 基本工具:su, sudo, visudo
- 审计工具:auditctl, ausearch
- 日志工具:journalctl, grep
- 监控工具:auditd, rsyslog
- 测试工具:sudo -l, id, whoami
# 1. 查看用户权限
# sudo -l
# sudo -U username -l
# 2. 编辑sudo配置
# visudo
# visudo -c
# 3. 查看sudo日志
# cat /var/log/sudo.log
# tail -f /var/log/sudo.log
# 4. 监控sudo使用
# auditctl -w /usr/bin/sudo -p x -k sudo_usage
# ausearch -k sudo_usage
# 5. 检查用户组
# groups username
# groupmems -g wheel -l
# 6. 切换用户
# su – username
# sudo -u username command
# 7. 检查PAM配置
# cat /etc/pam.d/su
# cat /etc/pam.d/sudo
# 8. 检查环境变量
# sudo env
# sudo -E env
# 9. 测试sudo配置
# sudo -l -U username
# 10. 监控权限变更
# auditctl -w /etc/sudoers -p wa -k sudo_config_changes
# ausearch -k sudo_config_changes
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
