13.1 Linux 的帐号与群组
13.1.1 使用者识别码:UID 与 GID
Linux 用数字 ID 而非用户名识别用户。每个登录至少有两个 ID:UID (User ID) 和 GID (Group ID)。文件记录的是 UID/GID 数字,显示时才翻译为用户名/群组名。
UID 范围:
| 范围 | 类型 | 说明 |
|---|---|---|
| 0 | 系统管理员 | root——UID=0 就是管理员,可以有多个(但不建议) |
| 1~999 | 系统帐号 | 1 |
| ≥1000 | 一般使用者 | 可登录系统的普通用户(CentOS 7 上限 60000) |
⚠️ 不要随便修改已有帐号的 UID!文件只记录 UID 数字,改了会导致权限错乱——用户连自己的主文件夹都进不去。
13.1.2 使用者帐号
登录流程:① 查 /etc/passwd 核对帐号 → ② 查 /etc/shadow 核对密码 → ③ 进入 Shell。
/etc/passwd 每行 7 字段(冒号分隔):
root:x:0:0:root:/root:/bin/bash
# ① ② ③ ④ ⑤ ⑥ ⑦| 字段 | 含义 |
|---|---|
| ① 帐号名 | 用户登录名 |
| ② 密码 | x = 密码已移至 /etc/shadow |
| ③ UID | 使用者 ID(0=管理员) |
| ④ GID | 初始群组 ID |
| ⑤ 说明 | 用户描述信息(finger 指令可读) |
| ⑥ 主文件夹 | 登录后进入的目录 |
| ⑦ Shell | 登录后使用的 shell(/sbin/nologin=禁止交互登录) |
/etc/shadow 每行 9 字段——密码加密存储,仅 root 可读写(---------- 或 -rw-------):
root:$6$wtbCCce...:16559:0:99999:7:::
# ② 密码(加密) ③改密日 ④最短 ⑤最长 ⑥警告 ⑦宽限 ⑧失效 ⑨保留
| 字段 | 含义 | 示例说明 |
|---|---|---|
| ② 密码 | SHA-512 加密;*/!!=禁止登录;加 !=锁定 | $6$ 开头 = SHA-512 |
| ③ 最近改密日 | 1970-01-01 以来的天数 | 16559 = 2015-05-04 |
| ④ 最短天数 | 多少天内不可再次改密码 | 0 = 随时可改 |
| ⑤ 最长天数 | 多少天内必须改密码 | 99999 ≈ 273 年(不强制) |
| ⑥ 警告天数 | 到期前 N 天开始提醒 | 7 = 提前 7 天警告 |
| ⑦ 宽限天数 | 过期后 N 天内仍可登录(强制改密) | 过期后 N 天密码彻底失效 |
| ⑧ 失效日期 | 帐号的绝对失效日(天数) | 超过此日期帐号彻底无法使用 |
| ⑨ 保留 |
密码加密:authconfig --test | grep hashing 查看加密算法(CentOS 7 默认 SHA512)。
忘记密码的解决方案:
- 普通用户:root 用
passwd user直接重置 - 忘记 root 密码:开机进入 rd.break / 单人维护模式 → 重设密码(详见第 19 章)
13.1.3 关于群组:有效与初始群组、groups, newgrp
/etc/group 每行 4 字段:
wheel:x:10:dmtsai
# ①群组名 ②密码(x) ③GID ④成员列表(逗号分隔,不含初始群组成员)
| 概念 | 说明 |
|---|---|
| 初始群组 (initial group) | /etc/passwd 第 4 字段指定的 GID,登录即取得——不需在 /etc/group 第 4 字段列出 |
| 有效群组 (effective group) | 当前创建文件时使用的群组——groups 列出的第一个 |
| 切换有效群组 | newgrp 群组名——会开子 shell,用 exit 回到原环境 |
groups # 查看所有支持的群组(第一个 = 当前有效群组)
newgrp users # 切换到 users 为有效群组(开启子 shell)
exit # 退回原 shell/etc/gshadow:群组密码与管理员配置(group admin 功能已少用,被 sudo 取代)。
13.2 帐号管理
13.2.1 新增与移除使用者:useradd, passwd, usermod, userdel
useradd:
useradd [-u UID] [-g 初始组] [-G 附加组] [-c 描述] [-d 主文件夹] [-s shell] [-mM] 帐号名
# -r: 创建系统帐号 (UID<1000, 不建主文件夹)
# -m: 强制创建主文件夹(一般帐号默认)
# -M: 不创建主文件夹(系统帐号默认)
# -e YYYY-MM-DD: 帐号失效日
# -f N: 密码失效宽限(0=立即, -1=永不)useradd 的默认值来自三个地方:
| 文件 | 控制内容 |
|---|---|
/etc/default/useradd | SHELL, HOME 基准目录, 主文件夹骨架目录(/etc/skel), 密码/帐号过期策略 |
/etc/login.defs | UID/GID 范围, 密码过期参数(最长/最短/警告天数), 是否需要主文件夹, umask, 加密算法 |
/etc/skel/ | 新用户主文件夹的骨架——.bashrc, .bash_profile 等从此复制 |
CentOS 使用私有群组机制:每个用户创建自己的同名初始群组,主文件夹权限为
700(仅自己可进)。
passwd:
passwd 帐号名 # root 给别人设密码(无需知旧密码)
passwd # 用户改自己密码(需先输入旧密码!)
echo "pwd" | passwd --stdin user # 脚本批量设密码(密码会留在 history!)
passwd -l user # 锁定(shadow 密码前加 !)
passwd -u user # 解锁
passwd -S user # 查看密码状态
passwd -x 60 -i 10 -w 7 user # 设置过期策略
# -n N: 最小改密间隔;-x N: 最大有效期;-w N: 警告天数;-i N: 过期宽限天数⚠️ 密码要求:长度≥8,含大小写+数字+特殊字符,不能与帐号相同,不能是字典词。
usermod:
usermod -aG wheel user # 追加到 wheel 组(获得 sudo 权限)
usermod -s /sbin/nologin user # 禁止交互登录
usermod -c "New Description" user # 修改描述
usermod -L/-U user # 锁定/解锁userdel:
userdel -r user # 删用户+家目录+邮件池chage——密码过期详情管理:
chage -l user # 查看密码过期详情
chage -M 90 user # 最长 90 天
chage -E 2025-12-31 user # 帐号到期日
chage -d 0 user # 强制首次登录修改密码13.2.2 新增与移除群组
groupadd -g GID groupname
groupmod -n newname oldname # 改名
groupdel groupname # 删群组(无人以此为初始组才可)
gpasswd -a user groupname # 加入群组
gpasswd -d user groupname # 踢出群组13.2.3 使用者功能
id user # UID, GID, 所有组
finger user # 详细信息(需安装)
chfn user # 修改 finger 显示信息
chsh -s /bin/bash user # 修改 shell13.3 主机的细部权限规划:ACL 的使用
传统 rwx 只能设 owner + 一个 group + others。ACL 可对任意单个用户/群组单独设权限。CentOS 7 的 xfs 默认支持 ACL。
ACL 的设置技巧:getfacl, setfacl
setfacl -m u:vbird:rx /srv/project # 给 vbird 读+执行
setfacl -m g:mygroup:rwx /srv/project # 给 mygroup 完全权限
setfacl -m m::rx /srv/project # 修改 mask(限制 ACL 条目最大权限)
setfacl -m d:u:vbird:rx /srv/project # d:=default,子文件自动继承
setfacl -x u:vbird /srv/project # 删除某条 ACL
setfacl -b /srv/project # 清除所有 ACL
getfacl /srv/project # 查看 ACL(含 mask 和 default)ls -l权限栏后面有+→ 表示该文件有 ACL- mask:限制 owner+others 以外所有条目的最大权限——修改 mask 可批量控制所有 ACL 权限
13.4 使用者身份切换
13.4.1 su
su # 切 root(需 root 密码,环境变量保持不变)
su - # 切 root(完整 login shell——推荐!)
su - vbird # 切到 vbird(需 vbird 密码)13.4.2 sudo
sudo cmd # 以 root 执行一条指令(用自己的密码)
sudo -i # 切到 root shell
sudo -u vbird cmd # 以 vbird 身份执行visudo 安全编辑 /etc/sudoers(带语法检查——绝不要直接用 vim 改!):
root ALL=(ALL) ALL # root 能做任何事
%wheel ALL=(ALL) ALL # wheel 组成员有完整 sudo 权限
vbird ALL=(ALL) NOPASSWD: ALL # vbird sudo 免密码
User_Alias ADMINS = vbird, dmtsai # 用户别名
Cmnd_Alias WEB = /usr/sbin/httpd, /usr/sbin/apachectl # 命令别名
给普通用户 sudo 的标准做法:
usermod -aG wheel user——CentOS 默认已配%wheel ALL=(ALL) ALL。
13.5 使用者的特殊 shell 与 PAM 模块
13.5.1 特殊的 shell, /sbin/nologin
/sbin/nologin 禁止交互登录,但可用于 FTP/POP3 等服务认证。写在 /etc/shells 中的 shell 才被承认为合法 shell。
13.5.2 PAM 模块简介
PAM(Pluggable Authentication Modules)= 可插拔认证模块。统一认证接口——不修改程序本身就能换认证方式(从 /etc/passwd 改为 LDAP,只需改 PAM 配置)。
13.5.3 PAM 模块设置语法
配置文件:/etc/pam.d/(如 /etc/pam.d/login, /etc/pam.d/sshd)。格式:
type control-flag module arguments
四种 type:
| type | 用途 |
|---|---|
| auth | 身份认证(验证密码) |
| account | 账号管理(是否过期、是否允许登录) |
| session | 会话管理(登录后的环境设置/清理) |
| password | 密码更新 |
四种 control-flag:
| flag | 行为 |
|---|---|
| required | 必须通过——失败继续走完再报错(不透露哪个环节失败,更安全) |
| requisite | 必须通过——失败立即返回 |
| sufficient | 通过则立即返回成功——跳过后续模块 |
| optional | 可选——不强制 |
13.5.4 常用模块
| 模块 | 功能 |
|---|---|
pam_securetty.so | root 只能从 /etc/securetty 列出的终端登录 |
pam_nologin.so | /etc/nologin 文件存在时禁止普通用户登录(系统维护时用) |
pam_selinux.so | SELinux 安全上下文设置 |
pam_limits.so | ulimit 资源限制 |
pam_cracklib.so | 密码复杂度检验(替代 login.defs 的 PASS_MIN_LEN) |
13.6 Linux 主机上的使用者讯息传递
13.6.1 查询使用者:w, who, last, lastlog
w # 当前在线用户+正在做什么(最详细)
who # 当前在线用户列表
last # 所有登录记录(读 /var/log/wtmp)
lastlog # 所有帐号的最后登录时间
lastb # 登录失败记录(读 /var/log/btmp,需 root)13.6.2 使用者对谈:write, mesg, wall
who # 先查对方在哪条终端
write vbird pts/2 # 开始对谈(Ctrl+d 结束)
mesg n # 拒绝接收消息(mesg y 恢复)
wall "System will reboot in 10 min!" # 广播给所有在线用户13.6.3 使用者邮件信箱:mail
mail -s "Subject" user@host # 发送邮件
mail # 查看邮件(进入交互模式)13.7 CentOS 7 环境下大量创建帐号的方法
批量建账号标准流程:
# 1. 准备账号清单
# 2. 循环创建+设密码
for user in $(cat userlist.txt); do
useradd -m -s /bin/bash ${user}
echo "DefaultPwd123" | passwd --stdin ${user}
chage -d 0 ${user} # 强制首次登录改密码
done检查工具:pwck(检查 /etc/passwd 完整性)、pwconv(同步 passwd→shadow)、grpck(检查 /etc/group)。
命令速查表
| 命令 | 用途 |
|---|---|
useradd -m -s /bin/bash user | 创建用户(含主文件夹) |
useradd -r sysuser | 创建系统帐号(UID<1000, 无主文件夹) |
userdel -r user | 删除用户+家目录+邮件 |
usermod -aG wheel user | 追加到 wheel 组 |
usermod -s /sbin/nologin user | 禁止交互登录 |
passwd user / passwd -l/-u/-S | 设密码/锁定/解锁/查看状态 |
echo "pwd" | passwd --stdin user | 批量设密码 |
chage -l/-M/-E/-d user | 密码过期管理/强制改密 |
groupadd / groupdel / gpasswd -a/-d | 群组管理 |
id / groups / newgrp | 查看/切换群组 |
su - / sudo cmd / visudo | 身份切换/管理员配置 |
setfacl -m u:user:rwx file | 给用户加 ACL |
setfacl -b file / getfacl file | 清除/查看 ACL |
w / who / last / lastlog / lastb | 登录记录 |
write user pts/N / wall msg | 用户对谈/广播 |
pwck / pwconv / grpck | 帐号检查工具 |