Linux 运维与安全专家 05 · 用户权限与安全模型

第 5 章 · 用户权限与安全模型

阶段 B预计 5–6 小时安全的地基

服务器安全的第一个问题不是防火墙,而是「谁能用系统、能碰什么」。本章把用户/组、权限位、sudo、SSH 密钥讲透 —— 这也是「怎么样的服务器才是安全的」的第一块基石。

5.1用户、组与 UID:Linux 的身份体系

终端 · 查看身份
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    # 组增删
运行服务的账号纪律 每个服务用独立系统账号(nginx、mysql、app),不给 Shell(nologin)。这样即使服务被攻破,攻击者也只是受限账号,拿不到 root,也看不到别的服务数据 —— 这叫「横向隔离」,是第 9 章加固的重要一环。

5.3权限位:rwx 三三得九

ls -l 第一列形如 -rwxr-xr--:第 1 位类型(- 文件 / d 目录 / l 链接),后 9 位 = 属主(rwx) + 属组(rwx) + 其他人(rwx)。

符号含义数字(八进制)
r 读文件:可读内容;目录:可列目录名4
w 写文件:可改内容;目录:可新建/删除目录内条目2
x 执行文件:可运行;目录:可进入(cd)1
rwx74+2+1
r-x54+1
r--44
---00
终端 · 改权限与属主
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
权限常见的坑 ① 目录需要 x 才能进入 —— 「我权限是 777 怎么还进不去」大概率是父目录没 x;② 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 可以给任意用户/组单独设权限:

终端 · 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:给谁什么权限,精确到命令

终端 · sudoers 授权示例
# 允许 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 安全习惯 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
私钥铁律 私钥(无 .pub 后缀)永不离开本地、永不进 Git、权限必须 600。泄露 = 你的服务器门禁被复制。服务器被攻破后,把所有机器的公钥全部轮换。

「禁用密码登录只留密钥」是第 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 章(攻防):攻击者入侵路径上每一道「最小权限」都是一道减速墙,而你的日志就是事后追责的证据链。

本章自测题

  1. 查看当前用户 uid/组列表用什么命令?用户密码哈希存在哪个文件?
  2. 给目录 /data/share 设属主 webapp、权限 750,写出命令。
  3. 解释 rwx 对目录的三种含义(进入/列名/增删)。
  4. setuid 是什么?为什么 /usr/bin/passwd 需要它?用什么命令排查 setuid 文件?
  5. 如何给 alice 一个文件「只读」权限而不影响其他人?(ACL)
  6. sudoers 用什么命令编辑?如何给 devs 组仅 systemctl 与 nginx 的免密权限?
  7. SSH 密钥登录流程一句话;私钥权限要求是多少?
  8. 运行 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 与其他服务。