26 - 系统安全加固与审计

系统安全加固是一个持续的过程。从最小权限原则到强制访问控制(MAC),从文件完整性监控到内核安全模块——Linux 提供了多层纵深防御能力。本章整合了系统加固的完整知识体系,涵盖 sudo 配置、PAM 认证、fail2ban 防暴力破解、auditd 审计、SELinux/AppArmor 强制访问控制、dm-verity 完整性保护以及内核安全模块(LSM)体系。


26.1 最小权限原则

不要以 root 运行

最小权限原则是系统安全的基石:每个程序、每个用户只应拥有完成任务所必需的最小权限。

# 不良实践
sudo python web_server.py # 整个服务器以 root 运行
 
# 良好实践
# 创建专用服务用户
sudo useradd -r -s /usr/sbin/nologin -d /var/www webapp
sudo -u webapp python web_server.py # 仅该服务以低权限用户运行

sudo 配置

sudo 允许普通用户以受控方式执行特权命令。

# 编辑 sudoers(必须使用 visudo,它会检查语法)
sudo visudo
# 或编辑 /etc/sudoers.d/ 下的文件(推荐)
sudo visudo -f /etc/sudoers.d/webadmins
# /etc/sudoers.d/webadmins
 
# 允许用户 alice 执行所有 sudo 命令
alice ALL=(ALL:ALL) ALL
 
# 允许 webadmin 组执行特定命令,无需密码
%webadmin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
 
# 允许数据库管理员组仅以 postgres 用户执行命令
%dbadmins ALL=(postgres) /usr/bin/psql, /usr/bin/pg_dump, /usr/bin/pg_restore
 
# 限制:不允许进入交互式 shell
# 使用 ! 来禁止特定命令
%limited ALL=(ALL) ALL, !/usr/bin/su, !/usr/bin/sudo
 
# 环境变量保留
Defaults env_keep += "SSH_AUTH_SOCK"
sudoers 字段含义
alice用户名或 %groupname(组)
ALL (第一个)允许的主机
(ALL:ALL)以哪些用户/组身份运行
/usr/bin/systemctl restart nginx允许的命令
NOPASSWD:不要求输入密码
PASSWD:要求输入密码(默认)
# 查看用户的 sudo 权限
sudo -l
sudo -U alice -l
 
# 时间戳管理
sudo -v # 刷新 sudo 时间戳(延长有效期)
sudo -k # 使时间戳失效(下次需要密码)

26.2 文件权限加固

查找不安全文件

# 查找全局可写文件
sudo find / -type f -perm -0002 ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null
 
# 查找全局可写目录
sudo find / -type d -perm -0002 ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null
 
# 查找 SUID 文件(可能被提权利用)
sudo find / -perm -4000 -type f 2>/dev/null
 
# 查找 SGID 文件
sudo find / -perm -2000 -type f 2>/dev/null
 
# 查找无主文件
sudo find / -nouser -o -nogroup 2>/dev/null
 
# 查找 7 天内修改过的 SUID 文件(新装后门)
sudo find / -perm -4000 -mtime -7 -type f 2>/dev/null

修复关键文件权限

# /etc/shadow: 仅 root 可读写(密码哈希)
sudo chmod 000 /etc/shadow
sudo chown root:root /etc/shadow
 
# /etc/passwd: 所有人可读,仅 root 可写
sudo chmod 644 /etc/passwd
 
# /etc/group: 同上
sudo chmod 644 /etc/group
 
# SSH 密钥
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_*
 
# 定时任务
sudo chmod 600 /etc/crontab
sudo chmod 700 /etc/cron.d /etc/cron.daily /etc/cron.hourly

特殊权限位审计

权限位含义风险
SUID (4000)以文件所有者身份执行如 /usr/bin/passwd 可以修改密码
SGID (2000)以文件所属组身份执行组内继承权限
Sticky (1000)只有文件所有者能删除用于 /tmp,非风险项
# 审查 SUID 程序,移除不必要的
sudo chmod u-s /path/to/suspect_program
 
# 比较当前和前一天的 SUID 列表
sudo find / -perm -4000 -type f 2>/dev/null > /var/log/suid_today.txt
diff /var/log/suid_yesterday.txt /var/log/suid_today.txt

26.3 PAM(可插拔认证模块)

PAM 是 Linux 认证体系的统一接口层,几乎所有需要认证的服务(ssh、sudo、login 等)都通过 PAM 进行。

