su命令是Linux/Unix系统中用于切换用户身份的核心工具,其名称源于”Substitute User”(替代用户)或”Switch User”(切换用户),正确使用可提升系统管理效率,错误操作可能导致严重安全风险,本指南涵盖实用场景、安全实践及企业级解决方案。
基础操作场景
临时切换至root用户(最常用)
su -
- 或
-l
参数:加载目标用户的环境变量(如PATH) - 需输入root密码(非当前用户密码)
- 退出:执行
exit
或Ctrl+D
切换至其他普通用户
su - username # su - webadmin
- 需输入目标用户的密码
- 保留原工作目录:去掉 参数(不推荐)
高级权限管理方案
场景1:执行单条特权命令(免交互)
su -c "apt update" root # -c后接命令,末尾声明用户
场景2:带环境变量执行脚本
su - dbadmin -s /bin/bash -c "/opt/scripts/backup.sh"
-s
指定Shell解释器- 确保脚本有可执行权限 (
chmod +x
)
场景3:sudo与su协同工作(企业最佳实践)
sudo su - # 先通过sudo认证,再用su切换
- 优势:
✅ 避免直接共享root密码
✅ 符合最小权限原则
✅ 所有操作记入/var/log/auth.log
安全风险控制
禁用root的su权限(强化安全)
编辑 /etc/pam.d/su
:
auth required pam_wheel.so use_uid group=admin
- 仅允许
admin
组成员使用su - 创建管理组:
groupadd admin && usermod -aG admin youruser
密码策略强制
# 编辑 /etc/pam.d/common-password password requisite pam_pwquality.so retry=3 minlen=10 difok=3
会话超时锁定
在 /etc/profile
追加:
TMOUT=300 # 300秒无操作自动退出 readonly TMOUT
企业环境实战案例
场景:自动化部署时的权限降级
#!/bin/bash # 以root启动服务,降权运行进程 su - appuser -c "/usr/bin/java -jar /opt/app/service.jar" echo "服务已通过最小权限启动 (PID: $(pgrep -u appuser java))"
审计建议:
- 启用会话记录:
# 在 /etc/bash.bashrc 追加 export PROMPT_COMMAND='history -a' chattr +a /home/*/.bash_history
- 使用
auditd
监控su调用:auditctl -a always,exit -F arch=b64 -S execve -F path=/bin/su
常见错误排查
错误提示 | 原因及解决方案 |
---|---|
su: Authentication failure |
密码错误/用户不存在/账户被锁定 |
su: cannot set user id |
目标用户的Shell不可执行 (/sbin/nologin ) |
su: warning cannot change directory |
目标用户家目录权限错误 |
替代方案推荐
- sudo:细粒度命令授权(编辑
/etc/sudoers
)webadmin ALL=(appuser) /usr/bin/systemctl restart nginx
- ssh密钥跳转:跨服务器安全切换
ssh -t prod-server "su - deployer"
技术引用说明:
- Linux
man-pages
核心文档 (man7.org)- Red Hat Enterprise Linux 安全加固指南
- Ubuntu Server 20.04 LTS 官方管理手册
- NIST SP 800-53 Rev.5 权限控制标准
操作前请务必在测试环境验证,生产环境建议使用配置管理工具(Ansible/SaltStack)批量部署
本指南遵循Linux Foundation的SysAdmin最佳实践,所有命令均在CentOS/Ubuntu LTS版本验证,适用于GDPR/HIPAA合规场景,定期权限审计与最小化特权分配是保障系统安全的基石。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/9079.html