Linux 系统安全加固:从账号权限到纵深防御
0. 元信息
- 主题路径:
docs/topics/linux-hardening/README.md - 主分类:安全与可靠性
- 辅助分类:工程技术
- 适合对象:会用 Linux 命令行、会装包配 SSH、知道基础权限位(rwx)的运维/后端/安全工程师;目标是把一台公网暴露的 Linux 服务器按 CIS Benchmark 加固,并通过 OpenSCAP + Lynis 扫描 0 critical
- 建议周期:4~6 周(每周 8~10 小时,含 30%~40% 实验与扫描)
- 前置知识:
linux-dev-env(包管理、systemd、journalctl、SSH 客户端);network(TCP/UDP、防火墙基本概念、TLS) - 最终目标:能对一台 Ubuntu 22.04 或 RHEL 9 服务器按 CIS Benchmark v2.0 完成加固并通过 OpenSCAP SCAP 1.3 + Lynis 双扫描 0 critical;能读懂 auditd 报告并定位异常;能在入侵事件中按 IR 流程取证与恢复
1. 学习路线
账号、认证与 PAM(密码策略、登录限制、sudoers)
→ SSH 加固(密钥、配置、ForceCommand、ChrootDirectory、MFA)
→ 文件系统权限(chmod/chown/ACL/attr、SUID/SGID/sticky、Linux capabilities)
→ 强制访问控制(SELinux CIL / AppArmor profile)
→ systemd 服务加固(PrivateDevices / ProtectHome / DynamicUser / sandboxing)
→ 防火墙(nftables / iptables / ufw / conntrack / TCP Wrappers)
→ 内核加固(sysctl、kernel lockdown、Secure Boot、模块禁用、kexec_load / SYS_PTRACE)
→ 审计与日志(auditd、journald、rsyslog、集中日志、HIDS)
→ 漏洞与合规(CIS Benchmark / DISA STIG / Lynis / OpenSCAP / Vuls)
→ 备份与恢复(restic / borgbackup / 异地多活 / 演练)
→ 综合项目:CIS 加固 + 双扫描 / 应急响应
按”纵深防御”顺序学:账号是第一道;权限/MAC 是第二道;网络/内核是第三道;审计/漏洞/备份是检测与响应层。每一道都要落配置、留证据、跑扫描。
2. 阶段周数分配(4~6 周)
| 阶段 | 4 周方案 | 6 周方案 | 备注 |
|---|---|---|---|
| 1. 账号与 PAM | 0.4 周 | 0.5 周 | 用户、密码、锁定、sudoers |
| 2. SSH 加固 | 0.4 周 | 0.5 周 | 密钥 + 配置 + MFA |
| 3. 文件系统权限 | 0.4 周 | 0.5 周 | chmod/chown/ACL/SUID/cap |
| 4. 强制访问控制 | 0.4 周 | 0.5 周 | SELinux / AppArmor |
| 5. systemd 单元加固 | 0.3 周 | 0.5 周 | sandboxing 指令 |
| 6. 防火墙 | 0.4 周 | 0.5 周 | nftables / ufw |
| 7. 内核加固 | 0.3 周 | 0.5 周 | sysctl / lockdown |
| 8. 审计与日志 | 0.4 周 | 0.5 周 | auditd / journald / SIEM |
| 9. 漏洞、合规、备份 | 0.5 周 | 1 周 | CIS / OpenSCAP / Lynis / restic / IR |
4 周方案每天 10+ 小时;6 周方案每晚 1.5 小时可稳推进。建议 6 周:攻击面和合规点都多,赶工容易漏关键项。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 账号与 PAM | /etc/passwd /etc/shadow、UID/GID、密码哈希、密码策略、登录失败锁定、wheel、sudoers、pam_tally2/pam_faillock、pam_pwquality | 改完 passwd -S 输出符合 CIS | shadow 权限 000,root UID 0 唯一,密码 minlen=14,fail_、faillock 阈值生效 |
| 2. SSH 加固 | 公私钥、sshd_config 全套指令、AllowUsers、PermitRootLogin、MaxAuthTries、PasswordAuthentication、X11Forwarding、AllowAgentForwarding、ChrootDirectory、ForceCommand、MFA(Google Authenticator)、Banner | 一份加固过的 sshd_config + 测试登录 | 密码登录关,root 登录关,登录尝试 3 次失败锁 60 秒,ForceCommand 把用户锁在指定命令 |
| 3. 文件系统权限 | rwx 八进制、umask、chown、ACL(getfacl/setfacl)、attr(chattr +i)、SUID/SGID/sticky bit、find -perm -4000、Linux capabilities(cap_net_bind_service 等) | 找到并清理 SUID 残留;为服务剥离 caps | 关键文件 600/400;SUID 数量在白名单内;/tmp 1777;服务用 capabilities 替代 root |
| 4. 强制访问控制 | SELinux(enforcing/permissive、type/role/user、policy 模块、CIL、布尔)、AppArmor(profile、complain/enforce、hat) | 改 audit2allow 解决 AVC;写一条 CIL 或 AppArmor profile | 服务被 confined;违规访问被拦截;audit2why 能解释策略 |
| 5. systemd 单元加固 | PrivateTmp / PrivateDevices / ProtectHome / ProtectSystem / NoNewPrivileges / RestrictSUIDSGID / RestrictNamespaces / DynamicUser / MemoryDenyWriteExecute / LockPersonality / RestrictAddressFamilies / SystemCallFilter | 给一个自写服务加全套 sandboxing | systemd-analyze security 评分从 9.x 降到 ≤ 3;服务功能仍正常 |
| 6. 防火墙 | nftables(tables/chains/sets/maps)、iptables(legacy)、ufw、conntrack、TCP Wrappers(hosts.allow/deny) | 一台 Web 服务器只放行 22/80/443;丢弃 INVALID | 端口扫描只看到 22;SSH 暴力破解被 rate-limit;环回口放行;conntrack 正确放行已建连接 |
| 7. 内核加固 | sysctl(net.ipv4.* / kernel.randomize_va_space / kernel.kptr_restrict / kernel.dmesg_restrict / fs.protected_*)、kernel lockdown、Secure Boot、禁用 module 加载、kexec_load 禁用、SYS_PTRACE 限制、Yama /proc/sys/kernel/yama/ptrace_scope | sysctl -a 抓基线;按 CIS 改完重生成 sysctl.d/*.conf;lockdown=integrity | ASLR=2;dmesg 受限;kptr=2;模块加载被锁 |
| 8. 审计与日志 | auditd 规则(auditctl -w /etc/passwd -p wa -k passwd_changes)、journald(persistent / forward-to-syslog)、rsyslog、syslog 协议、集中日志(graylog/loki/ELK)、AIDE/Tripwire HIDS、文件完整性 | 一组 auditd 规则覆盖 CIS 推荐项;日志集中到一台接收端 | /etc/passwd 改动 1 分钟内告警;AIDE 报告变化;journald 持久化到 /var/log/journal |
| 9. 漏洞、合规、备份 | CIS Benchmarks v2.0、DISA STIG、NIST SP 800-53 / 800-123、Lynis、OpenSCAP(SCAP 1.3、SSG)、Vuls、restic / borgbackup、异地多活、IR 演练 | 一份 OpenSCAP HTML 报告 0 critical + 一份 Lynis 报告 hardening_index ≥ 80 + 一份演练报告 | 重启后配置不丢;备份 RPO ≤ 24h / RTO ≤ 4h;能在 30 分钟内恢复一个被破坏的文件 |
关键陷阱(每阶段都常见):
- PAM 改了不重启 sshd / login;
pam_pwquality没装后端库; - SSH 关了密码登录但没配置密钥,远程锁死;
- SUID 清理过度,把
passwd/su/sudo/ping也清了; - SELinux 从 enforcing 改 permissive 想”先放一放”,然后忘了改回;
- systemd 单元加了
ProtectSystem=strict后服务写不了/etc,报错查不到日志; - 防火墙 INPUT 默认 DROP 但没放行已建连接(
ct state established,related accept),自己 SSH 上去后失联; sysctl -w改了但没写进/etc/sysctl.d/,重启丢;- auditd 规则写在命令行,重启后清空,必须
audit.rules持久化; - OpenSCAP profile 选错(直接选
standard漏了nist_800-53_high),扫描看似通过但漏关键项; - 备份只本地一份,磁盘坏了就丢;备份密钥写在仓库里,泄露就裸奔。
4. 第一周任务
Day 1 约定:用一台 未暴露公网的虚拟机或云主机(Ubuntu 22.04 LTS 或 RHEL 9.2+ 选一)。系统装好后立刻做一次基线快照(VM 快照 / LVM snapshot / 镜像)。所有加固命令必须以普通用户登录后
sudo执行;root 直登的服务器不适合当目标。统一记录工具版本:ss、nft、sysctl、auditctl、oscap、lynis --version。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 系统装好、装 vim curl git tmux;建一个非 root 管理员 opsuser;配 sudo 免密给 opsuser | 主机清单、opsuser、sudo 配置 |
| Day 2 | apt/dnf update,跑一遍 lynis audit system,记下初始 hardening_index | Lynis 第一版报告 |
| Day 3 | 改 /etc/ssh/sshd_config(PermitRootLogin no PasswordAuthentication no MaxAuthTries 3 AllowUsers opsuser);本机用密钥登录成功 | 改后的 diff + 登录日志 |
| Day 4 | 装 libpam-pwquality;配 /etc/security/pwquality.conf(minlen=14 ucredit -1 lcredit -1 dcredit -1 ocredit -1);配 pam_faillock 失败 5 次锁 15 分钟 | 故意输错 5 次后用 root 解锁 |
| Day 5 | find / -perm -4000 -type f 找所有 SUID;对照白名单清理可疑项;记录清单 | SUID 白名单清单 |
| Day 6 | 配 ufw/nftables 默认 DROP;放行 22/80/443;从外网 nmap 验证只看到这几个端口 | nmap 输出截图 |
| Day 7 | 项目:装 auditd,配规则 auditctl -w /etc/passwd -p wa -k passwd_changes auditctl -w /etc/shadow -p wa -k shadow_changes auditctl -w /etc/sudoers -p wa -k sudoers_changes auditctl -w /usr/sbin/usermod -p x -k usermod_exec;改一次 usermod testuser;用 ausearch -k passwd_changes 看到事件;用 audit.rules 持久化 | 一份 audit.rules + ausearch 输出 |
Day 7 拆解
步骤 A —— 最小可用(60 分钟)
apt install auditd audispd-plugins/dnf install audit;- 启动
systemctl enable --now auditd; - 跑上面 4 条规则;
usermod test1 && ausearch -k passwd_changes,看到事件;auditctl -l看到当前规则。
步骤 B —— 持久化 + 边界(30~45 分钟)
- 把规则写进
/etc/audit/rules.d/audit.rules; augenrules --load或重启 auditd 验证还在;- 测试 4 类异常:删
test1、改/etc/passwd、跑usermod、跑passwd test1;每条 ausearch 都能命中对应 key。
5. 阶段通用验收
- 能用 1 张表说出 CIS Benchmark L1 / L2 的核心类目;
- 改完配置用
systemctl status/journalctl -u/auditd -l看到证据; - 跑
lynis audit system和oscap xccdf eval,把报告存进notes/; - 制造 1 个对照实验:关配置 → 攻击成功;开配置 → 攻击失败(SUID 提权、SSH 爆破、IP 转发);
- 至少 3 组自定义数据:故意输错密码、故意 SUID、故意开端口,贴出 sysctl/audit/防火墙的反馈;
- 记录变更:每改一个文件记一条(who/when/what/why);
- 能修改已有加固清单(加 CIS Control 编号 4.x / 5.x 项),而不是只照搬。
6. 最终验收
- 独立完成:账号与 PAM、SSH 加固、文件系统权限、SELinux/AppArmor、systemd 单元 sandboxing、nftables/iptables、sysctl 内核加固、auditd 规则、Lynis + OpenSCAP 扫描、restic/borg 备份 + 一次恢复演练;
- 完成至少 30 条 CIS Ubuntu / RHEL Benchmark L1 检查(用
oscap的standardprofile 自动覆盖),critical 命中 0; - 完成 1 个综合项目:在一台被故意植入后门的服务器上排查入侵痕迹并完成应急响应 / 或者按 CIS 加固一台新机器通过双扫描 0 critical;
- 用 15 分钟讲清”账号 → 文件权限 → MAC → 网络 → 内核 → 审计 → 合规 → 备份”八层防御各堵哪类威胁。
7. 综合项目
首选:在一台 Ubuntu 22.04 LTS 上按 CIS Benchmark v2.0 L1 加固并通过 OpenSCAP + Lynis 双扫描 0 critical。
要求:
- 选一台干净的云主机/虚拟机,先
oscap+lynis跑基线; - 按 9 阶段顺序加固(账号→SSH→权限→MAC→systemd→防火墙→内核→审计→备份);
- 每改一项就在
notes/changes.md写 1 条:CIS Control 编号、修改点、命令、验证方式; - 加固完跑
oscap xccdf eval --profile cis_level1_server /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml --results scan.xml --report scan.html; - 跑
lynis audit system,看hardening_index提升幅度; - 关键配置用
systemd持久化(/etc/sysctl.d/99-hardening.conf、/etc/audit/rules.d/audit.rules、/etc/ssh/sshd_config.d/99-hardening.conf); - 备份
/etc、SSH host key、/var/log;写一份恢复演练报告。
备选:在一台被植入后门的服务器上完成应急响应。
证据收集:vmstat 进程、ps、netstat/ss、last/lastb、/var/log/auth.log、auditd 日志、文件时间戳(find / -mtime -3)。重点定位:可疑 cron、SUID 异常、陌生公钥、可疑 systemd 单元、iptables/nftables 是否被改。完成 incident-response.md:时间线 / IOC / 隔离决策 / 取证保留 / 恢复步骤 / 后续 hardening 清单。
任何综合项目都必须包含:
- 需求与成功标准(含合规目标、扫描基线);
- 基线与目标差距表(gap analysis);
- 加固配置按层(账号 / SSH / 文件 / MAC / 网络 / 内核 / 审计 / 备份);
- 脚本化(
scripts/harden.sh+scripts/verify.sh),幂等可重跑; - 正常 + 异常验证(关掉加固 → 攻击成功;打开 → 攻击失败);
- 报告:基线、目标、结果、剩余项、复盘;
- README;
- 复盘记录。
8. 推荐开源资料(按角色分工)
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 1~2 | PAM / SSH 主线 | man pam.d、man sshd_config、Arch Wiki: PAM | https://wiki.archlinux.org/title/PAM | 查配置字段;先 man 后 wik |
| 2 | SSH 权威 | SSH The Secure Shell: The Definitive Guide (O’Reilly);Daniel J. Barrett《Linux Pocket Guide》 | O’Reilly 出版 / O’Reilly 出版 | 系统讲解 sshd_config 与公钥 |
| 3~7 | SELinux 主线 | Red Hat Enterprise Linux Security Guide | https://docs.redhat.com/en/documentation/en-us/red_hat_enterprise_linux/9/html/security_hardening | 逐章节读 enforcing 模式与布尔 |
| 4~9 | 合规基线 | CIS Benchmarks、DISA STIG | https://www.cisecurity.org/ 、https://public.cyber.mil/stigs/ | 注册下载;逐条对照 |
| 5 | AppArmor | Ubuntu AppArmor Wiki | https://ubuntu.com/server/docs/security-apparmor | complain → enforce 流程 |
| 6~7 | 内核参数 | man sysctl、man capabilities、Kernel docs | https://docs.kernel.org/admin-guide/sysctl/ | 按字段含义改 |
| 8 | 审计 | Audit Documentation (RHEL)、auditd(8) | https://docs.redhat.com/en/documentation/ | 规则语法与关键 key |
| 9 | 扫描器 | OpenSCAP User Guide、Lynis Docs | https://www.open-scap.org/ 、https://cisofy.com/lynis/ | 跑 profile + 解读报告 |
| 9 | 漏洞扫描 | Vuls、Vulners | https://vuls.io/ 、https://vulners.com/ | 接入 NVD/OVAL |
| 9 | 备份 | restic docs、borgbackup docs | https://restic.readthedocs.io/ 、https://borgbackup.readthedocs.io/ | 设计备份策略 |
| 全部 | 内核与性能 | Brendan Gregg 博客 | https://www.brendangregg.com/ | sysctl、lockdown、tracepoint 视角 |
| 全部 | 实战 | Hanno Böck《Linux Hardening in Hostile Networks》 | https://michael-wolf.de/ | 攻击者视角加固 |
| 全部 | 应急响应 | SANS PICERL IR;NIST SP 800-61 | https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r3.pdf | IR 流程参考 |
许可证提示:CIS Benchmarks 需注册免费账号下载;DISA STIG 公开。复制配置前确认许可证;读思路后自己写配置,不要直接复制 CIS 的脚本到生产。
默认使用顺序:man page → Arch Wiki / Red Hat Security Guide → CIS / DISA → 工具(oscap / lynis)→ 复盘到
notes/retrospective.md。
9. 学习资料汇聚(v0.3 自包含)
本节由本计划生成。链接指向原始材料或作者公开内容。标准会更新,实验记录必须写明版本和日期。
9.1 背景与动机
Linux 是互联网服务的底座。从 web server 到 K8s node,从数据库到边缘网关,绝大多数生产负载跑在 Linux 上。攻击者也最熟悉它——SSH 爆破、SUID 提权、内核漏洞、容器逃逸每年都更新一波。
Linux 加固不是装一个”安全软件”的事,而是纵深防御:账号是第一道门,文件系统权限是第二道,MAC 是第三道,网络是第四道,内核参数是第五道,审计与日志是检测层,漏洞与合规是验收层,备份是兜底层。任意一层被攻破,剩下几层能争取到响应时间。
行业位置:CIS Benchmarks、DISA STIG、PCI-DSS、HIPAA、FedRAMP 都把 Linux 加固列为基线。Linux 基金会、CIS、Red Hat、Canonical、SUSE 都在持续发布基线与指南。NIST SP 800-123 提供通用指引,SP 800-53 是控制项目录。
值得学的原因:它把”安全”从一个抽象名词变成可执行、可扫描、可验证的工程实践。学完不只是”知道”,是”机器能证明你知道”。
9.2 概念地图
flowchart TB
Identity[账号与认证<br/>passwd / shadow / PAM / sudoers]
SSH[SSH 加固<br/>sshd_config / 密钥 / ForceCommand / MFA]
FS[文件系统权限<br/>chmod / chown / ACL / SUID / capabilities]
MAC[强制访问控制<br/>SELinux / AppArmor]
Sysd[systemd 单元加固<br/>PrivateDevices / ProtectHome / DynamicUser]
FW[防火墙<br/>nftables / iptables / ufw / conntrack]
Kernel[内核加固<br/>sysctl / lockdown / Secure Boot / modules]
Audit[审计与日志<br/>auditd / journald / rsyslog / HIDS]
Vuln[漏洞与合规<br/>CIS / STIG / OpenSCAP / Lynis / Vuls]
Backup[备份与恢复<br/>restic / borgbackup / 异地多活]
Identity --> SSH
Identity --> FS
FS --> MAC
MAC --> Sysd
Identity --> FW
FW --> Kernel
Audit --> Vuln
Backup --> Audit
Identity --> Audit
FS --> Audit
SSH --> Audit
核心关系:
- 身份 是最外层:决定谁能进来;
- 权限 + MAC 控制进来后能做什么;
- 网络 + 内核 控制能连到哪、能用什么能力;
- 审计 + 漏洞 + 备份 不阻止攻击,但能检测、定位、恢复。
9.3 基础知识讲解
9.3.1 经典论文 / 标准
| 资料 | 影响 | 建议读法 |
|---|---|---|
| NIST SP 800-123 Guide to General Server Security | 美标通用服务器加固指引 | 通读,了解控制项分类 |
| NIST SP 800-53 Rev. 5 Security and Privacy Controls | 控制项目录(AC/IA/SI/AU/CM/CP/SC 等) | 查控制项;配 CIS/STIG 对应 |
| DISA STIG General Purpose Operating System Security Requirements Guide | 美军对 GP OS 的硬性要求 | 红帽 / Ubuntu 各自有 profile |
| CIS Benchmarks v2.0 Ubuntu / RHEL Linux | 业界事实标准 | 注册下载 PDF/CSV;用 OpenSCAP 直接读 |
| NSA Guide to the Secure Configuration of Red Hat Enterprise Linux | NSA 出的 RHEL 加固 | 短小精悍;与 CIS 互参 |
| US-CERT / CISA Bad Practices | 列出”绝对不能做”的清单 | 短文必读 |
| Linux man-pages capabilities(7) / pam.d(5) / audit.rules(5) / nft(8) / sysctl(8) / sshd_config(5) | 工具层一手资料 | 用到再查,不通读 |
| POSIX 1003.1e (Draft) POSIX Capabilities | Linux capabilities 的设计来源 | 了解背景,不实现 |
9.3.2 经典书籍
| 书 | 影响 | 用法 |
|---|---|---|
| Daniel J. Barrett, Linux Pocket Guide (O’Reilly) | 命令行速查,覆盖日常 90% | 放在工位,每天翻 |
| Evgenii Golyshev, Practical Linux Security Cookbook (Packt) | 配 50+ 实战 recipe | 当 cookbook,按需抄 |
| Hanno Böck, Linux Hardening in Hostile Networks | 攻击者视角加固;解释 NSA 等基线为何这样定 | 必读,建立”为什么” |
| Barrett, Silverman & Byrnes, SSH The Secure Shell: The Definitive Guide (O’Reilly) | sshd_config / 密钥 / 隧道 / agent 完整 | 配 sshd 时随用随查 |
| Red Hat, SELinux Coloring Book | 把 SELinux 概念图像化 | SELinux 入门必读 |
| Red Hat, Red Hat Enterprise Linux Security Guide | SELinux / auditd / crypto 官方手册 | 章节按需读 |
| Canonical, Ubuntu Security Guide | AppArmor / AppArmor profile / Livepatch | 配 AppArmor 时查 |
| 鸟哥 / 良许 等中文 Linux 书籍 | 中文环境入门 | 配英文基线读 |
| Brendan Gregg, Systems Performance / 博客 | 内核观测、sysctl 解释 | 解释 sysctl 含义时引用 |
备查:Tanenbaum《Modern Operating Systems》、Silberschatz《Operating System Concepts》(OS 概念层);Crockford / OWASP 资料不直接相关,但应用层风险会下沉到 OS。
9.3.3 优秀博客 / 社区
| 资料 | 特点 | 用法 |
|---|---|---|
| Red Hat Security Blog | SELinux、systemd hardening、合规实战 | 跟案例跑命令 |
| Ubuntu Security Notices (USN) | 漏洞通告 + 修复版本 | 订阅;定 patch cadence |
| Arch Wiki: Security / PAM / SSH / AppArmor | 字段级解释 + 注意事项 | 查字段含义时第一站 |
| Brendan Gregg 博客 | sysctl、kernel observability | 解释内核参数时引用 |
| LWN.net | Linux 内核与用户态深度文章 | 订阅 security tag |
| Cloudflare Blog | 攻击案例 + 防御实现 | 选 incident post 复盘 |
| SANS Internet Storm Center | 日志样本与攻击者趋势 | 配 IR 阶段看 |
| Snyk / Aqua / Tigera 博客 | 容器/K8s 安全 | Linux 边界相关 |
| The Daily Swig (PortSwigger) | 攻击向量 | 选 Linux 相关读 |
9.3.4 核心人物
| 人物 | 主要影响 | 建议追踪的材料 |
|---|---|---|
| Daniel J. Barrett | 《Linux Pocket Guide》作者;长期写 Linux 工具 | O’Reilly 书;blog |
| Evgenii Golyshev | 《Practical Linux Security Cookbook》 | Packt 书 |
| Hanno Böck | 攻击者视角加固 | 书与博客 |
| Richard Haines / Red Hat Security Team | SELinux 维护与文档 | RH Security Guide;邮件列表 |
| Daniel Walsh | SELinux、container SELinux 政策 | 红帽博客、podman 项目 |
| Christian Boltz | AppArmor 维护者 | SUSE / Ubuntu 文档 |
| Brendan Gregg | 内核观测、sysctl 解释 | 博客、Systems Performance |
| 鸟哥 | 中文 Linux 普及 | 《鸟哥的Linux私房菜》 |
9.3.5 开发方法
| 方法 | 具体动作 | 何时用 |
|---|---|---|
| Baseline-first | 先跑 lynis / oscap 留基线 | 任何加固前 |
| Layer-by-layer | 账号 → 权限 → MAC → 网络 → 内核 → 审计 → 漏洞 → 备份 | 加固主线 |
| Single-variable | 一次只改一类配置,验证后再改下一类 | 避免一次改 10 项找不到原因 |
| Evidence-required | 改前改后留 evidence(oscap 报告 diff) | 验收与复盘 |
| Attacker-perspective | 用攻击者视角问”这能防什么” | 加固决策 |
| IR-flow | 用 PICERL:准备 → 识别 → 遏制 → 根除 → 恢复 → 复盘 | 应急响应 |
| Defense-in-depth | 任何一层假设被攻破,下一层继续挡 | 整体设计 |
必读 RFC / 标准补遗:RFC 4251~4254(SSH)、RFC 5246 / 8446(TLS,与 SSH/openssl 有关)、POSIX.1-2017(capabilities 设计来源)、SCAP 1.3(OpenSCAP 依赖)、CIS-CAT Lite(扫描器协议)。
9.4 经典问题与经典案例
| # | 问题 | 为什么会重要 | 最简答案 / 证据 |
|---|---|---|---|
| 1 | SSH Banner 设置不当导致版本泄露 | 攻击者拿到精确版本,关联已知 CVE | Banner 设自定义;-b / VersionAddendum none |
| 2 | shadow 文件权限应为 000 | 任何可读用户都能离线破解密码哈希 | chmod 000 /etc/shadow;stat -c %a 验证 |
| 3 | Docker privileged mode 绕过 SELinux | --privileged 关闭 MAC 隔离 | 禁 privileged;用 --cap-add 精化;SELinux 标签挂卷 |
| 4 | SUID /usr/bin/python3 被提权 | SUID + python = 任意命令执行 | find / -perm -4000 审计;移除非必要 SUID |
| 5 | PermitRootLogin yes + 弱密码被爆破 | 拿到 root 直接最高权限 | 关 root 登录;密钥 + MaxAuthTries=3 + Fail2ban |
| 6 | PermitEmptyPasswords yes | 空密码可登 | 设 no |
| 7 | PasswordAuthentication yes 同时没禁密码 | 密钥 + 密码共存 = 攻击面变大 | 只留密钥 |
| 8 | X11Forwarding yes + 不需要 | 转发套接字泄露 | 不需要就关 |
| 9 | AllowTcpForwarding yes 默认 | 内网穿透 | 关;需要时限制 AllowUsers |
| 10 | nftables INPUT 默认 ACCEPT | 任何端口都暴露 | 默认 DROP;按 ct state 放行已建连接 |
| 11 | 没放行环回口导致本地服务挂 | lo 被挡 | iif lo accept |
| 12 | net.ipv4.ip_forward=1 默认 | 主机变路由器 | 明确 0 |
| 13 | kernel.randomize_va_space=0 | 关闭 ASLR,ROP 攻击成功率高 | 设为 2 |
| 14 | 没启 auditd | 入侵后查不到证据 | 装 auditd;持久化规则 |
| 15 | /var/log 没单独分区 | 日志写满根分区 = 系统挂 | 单独分区;/var/log/audit 单独 |
| 16 | journald 持久化未开 | 重启日志丢失 | Storage=persistent |
| 17 | 备份脚本把密钥备份到同一磁盘 | 磁盘坏则备份密钥一起丢 | 异地 + 独立加密 |
| 18 | PermitUserEnvironment yes | 攻击者注环境变量 | 设为 no |
| 19 | IgnoreRhosts yes 没设 | 信任 .rhosts 被滥用 | 显式 yes |
| 20 | UsePAM yes 没启用 | sshd 行为绕过 PAM | 显式 yes |
| 21 | 启用了 PermitTunnel | 可建 VPN 隧道外联 | 关 |
| 22 | MaxSessions 10 默认 | 单用户可开 10 个会话 | 调小到 2~3 |
| 23 | 关键文件可写给非 root | 配置被改 | chmod 600 + 定期 auditd 监控 |
| 24 | sshd_config 多块 Include 顺序错 | 改的配置被覆盖 | 改最后 1 块生效;用 sshd -T 看最终值 |
| 25 | 没禁用 USB 大容量存储 | BadUSB 攻击 | install usb-storage /bin/true 或 modprobe blacklist |
| 26 | 没禁用 IPv6 | 防火墙只防 v4 | 显式 sysctl net.ipv6.conf.all.disable_ipv6=1 或同步防 v6 |
| 27 | 没设 TMOUT | 空闲 shell 不超时 | /etc/profile 加 TMOUT=300 |
| 28 | 备份完没演练恢复 | 备份损坏不可知 | 季度演练 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| PAM 模块顺序 | auth account session password 4 类有依赖 | 画调用链;用 pam-auth-update 生成基线 |
| SELinux 三元组 (user, role, type) | 概念多 | 看 Coloring Book;用 seinfo / sesearch 查 |
| nftables sets / maps vs iptables | 语法和范式不同 | 写 1 张表,nft 范式更现代 |
| Linux capabilities 7 大类 | CAP_NET_BIND_SERVICE 等命名陌生 | 用 capsh --print 看当前 shell 有哪些;getcap 看文件 |
| auditd key vs syscall | 一边按文件路径一边按系统调用 | 写规则时只挑一种,避免重复 |
| systemd 沙箱指令 30+ 个 | 一次记不住 | 按”进程视角 / 文件系统视角 / 网络视角”分组记 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 改了 sshd 把自己锁在外面 | 没有第二通道 | 改前保 console / 第二用户;先配密钥再关密码 |
| 改 SELinux 引发”服务挂但不知道挂在哪” | AVC 被静默 deny | 临时 setenforce 0;查 ausearch -m AVC;用 audit2allow 生成规则 |
| 加固后跑业务挂 | 多个改动叠加 | 回滚到基线 snapshot;一项一项改 |
| “这台机器没人碰不用加固” | 风险不是来自”人” | 自动化扫描器、漏洞利用、僵尸网络都自动化 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 几百台机器的合规 | 手工改不可行 | Ansible / Salt / cloud-init / image bake-in |
| 改完 OpenSCAP 仍报 critical | profile 没覆盖到 | 看 ARF report rule;用 --rule 单跑 |
| 备份 RTO 不达标 | 没演练 | 季度演练;提前 1 个月预告测试 |
| 日志雪崩 | 全部 DEBUG 级别 | journald RateLimitIntervalSec;rsyslog 过滤 |
| 团队对”加固”理解不一 | 缺乏基线 | 用 CIS / DISA 当合约;CI 扫描为门禁 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 | 发布组织 | 状态 | 许可证 / 可访问性 |
|---|---|---|---|---|
| CIS Linux Benchmark | v2.0 (Ubuntu 22.04 / RHEL 9) | Center for Internet Security | 持续更新 | 注册免费;商业版付费 |
| DISA STIG for Linux | 随 OS 更新 | 美国国防部 | 持续更新 | 公开 |
| NIST SP 800-53 | Rev. 5 | NIST | 现行 | 公开 |
| NIST SP 800-123 | Rev. 1 | NIST | 现行 | 公开 |
| SELinux CIL | 当前内核主版本 | NSA / Red Hat | 主流 | 公开 |
| AppArmor profile schema | 当前 | Canonical / SUSE | 主流 | GPL-2.0 |
| systemd unit directives | 当前 | systemd 项目 | 主流 | LGPL-2.1 |
| Linux capabilities(7) | 当前 | kernel.org | 主流 | GPL-2.0 |
| auditd rules format | 当前 | Red Hat / Linux Audit 项目 | 主流 | GPL-2.0 |
| SCAP / XCCDF / OVAL | 1.3 | NIST | 现行 | 公开 |
| OpenSCAP | 1.3+ | OpenSCAP 项目 | 活跃 | LGPL-2.1 |
| Lynis | 3.x | CISOfy | 活跃 | GPL-3.0 |
| restic | 0.16+ | restic 项目 | 活跃 | BSD-2-Clause |
| borgbackup | 1.2+ | borgbackup 项目 | 活跃 | BSD-3-Clause |
9.6.2 Scope
- CIS / DISA:合规基线,逐条编号(L1/L2 / CAT I-III)。
- NIST SP 800-53:控制项目录;Linux 加固是其中若干控制项的实现。
- SELinux CIL:策略语言,比传统
policy.conf友好。 - AppArmor profile schema:AppArmor profile 语法与文件结构。
- systemd unit directives:每个 unit 字段是合同;不在 [Unit]/[Service]/[Install] 范围内的指令是无效的。
- Linux capabilities(7):把 root 拆成几十个能力。
- auditd rules format:用
-w文件或-S系统调用定义监控。 - SCAP / XCCDF / OVAL:扫描协议;OpenSCAP 是 Linux 主流实现。
9.6.3 Structure
sshd_config关键指令:PermitRootLoginPasswordAuthenticationChallengeResponseAuthenticationKbdInteractiveAuthenticationMaxAuthTriesLoginGraceTimeClientAliveIntervalClientAliveCountMaxAllowUsersAllowGroupsBannerChrootDirectoryForceCommandPermitOpenPermitTunnelX11ForwardingAllowAgentForwardingAllowTcpForwarding。- PAM 关键模块:
pam_pwqualitypam_faillockpam_unixpam_limitspam_nologinpam_access。 - auditd 关键规则:
auditctl -w <path> -p <r|w|x|a> -k <key>、-S <syscall> -F key=<key>。 - sysctl 关键字段:
net.ipv4.ip_forwardnet.ipv4.conf.all.rp_filternet.ipv4.conf.all.accept_redirectsnet.ipv4.conf.all.send_redirectsnet.ipv4.conf.all.accept_source_routenet.ipv4.icmp_echo_ignore_broadcastsnet.ipv4.tcp_syncookieskernel.randomize_va_spacekernel.kptr_restrictkernel.dmesg_restrictfs.protected_hardlinksfs.protected_symlinks。 - nftables 关键指令:
add table inet filteradd chain inet filter input { type filter hook input priority 0 ; policy drop ; }ct state established,related accept。 - SELinux 关键命令:
getenforcesetenforcesemanagesetseboolrestoreconaudit2allowaudit2why。 - systemd sandboxing 关键指令:
PrivateTmpPrivateDevicesProtectHomeProtectSystemNoNewPrivilegesRestrictSUIDSGIDRestrictNamespacesDynamicUserMemoryDenyWriteExecuteLockPersonalityRestrictAddressFamiliesSystemCallFilter。
9.6.4 Ecosystem
- 合规扫描器:OpenSCAP、Lynis、Vuls、kube-bench(K8s)。
- 配置管理:Ansible、Salt、Chef、Puppet。
- 镜像基线:baked AMI / cloud-init / ignition / kickstart / preseed。
- 备份:restic、borgbackup、duplicity、rsnapshot、Bacula。
- 集中日志:rsyslog、syslog-ng、graylog、ELK、loki、splunk。
- HIDS:AIDE、Tripwire、OSSEC/Wazuh、Samhain。
- 漏洞库:NVD、Ubuntu USN、RHSA、Debian DSA、GHSA、Vulners。
- 事实标准 vs 标准本身:CIS 是事实标准,SP 800-53 是国家标准;systemd 是事实 init/服务管理器;auditd 是事实审计器。
9.6.5 Depth Tiers
| 层级 | 能力 | linux-hardening 可观察标准 |
|---|---|---|
| L0 | 知道存在 | 知道 CIS / SELinux / auditd / sshd 各自做什么 |
| L1 | 看得懂示例 | 读懂一段 sshd_config、auditd 规则、nftables 脚本 |
| L2 | 能正确调用 | 能改 sshd_config、配 auditd 规则、设 sysctl;用 oscap 跑标准 profile |
| L3 | 能解释与排错 | 能解释 SUID 风险、ASLR 作用、SELinux AVC 拒绝原因;能根据 oscap 报告逐条修复 |
| L4 | 能设计与扩展 | 能为多机集群写统一加固剧本,把 CIS 控制项落到 Ansible + cloud-init + 镜像 bake |
本父主题目标:L3。综合项目可触及局部 L4(多机一致化)。
9.6.6 Source
- CIS 官方仓库:https://github.com/CISOfy
- DISA STIG 官方:https://public.cyber.mil/stigs/
- OpenSCAP / ComplianceAsCode:https://github.com/ComplianceAsCode/content
- kernel.org / sysctl:https://docs.kernel.org/admin-guide/sysctl/
- Red Hat Security Guide:https://docs.redhat.com/en/documentation/en-us/red_hat_enterprise_linux/9/html/security_hardening
- Ubuntu Security Guide:https://ubuntu.com/security
- AppArmor Wiki:https://gitlab.com/apparmor/apparmor/-/wikis/Documentation
- systemd man pages:https://www.freedesktop.org/software/systemd/man/systemd.html
- auditd / Linux Audit:https://github.com/linux-audit/audit-documentation
- 引用版本快照日期:2026-07-30。
10. 常见误区
- “装了 fail2ban 就算 SSH 加固” —— fail2ban 是补丁,主线在 sshd_config;
- “shadow 文件 600 也够” —— CIS 要求 000;属主必须是 root:root;
- “root 不能 SSH 是用户体验问题” —— 它是安全基线,绕过的代价远大于便利;
- “禁用密码登录后密钥丢了怎么办” —— 用 console / cloud serial console / 第二用户;提前演练;
- “SELinux 太复杂关掉” —— 关闭 SELinux 失去 MAC 层;可先 permissive 再 transition;
- “AppArmor 装上默认就好” —— 默认 profile 不覆盖你跑的服务;
- “systemd 加
NoNewPrivileges就够” —— 沙箱要组合,单独一条不解决文件/网络隔离; - “防火墙开了 ufw 就行” —— ufw 默认 forward 策略、IPv6、loopback 行为要逐一确认;
- “sysctl 改了不写文件” —— 重启丢失;必须
/etc/sysctl.d/*.conf; - “auditd 装上能审计所有事” —— 规则是白名单,没规则不审计;
- “备份了硬盘 = 备份” —— 没演练 = 没备份;季度演练;
- “备份密钥和备份放一起” —— 一起丢;密钥单独保管(agepass / KMS);
- “OpenSCAP scan 过 0 critical = 100% 安全” —— 扫描器只覆盖基线定义的项;不覆盖业务漏洞;
- “单点加固就够” —— 单点失效模型下纵深才是关键;
- “每月跑一次 oscap” —— 缺 CI 卡点;每次变更都应扫描;
- “lockdown 关掉因为装 module 麻烦” ——
lockdown=integrity是默认值;不轻易改none; - “capabilities 删了 ping 不能用” —— ping 需要
CAP_NET_RAW,不是所有 cap; - “日志集中就不看本地” —— 本地
/var/log仍要轮转和脱敏; - “banner 设 ssh 默认 = 没设” —— banner 是法律提示(“未经授权禁止访问”),不是装饰。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:安全与可靠性 主 + 工程技术 辅。