1. Linux用户与组管理基础
在Linux系统中,用户和组管理是系统管理员日常工作中最基础也最重要的部分。每个用户都有一个唯一的用户ID(UID),而组则是用户的集合,拥有自己的组ID(GID)。这种设计不仅实现了权限隔离,也为协作提供了便利。
用户账户信息主要存储在三个关键文件中:
- /etc/passwd:保存用户账户的基本信息
- /etc/shadow:存储加密后的用户密码
- /etc/group:记录组信息
创建新用户的典型命令是:
bash复制useradd -m -s /bin/bash username
其中-m选项会自动创建用户主目录,-s指定默认shell。创建后可以使用passwd命令设置密码:
bash复制passwd username
组管理同样重要,创建组的命令是:
bash复制groupadd groupname
将用户加入组:
bash复制usermod -aG groupname username
注意:使用usermod时一定要加上-aG选项,否则用户会被移出其他组,只保留新指定的组。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用户切换机制详解
2.1 su命令的本质
su(switch user)是最基础的用户切换命令。不带任何参数时,默认切换到root用户:
bash复制su
系统会提示输入目标用户的密码。
如果想切换到特定用户:
bash复制su username
su命令的特点是:
- 不会改变当前工作目录
- 继承大部分原用户的环境变量
- 需要知道目标用户的密码
2.2 su - 的完整环境切换
su -(或su -l)提供了更彻底的切换:
bash复制su - username
这个命令会:
- 切换到目标用户的主目录
- 完全加载目标用户的环境变量
- 模拟真实的登录过程
实际经验:在编写自动化脚本时,如果需要完全模拟用户环境,务必使用su - 而不是单纯的su。
3. sudo权限管理
3.1 sudo基础原理
sudo(superuser do)允许授权用户以其他用户身份(通常是root)执行命令,而不需要知道目标用户的密码。其配置文件是/etc/sudoers,建议使用visudo命令编辑:
bash复制visudo
基本授权语法:
code复制username ALL=(ALL:ALL) ALL
这表示:
- username可以在任何主机上执行
- 可以切换到任何用户和组
- 可以执行任何命令
3.2 sudo -i与sudo su的区别
sudo -i模拟root登录:
bash复制sudo -i
效果类似于su - root,会:
- 切换到root主目录
- 加载root的环境变量
- 执行root的profile脚本
而sudo su只是切换用户身份:
bash复制sudo su
不会改变环境变量和工作目录。
排坑指南:如果遇到环境变量问题,优先考虑使用sudo -i而不是sudo su。
4. 特殊shell与nologin场景
4.1 /sbin/nologin的作用
某些系统账户(如www-data、mysql)不需要登录能力,可以设置其shell为:
bash复制usermod -s /sbin/nologin username
当尝试登录这类账户时,系统会显示"此账户当前不可用"信息。可以自定义这个提示信息:
bash复制usermod -s /sbin/nologin -c "Custom message" username
4.2 实际应用场景
- FTP服务账户:允许文件传输但禁止shell访问
- 数据库服务账户:只用于运行服务进程
- 系统守护进程账户:降低安全风险
运维经验:对于所有不需要交互登录的服务账户,都应该设置为nologin shell,这是服务器加固的基本要求。
5. 权限管理最佳实践
5.1 最小权限原则
- 避免直接使用root账户
- 为每个管理员创建个人账户
- 通过sudo授权特定命令
示例:只允许用户重启web服务
code复制username ALL=(root) /usr/bin/systemctl restart nginx
5.2 审计与日志
sudo自带详细的日志记录,默认存储在/var/log/auth.log。可以配置更详细的日志:
code复制Defaults log_host, log_year, logfile="/var/log/sudo.log"
5.3 常见问题排查
- sudo卡住无响应:
bash复制# 检查PAM认证模块
auth sufficient pam_permit.so
- 环境变量丢失:
bash复制# 在sudoers中保留环境变量
Defaults env_keep += "PATH HOME"
- 权限不足:
bash复制# 检查用户所属组
groups username
# 验证sudoers配置
sudo -l
6. 安全加固措施
- 限制su的使用:
bash复制# 只允许wheel组成员使用su
auth required pam_wheel.so use_uid
- sudo超时设置:
bash复制# 5分钟后需要重新输入密码
Defaults timestamp_timeout=5
- 命令限制:
bash复制# 禁止危险命令
Cmnd_Alias DANGEROUS = /bin/rm, /usr/bin/dd
username ALL=(ALL) ALL, !DANGEROUS
我在实际运维中发现,很多安全问题源于过度授权。建议定期审查sudo权限,使用自动化工具检查配置:
bash复制# 检查所有sudo权限
getent passwd | cut -d: -f1 | xargs -l sudo -l -U
