02 - 用户与权限管理
2.1 用户管理
相关文件
| 文件 | 用途 |
|---|
/etc/passwd | 用户账户信息 |
/etc/shadow | 加密密码 |
/etc/group | 组信息 |
/etc/gshadow | 组密码 |
/etc/skel/ | 新用户家目录模板 |
添加用户
# 基本用法
sudo useradd -m -s /bin/bash alice
# -m 创建家目录
# -s 指定 shell
# -G wheel 附加到 wheel 组
# 完整示例
sudo useradd -m -s /bin/bash -G wheel,audio,video -c "Alice Smith" alice
sudo passwd alice
修改用户
sudo usermod -aG docker alice # 追加组(-a 很重要!不加会覆盖)
sudo usermod -s /bin/zsh alice # 改 shell
sudo usermod -l newname oldname # 改用户名
sudo usermod -d /home/newdir alice # 改家目录
sudo usermod -e 2025-12-31 alice # 设置过期日期
sudo usermod -L alice # 锁定账户
sudo usermod -U alice # 解锁
删除用户
sudo userdel alice # 删用户,保留家目录
sudo userdel -r alice # 删用户+家目录+邮件池
/etc/passwd 格式
用户名:密码占位符:UID:GID:注释:家目录:Shell
root:x:0:0:root:/root:/bin/bash
alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash
| 字段 | 说明 |
|---|
| 用户名 | 登录名 |
| 密码 | x 表示密码存在 /etc/shadow |
| UID | 0=root, 1-999=系统用户, >=1000=普通用户 |
| GID | 主组 ID |
| 注释 | GECOS 字段 |
| 家目录 | 用户主目录 |
| Shell | 登录 Shell |
/etc/shadow 格式
用户名:加密密码:上次修改:最小天数:最大天数:警告天数:过期宽限:过期时间:保留
alice:$y$j9T$...:19886:0:99999:7:::
2.2 组管理
sudo groupadd developers # 添加组
sudo groupmod -n coders developers # 重命名
sudo groupdel coders # 删除
sudo usermod -aG developers alice # 用户加入组
# 查看用户所属组
groups alice
id alice
/etc/group 格式
组名:密码:GI:成员列表
wheel:x:998:alice,bob
2.3 文件权限
基本权限
rwx rwx rwx
││└─ 执行 (x)
│└── 写入 (w)
└─── 读取 (r)
│ │ │
│ │ └── 其他人 (other)
│ └─────── 组 (group)
└──────────── 所有者 (user/owner)
数字含义:r=4, w=2, x=1,每组权限相加得到一个数字。
rwx = 4+2+1 = 7 完全权限
r-x = 4+0+1 = 5 只读+执行
rw- = 4+2+0 = 6 只读+写
r-- = 4+0+0 = 4 只读
--- = 0+0+0 = 0 无权限
常用权限组合速查
| 数字 | 符号 | 适用场景 | 说明 |
|---|
755 | rwxr-xr-x | 目录、可执行脚本 | 所有人可读可执行,只有所有者可写 |
644 | rw-r--r-- | 普通文件 | 所有人可读,只有所有者可写 |
600 | rw------- | 私钥、敏感文件 | 只有所有者可读写 |
700 | rwx------ | 私有目录 | 只有所有者可进入 |
777 | rwxrwxrwx | 禁用 | 所有人可读写执行,极不安全 |
666 | rw-rw-rw- | 禁用 | 所有人可读写 |
444 | r--r--r-- | 只读归档 | 所有人只读,包括所有者也无法写 |
555 | r-xr-xr-x | 只读可执行 | 所有人可读可执行,不能修改 |
# 符号模式
chmod u+x script.sh # 所有者加执行
chmod g-w file.txt # 组减写
chmod o=r file.txt # 其他人只读
chmod a+rx script.sh # 所有人加读执行
chmod u=rwx,g=rx,o=r file.txt # 分别设置三组权限
# 数字模式(记住常用组合)
chmod 755 script.sh # rwxr-xr-x (目录/脚本)
chmod 644 file.txt # rw-r--r-- (普通文件)
chmod 600 id_rsa # rw------- (私钥)
chmod 700 ~/.ssh # rwx------ (SSH 目录)
chmod 777 不用 # rwxrwxrwx (千万别用)
# 递归修改
chmod -R 755 /var/www
chmod -R o-rwx /secret # 移除其他人的所有权限
权限计算示例
# 问题:chmod 754 对应什么符号权限?
# 7 = rwx (所有者)
# 5 = r-x (组)
# 4 = r-- (其他人)
# 答案:rwxr-xr--
# 问题:要让文件所有者可读写执行,组只读,其他人无权限?
# 所有者: rwx = 7
# 组: r-- = 4
# 其他人: --- = 0
# 答案:chmod 740 file
# 问题:stat 输出 Access: (0644/-rw-r--) 如何解读?
# 0644 = 八进制权限
# -rw-r--r-- = 符号权限
# - = 普通文件
# rw- = 所有者 (6)
# r-- = 组 (4)
# r-- = 其他人 (4)
改变所属
chown alice file.txt # 改所有者
chown alice:developers file.txt # 改所有者+组
chown :developers file.txt # 只改组
chown -R alice:alice /home/alice # 递归
2.4 特殊权限位
| 位 | 数字 | 符号 | 效果 |
|---|
| SUID | 4 | u+s | 以文件所有者权限运行 |
| SGID | 2 | g+s | 以组权限运行;目录下新文件继承组 |
| Sticky | 1 | o+t | 只有所有者能删除自己文件(如 /tmp) |
# SUID — 经典例子:passwd 需要修改 /etc/shadow
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# SGID — 共享目录
mkdir /shared
chmod 2770 /shared
# 目录下新建文件自动继承组
# Sticky Bit — /tmp
ls -ld /tmp
# drwxrwxrwt ... /tmp
# 特殊权限 + 基本权限组合
chmod 4755 /usr/bin/program # SUID (4) + 755
chmod 2755 /shared # SGID (2) + 755
chmod 1777 /tmp # Sticky (1) + 777
# 查找系统中的 SUID 文件
find / -perm -4000 -type f 2>/dev/null
2.5 umask
默认权限掩码,减去的值。
umask # 查看当前
umask 022 # 设置
# 计算规则
# 文件默认最大 666 (rw-rw-rw-),目录默认最大 777 (rwxrwxrwx)
# umask=022 时:文件 = 666 - 022 = 644 目录 = 777 - 022 = 755
# umask=077 时:文件 = 666 - 077 = 600 目录 = 777 - 077 = 700
# 配置位置
/etc/profile
/etc/bash.bashrc
~/.bashrc
2.6 ACL(访问控制列表)
传统权限只能设一个组,ACL 可设多个。
# 安装
sudo pacman -S acl
# 查看 ACL
getfacl file.txt
# # file: file.txt
# # owner: alice
# # group: users
# user::rw-
# user:bob:rw- ← 额外权限
# group::r--
# mask::rw-
# other::r--
# 设置 ACL
setfacl -m u:bob:rw file.txt # 用户 bob 有读写
setfacl -m g:dev:rx directory/ # 组 dev 有读执行
setfacl -m o::--- file.txt # 其他人无权限
setfacl -m m::r-- file.txt # 设置 mask
# 递归
setfacl -R -m u:bob:rw /shared/
# 删除
setfacl -x u:bob file.txt
setfacl -b file.txt # 清除所有 ACL
2.7 sudo 配置
# 使用 visudo 编辑(不要直接编辑 /etc/sudoers)
sudo visudo
# wheel 组免密码
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
# 单个用户限制命令
alice ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/journalctl
2.8 知识点概要
- 计算
chmod 754 对应的权限 → rwxr-xr--
- SUID 文件的权限显示 →
rws(有执行位)或 rwS(无执行位)
- umask=027,新建文件权限? →
640(666-027=640,x 位会自动去掉)
/etc/shadow 中 !! 或 * 什么意思? → 账户被锁定
- passwd 为什么能改 root 拥有的文件? → SUID,以 root 身份运行