Linux 用户权限与安全加固:从 ACL 到 SELinux 的完整实战

系统讲解 Linux 用户权限与安全加固:用户与组管理、文件权限模型与 umask、ACL 访问控制列表、sudo 提权策略、SSH 安全加固、PAM 认证、SELinux 强制访问控制入门,以及一份完整的服务器安全加固清单。

引言

一台裸奔的 Linux 服务器被攻破,十有八九是「权限没管好」:默认密码、root 直连 SSH、宽松的文件权限、缺失的 sudo 审计。权限是 Linux 安全的基石,从经典 rwx 权限位、umask、到 ACL 精细化控制、sudo 提权策略,再到 SELinux 强制访问控制,层层递进构成了纵深防御。

本文系统覆盖用户与组管理、文件权限模型、ACL、sudo 配置、SSH 加固、PAM,以及 SELinux 入门,最后给出一份可直接落地的服务器安全加固清单。

前置:基本命令行。安全威胁模型参考 [[security]] 专题。


目录


1. 用户与组管理

1.1 用户增删改查

# 创建用户(并创建家目录)
useradd -m -s /bin/bash alice
# 或带注释与附加组
useradd -m -G sudo,dev alice -c "Alice Dev"

# 设置/修改密码
passwd alice

# 修改用户属性
usermod -aG docker alice     # 加入组(-a 必须,防覆盖)
usermod -s /usr/sbin/nologin bob   # 禁止登录

# 删除用户
userdel -r alice             # -r 同时删家目录

1.2 组管理

groupadd devops
groupadd -g 2001 devops      # 指定 GID
groupmod -n dev devops       # 改名
groupdel dev
gpasswd -a alice devops      # 加入组

1.3 用户信息文件

cat /etc/passwd     # 用户列表(alice:x:1000:1000::/home/alice:/bin/bash)
cat /etc/shadow     # 密码哈希(只有 root 可读)
cat /etc/group      # 组列表

安全习惯:运行服务尽量用专用系统用户,禁止用 root 跑 Web 服务。


2. 文件权限模型

2.1 rwx 三位一组

-rwxr-xr--  1  alice  dev   1024  Sep 25 10:00  script.sh
│  │││ │││   │  user  group
│  └┴┴─┴┴┴─ 权限:属主/属组/其他
│
第一位:- 文件,d 目录,l 链接
权限文件目录
r (4)读内容列出目录项
w (2)修改增删目录内文件
x (1)执行进入目录

2.2 chmod 修改

# 数字法
chmod 750 script.sh      # rwxr-x---
chmod 644 file.txt       # rw-r--r--

# 符号法
chmod u+x script.sh      # 属主加执行
chmod g-w file.txt       # 组去掉写
chmod o-r file.txt       # 其他人去掉读
chmod a+r file.txt       # 所有人加读

2.3 属主与特殊权限

# 修改属主/属组
chown alice:dev script.sh
chown -R alice:dev /app   # 递归

# 特殊位
chmod +t /tmp         # sticky:仅属主可删(/tmp 默认)
chmod u+s /usr/bin/passwd  # setuid:以属主身份运行
chmod g+s /shared     # setgid:新文件继承组

# 查看特殊位
ls -ld /tmp   # drwxrwxrwt(末尾 t)

3. umask 与默认权限

3.1 umask 规则

默认文件权限 = 666 - umask
默认目录权限 = 777 - umask
umask文件默认目录默认
022644755
027640750
002664775
077600700

3.2 设置与检查

umask          # 查看当前
umask 027      # 临时设置

# 永久:写入 /etc/profile 或 ~/.bashrc
echo 'umask 027' >> ~/.bashrc

3.3 安全建议

普通开发机: 022(常用,兼容性好)
服务器/共享目录: 027 或 077(更严格,默认不开放给 other)

4. ACL:精细化权限控制

4.1 为什么需要 ACL

传统权限只有「属主/属组/其他」三组,无法满足「给某个特定用户单独权限」。ACL 可以精确到单个用户或组。

4.2 配置与查看

# 确保支持(ext4/xfs 默认支持)
# 安装工具
apt install acl

# 给用户 bob 单独 rwx
setfacl -m u:bob:rwx /data/project

# 给组单独权限
setfacl -m g:devops:rx /data/project

# 查看
getfacl /data/project

# 移除
setfacl -x u:bob /data/project
setfacl -b /data/project    # 清空所有 ACL

4.3 复制 ACL

# 从文件 A 复制 ACL 到 B
getfacl A | setfacl --set-file=- B

# 递归设置默认 ACL(新文件自动继承)
setfacl -m d:u:bob:rwx /data/project

5. sudo:受控提权

5.1 基本配置

# 查看当前用户可执行
sudo -l

# 直接查看配置文件
cat /etc/sudoers          # 用 visudo 编辑
sudo visudo

5.2 常用规则

# /etc/sudoers 关键行
root ALL=(ALL) ALL                              # root 全能
%sudo ALL=(ALL:ALL) ALL                         # sudo 组可提权
alice ALL=(ALL) NOPASSWD:ALL                    # 免密(谨慎)
bob ALL=(ALL:ALL) ALL                           # 完全 sudo
carol ALL=(ALL) /usr/bin/systemctl restart nginx   # 只允许特定命令

