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系统帐号1200:发行版自建;201999:用户自建系统帐号
≥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/useraddSHELL, HOME 基准目录, 主文件夹骨架目录(/etc/skel), 密码/帐号过期策略
/etc/login.defsUID/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                         # 修改 shell

13.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.soroot 只能从 /etc/securetty 列出的终端登录
pam_nologin.so/etc/nologin 文件存在时禁止普通用户登录(系统维护时用)
pam_selinux.soSELinux 安全上下文设置
pam_limits.soulimit 资源限制
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帐号检查工具