引言
一台裸奔的 Linux 服务器被攻破,十有八九是「权限没管好」:默认密码、root 直连 SSH、宽松的文件权限、缺失的 sudo 审计。权限是 Linux 安全的基石,从经典 rwx 权限位、umask、到 ACL 精细化控制、sudo 提权策略,再到 SELinux 强制访问控制,层层递进构成了纵深防御。
本文系统覆盖用户与组管理、文件权限模型、ACL、sudo 配置、SSH 加固、PAM,以及 SELinux 入门,最后给出一份可直接落地的服务器安全加固清单。
前置:基本命令行。安全威胁模型参考 [[security]] 专题。
目录
- 1. 用户与组管理
- 2. 文件权限模型
- 3. umask 与默认权限
- 4. ACL:精细化权限控制
- 5. sudo:受控提权
- 6. SSH 安全加固
- 7. PAM 认证与登录控制
- 8. SELinux 强制访问控制
- 9. 服务器安全加固清单
- 延伸阅读
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 | 文件默认 | 目录默认 |
|---|---|---|
| 022 | 644 | 755 |
| 027 | 640 | 750 |
| 002 | 664 | 775 |
| 077 | 600 | 700 |
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 安全基线 — 服务器加固标准
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。