NOTE
Linux 账号管理与 ACL 权限设置
整理账号文件、用户组、ACL、sudo、PAM 与账号检查。
用户账号基础
Linux 中每个用户都有自己的 UID 和 GID,可以通过 id 命令查看:
$ id root
uid=0(root) gid=0(root) groups=0(root)
文件通过 UID 和 GID 来判断所有者和所属组:
# UID GID 对应关系
-rw-r--r-- 1 root root 0 Jul 23 14:52 a.txt
用户登录流程
- 查询
/etc/passwd中是否有输入的账号 - 读取该账号对应的 UID、GID、家目录和 shell 设置
- 进入
/etc/shadow核对密码 - 密码正确后进入系统
安全注意:若
/etc/passwd文件中第二个字段不为x,而是已知哈希值或空字符串,系统会直接使用该字段作为密码进行验证,而不会查询 shadow 文件,这存在安全风险。攻击者可能通过添加 UID 为 0 的特殊用户获取 root 权限。
配置文件结构
/etc/passwd 文件结构
$ head -5 /etc/passwd
root:x:0:0:root:/root:/bin/zsh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
每行包含 7 个字段(由 : 分隔):
- 用户名:登录系统时使用的名称
- 密码:
x表示密码存储在/etc/shadow - UID:用户识别码
0:系统管理员(可多个)1~999:系统保留账号1000~60000:可登录用户
- GID:组识别码
- 用户信息说明:账号描述信息
- 家目录:用户主目录路径
- Shell:用户使用的 shell 路径
/etc/shadow 文件结构
$ head -5 /etc/shadow
root:$6$qoE1r1SEixJrGYUC$EGb74SGLfH1oSbmfOCXmcbe4INzY/Ff.r6nrnR/oAMvDQg/lPRwqs5YJc/NRtuRqTcGuGqfML4rXkDnODS5Cf/:20287:0:99999:7:::
bin:*:19760:0:99999:7:::
daemon:*:19760:0:99999:7:::
adm:*:19760:0:99999:7:::
lp:*:19760:0:99999:7:::
每行包含 9 个字段(由 : 分隔):
- 用户名
- 密码:加密后的密码字符串
- 最近密码修改日期
- 密码不可更改天数
- 密码需要更改的天数
- 密码过期前警告天数
- 密码过期宽限时间
- 账号失效日期
- 保留字段
群组管理
/etc/group 文件结构
$ head -5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
每行包含 4 个字段:
- 组名
- 密码:
x表示存储在/etc/gshadow - GID
- 组成员
群组操作命令
查看有效群组:
groups
切换有效群组:
newgrp users # 切换到 users 群组
exit # 退出当前群组环境
/etc/gshadow 文件结构
$ head -5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
每行包含 4 个字段:
- 组名
- 密码
- 管理员账号
- 组成员
用户账号管理
useradd 默认值
$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
其他默认值在 /etc/login.defs 中设置:
MAIL_DIR /var/spool/mail # 邮箱目录
PASS_MAX_DAYS 99999 # 密码最大有效天数
PASS_MIN_DAYS 0 # 密码最小更改间隔
PASS_WARN_AGE 7 # 密码过期前警告天数
UID_MIN 1000 # 最小用户 UID
UID_MAX 60000 # 最大用户 UID
CREATE_HOME yes # 是否创建家目录
UMASK 077 # 家目录权限掩码
密码管理
查看详细密码信息:
chage -l username
创建必须修改密码的用户:
useradd agetest
echo "agetest" | passwd --stdin agetest
chage -d 0 agetest # 设置第一次登录必须修改密码
删除用户
userdel -r username # 删除用户及家目录
用户信息查询
查看用户信息:
id username
更改用户 shell:
chsh -s /bin/bash username # 更改用户默认 shell
chsh -l # 列出可用 shell
特殊应用场景
创建不可登录账号:
useradd -c "this user can not login" -s /sbin/nologin testUser
ACL 权限管理
简介
ACL(Access Control List)提供更细粒度的权限控制,可以针对单一用户、文件或目录设置权限。
检查文件系统支持
dmesg | grep -i acl
setfacl:设置 ACL 权限
setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
常用选项:
| 选项 | 说明 |
|---|---|
-m | 设置 ACL 参数 |
-x | 删除 ACL 参数 |
-b | 移除所有 ACL 设置 |
-R | 递归设置 |
-d | 设置默认 ACL(仅对目录有效) |
示例:
setfacl -m u:test:w file1 # 给 test 用户添加写权限
setfacl -m u::rwx file1 # 设置文件所有者权限
setfacl -m g:group_test:w file1 # 给组添加写权限
setfacl -m m:rx file1 # 设置最大权限为 rx
setfacl -m d:u:test:rx doc # 设置默认 ACL(目录继承)
getfacl:查看 ACL 权限
getfacl filename
输出示例:
# file: hello.txt
# owner: root
# group: root
user::rwx
group::r--
other::r--
注意:设置 ACL 权限后,
ls -l显示的文件权限末尾会出现+号。
用户切换
su 命令
su [-lm] [-c 命令] [username]
选项说明:
| 选项 | 说明 |
|---|---|
-l | 登录式切换(加载目标用户环境) |
-m | 保留当前环境 |
-c | 执行单条命令 |
sudo 命令
允许用户以其他身份执行命令:
sudo [-b] [-u username] command
选项说明:
| 选项 | 说明 |
|---|---|
-b | 在后台执行命令 |
-u | 指定目标用户(默认为 root) |
sudoers 配置
使用 visudo 编辑 /etc/sudoers:
# 用户权限格式
用户/组 主机=(可切换身份) 可执行命令
# 示例
root ALL=(ALL) ALL # root 可执行任何命令
%wheel ALL=(ALL) ALL # wheel 组成员可使用 sudo
%wheel ALL=(ALL) NOPASSWD: ALL # 免密码使用 sudo
特殊 Shell:/sbin/nologin
用于不需要登录但需要系统资源的用户(如服务账号):
usermod -s /sbin/nologin username
设置登录提示信息:
echo "此账号禁止登录" > /etc/nologin.txt
PAM 模块
简介
PAM(Pluggable Authentication Modules)提供了一套认证 API,允许程序集成用户验证功能。
PAM 工作流程
- 用户执行命令(如
passwd) - 命令调用 PAM 模块
- PAM 读取配置文件(如
/etc/pam.d/passwd) - 根据配置调用相应模块进行认证
- 返回认证结果
配置文件结构
示例:/etc/pam.d/passwd
#%PAM-1.0
password substack system-auth
-password optional pam_gnome_keyring.so use_authtok
password substack postlogin
每行包含三个字段:
- 验证类型(auth, account, password, session)
- 控制标志(required, requisite, sufficient, optional)
- 模块路径及参数
用户信息查询
查看已登录用户
w # 显示详细登录信息
who # 显示登录用户
查看最近登录记录
lastlog # 显示所有用户最近登录时间
用户消息通信
发送消息给其他用户:
write username pts/1 # 发送给指定终端
wall "公告消息" # 发送广播消息(root 可屏蔽)
设置消息接收:
mesg n # 拒绝接收消息(root 消息除外)
mesg y # 允许接收消息
账号检查工具
密码文件检查
pwck # 检查 /etc/passwd 和 /etc/shadow 一致性
密码转换(慎用)
pwunconv # 将 /etc/shadow 信息写回 /etc/passwd 并删除 shadow 文件
注意:
pwunconv命令会降低系统安全性,不建议使用。