Linux学习日志(10) Linux 帐号管理与 ACL 权限设置

参考文档:鸟哥私房菜 - 第十三章、Linux 帐号管理与 ACL 权限设置 - 鸟哥的 Linux 私房菜

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 创建用户时执行的操作

  1. /etc/passwd/etc/shadow/etc/group/etc/gshadow 中增加记录
  2. /home 下创建家目录(从 /etc/skel 复制环境文件)
  3. 设置家目录权限(默认 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
2
3
gpasswd 群组名                    # 设置群组密码
gpasswd -A 用户 群组名 # 设置群组管理员
gpasswd -M 用户1,用户2 群组名 # 设置群组成员

群组管理员操作:

1
2
gpasswd -a 用户 群组名     # 添加成员
gpasswd -d 用户 群组名 # 移除成员

2.4 帐号管理实例

任务一:创建不同需求的用户

1
2
3
4
5
groupadd mygroup1
useradd -G mygroup1 -c "1st user" myuser1
useradd -G mygroup1 -c "2nd user" myuser2
useradd -c "3rd user" -s /sbin/nologin myuser3
echo "password" | passwd --stdin myuser1

任务二:创建协作项目目录(使用 SGID)

1
2
3
4
5
6
7
groupadd projecta
useradd -G projecta pro1
useradd -G projecta pro2
useradd -G projecta pro3
mkdir /srv/projecta
chgrp projecta /srv/projecta
chmod 2770 /srv/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
2
3
User_Alias ADMPW = pro1, pro2, pro3
Cmnd_Alias ADMPWCOM = /usr/bin/passwd [A-Za-z]*
ADMPW ALL=(root) ADMPWCOM

时间间隔:两次 sudo 操作在 5 分钟内无需重复输入密码。

sudo 配合 su

1
2
User_Alias ADMINS = pro1, pro2, pro3
ADMINS ALL=(root) /bin/su -

用户执行 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
2
3
4
# 格式: domain type item value
username soft core 0
@group hard nproc 50
* hard nofile 4096
字段 说明
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
2
mail -s "邮件主题" 用户 < 文件    # 发送邮件
mail # 查看邮件(输入编号阅读,q退出)

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 选项)

步骤

  1. 创建账号列表文件 user.txt,每行格式:username:password
  2. 使用脚本批量建置

示例脚本

1
2
3
4
5
6
7
#!/bin/bash
for username in $(cut -d: -f1 user.txt)
do
useradd $username
done

chpasswd < user.txt

注意事项

  • 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. 核心要点

  1. 系统通过 UID/GID 识别用户和群组,账号名称是给人看的
  2. 账号核心文件:/etc/passwd + /etc/shadow,群组核心文件:/etc/group + /etc/gshadow
  3. useradd 创建用户后,必须用 passwd 设置密码才能登录
  4. su -su 更推荐,因为会完全切换环境变量
  5. sudo 执行时输入自己的密码,更安全,多人管理时推荐使用
  6. ACL 突破了传统权限的三组限制,可针对单一用户或群组单独设置权限
  7. visudo 是唯一安全的 sudoers 编辑方式,会进行语法检查
  8. /sbin/nologin 用于创建无法登录但可使用其他服务的账号
  9. newgrp 可切换有效群组,但会新建一个 shell,需用 exit 返回
  10. PAM 提供统一的认证机制,配置文件位于 /etc/pam.d/
  11. 大量建置账号可用循环脚本配合 useraddchpasswd
  12. lastwritewallmail 等命令用于用户消息传递