引言
一台刚装好的 Linux 默认配置经不起公网扫描。安全加固不是装一个工具,而是一套纵深防御流程:从系统基线、SSH 与权限,到强制访问控制、网络最小化、审计与入侵检测。本文按攻击者的视角走一遍防守方该做的每一层——先立目标与模型,再逐层落地基线配置、SSH 加固、PAM/sudo、SELinux/AppArmor、服务最小化、审计监控、入侵检测,最后用 CIS 基线验收加固效果。
前置:/linux-user-permissions/(用户/权限/sudo)、/linux-firewall-nftables/(防火墙)、/linux-journald-logging/(日志审计)。
目录
- 1. 加固目标与纵深防御模型
- 2. 系统基线:更新、账户与最小化
- 3. SSH 加固:密钥、配置与访问控制
- 4. 权限与 PAM:sudo、PAM 与 umask
- 5. SELinux 与 AppArmor:强制访问控制
- 6. 网络与服务最小化:端口与攻击面
- 7. 审计与监控:auditd 与日志
- 8. 入侵检测:AIDE、fail2ban 与 rootkit 检查
- 9. 加固验收:CIS 基线扫描与持续加固
- 10. 速查表与一句话记忆
- 延伸阅读
1. 加固目标与纵深防御模型
加固的最终目标:让攻击成本 > 资产价值,缩短入侵检测时间(MTTD)。
纵深防御(Defense in Depth):多层防护,单层被破不至于全盘失守:
外围:防火墙 / 网关 / 限速
边界:SSH 加固 / 服务最小化 / 强制访问控制
内层:账户权限 / PAM / sudo 最小化
最后:审计 / 监控 / 入侵检测 / 应急响应
加固三问(先答再动手):
① 这台机跑什么?(最小暴露)
② 谁能访问?(最小授权)
③ 出了事怎么发现?(可观测)
关键心态:
- 安全是流程不是快照:持续更新与复检
- 加固别破坏业务:先测再上线
- 记录变更:加固项可审计
记忆:加固目标 = 提高攻击成本、缩短检测时间;纵深防御分四层(外围/边界/内层/审计);动手前先答三问——跑什么、谁能访问、出事怎么发现。
2. 系统基线:更新、账户与最小化
第一步:保持更新:
apt update && apt upgrade -y # Debian/Ubuntu
dnf upgrade -y # RHEL/Fedora
# 自动安全更新:unattended-upgrades / dnf-automatic
账户最小化:
userdel -r unused-user # 删无用账户
passwd -l someone # 锁定不删的账户
# 检查空密码/弱密码
awk -F: '($2 == "") {print}' /etc/shadow
服务最小化:
systemctl list-units --type=service --state=running # 看跑了什么
systemctl disable --now 不用的服务 # 停并禁用
内核与启动加固:
# /etc/sysctl.d/ 基础加固
kernel.kptr_restrict=2 # 限制内核地址暴露
net.ipv4.conf.all.rp_filter=1 # 反欺骗
kernel.yama.ptrace_scope=1 # 限制 ptrace
基线检查清单:
□ 补丁最新
□ 无空密码/无弱密码/无多余账户
□ 无多余服务在跑
□ root 禁止远程直接登录(见第 3 节)
□ 关键 sysctl 加固项生效
记忆:基线五件事——更新打补丁、账户最小化(删/锁/查空密码)、服务最小化、内核 sysctl 加固、root 禁远程;先清理攻击面再谈深加固。
3. SSH 加固:密钥、配置与访问控制
SSH 是公网主机的第一道门——重点加固。
用密钥不用密码:
ssh-keygen -t ed25519 -a 100 # 生成密钥(ed25519 推荐)
ssh-copy-id user@host # 安装公钥
sshd 配置加固(/etc/ssh/sshd_config):
PasswordAuthentication no # 禁密码登录
PermitRootLogin prohibit-password # 禁止 root 密码登录(可密钥)
PubkeyAuthentication yes # 密钥认证
MaxAuthTries 3 # 限制尝试次数
AllowUsers alice # 白名单用户
ClientAliveInterval 300 # 空闲保活/踢线
密钥本身管理:
- 密钥设 passphrase(失窃也不能直接用)
- 私钥权限 600、放 ~/.ssh、公钥 ~/.ssh/authorized_keys
- 轮换:定期换密钥、吊销旧密钥
访问控制:结合防火墙只放开 SSH 来源 IP:
nft add rule inet filter input ip saddr 可信网段 tcp dport 22 accept
fail2ban(见第 8 节)自动封禁爆破来源。
记忆:SSH 加固五件——ed25519 密钥替代密码、禁 PasswordAuthentication、禁 root 密码登录、AllowUsers 白名单、防火墙限来源 IP;密钥带 passphrase 且权限 600。
4. 权限与 PAM:sudo、PAM 与 umask
sudo 最小授权:
# 仅给需要的命令,不给全部 root
useradd -G sudo alice # Debian sudo 组
# 或 /etc/sudoers.d/alice
alice ALL=(ALL) /usr/bin/systemctl restart nginx
sudoers 铁律:
- 不用 NOPASSWD 给全权限
- 按角色拆分(运维组/只读组)
- 用 visudo 编辑防语法错
PAM 认证加固:
- 密码策略:/etc/pam.d/common-password 强制复杂度/长度
- 锁定爆破:pam_faillock / pam_tally2 连续失败锁定
- 双因子:pam_google_authenticator(OTP)可选
umask 与文件权限:
umask 027 # 新文件 640、新目录 750
# 系统级:/etc/profile、/etc/login.defs 设置
SUID/SGID 排查:
find / -perm -4000 -type f 2>/dev/null # 找出 SUID 文件,排查异常
记忆:权限加固四件——sudo 最小授权(只给必要命令)、PAM 密码策略+失败锁定+OTP、umask 027 收紧默认权限、定期排查 SUID/SGID 文件。
5. SELinux 与 AppArmor:强制访问控制
强制访问控制(MAC):即使 root 进程被攻破,也不让它在系统里乱跑。
DAC(默认):进程按 owner/权限决定访问
MAC(SELinux/AppArmor):额外按「策略」强制约束
SELinux(RHEL 系):
getenforce # 查看:Enforcing/ Permissive/ Disabled
sestatus # 详细状态
# 放行某服务(Web 服务器绑定非标准端口)
semanage port -a -t http_port_t -p tcp 8080
# 排查 AVC 拒绝
ausearch -m avc -ts recent
SELinux 模式:Enforcing(强制执行)> Permissive(只记不拦)> Disabled。
AppArmor(Ubuntu/Debian):
aa-status # 查看已加载 profile
# 生成 profile:aa-genprof /usr/bin/xxx
# 强制执行
aa-enforce /usr/bin/xxx
日常策略:
- 上线先 Permissive/记录模式,看日志无误再 Enforcing
- 给每个对外服务配 profile(httpd/nginx/mysql……)
- 遇到「Permission denied」先看 AVC/日志,别直接关 SELinux
记忆:MAC 是最后防线——SELinux 用 Enforcing/Permissive/Disabled 三级、AppArmor 用 aa-enforce/aa-genprof;上线先 Permissive 观察再 Enforcing,遇拒绝查 AVC 别关 SELinux。
6. 网络与服务最小化:端口与攻击面
只开该开的端口:
ss -tlnp # 列出监听端口与服务
# 防火墙只放行必要端口,见 nftables 专题
常见风险端口:
□ 22(改高/限来源)、3306/5432(绝不对公网)
□ 6379/11211(redis/memcached 未认证 → 常被挖矿)
□ 2375/2376(docker 远程未保护)
□ 8080/8888(面板类,需鉴权)
服务自身加固:
- 数据库只监听内网地址(bind 127.0.0.1 或内网卡)
- 管理面板加认证 + 限 IP
- 关闭不必要的开端口服务
IP 欺骗与路由器加固:
# 反欺骗、禁 ICMP 重定向
net.ipv4.conf.all.accept_redirects=0
net.ipv6.conf.all.accept_redirects=0
记忆:最小化攻击面——
ss -tlnp盘点端口、防火墙只放必要端口;数据库/redis/docker 端口禁公网;服务只监听内网、面板加认证;禁 ICMP 重定向防欺骗。
7. 审计与监控:auditd 与日志
审计(auditd):记录敏感操作,出事有据可查。
# 安装并启用
apt install auditd
# 审计关键文件与命令
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -a always,exit -F arch=b64 -S execve -k exec_calls
# 查询
ausearch -k passwd_changes -ts recent
audit 规则三件:
-w 文件:监控 /etc/passwd、/etc/shadow、/etc/ssh/sshd_config
-a execve:审计命令执行
登录/失败登录:pam 触发
日志集中与保护:
- journald 持久化(见日志专题)
- 关键日志异地/集中收集(防被篡改灭迹)
- 日志权限:root 才能读 /var/log/auth.log
登录监控:
journalctl -u sshd --since "1 hour ago" # SSH 登录记录
last / lastb # 成功/失败登录
记忆:审计三件——auditd 监控敏感文件(-w /etc/passwd)与命令执行(-a execve)、日志集中+权限保护防篡改、last/journalctl 盯登录;出事能回溯是谁干了什么。
8. 入侵检测:AIDE、fail2ban 与 rootkit 检查
文件完整性(AIDE):关键文件哈希基线,变更报警。
apt install aide
aideinit # 初始化基线库
# 定期比对
aide --check
# cron 每日比对 + 差异告警
fail2ban(爆破防护):
apt install fail2ban
# 默认 jail 封 SSH 多次失败
systemctl enable --now fail2ban
fail2ban-client status sshd
rootkit/恶意软件检查:
apt install rkhunter chkrootkit
rkhunter --check
chkrootkit
# 结合进程/网络异常排查
异常行为指标(IOC):
- 陌生进程/高 CPU(挖矿)
- 新开的监听端口
- 异常登录(异地/凌晨)
- /tmp、/dev/shm 的可疑文件
- crontab、authorized_keys 被改
记忆:入侵检测三件——AIDE 哈希基线比对防篡改、fail2ban 封爆破、rkhunter/chkrootkit 查 rootkit;日常盯 IOC——陌生进程、新端口、异常登录、可疑文件与 cron 变更。
9. 加固验收:CIS 基线扫描与持续加固
CIS 基线:业界公认的加固标准清单(分级 Level1/Level2)。
扫描工具:
# Lynis(开源审计)
apt install lynis
lynis audit system # 报告 + 加固建议(分数)
# 或 CIS-CAT / OpenSCAP
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis ...
Lynis 看什么:
- 安全分数(越高越好)
- 每项 hardening index
- 发现项:警告、建议、提示
验收闭环:
基线扫描(记分) → 逐项加固 → 复扫(提分) → 持续监控
持续加固自动化:配置管理(Ansible)把加固项固化为代码,新机器一键达标:
ansible-playbook hardening.yml # 一键加固多台
记忆:验收用 CIS 基线 + Lynis/OpenSCAP 扫描记分——扫出项逐条加固、复扫验证提分、Ansible 固化为代码持续达标;加固不是一次完成而是闭环流程。
10. 速查表与一句话记忆
| 加固项 | 关键动作 |
|---|---|
| 系统基线 | 更新、删账户、最小化服务、sysctl |
| SSH | ed25519 密钥、禁密码、禁 root、白名单 |
| 权限 | sudo 最小化、PAM 策略、umask 027 |
| MAC | SELinux Enforcing / AppArmor profile |
| 网络 | 只开必要端口、库禁公网 |
| 审计 | auditd 监控文件与命令 |
| 检测 | AIDE 基线、fail2ban、rkhunter |
| 验收 | Lynis/CIS 扫描 + Ansible 固化 |
一句话记忆:Linux 加固是纵深防御流程——基线(更新/账户/服务最小化)→ SSH(密钥替代密码、禁 root、白名单限 IP)→ 权限(sudo 最小化、PAM 策略、umask)→ MAC(SELinux/AppArmor 让 root 也不能乱跑)→ 网络最小化(只开必要端口、库禁公网)→ 审计(auditd 记录敏感操作、日志集中保护)→ 检测(AIDE 基线、fail2ban 封爆破、rootkit 检查)→ CIS 基线扫描验收 + Ansible 固化为代码——每一层被破还有下一层兜底,攻击成本高于资产价值、异常能在审计里被看见,才是真的「加固」。
延伸阅读
- /linux-user-permissions/ — 用户、权限、sudo 与 ACL
- /linux-firewall-nftables/ — 防火墙与网络访问控制
- /linux-journald-logging/ — 日志管理与审计
- /linux-network-commands/ — 端口与服务排查
- [[security]] — 安全攻防全景
- [[observability]] — 监控与告警
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。