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
UID0=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    无权限

常用权限组合速查

数字符号适用场景说明
755rwxr-xr-x目录、可执行脚本所有人可读可执行,只有所有者可写
644rw-r--r--普通文件所有人可读,只有所有者可写
600rw-------私钥、敏感文件只有所有者可读写
700rwx------私有目录只有所有者可进入
777rwxrwxrwx禁用所有人可读写执行,极不安全
666rw-rw-rw-禁用所有人可读写
444r--r--r--只读归档所有人只读,包括所有者也无法写
555r-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 特殊权限位

数字符号效果
SUID4u+s文件所有者权限运行
SGID2g+s组权限运行;目录下新文件继承组
Sticky1o+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 知识点概要

  1. 计算 chmod 754 对应的权限 → rwxr-xr--
  2. SUID 文件的权限显示 → rws(有执行位)或 rwS(无执行位)
  3. umask=027,新建文件权限? → 640(666-027=640,x 位会自动去掉)
  4. /etc/shadow!!* 什么意思? → 账户被锁定
  5. passwd 为什么能改 root 拥有的文件? → SUID,以 root 身份运行