5.3 最小权限原则示例

# 运维账号只允许管理特定服务
ops ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx

# 日志查看专用
logviewer ALL=(ALL) /usr/bin/tail /var/log/*, /usr/bin/grep /var/log/*

5.4 安全要点

# 禁止 root 远程直接登录,改用普通用户 + sudo
sudo visudo
# 加:需要 TTY 与完整路径(默认即如此)
Defaults requiretty
Defaults secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

6. SSH 安全加固

6.1 关键配置(/etc/ssh/sshd_config)

# 禁止 root 直接登录(改用 sudo)
PermitRootLogin no

# 仅允许密钥登录
PasswordAuthentication no
PubkeyAuthentication yes

# 限定可登录用户
AllowUsers alice ops

# 限制尝试次数,防爆破
MaxAuthTries 3

# 只监听特定网卡(可选)
ListenAddress 192.168.1.100
systemctl restart sshd

6.2 配置密钥登录

# 客户端生成密钥
ssh-keygen -t ed25519 -a 100

# 上传公钥到服务器
ssh-copy-id alice@server
# 或手动追加到 ~/.ssh/authorized_keys

# 权限检查(必须是 600)
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

6.3 防护爆破

# fail2ban:自动封禁多次失败 IP
apt install fail2ban
systemctl enable --now fail2ban

# 查看封禁
fail2ban-client status sshd

7. PAM 认证与登录控制

7.1 PAM 是什么

PAM(可插拔认证模块)统一管理登录认证流程,支持密码策略、失败锁定、二次认证。

7.2 常用 PAM 模块

pam_pwquality   # 密码强度
pam_faillock    # 失败锁定
pam_google_authenticator  # TOTP 二次认证

7.3 密码策略示例

# /etc/security/pwquality.conf
minlen = 12
dcredit = -1   # 至少 1 数字
ucredit = -1   # 至少 1 大写
ocredit = -1   # 至少 1 特殊字符

7.4 失败锁定

# /etc/security/faillock.conf
deny = 5           # 5 次失败
unlock_time = 900  # 15 分钟解锁

8. SELinux 强制访问控制

8.1 SELinux 与 DAC

传统权限(DAC): 由文件属主决定「谁能访问」
SELinux(MAC): 内核强制,即使 root 也受策略约束

8.2 三种模式

模式行为
Enforcing强制执行,拒绝并记录
Permissive只记录不拒绝(排障用)
Disabled关闭
getenforce        # 查看模式
setenforce 0      # 临时切 Permissive(重启失效)

8.3 常见操作

# 查看进程上下文
ps -Z

# 查看文件上下文
ls -Z /var/www/html

# 恢复标准上下文
restorecon -Rv /var/www/html

# 查看被拒记录
ausearch -m avc -ts recent

8.4 实战:Web 目录放行

# 把自定义目录打上 httpd 标签
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www

# 需要时放行网络端口
semanage port -a -t http_port_t -p tcp 8080

注意:CentOS/RHEL/Fedora 默认开启 SELinux,Ubuntu 默认 AppArmor。千万别在不知情下 setenforce 0 关闭安全机制。


9. 服务器安全加固清单

9.1 可执行清单

□ 1. 创建非 root 运维账号,加入 sudo
□ 2. 禁止 root 直接 SSH,禁止密码登录,启用密钥
□ 3. 更新系统补丁(apt/yum upgrade)
□ 4. 启用 fail2ban 防爆破
□ 5. 开放最小化端口,仅限所需(iptables/nftables)
□ 6. 设置合理 umask(如 027)与文件权限
□ 7. 配置密码策略与失败锁定(PAM)
□ 8. 服务使用独立低权限用户运行
□ 9. 检查并清理不必要的定时任务与可疑进程
□ 10. 定期审计日志(/var/log/auth.log、secure)

9.2 加固优先级

P0 最紧急: 改默认密码、禁 root SSH、开防火墙
P1 重要:   密钥登录、最小权限 sudo、补丁更新
P2 增强:   PAM 策略、SELinux/AppArmor、fail2ban

9.3 自检清单

检查项是否掌握
能创建并管理用户/组☐
能解释 rwx/umask/ACL☐
能配置 sudo 最小权限☐
能做 SSH 安全加固☐
能理解 SELinux 三种模式☐

延伸阅读

  • https://plumephp.com/linux-network-commands/ — 防火墙与网络加固配合
  • https://plumephp.com/linux-process-management/ — 服务用户与权限最小化
  • [[security]] 专题 — 渗透测试与威胁模型
  • [[os]] 专题 — 权限模型与内核安全机制
  • SELinux 官方文档 — 完整策略参考
  • CIS 安全基线 — 服务器加固标准

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 高级文件系统:XFS、Btrfs、ZFS 与存储进阶
  2. Linux 高可用与负载均衡:HAProxy、Keepalived 与集群方案
  3. Linux 防火墙与 nftables:规则集、链、NAT 与网络安全防护