第 5 章 · 用户权限与安全模型
服务器安全的第一个问题不是防火墙,而是「谁能用系统、能碰什么」。本章把用户/组、权限位、sudo、SSH 密钥讲透 —— 这也是「怎么样的服务器才是安全的」的第一块基石。
本章目录
5.1 用户、组与 UID 5.2 用户管理命令 5.3 权限位 rwx 5.4 特殊权限 5.5 ACL 精细授权 5.6 sudo 精确授限 5.7 PAM 与密码策略 5.8 SSH 密钥与免密 5.9 最小权限纪律 自测题5.1用户、组与 UID:Linux 的身份体系
- 用户(User):每个进程都有属主。用户信息存
/etc/passwd(含 UID/GID/家目录/Shell),密码哈希存/etc/shadow(普通用户不可读)。 - 组(Group):
/etc/group。一个用户可属多个组(主要组 + 附加组),权限按「属主 / 属组 / 其他人」三档判断。 - UID 规则:0 = root;1–999 = 系统用户(服务用,如 nginx、mysql);1000+ = 普通用户。查看:
id、getent passwd。 /etc/skel/:新建用户时自动复制到其家目录的模板文件。
whoami # 我是谁
id # uid gid 组列表
getent passwd webapp # 查用户信息行
getent group www-data # 查组信息行
5.2用户管理命令(Ubuntu / Rocky 通用)
sudo useradd -m -s /bin/bash webapp # -m 建家目录 -s 指定 Shell
sudo useradd -r -s /usr/sbin/nologin app # 系统用户,禁止登录(跑服务用)
sudo passwd webapp # 设置/修改密码
sudo usermod -aG sudo webapp # 加入 sudo 组(Ubuntu);Rocky 是 wheel 组
sudo usermod -aG docker webapp # 加入附加组 docker
sudo usermod -L webapp # 锁定账号(临时禁用)
sudo userdel -r webapp # 删除用户及其家目录
sudo groupadd devs && sudo groupdel devs # 组增删
5.3权限位:rwx 三三得九
ls -l 第一列形如 -rwxr-xr--:第 1 位类型(- 文件 / d 目录 / l 链接),后 9 位 = 属主(rwx) + 属组(rwx) + 其他人(rwx)。
| 符号 | 含义 | 数字(八进制) |
|---|---|---|
r 读 | 文件:可读内容;目录:可列目录名 | 4 |
w 写 | 文件:可改内容;目录:可新建/删除目录内条目 | 2 |
x 执行 | 文件:可运行;目录:可进入(cd) | 1 |
rwx | 7 | 4+2+1 |
r-x | 5 | 4+1 |
r-- | 4 | 4 |
--- | 0 | 0 |
chmod 755 script.sh # 属主 rwx,组/其他 r-x(目录常用)
chmod 644 config.conf # 属主 rw,组/其他 r(普通文件常用)
chmod 600 id_rsa # 私钥只能属主读写(SSH 强制要求)
chmod +x deploy.sh # 加执行权限(符号法)
chown webapp:webapp /data/app # 改属主:属组(-R 递归)
umask # 默认权限遮罩:022 = 新建文件 644、目录 755
chmod -R 777 是安全灾难,绝不要对网站/数据目录整体 777;③ 配置文件 644、密钥 600、脚本 755,是行业默认纪律。
5.4特殊权限:setuid / setgid / sticky
| 权限 | 表现 | 作用与风险 |
|---|---|---|
| setuid(u+s,4000) | 属主位 x 变 s,如 -rwsr-xr-x(/usr/bin/passwd) | 执行时以文件属主身份运行(通常提权到 root)。系统用它让普通用户改密码;被攻击者复制的 setuid 二进制是经典提权后门 —— find / -perm -4000 定期排查 |
| setgid(g+s,2000) | 属组位 x 变 s | 目录上:新建文件自动继承目录属组(团队共享目录常用) |
| sticky(o+t,1000) | 其他人位 x 变 t,如 /tmp 的 drwxrwxrwt | 目录里只有文件属主/root 能删除 —— 防止 /tmp 里互相删文件 |
排查命令:find / -perm -4000 -type f 2>/dev/null(找 setuid 文件)、find / -perm -2000 -type d(setgid 目录)。
5.5ACL:超出三档的精细授权
rwx 只有「属主/组/其他」三档,ACL 可以给任意用户/组单独设权限:
sudo setfacl -m u:alice:rw /data/share/file # 给 alice 读写在文件上
sudo setfacl -m g:devs:rx /data/share # 给 devs 组 rx
sudo setfacl -R -m d:u:alice:rwx /data/share # 默认 ACL(新文件继承)
getfacl /data/share/file # 查看 ACL
sudo setfacl -x u:alice /data/share/file # 移除
注意:ls -l 权限位后多出的 + 表示存在 ACL;部分场景下 ACL 与「目录默认 x」配合易踩坑,生产先小范围测试。
5.6sudo:给谁什么权限,精确到命令
- Ubuntu 的 sudo 组、Rocky 的 wheel 组默认「可执行一切 sudo」。
- 配置在
/etc/sudoers(用visudo编辑,语法错误会被拦截,防止把自己锁死)。
# 允许 webapp 用户只执行服务管理和 nginx 相关命令,无需密码
webapp ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/sbin/nginx
# 允许 devs 组执行所有(带密码)
%devs ALL=(ALL) ALL
# 禁止某用户执行危险命令(放在文件末尾,先 allow 再 deny 无效,注意顺序)
baduser ALL=(ALL) ALL, !/bin/su
sudo -l 查看自己被授权的命令;sudo -i 切 root Shell(别滥用);每次 sudo 都会被记入日志(/var/log/auth.log 或 secure)—— 这是审计追责的关键证据(第 9/10 章)。
5.7PAM 与密码策略:登录怎么被检查
PAM(可插拔认证模块)是所有登录/认证服务的公共框架(SSH 登录、su、sudo 都过它)。配置文件在 /etc/pam.d/。运维常用的是「密码策略」:
# Ubuntu:装 libpam-pwquality 后编辑 /etc/pam.d/common-password
password requisite pam_pwquality.so retry=3 minlen=12
# Rocky:编辑 /etc/security/pwquality.conf
minlen = 12
# 密码过期策略(chage 命令)
sudo chage -M 90 -m 7 -W 14 webapp # 90 天过期、最短 7 天、提前 14 天警告
sudo chage -l webapp # 查看策略
5.8SSH 密钥:免密登录与服务器安全的核心
密钥登录原理:客户端持私钥,服务器持公钥(~/.ssh/authorized_keys),登录时用非对称加密校验身份。比密码安全(无法被爆破),是生产标准。
# 在【本地电脑】生成密钥对(Ed25519 更安全更快)
ssh-keygen -t ed25519 -C "你的备注"
# 生成 ~/.ssh/id_ed25519(私钥)与 id_ed25519.pub(公钥)
# 把公钥复制到服务器(首次仍要密码)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@服务器IP
# 或手动:把 .pub 内容追加到服务器 ~/.ssh/authorized_keys
# 之后即可免密登录
ssh root@服务器IP
# 多服务器统一管理:写 ~/.ssh/config
Host myserver
HostName 203.0.113.10
User root
IdentityFile ~/.ssh/id_ed25519
Port 22
「禁用密码登录只留密钥」是第 9 章加固的第一步(改 /etc/ssh/sshd_config 的 PasswordAuthentication no)。
5.9最小权限纪律(安全模型总纲)
1root 最小化
日常用普通用户 + sudo;root 只在系统级操作时用。Ubuntu 默认禁用 root 直接登录,是对的。
2每服务一账号
服务用独立 nologin 系统账号,互不越权。
3文件权限最小化
能给 644 不给 777;目录给 755;密钥 600。
4授权可审计
一切提权走 sudo(留日志),不用 su 裸切 root;离职即删账号。
这套纪律贯穿第 9 章(加固)与第 15 章(攻防):攻击者入侵路径上每一道「最小权限」都是一道减速墙,而你的日志就是事后追责的证据链。
本章自测题
- 查看当前用户 uid/组列表用什么命令?用户密码哈希存在哪个文件?
- 给目录 /data/share 设属主 webapp、权限 750,写出命令。
- 解释 rwx 对目录的三种含义(进入/列名/增删)。
- setuid 是什么?为什么 /usr/bin/passwd 需要它?用什么命令排查 setuid 文件?
- 如何给 alice 一个文件「只读」权限而不影响其他人?(ACL)
- sudoers 用什么命令编辑?如何给 devs 组仅 systemctl 与 nginx 的免密权限?
- SSH 密钥登录流程一句话;私钥权限要求是多少?
- 运行 Web 服务应该用什么账号?为什么?
参考答案
1. id;/etc/shadow。
2. sudo chown webapp:webapp /data/share && sudo chmod 750 /data/share
3. x 可进入目录;r 可列出目录内容;w 可新建/删除目录内条目。
4. setuid:执行时以文件属主身份运行;passwd 需写 /etc/shadow 但普通用户无写权限,故提权。find / -perm -4000 -type f
5. sudo setfacl -m u:alice:r /path/file
6. visudo;行:%devs ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/sbin/nginx
7. 客户端用私钥签名、服务器用 authorized_keys 里的公钥验证;私钥 600。
8. 独立 nologin 系统账号(如 webapp):服务被攻破时权限受限,无法波及 root 与其他服务。