1. Linux 的帐号与群组
1.1 用户识别码:UID 与 GID
Linux 系统识别用户的不是账号名称,而是数字代号。
- UID (User ID):用户识别码
- GID (Group ID):群组识别码
系统通过 /etc/passwd 与 /etc/group 将 UID/GID 转换为账号名称显示。随意修改 UID 会导致用户无法正确访问自己的文件。
1.2 用户帐号
/etc/passwd 文件结构
每行代表一个账号,用冒号 : 分隔为 7 个字段:
| 字段 | 说明 |
|---|---|
| 1 | 账号名称 |
| 2 | 密码占位符(x 表示密码在 /etc/shadow) |
| 3 | UID(0=root,1-999=系统账号,1000-60000=一般用户) |
| 4 | GID(初始群组) |
| 5 | 用户信息说明栏 |
| 6 | 家目录 |
| 7 | Shell(如 /bin/bash、/sbin/nologin) |
/etc/shadow 文件结构
每行 9 个字段,用冒号分隔:
| 字段 | 说明 |
|---|---|
| 1 | 账号名称 |
| 2 | 加密密码(* 或 ! 表示无法登录) |
| 3 | 最近更改密码日期(1970/1/1 起算) |
| 4 | 密码不可更改天数 |
| 5 | 密码需重新更改天数 |
| 6 | 密码过期前警告天数 |
| 7 | 密码过期后宽限天数(密码失效日) |
| 8 | 账号失效日期 |
| 9 | 保留字段 |
加密机制:目前主流使用 SHA512(密码字段以 $6$ 开头)。
1.3 关于群组
/etc/group 文件结构
每行 4 个字段,用冒号分隔:
| 字段 | 说明 |
|---|---|
| 1 | 群组名称 |
| 2 | 群组密码占位符 |
| 3 | GID |
| 4 | 此群组支持的账号名称 |
有效群组与初始群组
| 概念 | 说明 |
|---|---|
| 初始群组(initial group) | /etc/passwd 第4字段 GID 对应的群组,用户登录即拥有 |
| 有效群组(effective group) | 当前正在使用的群组,新建文件的群组归属依据有效群组 |
groups
查看当前用户所属的所有群组,第一个显示的是有效群组。
1 | groups |
newgrp
切换有效群组(会新建 shell,用 exit 返回)。
1 | newgrp 群组名 |
/etc/gshadow
每行 4 个字段,用冒号分隔:
| 字段 | 说明 |
|---|---|
| 1 | 群组名称 |
| 2 | 加密后的群组密码 |
| 3 | 群组管理员账号 |
| 4 | 此群组支持的账号名称 |
2. 帐号管理
2.1 添加与移除用户
useradd
命令格式:useradd [-u UID] [-g 初始群组] [-G 次要群组] [-c 说明] [-d 家目录] [-s shell] [-r] 账号名称
| 选项 | 说明 |
|---|---|
-u |
指定 UID |
-g |
指定初始群组 |
-G |
指定次要群组 |
-c |
用户说明栏 |
-d |
指定家目录 |
-s |
指定 shell |
-r |
创建系统账号 |
-m |
强制创建家目录 |
-M |
强制不创建家目录 |
useradd 创建用户时执行的操作:
- 在
/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow中增加记录 - 在
/home下创建家目录(从/etc/skel复制环境文件) - 设置家目录权限(默认 700)
useradd 参考档
/etc/default/useradd:定义家目录、shell、密码失效日等默认值/etc/login.defs:定义 UID/GID 范围、密码加密机制、家目录创建策略等UID_MIN/UID_MAX:一般用户 UID 范围(1000-60000)SYS_UID_MIN/SYS_UID_MAX:系统账号 UID 范围(201-999)ENCRYPT_METHOD SHA512:密码加密机制CREATE_HOME yes:是否默认创建家目录USERGROUPS_ENAB yes:删除用户时是否删除其初始群组
passwd
命令格式:passwd [--stdin] [账号名称]
| 用法 | 说明 |
|---|---|
passwd |
修改当前用户密码 |
passwd 账号 |
root 修改他人密码 |
echo "密码" | passwd --stdin 账号 |
通过标准输入设置密码 |
密码管理参数(仅 root 可用):
-l:锁定账号(Lock)-u:解锁账号(Unlock)-S:显示密码状态-x 天数:设置密码需重新更改天数-n 天数:设置密码不可更改天数-w 天数:设置警告天数-i 天数:设置密码失效天数
chage
命令格式:chage [-l] [-d 日期] [-E 日期] [-I 天数] [-m 天数] [-M 天数] [-W 天数] 账号
| 选项 | 说明 |
|---|---|
-l |
列出详细密码参数 |
-d 0 |
强制用户下次登录修改密码 |
-E |
设置账号失效日期 |
-I |
设置密码失效天数 |
-m |
设置密码最短保留天数 |
-M |
设置密码最长保留天数 |
-W |
设置警告天数 |
usermod
命令格式:usermod [-cdegGlsuLU] 账号
| 选项 | 说明 |
|---|---|
-g |
修改初始群组 |
-G |
修改次要群组 |
-a -G |
增加次要群组(而非设置) |
-L |
锁定账号 |
-U |
解锁账号 |
-u |
修改 UID |
-s |
修改 shell |
-c |
修改说明栏 |
-d |
修改家目录 |
-e |
修改账号失效日期 |
-l |
修改账号名称 |
userdel
命令格式:userdel [-r] 账号
-r:连同用户的家目录一起删除
2.2 用户功能
| 命令 | 用途 |
|---|---|
id |
查看 UID/GID 及所属群组 |
finger |
查看用户详细信息(需安装) |
chfn |
修改 finger 信息(/etc/passwd 第5字段) |
chsh |
修改 shell(需在 /etc/shells 中) |
2.3 添加与移除群组
| 命令 | 用途 | 常用选项 |
|---|---|---|
groupadd |
新增群组 | -g GID、-r(系统群组) |
groupmod |
修改群组 | -g GID、-n 新名称 |
groupdel |
删除群组 | 不能删除是某用户初始群组的群组 |
gpasswd:群组管理员
系统管理员操作:
1 | gpasswd 群组名 # 设置群组密码 |
群组管理员操作:
1 | gpasswd -a 用户 群组名 # 添加成员 |
2.4 帐号管理实例
任务一:创建不同需求的用户
1 | groupadd mygroup1 |
任务二:创建协作项目目录(使用 SGID)
1 | groupadd projecta |
2.5 使用外部身份认证系统
- 使用
authconfig-tui命令配置外部身份验证(如 LDAP、NIS、AD) - 该工具提供图形化界面,可在各个认证项目间切换
3. 主机的细部权限规划:ACL 的使用
3.1 什么是 ACL 与如何支持启动 ACL
ACL (Access Control List):传统 owner/group/others 权限只能针对三个身份设置,ACL 可针对单一用户或单一群组单独设置权限。
ACL 可针对的项目:
- 用户(user)
- 群组(group)
- 默认属性(mask)
- 默认权限(default)
启动 ACL:CentOS 7 中 ext4/xfs 默认支持,可通过 dmesg | grep -i acl 确认。
3.2 ACL 的设置技巧
getfacl:查看 ACL
1 | getfacl 文件名 |
setfacl:设置 ACL
命令格式:setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
| 选项 | 说明 |
|---|---|
-m |
设置 ACL 参数 |
-x |
移除 ACL 参数 |
-b |
移除所有 ACL |
-k |
移除默认 ACL |
-R |
递归设置 |
-d |
设置默认 ACL |
ACL 设置格式
| 格式 | 说明 | 示例 |
|---|---|---|
u:用户:权限 |
设置用户 ACL | setfacl -m u:vbird1:rx file |
u::权限 |
设置文件拥有者权限 | setfacl -m u::rwx file |
g:群组:权限 |
设置群组 ACL | setfacl -m g:mygroup1:rx file |
m:权限 |
设置 mask(有效权限上限) | setfacl -m m:r file |
d:u:用户:权限 |
设置默认 ACL | setfacl -m d:u:vbird1:rx dir |
d:g:群组:权限 |
设置默认群组 ACL | setfacl -m d:g:projecta:rwx dir |
mask 的作用
用户或群组的权限必须与 mask 的权限进行“与”运算后才是实际有效权限。mask 用于规范最大允许权限。
4. 用户身份切换
4.1 su
| 用法 | 说明 |
|---|---|
su |
切换为 root,non-login shell,环境变量不变 |
su - 或 su -l |
切换为 root,login shell,环境完全切换(推荐) |
su - 用户 |
切换为指定用户 |
su - -c "指令" |
以 root 执行单条指令 |
缺点:需要知道目标用户的密码,多人管理时 root 密码容易外流。
4.2 sudo
- 执行时输入自己的密码,而非目标用户密码
- 通过
/etc/sudoers控制权限
sudo 指令
1 | sudo [-b] [-u 新用户] 指令 |
| 选项 | 说明 |
|---|---|
-b |
将指令放到后台执行 |
-u |
以指定用户身份执行(默认 root) |
visudo:编辑 /etc/sudoers
语法检查、锁定文件,是唯一安全的编辑方式。
/etc/sudoers 设置格式
1 | 用户/群组 主机=(可切换身份) 指令 |
| 配置 | 说明 |
|---|---|
root ALL=(ALL) ALL |
root 任何指令 |
vbird1 ALL=(ALL) ALL |
vbird1 可执行任何指令 |
%wheel ALL=(ALL) ALL |
wheel 群组成员可执行任何指令 |
%wheel ALL=(ALL) NOPASSWD: ALL |
免密码 sudo |
myuser1 ALL=(root) /usr/bin/passwd |
仅能执行 passwd |
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root |
限制 passwd 参数 |
别名设置(须全大写)
1 | User_Alias ADMPW = pro1, pro2, pro3 |
时间间隔:两次 sudo 操作在 5 分钟内无需重复输入密码。
sudo 配合 su
1 | User_Alias ADMINS = pro1, pro2, pro3 |
用户执行 sudo su - 输入自己密码即可变成 root。
5. 用户的特殊 shell 与 PAM 模块
5.1 特殊的 shell:/sbin/nologin
- 使用此 shell 的用户无法登录系统
- 但仍可使用其他系统资源(如邮件、服务进程)
- 可创建
/etc/nologin.txt自定义拒绝登录时的提示信息
5.2 PAM 模块简介
PAM (Pluggable Authentication Modules):嵌入式认证模块,提供统一的验证机制。
- 验证配置文件位于
/etc/pam.d/,与程序同名 - 例如
pam_cracklib.so模块用于检查密码是否在字典中
5.3 PAM 模块设置语法
配置文件格式:
1 | 验证类别 控制标准 模块 参数 |
验证类别(type)
| 类别 | 说明 |
|---|---|
auth |
身份认证 |
account |
账号有效性 |
session |
会话管理 |
password |
密码管理 |
控制标准(flag)
| 标准 | 说明 |
|---|---|
required |
必须成功,失败后继续检查 |
requisite |
必须成功,失败立即返回 |
sufficient |
成功则立即通过 |
optional |
可选,仅用于日志 |
5.4 常用模块简介
| 模块 | 说明 |
|---|---|
pam_securetty.so |
限制 root 登录的终端(/etc/securetty) |
pam_nologin.so |
检查 /etc/nologin,禁止非 root 登录 |
pam_pwquality.so |
密码强度检查 |
pam_unix.so |
传统的密码验证 |
pam_env.so |
设置环境变量 |
pam_limits.so |
限制用户资源使用 |
5.5 其他相关文件:limits.conf
/etc/security/limits.conf:限制用户的系统资源使用。
1 | # 格式: domain type item value |
| 字段 | 说明 |
|---|---|
| domain | 用户、群组(@group)或 *(所有人) |
| type | soft(软限制)、hard(硬限制) |
| item | core(核心文件)、nproc(进程数)、nofile(打开文件数)等 |
6. Linux 主机上的用户消息传递
6.1 查找用户
| 命令 | 用途 |
|---|---|
w |
查看当前登录用户及正在执行的操作 |
who |
查看当前登录用户 |
last |
查看最近登录记录(/var/log/wtmp) |
lastlog |
查看每个用户最近一次登录时间 |
6.2 用户对谈
| 命令 | 用途 |
|---|---|
write 用户 |
向指定用户发送消息 |
mesg [y/n] |
设置是否接收消息(y=接收,n=拒绝) |
wall "消息" |
向所有用户广播消息 |
6.3 用户邮件信箱:mail
1 | mail -s "邮件主题" 用户 < 文件 # 发送邮件 |
7. CentOS 7 环境下大量建置帐号的方法
7.1 帐号相关的检查工具
| 命令 | 用途 |
|---|---|
pwck |
检查 /etc/passwd 和 /etc/shadow 的一致性 |
pwconv |
将 /etc/passwd 中的密码迁移到 /etc/shadow |
pwunconv |
将密码从 /etc/shadow 写回 /etc/passwd |
chpasswd |
批量更新密码,格式:`echo “username:password” |
7.2 大量建置帐号范本(适用 passwd –stdin 选项)
步骤:
- 创建账号列表文件
user.txt,每行格式:username:password - 使用脚本批量建置
示例脚本:
1 |
|
注意事项:
passwd --stdin选项并非所有发行版都支持- 批量建置前可用
pwck检查系统帐号状态 - 可用
useradd -s /sbin/nologin创建纯邮件账号
8. 本章重点命令速查
| 命令 | 用途 | 示例 |
|---|---|---|
useradd |
新增用户 | useradd -g users -G wheel john |
passwd |
设置密码 | passwd john |
chage |
密码参数 | chage -l john |
usermod |
修改用户 | usermod -a -G wheel john |
userdel |
删除用户 | userdel -r john |
groupadd |
新增群组 | groupadd project |
groupmod |
修改群组 | groupmod -n newname oldname |
groupdel |
删除群组 | groupdel project |
gpasswd |
群组管理 | gpasswd -M john project |
su |
切换用户 | su - john |
sudo |
以其他身份执行 | sudo -u john ls |
visudo |
编辑 /etc/sudoers | visudo |
setfacl |
设置 ACL | setfacl -m u:john:rx file |
getfacl |
查看 ACL | getfacl file |
id |
显示身份信息 | id john |
groups |
显示所属群组 | groups |
chsh |
修改 shell | chsh -s /bin/bash |
w / who |
查看登录用户 | w |
last / lastlog |
查看登录记录 | lastlog |
write / wall |
消息传递 | wall "message" |
mail |
邮件收发 | mail -s "hi" john |
pwck |
检查帐号文件 | pwck |
chpasswd |
批量设置密码 | echo "u:p" | chpasswd |
authconfig-tui |
外部身份认证配置 | authconfig-tui |
9. 核心要点
- 系统通过 UID/GID 识别用户和群组,账号名称是给人看的
- 账号核心文件:
/etc/passwd+/etc/shadow,群组核心文件:/etc/group+/etc/gshadow useradd创建用户后,必须用passwd设置密码才能登录su -比su更推荐,因为会完全切换环境变量sudo执行时输入自己的密码,更安全,多人管理时推荐使用- ACL 突破了传统权限的三组限制,可针对单一用户或群组单独设置权限
visudo是唯一安全的 sudoers 编辑方式,会进行语法检查/sbin/nologin用于创建无法登录但可使用其他服务的账号newgrp可切换有效群组,但会新建一个 shell,需用exit返回- PAM 提供统一的认证机制,配置文件位于
/etc/pam.d/ - 大量建置账号可用循环脚本配合
useradd和chpasswd last、write、wall、mail等命令用于用户消息传递