← 返回主页
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

用户登录流程

  1. 查询 /etc/passwd 中是否有输入的账号
  2. 读取该账号对应的 UID、GID、家目录和 shell 设置
  3. 进入 /etc/shadow 核对密码
  4. 密码正确后进入系统

安全注意:若 /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 个字段(由 : 分隔):

  1. 用户名:登录系统时使用的名称
  2. 密码x 表示密码存储在 /etc/shadow
  3. UID:用户识别码
    • 0:系统管理员(可多个)
    • 1~999:系统保留账号
    • 1000~60000:可登录用户
  4. GID:组识别码
  5. 用户信息说明:账号描述信息
  6. 家目录:用户主目录路径
  7. 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 个字段(由 : 分隔):

  1. 用户名
  2. 密码:加密后的密码字符串
  3. 最近密码修改日期
  4. 密码不可更改天数
  5. 密码需要更改的天数
  6. 密码过期前警告天数
  7. 密码过期宽限时间
  8. 账号失效日期
  9. 保留字段

群组管理

/etc/group 文件结构

$ head -5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

每行包含 4 个字段:

  1. 组名
  2. 密码x 表示存储在 /etc/gshadow
  3. GID
  4. 组成员

群组操作命令

查看有效群组:

groups

切换有效群组:

newgrp users  # 切换到 users 群组
exit          # 退出当前群组环境

/etc/gshadow 文件结构

$ head -5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::

每行包含 4 个字段:

  1. 组名
  2. 密码
  3. 管理员账号
  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 工作流程

  1. 用户执行命令(如 passwd
  2. 命令调用 PAM 模块
  3. PAM 读取配置文件(如 /etc/pam.d/passwd
  4. 根据配置调用相应模块进行认证
  5. 返回认证结果

配置文件结构

示例:/etc/pam.d/passwd

#%PAM-1.0
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin

每行包含三个字段:

  1. 验证类型(auth, account, password, session)
  2. 控制标志(required, requisite, sufficient, optional)
  3. 模块路径及参数

用户信息查询

查看已登录用户

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 命令会降低系统安全性,不建议使用。