5.17 项目实战:企业级服务器安全加固
预计阅读时间:22 分钟
📖 目录
第五编系统讲解了账户安全、SSH 安全、防火墙、SELinux、审计与入侵检测等单项技术。本项目将这些知识点串联成一个完整的安全加固流程,从零开始把一台"裸"服务器加固到企业安全基线水平。跟着做完,你会得到一套可复用的安全加固清单和自动化脚本。
学习目标
学完本章后,你将能够:
- 掌握企业级安全加固的完整流程:账户 → SSH → 防火墙 → SELinux → 审计 → 入侵检测
- 能够独立完成服务器安全基线配置,并通过 lynis 工具验证加固效果
- 理解安全加固各层面之间的依赖关系与优先级
- 建立可复用的安全加固清单,适用于新服务器上线前的安全评审
前置知识
在开始本项目之前,建议先掌握以下知识:
- 5.1:Linux 安全加固 Linux 安全加固——理解安全基线与攻击面的基本概念
- 2.2:配置文件与系统设置 进程管理——理解用户/权限模型
- 5.5:防火墙实战 防火墙实战——iptables/nftables 规则编写
- 5.6:SELinux 与 AppArmor SELinux——强制模式、布尔值与上下文管理
- 4.8:集中式日志管理 集中式日志管理——审计日志的采集与分析
安全加固概述
在开始具体操作之前,先了解安全加固的基本概念和原则。安全加固是一个系统性的工作,需要从多个层面进行防护:
安全原则
安全加固遵循三个核心原则:
- 最小权限原则:只授予完成工作所需的最小权限,多余的权限都是攻击面
- 纵深防御原则:不依赖单一安全措施,在多个层面部署防护
- 默认拒绝原则:默认拒绝所有访问,只显式允许需要的服务
攻击面分析
一台未加固的 Linux 服务器常见的攻击面:
| 攻击面 | 风险 | 加固层 |
|---|---|---|
| SSH 默认配置 | 暴力破解、弱密码 | 账户安全 + SSH 配置 |
| 开放端口 | 未授权服务访问 | 防火墙 |
| SELinux 未启用 | 进程逃逸后无约束 | SELinux |
| 缺少审计日志 | 入侵后无法取证 | 审计配置 |
| 缺少入侵检测 | 无法及时发现异常 | 入侵检测 |
加固策略
本项目按照从内到外的顺序逐步加固:
账户安全 → SSH 加固 → 防火墙 → SELinux → 审计 → 入侵检测 → 基线验证
│ │ │ │ │ │ │
禁用root 密钥认证 端口控制 强制模式 文件监控 文件完整性 lynis检查
sudo日志 限制用户 速率限制 布尔值 用户操作 后门检测 持续监控
第一步:账户安全加固
账户安全是系统安全的基础。通过加固账户安全,可以防止未经授权的访问和权限提升。主要包括禁用 root 远程登录、配置 sudo 日志、设置密码策略和账户锁定:
1.1 禁用 root 远程登录
攻击者最常见的攻击目标就是 root 账户。禁用 root 直接远程登录是最基本的加固措施。据统计,超过90%的SSH暴力破解攻击都是针对 root 账户的。
# 检查当前 SSH 配置中 root 登录状态
sudo grep -n "^PermitRootLogin" /etc/ssh/sshd_config
# 如果没有输出或值为 yes,需要修改
# 编辑 SSH 配置,禁用 root 远程登录
sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
# 验证修改结果
sudo grep "^PermitRootLogin" /etc/ssh/sshd_config
# 预期输出:PermitRootLogin no
# 重启 SSH 服务使配置生效
sudo systemctl restart sshd
1.2 配置 sudo 日志
记录所有 sudo 操作,方便审计追踪:
# 记录所有 sudo 操作到日志文件
sudo tee /etc/sudoers.d/logging <<'EOF'
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults iolog_dir="/var/log/sudo-io/%{user}"
EOF
sudo chmod 0440 /etc/sudoers.d/logging
sudo visudo -cf /etc/sudoers.d/logging
# 预期输出:parsed OK
# 查看 sudo 日志
sudo tail -f /var/log/sudo.log
1.3 密码策略
配置密码复杂度、过期时间和锁定策略。弱密码是最常见的安全漏洞之一,强密码策略可以有效防止暴力破解和字典攻击:
# 安装密码质量检查模块
sudo apt install -y libpam-pwquality # Ubuntu/Debian
sudo dnf install -y libpwquality # RHEL/Fedora(包名 libpwquality,非 pam pwquality)
# 配置密码复杂度要求
sudo tee /etc/security/pwquality.conf <<'EOF'
minlen = 14
ucredit = -1
lcredit = -1
dcredit = -1
ocredit = -1
maxrepeat = 3
remember = 5
difok = 3
EOF
# 配置密码过期策略
sudo tee -a /etc/login.defs <<'EOF'
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_MIN_LEN 14
PASS_WARN_AGE 14
EOF
# 对现有用户设置过期策略
sudo chage -M 90 -m 7 -W 14 $(whoami)
# 查看密码过期信息
sudo chage -l $(whoami)
# 预期输出:
# Last password change : Jul 15, 2026
# Password expires : Oct 13, 2026
# Minimum number of days between password change : 7
# Maximum number of days between password change : 90
# Number of days of warning before password expires : 14
1.4 账户锁定
配置连续登录失败后自动锁定账户,防止暴力破解攻击。当攻击者尝试多次错误密码后,账户将被临时锁定:
配置连续登录失败后自动锁定账户:
# 配置登录失败锁定(Ubuntu/Debian)
sudo tee /etc/pam.d/common-auth <<'EOF'
auth required pam_tally2.so onerr=fail deny=5 unlock_time=900
auth required pam_unix.so try_first_pass
auth optional pam_sss.so
EOF
# RHEL/Fedora 使用 pam_faillock
sudo tee /etc/pam.d/system-auth <<'EOF'
auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth sufficient pam_unix.so try_first_pass
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900
auth required pam_deny.so
account required pam_faillock.so
EOF
# 手动锁定/解锁账户
sudo passwd -l testuser # 锁定
sudo passwd -u testuser # 解锁
sudo faillock --user testuser # 查看失败次数
sudo faillock --user testuser --reset # 重置失败计数
1.5 禁用不必要的账户
禁用不需要的系统账户可以减少攻击面。同时设置安全的默认 umask,确保新创建的文件具有适当的权限:
# 查看所有可登录账户
grep -v '/nologin\|/false\|/sync\|/shutdown\|/halt' /etc/passwd
# 禁用不需要的系统账户(不要禁用关键系统账户)
sudo usermod -s /usr/sbin/nologin games
sudo usermod -s /usr/sbin/nologin gnats
# 设置安全的默认 umask
echo "umask 027" | sudo tee -a /etc/profile
第二步:SSH 安全配置
SSH 是远程管理 Linux 服务器的主要工具,也是最常见的攻击目标之一。通过配置 SSH 密钥认证、禁用密码登录和修改默认端口,可以大幅提升 SSH 服务的安全性:
2.1 生成密钥对
使用密钥认证替代密码认证,大幅提升 SSH 安全性。密钥认证比密码认证更安全,因为密钥的长度远大于密码,且不会在网络上传输:
# 在客户端生成密钥对(推荐 Ed25519 算法)
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/server_key
# 也可以使用 RSA 4096 位(兼容旧系统)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/server_key_rsa
# 查看生成的密钥
ls -la ~/.ssh/server_key*
# 预期输出:
# -rw------- 1 user user 464 Jul 15 10:00 server_key
# -rw------- 1 user user 100 Jul 15 10:00 server_key.pub
# 将公钥复制到服务器
ssh-copy-id -i ~/.ssh/server_key.pub user@server
# 输入密码后即可完成部署
# 验证密钥登录(应该无需密码即可登录)
ssh -i ~/.ssh/server_key user@server
2.2 配置 SSH 服务端
SSH 服务端配置是安全加固的关键环节。通过合理配置,可以大幅降低 SSH 服务被攻击的风险:
# 备份原始配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 创建安全的 SSH 配置
sudo tee /etc/ssh/sshd_config.d/hardened.conf <<'EOF'
Protocol 2
MaxAuthTries 3
LoginGraceTime 30
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
AllowUsers admin deployer
Port 22222
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
LogLevel VERBOSE
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
Banner /etc/ssh/banner.txt
EOF
# 创建登录警告 Banner
sudo tee /etc/ssh/banner.txt <<'EOF'
**************************************************************
* WARNING: Authorized access only! *
* All connections are monitored and recorded. *
**************************************************************
EOF
# 验证并重启 SSH
sudo sshd -t && sudo systemctl restart sshd
2.3 测试新配置
修改 SSH 配置后,务必进行测试以确保新配置正常工作。建议在新终端中测试,保持原终端连接不断开,以防配置错误导致无法连接:
# 在新终端测试新端口连接(保持原终端不要关闭)
ssh -p 22222 -i ~/.ssh/server_key user@server
# 测试密码登录是否被拒绝
ssh -p 22222 user@server
# 预期输出:Permission denied (publickey)
# 查看 SSH 日志
sudo journalctl -u sshd --since "5 minutes ago" --no-pager
# 预期会看到连接日志
第三步:防火墙配置
防火墙是网络安全的第一道防线,通过控制进出网络的流量来保护系统。配置防火墙可以阻止未授权的访问和恶意流量:
3.1 安装配置 nftables
nftables 是 iptables 的继任者,语法更清晰,性能更好。它提供了更强大的包过滤功能和更简洁的配置语法:
# 安装 nftables
sudo apt install -y nftables # Ubuntu/Debian
sudo dnf install -y nftables # RHEL/Fedora
# 启用并启动服务
sudo systemctl enable nftables
sudo systemctl start nftables
# 查看当前规则
sudo nft list ruleset
3.2 创建企业级规则集
企业级防火墙配置遵循默认拒绝原则,只显式允许必要的流量:
# 创建 nftables 配置文件
sudo tee /etc/nftables.conf <<'EOF'
#!/usr/sbin/nft -f
flush ruleset
define SSH_PORT = 22222
define TRUSTED_NETS = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif lo accept
ip protocol icmp limit rate 10/second burst 5 packets accept
ip saddr $TRUSTED_NETS tcp dport $SSH_PORT ct state new limit rate 5/minute accept
tcp dport { 80, 443 } ct state new accept
udp dport 53 accept
limit rate 5/minute burst 10 packets log prefix "[NFT-DROP] " counter drop
}
chain output {
type filter hook output priority filter; policy accept;
ct state established,related accept
oif lo accept
udp dport 53 accept
tcp dport { 80, 443 } accept
udp dport 123 accept
}
chain forward {
type filter hook forward priority filter; policy drop;
ct state established,related accept
}
}
EOF
sudo nft -c -f /etc/nftables.conf
sudo nft -f /etc/nftables.conf
sudo nft list ruleset
3.3 测试防火墙规则
配置防火墙后,需要测试规则是否正确生效。测试包括验证允许的连接是否正常,以及被拒绝的连接是否被正确拦截:
# 从外部测试 SSH 连接
ssh -p 22222 user@server
# 应该能正常连接
# 从外部测试被拒绝的端口
nc -zv server 23 2>&1
# 预期输出:Connection refused 或无响应
# 查看防火墙日志
sudo journalctl -k | grep NFT-DROP | tail -5
# 查看连接跟踪表
sudo conntrack -L | head -10
第四步:SELinux 配置
SELinux(Security-Enhanced Linux,安全增强型 Linux)是一个强制访问控制(MAC,Mandatory Access Control)系统,可以限制进程的权限,即使进程以 root 身份运行。启用 SELinux 可以有效防止进程逃逸和权限提升攻击:
4.1 检查并启用 SELinux
# 检查当前 SELinux 状态
getenforce
# 可能输出:Disabled、Permissive 或 Enforcing
# 如果是 Permissive,切换到 Enforcing
sudo setenforce 1
# 永久启用
sudo sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
# 验证
getenforce
# 预期输出:Enforcing
4.2 配置 SELinux 布尔值
SELinux 布尔值是 SELinux 策略的开关,可以快速启用或禁用特定的安全策略。通过配置布尔值,可以灵活地调整 SELinux 的行为:
# 查看所有布尔值
getsebool -a | head -20
# 启用常用布尔值
sudo setsebool -P httpd_can_network_connect on
sudo setsebool -P httpd_can_network_connect_db on
sudo setsebool -P ssh_sysadm_login on
# 查看与 Web 服务相关的布尔值
getsebool -a | grep httpd
4.3 处理 SELinux 拒绝
当 SELinux 拒绝某个操作时,会记录到审计日志中。通过分析这些拒绝日志,可以了解系统的行为并相应调整 SELinux 策略:
# 查看 SELinux 拒绝日志
sudo ausearch -m AVC -ts recent
# 分析拒绝原因
sudo ausearch -m AVC -ts recent | audit2why
# 生成并应用自定义策略模块
sudo ausearch -m AVC -ts recent | audit2allow -M my_httpd
sudo semodule -i my_httpd.pp
4.4 修复文件上下文
文件上下文是 SELinux 用于控制文件访问权限的标签。如果文件上下文不正确,即使权限设置正确,SELinux 也可能拒绝访问。通过修复文件上下文,可以确保 SELinux 正确控制文件访问:
# 查看文件的 SELinux 上下文
ls -Z /var/www/html/
# 修复不正确的上下文
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
sudo restorecon -Rv /data/www/
# 添加自定义端口标签
sudo semanage port -a -t http_port_t -p tcp 8080
第五步:审计配置
审计是安全监控的重要组成部分,通过记录系统活动来检测异常行为。配置审计可以追踪用户操作、文件访问和系统调用,为安全事件提供证据:
5.1 安装配置 auditd
auditd 是 Linux 的审计守护进程,负责记录系统调用和用户操作。它是系统安全审计的核心组件,可以记录文件访问、用户登录、权限变更等关键事件:
# 安装审计守护进程
sudo apt install -y auditd audispd-plugins # Ubuntu/Debian
sudo dnf install -y audit # RHEL/Fedora
# 启用并启动服务
sudo systemctl enable auditd
sudo systemctl start auditd
# 验证状态
sudo systemctl status auditd
# 预期输出:active (running)
5.2 创建审计规则
配置审计规则来监控关键系统文件和用户操作。审计规则定义了需要监控的文件、目录和系统调用,以及如何记录这些事件:
# 创建自定义审计规则
sudo tee /etc/audit/rules.d/hardening.rules <<'EOF'
-b 8192
-f 1
# 监控用户认证相关文件
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
# 监控 sudo 和 SSH 配置
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 监控 cron 配置
-w /etc/crontab -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /var/spool/cron/ -p wa -k cron
# 监控内核模块加载
-w /sbin/insmod -p x -k modules
-w /sbin/rmmod -p x -k modules
-w /sbin/modprobe -p x -k modules
# 监控文件删除和特权命令
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k file_delete
-a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k privilege_escalation
EOF
# 加载规则
sudo augenrules --load
sudo auditctl -l
5.3 查看审计日志
配置审计规则后,需要定期查看审计日志以发现异常行为。auditd 提供了多种工具来查询和分析审计日志:
# 实时监控审计日志
sudo tail -f /var/log/audit/audit.log
# 搜索特定事件
sudo ausearch -k identity --start today
sudo ausearch -k sudoers --start recent
sudo ausearch -k sshd_config --start recent
# 生成审计报告
sudo aureport --summary
# 预期输出:
# Summary Report
# =======================
# Range of time in logs: 2026-07-15 10:00:00.000000 - 2026-07-15 12:00:00.000000
# Total number of events: 1234
# 查看失败的登录尝试
sudo ausearch -m USER_LOGIN -sv no --start recent
# 查看 sudo 使用记录
sudo ausearch -k sudoers --start today | aureport -x
第六步:入侵检测
入侵检测是安全加固的最后一道防线,用于及时发现系统中的异常行为和潜在威胁。通过部署入侵检测工具,可以在攻击发生时及时告警:
6.1 安装 rkhunter(Rootkit 检测)
rkhunter(Rootkit Hunter)是一个广泛使用的rootkit检测工具,通过检查文件哈希、可疑文件和权限来发现系统中的后门和恶意软件:
# 安装 rkhunter
sudo apt install -y rkhunter # Ubuntu/Debian
sudo dnf install -y rkhunter # RHEL/Fedora
# 更新数据库
sudo rkhunter --update
# 运行检查
sudo rkhunter --check --sk
# 预期输出类似:
# [ Rootkit Hunter version 1.4.6 ]
# Checking file properties...
# Checking /usr/bin/awk... OK
# Checking /usr/bin/find... OK
# ...
# 查看检查报告
sudo grep -E "Warning|Found" /var/log/rkhunter.log
# 配置自动更新和扫描
sudo tee /etc/cron.daily/rkhunter <<'EOF'
#!/bin/bash
/usr/bin/rkhunter --update --quiet
/usr/bin/rkhunter --check --sk --report-warnings-only | mail -s "rkhunter Report" admin@example.com
EOF
sudo chmod +x /etc/cron.daily/rkhunter
6.2 安装 AIDE(文件完整性检测)
AIDE(Advanced Intrusion Detection Environment)是一个文件完整性检查工具,通过创建文件系统的快照来检测未授权的更改:
# 安装 AIDE
sudo apt install -y aide # Ubuntu/Debian
sudo dnf install -y aide # RHEL/Fedora
# 初始化数据库(首次运行)
sudo aideinit
# 预期输出:AIDE, AIDE database initialized.
# 将新数据库替换为当前数据库
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 运行检查
sudo aide --check
# 预期输出(首次检查应该没有变化):
# AIDE found no differences between database and filesystem.
# 配置定期检查
sudo tee /etc/cron.daily/aide <<'EOF'
#!/bin/bash
/usr/bin/aide --check | mail -s "AIDE Integrity Report" admin@example.com
EOF
sudo chmod +x /etc/cron.daily/aide
# 配置 AIDE 监控路径
sudo tee /etc/aide/aide.conf <<'EOF'
database_in=file:/var/lib/aide/aide.db
database_out=file:/var/lib/aide/aide.db.new
database_new=file:/var/lib/aide/aide.db.new
# 检查的目录和规则
/etc NORMAL
/bin NORMAL
/sbin NORMAL
/usr/bin NORMAL
/usr/sbin NORMAL
/boot NORMAL
/lib NORMAL
/lib64 NORMAL
# 排除频繁变化的目录
!/var/log
!/var/cache
!/tmp
!/proc
!/sys
!/dev
EOF
6.3 配置定期扫描
入侵检测需要持续进行。配置定期自动扫描,确保系统始终处于监控状态,及时发现安全问题:
# 创建综合安全扫描脚本
sudo tee /usr/local/bin/security-scan.sh <<'SCRIPT'
#!/bin/bash
# 企业安全扫描脚本
LOG_DIR="/var/log/security-scan"
DATE=$(date +%Y%m%d)
mkdir -p "$LOG_DIR"
echo "=== Security Scan Started: $(date) ===" | tee -a "$LOG_DIR/scan-$DATE.log"
# 1. rkhunter 检查
echo "[1/3] Running rkhunter..." | tee -a "$LOG_DIR/scan-$DATE.log"
rkhunter --check --sk --report-warnings-only 2>&1 | tee -a "$LOG_DIR/rkhunter-$DATE.log"
# 2. AIDE 完整性检查
echo "[2/3] Running AIDE..." | tee -a "$LOG_DIR/scan-$DATE.log"
aide --check 2>&1 | tee -a "$LOG_DIR/aide-$DATE.log"
# 3. 审计日志分析
echo "[3/3] Analyzing audit logs..." | tee -a "$LOG_DIR/scan-$DATE.log"
ausearch -k identity --start today 2>&1 | tee -a "$LOG_DIR/audit-$DATE.log"
echo "=== Security Scan Completed: $(date) ===" | tee -a "$LOG_DIR/scan-$DATE.log"
SCRIPT
sudo chmod +x /usr/local/bin/security-scan.sh
# 添加到 cron(每天凌晨 2 点执行)
echo "0 2 * * * root /usr/local/bin/security-scan.sh" | sudo tee /etc/cron.d/security-scan
第七步:安全基线检查
安全基线检查是验证加固效果的最后一步。通过使用专业工具如 lynis 进行全面的安全审计,可以发现系统中仍存在的安全问题:
7.1 安装运行 lynis
lynis 是一个全面的安全审计工具,可以自动检查系统的安全配置并给出改进建议。它会检查100多个安全项目并生成详细报告:
# 安装 lynis
sudo apt install -y lynis # Ubuntu/Debian
sudo dnf install -y lynis # RHEL/Fedora
# 运行安全审计
sudo lynis audit system --quick
# 预期输出类似:
# [+] Boot and services
# [+] Kernel
# [+] Memory and processes
# [+] Users, Groups and Authentication
# [+] Shells
# [+] File systems
# [+] Storage
# [+] NFS
# [+] Software: name services
# [+] Networking
# [+] Firewall
# [+] SSH Support
# [+] PHP
# [+] Hardening
# ...
# [+] Test: SSL certificate check
# 查看详细报告
sudo grep -E "RESULT|WARNING|SUGGESTION" /var/log/lynis.log
# 查看评分
sudo grep "Hardening index" /var/log/lynis.log
# 预期输出:[+] Hardening index : 67 [############# ]
7.2 分析并修复问题
lynis 检查完成后,会生成一份详细的报告,包括已通过的检查项、警告和改进建议。根据报告修复发现的问题,可以进一步提升系统安全性:
# 查看所有建议
sudo lynis show suggestions
# 预期输出类似:
# Suggestion: Set timeouts in /etc/ssh/sshd_config [SSH-7408]
# Suggestion: Enable auditd to improve security monitoring [ACCT-9628]
# 查看警告
sudo lynis show warnings
# 逐项修复建议的问题
# 修复 1:设置 SSH 超时
sudo sed -i 's/^#\?ClientAliveInterval.*/ClientAliveInterval 300/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?ClientAliveCountMax.*/ClientAliveCountMax 2/' /etc/ssh/sshd_config
# 修复 2:限制 core dumps
echo "* hard core 0" | sudo tee -a /etc/security/limits.conf
echo "fs.suid_dumpable = 0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 修复 3:配置密码掩码
echo "umask 027" | sudo tee -a /etc/profile
# 修复 4:确保 NTP 正在运行
sudo systemctl enable chronyd
sudo systemctl start chronyd
# 修复后重新检查
sudo lynis audit system --quick | grep "Hardening index"
验证加固效果
完成所有加固步骤后,需要进行综合验证,确保各项配置都已正确生效。通过编写验证脚本,可以自动化检查所有加固项目的状态:
8.1 综合验证测试
完成所有加固步骤后,需要进行全面的验证测试,确保各项配置都已正确生效:
# 创建验证脚本
cat > /tmp/verify-hardening.sh <<'VERIFY'
#!/bin/bash
echo "=== 安全加固验证 ==="
# 1. 验证 root 远程登录已禁用
echo -n "[1] Root SSH 登录: "
if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config; then
echo "✓ 已禁用"
else
echo "✗ 未禁用"
fi
# 2. 验证密码认证已禁用
echo -n "[2] 密码认证: "
if grep -q "^PasswordAuthentication no" /etc/ssh/sshd_config; then
echo "✓ 已禁用"
else
echo "✗ 未禁用"
fi
# 3. 验证 SSH 端口
echo -n "[3] SSH 端口: "
PORT=$(grep "^Port" /etc/ssh/sshd_config | awk '{print $2}')
echo "$PORT"
# 4. 验证防火墙状态
echo -n "[4] 防火墙: "
if sudo nft list ruleset | grep -q "policy drop"; then
echo "✓ 默认拒绝策略"
else
echo "✗ 未配置默认拒绝"
fi
# 5. 验证 SELinux 状态
echo -n "[5] SELinux: "
SELINUX=$(getenforce 2>/dev/null || echo "Disabled")
echo "$SELINUX"
# 6. 验证审计服务
echo -n "[6] 审计服务: "
if systemctl is-active auditd | grep -q "active"; then
echo "✓ 运行中"
else
echo "✗ 未运行"
fi
# 7. 验证密码策略
echo -n "[7] 密码最大有效期: "
grep "^PASS_MAX_DAYS" /etc/login.defs | awk '{print $2}'
# 8. 验证 lynis 评分
echo -n "[8] Lynis 评分: "
sudo lynis audit system --quick 2>&1 | grep "Hardening index" | awk -F: '{print $2}'
echo "=== 验证完成 ==="
VERIFY
chmod +x /tmp/verify-hardening.sh
sudo /tmp/verify-hardening.sh
8.2 自动化加固脚本
将所有加固步骤整合为一个可复用的自动化脚本,可以快速部署到新服务器上。这个脚本包含了本项目所有加固步骤的核心配置:
# 将所有加固步骤整合为可复用脚本
cat > /tmp/hardening-checklist.sh <<'CHECKLIST'
#!/bin/bash
# 企业安全加固清单
set -e
echo "开始安全加固..."
# 1. 账户安全
echo "[1/7] 配置账户安全..."
sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
# 2. SSH 加固
echo "[2/7] 加固 SSH..."
cat >> /etc/ssh/sshd_config.d/hardened.conf <<'SSHCONF'
PubkeyAuthentication yes
PasswordAuthentication no
Port 22222
SSHCONF
# 4. SELinux
echo "[4/7] 配置 SELinux..."
setenforce 1
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
# 5. 审计
echo "[5/7] 配置审计..."
systemctl enable auditd
systemctl start auditd
# 6. 入侵检测
echo "[6/7] 安装入侵检测..."
apt install -y rkhunter aide
aideinit
# 7. 验证
echo "[7/7] 验证加固效果..."
lynis audit system --quick
echo "加固完成!"
CHECKLIST
chmod +x /tmp/hardening-checklist.sh
echo "加固脚本已创建:/tmp/hardening-checklist.sh"
常见错误
在进行安全加固时,常见的错误和解决方案如下:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 禁用 root 登录后无法 SSH | 没有其他 sudo 用户 | 通过控制台登录创建 sudo 用户 |
| 防火墙配置后断开连接 | SSH 端口未在防火墙开放 | 先测试新端口再关闭旧端口 |
| SELinux 阻止服务启动 | 文件上下文不正确 | 使用 restorecon 或 audit2allow |
| auditd 日志洪泛 | 规则过于宽泛 | 缩小监控范围,使用 -k 过滤 |
| lynis 建议太多无法全部修复 | 安全与便利的权衡 | 优先修复高风险项 |
| 密码策略导致用户无法修改密码 | 密码历史记录太长 | 调整 remember 参数 |
最佳实践
遵循以下最佳实践可以确保安全加固工作的有效性和持续性:
- 渐进式加固:一次修改一个层面,验证后再继续下一个
- 保留回退方案:修改 SSH 或防火墙前保持原终端连接不断
- 记录变更:每次加固操作都记录到变更日志中
- 定期审计:每周运行 lynis 检查,每月运行完整安全扫描
- 最小权限:只开放必要的端口和权限,其余全部拒绝
- 监控告警:对关键安全事件配置实时告警
练习题
通过以下练习巩固本项目所学知识:
- 完成本文所有加固步骤,记录 lynis 评分从加固前到加固后的变化。
- 编写一个 Ansible Playbook 实现自动化的安全加固部署。
- 尝试绕过你配置的防火墙规则,分析哪些攻击可以被拦截,哪些不能。
- 配置 SELinux 策略让一个自定义 Web 服务在强制模式下正常运行。
- 设置一个集中式审计日志服务器,收集多台服务器的审计事件。
学习检查点
学完本章后,请检验自己是否掌握以下内容:
| 检查项 | 自测问题 | 验证方法 |
|---|---|---|
| 概念理解 | 能用自己的话解释服务器安全加固的层次和各措施的防护目标 | 尝试向他人讲解 |
| 命令操作 | 能不查文档完成 SSH 加固、防火墙配置和审计日志设置 | 在终端实际执行 |
| 原理掌握 | 能说出安全加固措施的纵深防御原理和最小权限原则 | 画出流程图 |
| 故障排查 | 能独立排查加固措施导致服务无法正常运行的问题 | 模拟故障并修复 |
| 最佳实践 | 能说明为什么需要使用 lynis 等工具进行安全基线验证 | 对比不同方案 |
本章总结
本项目通过七个步骤完成了企业级服务器安全加固:从账户安全到 SSH 加固,从防火墙到 SELinux,从审计日志到入侵检测,最后通过 lynis 进行安全基线验证。这套加固流程是可复用的——新服务器上线前,按照这个清单逐项检查,就能快速达到企业安全基线要求。安全加固不是一次性的工作,而是持续的过程,需要定期审计和更新。通过本项目的学习,你应该能够独立完成Linux服务器的安全加固工作,并建立起完善的安全防护体系。
延伸阅读
以下资源可以帮助你深入了解 Linux 安全加固的更多内容:
- CIS Benchmarks:https://www.cisecurity.org/cis-benchmarks/——各操作系统和应用的安全配置基线
- NIST SP 800-123:https://csrc.nist.gov/publications/detail/sp/800-123/final——服务器安全指南
- DISA STIGs:https://public.cyber.mil/stigs/——美国国防部安全技术实施指南
- Linux Security Cookbook:O'Reilly 出版,Linux 安全实战参考