PAM 配置文件

# PAM 配置目录
# Debian/Ubuntu: /etc/pam.d/
# RHEL/Fedora: /etc/pam.d/
# Arch: /etc/pam.d/
 
# 查看 SSH 的 PAM 配置
cat /etc/pam.d/sshd
 
# PAM 模块位置
# /lib/x86_64-linux-gnu/security/ Debian/Ubuntu
# /lib64/security/ RHEL/Fedora
# /usr/lib/security/ Arch

PAM 配置语法

type control_flag module_path [arguments]
type说明
auth认证用户身份(密码、指纹等)
account账户管理(账户是否过期、是否允许登录时间)
session会话管理(登录时挂载目录、设置环境)
password密码管理(修改密码时验证强度)
control_flag说明
required必须成功,失败时继续执行后续模块但最终返回失败
requisite必须成功,失败时立即返回失败
sufficient如果成功且之前没有 required 失败,立即返回成功
optional可选,只有它是栈中唯一模块时才影响结果

常用 PAM 模块

# pam_unix.so:传统 Unix 密码认证
# /etc/pam.d/common-auth(Debian/Ubuntu)
auth required pam_unix.so
 
# pam_tally2.so / pam_faillock.so:登录失败锁定
# /etc/pam.d/common-auth
auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth required pam_faillock.so authfail deny=5 unlock_time=900
 
# pam_pwquality.so:密码强度检查
# /etc/pam.d/common-password
password requisite pam_pwquality.so minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
 
# pam_limits.so:资源限制
# /etc/pam.d/common-session
session required pam_limits.so
 
# pam_google_authenticator.so:TOTP 双因素认证
# sudo apt install libpam-google-authenticator # Debian/Ubuntu
 
# pam_ssh_agent_auth.so:通过 SSH agent 进行 sudo 认证

密码策略配置

# /etc/security/pwquality.conf
minlen = 12 # 最小长度
dcredit = -1 # 至少 1 个数字
ucredit = -1 # 至少 1 个大写字母
lcredit = -1 # 至少 1 个小写字母
ocredit = -1 # 至少 1 个特殊字符
minclass = 3 # 至少 3 种字符类型
enforce_for_root # 对 root 也生效
 
# 密码有效期
# /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7

26.4 Fail2ban — 防暴力破解

Fail2ban 监控日志文件,对多次认证失败的 IP 自动执行封禁动作。

安装与配置

# 安装
# Debian/Ubuntu: sudo apt install fail2ban
# RHEL/Fedora: sudo dnf install fail2ban
# Arch: sudo pacman -S fail2ban
 
# 创建本地配置(不修改主配置文件)
# /etc/fail2ban/jail.local
 
[DEFAULT]
# 封禁时间(秒):3600 = 1小时
bantime = 3600
 
# 查找窗口:在 findtime 秒内达到 maxretry 次就封禁
findtime = 600
 
# 最大重试次数
maxretry = 5
 
# IP 白名单(不封禁的 IP)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
 
# 动作(封禁方式)
banaction = iptables-multiport
# 可选: iptables-allports, nftables-multiport, ufw-sysintegrate
 
# 邮件通知
# destemail = admin@example.com
# action = %(action_mwl)s
 
# === SSH 保护 ===
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
# Debian/Ubuntu: /var/log/auth.log
# RHEL/Fedora: /var/log/secure
# 如需自定义端口:
# port = 2222
 
# === Web 服务器保护 ===
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
port = http,https
 
