在Linux系统中,用户账户远不止是一个登录名那么简单。它实际上是系统资源访问控制的核心机制。每当我培训新入职的运维工程师时,总会强调:理解用户账户的本质,是掌握Linux系统安全的基础。
用户账户的核心作用体现在三个维度:
系统用户主要分为三类:
查看用户信息的几种实用方法:
bash复制# 查看当前用户信息
$ id
uid=1000(user01) gid=1000(user01) groups=1000(user01),10(wheel)
# 查看/etc/passwd文件结构
$ head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 解析passwd字段含义
$ grep user01 /etc/passwd
user01:x:1000:1000:User One:/home/user01:/bin/bash
# 字段说明:用户名:密码占位符:UID:GID:描述信息:家目录:登录shell
组机制是Linux权限管理的精髓所在。根据我的运维经验,合理的组规划可以大幅降低权限管理复杂度。组分为两种类型:
主要组(Primary Group):
补充组(Supplementary Group):
组信息查看技巧:
bash复制# 查看用户所属组
$ groups user01
user01 : user01 wheel docker
# 解析/etc/group文件
$ grep wheel /etc/group
wheel:x:10:user01,user02
# 字段说明:组名:密码占位符:GID:组成员列表
经验提示:新建用户时,如果不指定-G参数,系统会创建一个与用户名同名的私有组作为主要组。这在单用户环境下是合理的,但在多用户协作场景中,建议提前规划好组结构。
su命令是切换用户身份的基础工具,但很多新手并不清楚su与su-的关键区别:
bash复制# 方式一:非登录式切换(保留原用户环境)
$ su user02
Password:
$ env | grep PATH # 仍保持原用户的PATH环境
# 方式二:登录式切换(完全模拟目标用户环境)
$ su - user02
Password:
$ env | grep PATH # 使用user02的环境配置
实际运维中的经验法则:
su usersu - usersudo是我最推荐的权限管理方式,相比su有以下优势:
/etc/sudoers文件配置案例:
bash复制# 允许wheel组成员执行所有命令
%wheel ALL=(ALL) ALL
# 允许用户user01以root身份管理服务
user01 ALL=(root) /usr/bin/systemctl
# 允许运维组免密重启服务
%ops ALL=(root) NOPASSWD: /sbin/reboot, /sbin/shutdown
配置时的黄金法则:
bash复制# 查看可用sudo权限
$ sudo -l
User user01 may run the following commands on host01:
(root) /usr/bin/systemctl
创建用户最佳实践:
bash复制# 基础创建
$ sudo useradd -m -s /bin/bash dev01
# 完整参数示例
$ sudo useradd -m -d /data/users/dev02 -s /bin/zsh -c "开发工程师" -G docker,git dev02
# 设置密码(交互式)
$ sudo passwd dev01
# 非交互式设置密码(适合自动化部署)
$ echo "Init1234" | sudo passwd --stdin dev01
用户修改常见场景:
bash复制# 修改家目录位置(自动迁移内容)
$ sudo usermod -m -d /new/home/dev01 dev01
# 追加补充组(不影响原有组)
$ sudo usermod -aG docker dev01
# 锁定/解锁账户
$ sudo usermod -L dev01 # 锁定
$ sudo usermod -U dev01 # 解锁
用户删除注意事项:
bash复制# 保留家目录(默认行为)
$ sudo userdel dev01
# 完全删除(包括家目录和邮件)
$ sudo userdel -r dev01
# 特殊场景:当用户存在残留进程时
$ sudo killall -u dev01 # 先终止进程
$ sudo userdel -f dev01 # 强制删除
组管理命令示例:
bash复制# 创建系统组(GID<1000)
$ sudo groupadd -r sysadmin
# 修改组名和GID
$ sudo groupmod -n admins -g 2000 sysadmin
# 删除组(确保没有用户将其作为主要组)
$ sudo groupdel admins
组成员管理技巧:
bash复制# 查看组成员
$ getent group docker
docker:x:983:dev01,dev02
# 批量添加多个用户到组
$ sudo gpasswd -M "user1,user2,user3" developers
# 从组中移除用户
$ sudo gpasswd -d user1 developers
/etc/shadow文件是密码安全的核心,各字段含义如下:
code复制user01:$6$salt$hash:18647:5:60:7:10:19475:
查看shadow文件的正确姿势:
bash复制# 安全查看(避免密码哈希泄露)
$ sudo grep user01 /etc/shadow | awk -F: '{print $1,$3,$5,$7}'
user01 18647 60 7
# 密码状态检查
$ sudo passwd -S user01
user01 PS 2023-05-01 0 60 7 10 (Password set, SHA512 crypt.)
使用chage设置密码策略:
bash复制# 设置60天过期,提前7天警告
$ sudo chage -M 60 -W 7 user01
# 强制下次登录修改密码
$ sudo chage -d 0 user01
# 查看完整策略
$ sudo chage -l user01
Last password change : May 01, 2023
Password expires : Jun 30, 2023
Password inactive : Jul 10, 2023
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7
密码强度策略配置:
bash复制# 修改/etc/security/pwquality.conf
minlen = 12
dcredit = -1 # 至少1位数字
ucredit = -1 # 至少1位大写
ocredit = -1 # 至少1位特殊字符
问题1:用户无法登录
sudo passwd -S usernamesudo chage -l usernamesudo tail -f /var/log/secure问题2:sudo命令报错"不在sudoers文件中"
groups usernamesudo visudo -c问题3:用户家目录权限错误
bash复制# 典型修复流程
$ sudo chmod 755 /home/username
$ sudo chown -R username:group /home/username
$ sudo restorecon -Rv /home/username # SELinux环境需要
批量用户管理:
bash复制# 批量创建用户
$ for user in dev{01..10}; do
sudo useradd -m -s /bin/bash $user
echo "$user:InitPass123" | sudo chpasswd
done
# 批量修改密码过期
$ sudo chage -M 90 -W 7 $(getent passwd | grep -E "dev[0-9]+" | cut -d: -f1)
用户模板配置:
bash复制# 设置默认配置
$ sudo cp -r /etc/skel /etc/skel.custom
$ echo "export EDITOR=vim" >> /etc/skel.custom/.bashrc
# 使用模板创建用户
$ sudo useradd -m -k /etc/skel.custom -s /bin/bash newuser
审计用户活动:
bash复制# 查看所有登录用户
$ who -a
# 查看用户历史命令(需提前配置)
$ sudo cat /home/user01/.bash_history
# 实时监控用户操作
$ sudo auditctl -w /home/user01 -p wa -k user_monitor