[apache-auth]
enabled = true
logpath = /var/log/apache2/*error.log
port = http,https
 
# === 邮件服务器 ===
[postfix]
enabled = true
logpath = /var/log/maillog # RHEL/Fedora
# logpath = /var/log/mail.log # Debian/Ubuntu
 
# === 自建服务保护 ===
[myapp]
enabled = true
filter = myapp # 需创建 /etc/fail2ban/filter.d/myapp.conf
logpath = /var/log/myapp/login.log
maxretry = 3
port = 8080
# 启动
sudo systemctl enable --now fail2ban
 
# 查看状态
sudo fail2ban-client status
sudo fail2ban-client status sshd
 
# 解封 IP
sudo fail2ban-client set sshd unbanip 192.168.1.100
 
# 手动封禁 IP
sudo fail2ban-client set sshd banip 10.0.0.55
 
# 查看日志
sudo tail -f /var/log/fail2ban.log

26.5 文件完整性监控(AIDE / Tripwire)

AIDE(Advanced Intrusion Detection Environment)

# 安装
# Debian/Ubuntu: sudo apt install aide
# RHEL/Fedora: sudo dnf install aide
# Arch: sudo pacman -S aide
 
# 初始化数据库
sudo aideinit # Debian/Ubuntu
sudo aide --init # RHEL/Fedora
 
# 移动数据库到正式位置
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
 
# 检查文件变更
sudo aide --check
 
# 更新数据库(确认变更合法后)
sudo aide --update
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
 
# 配置监控范围 /etc/aide/aide.conf
# 常用规则:
# R: read+write+execute+attributes 文件属性
# L: link 变化
# E: empty group
# >: growing logfile
# PERMS: 仅权限变化
 
# 定时检查(cron)
# 0 3 * * * /usr/bin/aide --check | mail -s "AIDE Report" admin@example.com

配置示例

# /etc/aide/aide.conf(关键路径监控)
/bin REGULAR
/sbin REGULAR
/usr/bin REGULAR
/usr/sbin REGULAR
/etc REGULAR
/boot REGULAR
/lib REGULAR
/lib64 REGULAR
/usr/lib REGULAR
/usr/lib64 REGULAR

26.6 auditd — Linux 审计框架

auditd 是内核级审计系统,可精细记录系统调用、文件访问、用户操作等事件。详见 Linux 内核基础与模块

安装与基础使用

# 安装
# Debian/Ubuntu: sudo apt install auditd
# RHEL/Fedora: sudo dnf install audit
# Arch: sudo pacman -S audit
 
# 启动
sudo systemctl enable --now auditd
 
# === 审计规则管理(auditctl)===
 
# 监控文件操作
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
sudo auditctl -w /etc/shadow -p wa -k shadow_changes
sudo auditctl -w /etc/ssh/sshd_config -p wa -k sshd_config
 
# 监控系统调用
sudo auditctl -a always,exit -F arch=b64 -S execve -F euid=0 -k root_commands
sudo auditctl -a always,exit -F arch=b64 -S mount -k mount_ops
sudo auditctl -a always,exit -F arch=b64 -S ptrace -k ptrace_use
 
# 查看当前规则
sudo auditctl -l
 
# 删除所有规则
sudo auditctl -D
 
# === 持久化规则 ===
# 文件:/etc/audit/rules.d/audit.rules(RHEL/Fedora)
# 或 /etc/audit/audit.rules(Debian/Ubuntu)
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/sudoers -p wa -k sudoers_changes
-a always,exit -F arch=b64 -S execve -k exec_commands
-a always,exit -F arch=b64 -S mount -k mount_events
 
# 重新加载规则
sudo systemctl restart auditd
# 或
sudo augenrules --load # RHEL/Fedora

审计日志分析

# === ausearch:搜索审计日志 ===
# 按关键字搜索
sudo ausearch -k passwd_changes
 
# 按时间
sudo ausearch -k exec_commands -ts today
sudo ausearch -ts 07/24/2026 '10:00:00' -te 07/24/2026 '12:00:00'
 
# 按用户
sudo ausearch -ua 1000
 
# 按系统调用
sudo ausearch -sc execve
 
# 按进程
sudo ausearch -p 12345
 
# 失败事件
sudo ausearch --success no
 
# === aureport:审计报告 ===
sudo aureport --summary # 总体摘要
sudo aureport -au # 认证报告
sudo aureport -f # 文件访问报告
sudo aureport -x # 可执行文件报告
sudo aureport -s # 系统调用报告
sudo aureport --failed # 失败事件
sudo aureport -au -ts today # 今日认证

26.7 SELinux 基础

SELinux 是 Linux 内核的强制访问控制(MAC)系统,由 NSA 开发。RHEL/Fedora 默认启用。

核心概念

传统 DAC(自主访问控制):
 用户 → 文件(owner-group-other 权限)
 问题:程序以用户身份运行 → 继承了用户的全部权限

SELinux MAC(强制访问控制):
 主体(进程)→ 标签(type)→ 客体(文件)→ 规则
 即使 root 进程也受 SELinux 策略限制
概念说明
Type EnforcementSELinux 的核心:每个进程和文件有 type 标签
Domain进程的 type 称为 domain
Policy控制 domain ↔ type 的访问规则
Targeted Policy默认策略:仅约束关键服务,其余不受限
MLS/MCS多级安全 / 多类别安全(军标级别)

基本操作

# 查看 SELinux 状态
getenforce # Enforcing / Permissive / Disabled
sestatus
 
# 切换模式
sudo setenforce 1 # Enforcing(强制执行)
sudo setenforce 0 # Permissive(仅记录违规)
# 永久设置:/etc/selinux/config 中 SELINUX=enforcing
 
# 查看文件/进程的 SELinux 上下文
ls -Z /var/www/html
# system_u:object_r:httpd_sys_content_t:s0 /var/www/html
ps auxZ | grep nginx
 
# 修改文件上下文
sudo chcon -t httpd_sys_content_t /var/www/myapp
sudo restorecon -v /var/www/myapp # 恢复默认上下文
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/myapp(/.*)?"
 
# 修改端口标签
sudo semanage port -l | grep http
sudo semanage port -a -t http_port_t -p tcp 8080

审计日志与排错

# SELinux 审计日志位置
# RHEL/Fedora: /var/log/audit/audit.log
# 通用:journalctl | grep AVC
 
# 查看最近的 SELinux 拒绝事件
sudo ausearch -m avc -ts recent
sudo ausearch -m avc -ts today | audit2why
 
# audit2allow:从日志生成策略(谨慎使用!)
sudo ausearch -m avc -ts today | audit2allow -M mypolicy
# 检查生成的策略
cat mypolicy.te
# 安装策略
sudo semodule -i mypolicy.pp
 
# sealert:友好化的错误信息
# Debian/Ubuntu: sudo apt install setroubleshoot
# RHEL/Fedora: sudo dnf install setroubleshoot-server
sudo sealert -a /var/log/audit/audit.log

常见 SELinux 问题

症状常见原因解决
Nginx 无法读取文件文件标签不是 httpd_sys_content_tsemanage fcontext + restorecon
SSH 非标准端口端口未标记 ssh_port_tsemanage port -a -t ssh_port_t -p tcp 2222
MySQL 无法写入数据目录数据目录标签错误restorecon -vR /var/lib/mysql
应用未知被拒绝SELinux 静默阻止临时 setenforce 0 测试

26.8 AppArmor 基础

AppArmor 是 Ubuntu 和 SUSE 的默认 MAC 系统,基于路径而非标签。

与 SELinux 对比

特性SELinuxAppArmor
标识方式inode 标签(需要 setfattr文件路径
策略粒度极细(每个操作)粗粒度(路径 + 权限标志)
配置复杂度较低
学习曲线陡峭平缓
默认策略targeted(仅限制关键服务)应用级 profile
发行版支持RHEL/Fedora/CentOSUbuntu/openSUSE

基本操作

# 安装(Ubuntu 预装)
sudo apt install apparmor apparmor-utils # Debian/Ubuntu
sudo dnf install apparmor apparmor-utils # Fedora(非默认)
sudo zypper install apparmor apparmor-utils # openSUSE
 
# 查看状态
sudo aa-status
# apparmor module is loaded.
# 42 profiles are loaded.
# 38 profiles are in enforce mode.
# 4 profiles are in complain mode.
 
# 查看所有 profile
sudo aa-status | grep -E "enforce|complain"
 
# === 模式管理 ===
sudo aa-enforce /etc/apparmor.d/usr.bin.nginx # 强制模式
sudo aa-complain /etc/apparmor.d/usr.bin.nginx # 抱怨模式(仅记录)
sudo aa-disable /etc/apparmor.d/usr.bin.nginx # 禁用
 
# === Profile 生成与更新 ===
sudo aa-genprof /usr/bin/myapp # 交互式生成 profile
sudo aa-logprof # 从日志更新 profile
 
# === 日志审计 ===
sudo aa-notify -p -f /var/log/syslog # 查看最近的拒绝事件
sudo grep "apparmor" /var/log/syslog | grep DENIED

简单 AppArmor Profile

# /etc/apparmor.d/usr.bin.myapp
#include <tunables/global>
 
profile myapp /usr/bin/myapp {
 #include <abstractions/base>
 #include <abstractions/nameservice>
 
 # 允许读写自己的配置文件
 /etc/myapp/** rw,
 
 # 允许读取系统库
 /usr/lib/** mr,
 
 # 允许写日志
 /var/log/myapp/** w,
 
 # 网络权限
 network inet tcp,
 network inet6 tcp,
 
 # 拒绝访问其他用户家目录
 deny @{HOME}/** rwx,
}

选择 SELinux 还是 AppArmor

场景推荐理由
RHEL/Fedora/CentOS 环境SELinux系统默认,集成度最高
Ubuntu/Debian 环境AppArmor系统默认,配置友好
容器环境AppArmor 或 SELinuxDocker 对两者都有良好支持
高安全合规(军标)SELinuxMLS 多级安全
快速部署AppArmor学习成本低,路径式配置直观

26.9 dm-verity 与完整性保护

dm-verity 是 Linux 内核的 device-mapper 目标,提供只读块设备的透明完整性验证。详见 Device Mapper 与存储栈

核心原理

数据设备 Hash 设备
┌────────────┐ ┌────────────────┐
│ Data Block │ ──→ H(Data) ──→ │ Merkle Tree │
│ Block 0 │ │ Leaf Hash 0 │
│ Block 1 │ │ Leaf Hash 1 │ → 逐层验证 → Root Hash
│ ... │ │ Internal Hash │
└────────────┘ └────────────────┘

根哈希(Root Hash)存储在可信位置,启动时传入内核。
任何数据块被篡改 → 哈希验证失败 → 返回 I/O 错误。

基本使用

# 安装 cryptsetup(包含 veritysetup)
# Debian/Ubuntu: sudo apt install cryptsetup-bin
# RHEL/Fedora: sudo dnf install cryptsetup
# Arch: sudo pacman -S cryptsetup
 
# 创建 verity hash
sudo veritysetup format /dev/sda2 /dev/sda3
# 记录输出的 Root Hash
 
# 打开 verity 设备
sudo veritysetup open /dev/sda2 verity-root /dev/sda3 \
 <root_hash_hex>
 
# 只读挂载
sudo mount -o ro /dev/mapper/verity-root /mnt
 
# 验证(不挂载)
sudo veritysetup verify /dev/sda2 /dev/sda3 <root_hash>

安全启动链

完整的信任链从固件到用户空间,dm-verity 是其中关键一环:

┌──────────────────────────────────────────────────┐
│ UEFI Secure Boot │
│ └→ 验证 shim.efi (Microsoft签名) │
│ └→ 验证 GRUB/systemd-boot (发行版签名) │
│ └→ 加载签名内核 + Root Hash │
│ └→ dm-verity 验证只读根文件系统 │
│ └→ IMA/EVM 度量运行时代码 │
└──────────────────────────────────────────────────┘

26.10 内核安全模块(LSM 体系)

Linux 安全模块(LSM)是一个框架,允许多个安全模块同时运行:

# 查看当前启用的 LSM
cat /sys/kernel/security/lsm
# 输出示例:lockdown,capability,yama,landlock,integrity,apparmor,bpf
 
# 通过内核参数配置
# GRUB_CMDLINE_LINUX="lsm=apparmor,landlock,lockdown,yama,integrity,bpf"
LSM 模块功能启用方式
SELinux强制访问控制(inode 标签)内核参数 + 策略包
AppArmor强制访问控制(路径)内核参数 + profiles
Landlock非特权沙箱(应用自限)内核支持即启用,无管理
Lockdown限制内核功能(即使 root)内核参数
Yamaptrace 限制内核参数
IntegrityIMA/EVM 完整性内核参数
BPF LSMBPF 程序实现安全策略内核参数 + BPF 程序

Landlock 沙箱

Landlock 允许非特权进程自行限制对文件系统和网络的访问。与 SELinux/AppArmor 不同,应用程序自身可以设置限制而无需管理员介入。

# 检查支持
cat /sys/kernel/security/lsm | grep landlock
 
# 应用级使用(以 C 编程为例)
# 进程调用 landlock_create_ruleset + landlock_restrict_self
# 就可以限制自己的文件访问范围
# 这在沙箱化 CLI 工具和浏览器渲染进程时很有用

Secure Boot 与 TPM 概念

技术功能信任根
Secure Boot验证引导代码签名UEFI 固件中的平台密钥(PK)
TPM 2.0硬件安全模块:密钥存储、PCR 测量硬件芯片
TPM PCR存储引导链的哈希度量值TPM 内部的平台配置寄存器
可信启动Secure Boot + TPM 结合硬件 + 固件
远程证明向远程服务器证明系统完整性TPM + IMA
# 检查 Secure Boot 状态
mokutil --sb-state
# SecureBoot enabled
 
# 查看 TPM 设备
ls /dev/tpm*
dmesg | grep -i tpm
 
# 使用 tpm2-tools 操作 TPM
# sudo apt install tpm2-tools (Debian/Ubuntu)
tpm2_pcrread
tpm2_getrandom 32

26.11 系统加固清单

快速审计脚本

#!/bin/bash
# 系统安全快速检查
 
echo "=== 1. 内核安全参数 ==="
sysctl kernel.kptr_restrict kernel.dmesg_restrict kernel.randomize_va_space
 
echo "=== 2. 开放端口 ==="
ss -tlnp
 
echo "=== 3. SUID 文件(仅列出异常项)==="
find / -perm -4000 -type f 2>/dev/null | grep -v -E '/usr/bin/(passwd|sudo|su|ping|mount|umount|newgrp|chsh|chfn|gpasswd)'
 
echo "=== 4. 免密码 sudo 用户 ==="
sudo grep -r "NOPASSWD" /etc/sudoers /etc/sudoers.d/ 2>/dev/null
 
echo "=== 5. 无密码账户 ==="
sudo awk -F: '($2 == "" || $2 == "!") {next} {print $1}' /etc/shadow
 
echo "=== 6. 当前登录用户 ==="
who
 
echo "=== 7. 失败登录记录 ==="
sudo lastb | head -10 2>/dev/null || echo "无 lastb 记录或日志为空"
 
echo "=== 8. systemd 服务安全评分 ==="
systemd-analyze security 2>/dev/null | head -15
 
echo "=== 9. fail2ban 状态 ==="
sudo fail2ban-client status 2>/dev/null || echo "fail2ban 未安装或未运行"
 
echo "=== 10. SELinux/AppArmor 状态 ==="
getenforce 2>/dev/null || sudo aa-status --enabled 2>/dev/null && echo "AppArmor enabled" || echo "LSM 未启用或未知"

内核安全参数

# /etc/sysctl.d/99-security.conf
 
# 禁止内核指针泄露
kernel.kptr_restrict = 2
 
# 限制 dmesg 访问
kernel.dmesg_restrict = 1
 
# 限制 ptrace
kernel.yama.ptrace_scope = 2
 
# 启用 ASLR(地址空间布局随机化)
kernel.randomize_va_space = 2
 
# 限制用户命名空间(如不需要 rootless 容器)
# kernel.unprivileged_userns_clone = 0
 
# 限制 BPF
kernel.unprivileged_bpf_disabled = 1
 
# 限制性能事件
kernel.perf_event_paranoid = 3
 
# === 网络层 ===
# 禁用 IP 转发(非路由器)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
 
# 禁用 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
 
# 启用 SYN Cookies(防 SYN Flood)
net.ipv4.tcp_syncookies = 1
 
# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
 
# 启用反向路径过滤
net.ipv4.conf.all.rp_filter = 1
# 应用 sysctl 配置
sudo sysctl -p /etc/sysctl.d/99-security.conf

26.12 安全监控与告警

# 入侵检测辅助工具
# lynis: 系统安全审计
# rkhunter: rootkit 检查
# chkrootkit: rootkit 检查
 
# 安装
# Debian/Ubuntu: sudo apt install lynis rkhunter
# RHEL/Fedora: 需要 EPEL: sudo dnf install lynis rkhunter
 
# 运行审计
sudo lynis audit system # 全面的安全审计
sudo rkhunter --check --skip-keypress # rootkit 扫描
 
# 持续监控
# - Wazuh / OSSEC:开源 HIDS
# - AIDE:文件完整性检查
# - auditd:系统调用审计
# - fail2ban:登录防护
 
# 日志集中管理(rsyslog → 集中式日志服务器)
# /etc/rsyslog.conf 中配置远程发送

26.13 相关章节


小结:系统安全加固不是一次性工作,而是持续的过程。核心原则是纵深防御:用户权限(sudo/PAM)→ 文件系统(权限/完整性)→ 网络层(防火墙/fail2ban)→ 内核层(SELinux/AppArmor)→ 审计层(auditd/AIDE)。每个层级互不替代,层层叠加才能构建真正的防线。