Skip to content

安全加固清单 — CIS Benchmark 与基线核查

Published:
22 min read

安全加固是将系统从默认的”开箱即用”状态调整为符合安全最佳实践的状态。许多安全事件的根本原因并非零日漏洞,而是系统配置不当——默认密码未修改、不必要的服务暴露、过于宽松的权限设置。CIS Benchmark(互联网安全中心基准)提供了一套业界公认的安全配置标准,本文将以此为核心,结合 Linux 和 Windows 的具体加固操作,以及 Lynis 和 OpenSCAP 等自动化工具,构建一份系统化的安全加固清单。

安全基线概念

安全基线(Security Baseline)是指一组经过验证的最低安全配置要求,用于确保系统在部署和运行过程中达到可接受的安全水平。

安全基线的核心价值:

安全基线的制定通常参考行业标准(如 CIS Benchmark)并结合组织自身的业务场景和风险偏好进行裁剪。

CIS Benchmark 详解

CIS(Center for Internet Security)是一个全球性的非营利组织,其发布的 CIS Benchmark 覆盖了操作系统、数据库、云平台、网络设备、中间件等 100 多类 IT 产品的安全配置建议。

评分机制

CIS Benchmark 中的每一条配置建议都标注了评分状态(Scored/Not Scored):

Level 1 与 Level 2

级别描述适用场景
Level 1基础安全加固。实施后对系统功能和性能影响极小,适用于所有系统所有生产环境必须满足
Level 2深度安全加固。可能影响系统便利性或性能,适用于高安全要求环境金融、政务、涉密系统

CIS Benchmark 文档获取

# CIS Benchmark PDF 文档可从官方网站免费下载(需注册)
# https://www.cisecurity.org/cis-benchmarks

# 常用的 Benchmark 包括:
# - CIS Red Hat Enterprise Linux 8/9 Benchmark
# - CIS Ubuntu Linux 22.04/24.04 LTS Benchmark
# - CIS Microsoft Windows Server 2019/2022 Benchmark
# - CIS Microsoft Windows 11 Enterprise Benchmark
# - CIS Docker Benchmark
# - CIS Kubernetes Benchmark

Linux 安全加固

SSH 加固

SSH 是 Linux 服务器最常用的远程管理入口,也是暴力破解攻击的首要目标。

# === SSH 安全加固配置 ===
# 编辑 /etc/ssh/sshd_config

# 1. 禁止 root 直接 SSH 登录
PermitRootLogin no

# 2. 使用密钥认证,禁用密码认证
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no

# 3. 修改默认端口(降低自动化扫描命中率)
Port 22222

# 4. 限制 SSH 协议版本
Protocol 2

# 5. 设置登录超时和最大尝试次数
LoginGraceTime 60
MaxAuthTries 3
MaxSessions 5

# 6. 禁止空密码登录
PermitEmptyPasswords no

# 7. 限制允许 SSH 登录的用户
AllowUsers admin deployer
# 或限制允许的用户组
AllowGroups ssh-users

# 8. 禁用不安全的认证方式
HostbasedAuthentication no
IgnoreRhosts yes

# 9. 配置 SSH 空闲超时断开
ClientAliveInterval 300
ClientAliveCountMax 2

# 10. 禁用 X11 转发和 Agent 转发
X11Forwarding no
AllowAgentForwarding no

# 11. 配置加密算法(禁用弱算法)
Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512

# 12. 启用日志记录
LogLevel VERBOSE

# 应用配置
sudo systemctl restart sshd
# === 配置 Fail2Ban 防暴力破解 ===
sudo apt install fail2ban   # Debian/Ubuntu
sudo yum install fail2ban   # RHEL/CentOS

# 创建自定义配置
sudo tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport

[sshd]
enabled = true
port = 22222
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
EOF

sudo systemctl enable fail2ban
sudo systemctl restart fail2ban

# 查看封禁状态
sudo fail2ban-client status sshd

内核参数调优

# === 安全相关的内核参数优化 ===
# 编辑 /etc/sysctl.conf 或创建 /etc/sysctl.d/99-security.conf

sudo tee /etc/sysctl.d/99-security.conf << 'EOF'
# 禁用 IP 转发(非路由器/网关设备)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# 禁用 ICMP 重定向接受(防止路由劫持)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# 禁止发送 ICMP 重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 启用源路由验证(防 IP 欺骗)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 忽略 ICMP 广播请求(防 Smurf 攻击)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 记录可疑的 Martian 数据包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# 启用 SYN Cookie(防 SYN Flood)
net.ipv4.tcp_syncookies = 1

# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# 限制核心转储(防止敏感数据泄露)
fs.suid_dumpable = 0

# 启用 ASLR(地址空间布局随机化)
kernel.randomize_va_space = 2

# 限制对 dmesg 的访问
kernel.dmesg_restrict = 1

# 限制对内核指针的暴露
kernel.kptr_restrict = 2
EOF

# 应用配置
sudo sysctl -p /etc/sysctl.d/99-security.conf

文件权限加固

# === 关键文件权限加固 ===

# 确保 /etc/passwd 权限正确
chmod 644 /etc/passwd
chown root:root /etc/passwd

# 确保 /etc/shadow 只有 root 可读
chmod 600 /etc/shadow
chown root:root /etc/shadow

# 确保 /etc/group 权限正确
chmod 644 /etc/group
chown root:root /etc/group

# 确保 /etc/gshadow 权限正确
chmod 600 /etc/gshadow
chown root:root /etc/gshadow

# 确保 cron 配置文件权限
chmod 600 /etc/crontab
chown root:root /etc/crontab
chmod 700 /etc/cron.d
chmod 700 /etc/cron.daily
chmod 700 /etc/cron.hourly
chmod 700 /etc/cron.weekly
chmod 700 /etc/cron.monthly

# 确保 SSH 配置文件权限
chmod 600 /etc/ssh/sshd_config
chown root:root /etc/ssh/sshd_config

# 查找并修复全局可写文件(不包含临时目录)
find / -xdev -type f -perm -0002 -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null

# 查找无属主或无属组的文件
find / -xdev \( -nouser -o -nogroup \) -not -path "/proc/*" -ls 2>/dev/null

# 禁止非授权用户查看其他用户的 home 目录
chmod 750 /home/*

# 设置 umask 为 027(限制新建文件的默认权限)
echo "umask 027" >> /etc/profile
echo "umask 027" >> /etc/bashrc

账户与密码策略

# === 密码策略加固 ===

# 设置密码最大有效期(90天)
sudo sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS   90/' /etc/login.defs

# 设置密码最小有效期(1天,防止快速循环修改)
sudo sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS   1/' /etc/login.defs

# 设置密码最小长度(12位)
sudo sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN    12/' /etc/login.defs

# 设置密码过期前警告天数
sudo sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE   14/' /etc/login.defs

# 安装密码复杂度检查模块
sudo apt install libpam-pwquality   # Debian/Ubuntu
sudo yum install pam_pwquality      # RHEL/CentOS

# 配置密码复杂度(/etc/security/pwquality.conf)
sudo tee /etc/security/pwquality.conf << 'EOF'
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
minclass = 3
maxrepeat = 3
maxclassrepeat = 4
EOF

# 锁定长期不活动的账户(超过30天未登录自动锁定)
sudo useradd -D -f 30

# 禁用不需要的系统账户
for user in games ftp news; do
    sudo usermod -L -s /sbin/nologin "${user}" 2>/dev/null
done

Windows 安全加固

组策略配置

Windows 系统加固主要通过组策略(Group Policy)和本地安全策略实现。

# === 通过 PowerShell 配置安全策略 ===

# 1. 配置账户锁定策略
# 账户锁定阈值:5次失败后锁定
net accounts /lockoutthreshold:5
# 账户锁定持续时间:30分钟
net accounts /lockoutduration:30
# 锁定计数器重置时间:30分钟
net accounts /lockoutwindow:30

# 2. 配置密码策略
# 密码最小长度:12字符
net accounts /minpwlen:12
# 密码最大有效期:90天
net accounts /maxpwage:90
# 密码最小有效期:1天
net accounts /minpwage:1
# 密码历史记录:24个(防止重复使用旧密码)
net accounts /uniquepw:24

# 3. 查看当前账户策略
net accounts

审计策略配置

# === 配置高级审计策略 ===

# 启用登录事件审计(成功和失败)
auditpol /set /subcategory:"Logon" /success:enable /failure:enable

# 启用登录失败审计
auditpol /set /subcategory:"Account Lockout" /failure:enable

# 启用特权使用审计
auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable

# 启用进程创建审计
auditpol /set /subcategory:"Process Creation" /success:enable

# 启用对象访问审计
auditpol /set /subcategory:"File System" /success:enable /failure:enable

# 启用策略更改审计
auditpol /set /subcategory:"Audit Policy Change" /success:enable /failure:enable

# 启用账户管理审计
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable
auditpol /set /subcategory:"Security Group Management" /success:enable /failure:enable

# 启用 PowerShell 脚本块日志
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" `
    -Name "EnableScriptBlockLogging" -Value 1 -PropertyType DWORD -Force

# 启用进程命令行记录
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" `
    -Name "ProcessCreationIncludeCmdLine_Enabled" -Value 1 -PropertyType DWORD -Force

# 查看当前审计策略
auditpol /get /category:*

服务与功能加固

# === 禁用不必要的服务 ===

# 禁用远程注册表服务
Set-Service -Name RemoteRegistry -StartupType Disabled
Stop-Service -Name RemoteRegistry -Force -ErrorAction SilentlyContinue

# 禁用 Telnet 服务(如已安装)
Set-Service -Name TlntSvr -StartupType Disabled -ErrorAction SilentlyContinue

# 禁用 Windows Remote Management(如不需要)
# Set-Service -Name WinRM -StartupType Disabled

# 禁用 NetBIOS over TCP/IP(减少攻击面)
$adapters = Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.IPEnabled}
foreach ($adapter in $adapters) {
    $adapter.SetTcpipNetbios(2)  # 2 = 禁用
}

# 禁用 SMBv1(安全风险极高)
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force

# 配置 Windows 防火墙默认策略
Set-NetFirewallProfile -Profile Domain,Public,Private -DefaultInboundAction Block
Set-NetFirewallProfile -Profile Domain,Public,Private -DefaultOutboundAction Allow

# 启用 Windows Defender 实时保护
Set-MpPreference -DisableRealtimeMonitoring $false
Set-MpPreference -DisableBehaviorMonitoring $false
Set-MpPreference -DisableIOAVProtection $false

# 配置 Windows Defender 扫描策略
Set-MpPreference -ScanScheduleDay Everyday
Set-MpPreference -SignatureUpdateInterval 4

用户权限加固

# === 用户权限加固 ===

# 重命名 Administrator 账户(增加攻击难度)
Rename-LocalUser -Name "Administrator" -NewName "LocalSysAdmin"

# 禁用 Guest 账户
Disable-LocalUser -Name "Guest"

# 查看本地管理员组成员(应最小化)
Get-LocalGroupMember -Group "Administrators"

# 移除不必要的管理员组成员
# Remove-LocalGroupMember -Group "Administrators" -Member "UserToRemove"

# 配置 UAC 级别为最高
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" `
    -Name "ConsentPromptBehaviorAdmin" -Value 2
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" `
    -Name "EnableLUA" -Value 1

# 禁止在锁屏界面显示上次登录用户名
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" `
    -Name "DontDisplayLastUserName" -Value 1

自动化基线核查工具

Lynis — Linux 安全审计利器

Lynis 是一款轻量级、功能强大的 Linux/Unix 安全审计工具,可以检查系统配置、软件补丁、文件权限等数百项安全指标。

# === Lynis 安装与使用 ===

# 方式一:通过包管理器安装
sudo apt install lynis              # Debian/Ubuntu
sudo yum install lynis              # RHEL/CentOS(需 EPEL 源)

# 方式二:从 Git 仓库获取最新版
cd /opt
sudo git clone https://github.com/CISOfy/lynis.git
cd lynis

# 执行系统审计
sudo lynis audit system

# 执行快速扫描(跳过等待输入)
sudo lynis audit system --quick

# 只检查特定类别
sudo lynis audit system --tests-from-group "firewalls"
sudo lynis audit system --tests-from-group "authentication"
sudo lynis audit system --tests-from-group "networking"

# 查看可用的测试组
sudo lynis show groups

# 生成详细报告
sudo lynis audit system --quick --auditor "Security Team" 2>&1 | tee /tmp/lynis_report.txt

# 查看上次扫描报告
sudo cat /var/log/lynis-report.dat

# 查看建议列表
sudo grep "suggestion\[\]" /var/log/lynis-report.dat

Lynis 报告分析要点:

OpenSCAP — 合规性自动化评估

OpenSCAP 是 NIST 认证的安全合规自动化评估工具,支持 SCAP(Security Content Automation Protocol)标准。

# === OpenSCAP 安装与使用 ===

# 安装 OpenSCAP 及 SCAP 安全指南
sudo apt install openscap-scanner scap-security-guide    # Debian/Ubuntu
sudo yum install openscap-scanner scap-security-guide     # RHEL/CentOS

# 查看可用的 SCAP 内容
ls /usr/share/xml/scap/ssg/content/

# 查看可用的安全配置文件(Profile)
oscap info /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml

# 执行 CIS Level 1 基线核查(以 Ubuntu 22.04 为例)
sudo oscap xccdf eval \
    --profile xccdf_org.ssgproject.content_profile_cis_level1_server \
    --results /tmp/oscap_results.xml \
    --report /tmp/oscap_report.html \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml

# 执行 CIS Level 2 基线核查
sudo oscap xccdf eval \
    --profile xccdf_org.ssgproject.content_profile_cis_level2_server \
    --results /tmp/oscap_results_l2.xml \
    --report /tmp/oscap_report_l2.html \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml

# RHEL/CentOS 核查
sudo oscap xccdf eval \
    --profile xccdf_org.ssgproject.content_profile_cis \
    --results /tmp/oscap_results.xml \
    --report /tmp/oscap_report.html \
    /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml

# 生成修复脚本(基于检查结果自动生成 Bash 修复脚本)
sudo oscap xccdf generate fix \
    --fix-type bash \
    --result-id "" \
    /tmp/oscap_results.xml > /tmp/remediation.sh

# 生成 Ansible Playbook 修复方案
sudo oscap xccdf generate fix \
    --fix-type ansible \
    --result-id "" \
    /tmp/oscap_results.xml > /tmp/remediation.yml

加固检查清单汇总

以下是一份综合性的安全加固检查清单,涵盖 Linux 和 Windows 核心加固项:

Linux 加固检查清单

序号检查项CIS级别状态
1确保 SSH root 登录已禁用L1[ ]
2确保 SSH 使用密钥认证L1[ ]
3确保密码最小长度 ≥ 12L1[ ]
4确保密码复杂度策略已配置L1[ ]
5确保 Fail2Ban 或类似方案已部署L1[ ]
6确保系统时间同步(NTP)已配置L1[ ]
7确保 iptables/nftables 防火墙已启用L1[ ]
8确保不必要的服务已禁用L1[ ]
9确保内核安全参数已优化L1[ ]
10确保文件权限符合最小权限原则L1[ ]
11确保日志审计已启用(auditd)L2[ ]
12确保 SELinux/AppArmor 已启用L2[ ]
13确保无空密码账户L1[ ]
14确保 SUID/SGID 文件已审查L1[ ]
15确保自动安全更新已配置L1[ ]

Windows 加固检查清单

序号检查项CIS级别状态
1确保账户锁定策略已配置L1[ ]
2确保密码策略符合要求L1[ ]
3确保 SMBv1 已禁用L1[ ]
4确保 Windows 防火墙已启用L1[ ]
5确保审计策略已全面配置L1[ ]
6确保 UAC 已启用且级别适当L1[ ]
7确保 Guest 账户已禁用L1[ ]
8确保 Administrator 已重命名L1[ ]
9确保 PowerShell 日志已启用L1[ ]
10确保 Windows Defender 已启用L1[ ]
11确保远程注册表服务已禁用L1[ ]
12确保 Windows Update 已配置L1[ ]
13确保 BitLocker 磁盘加密已启用L2[ ]
14确保 Credential Guard 已启用L2[ ]
15确保 AppLocker/WDAC 已配置L2[ ]

快速核查脚本

#!/bin/bash
# Linux 安全基线快速核查脚本

echo "========================================="
echo "  Linux Security Baseline Quick Check"
echo "  $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================="

PASS=0
FAIL=0
WARN=0

check() {
    local description="$1"
    local result="$2"
    if [ "$result" = "PASS" ]; then
        echo -e "[\033[32mPASS\033[0m] $description"
        ((PASS++))
    elif [ "$result" = "FAIL" ]; then
        echo -e "[\033[31mFAIL\033[0m] $description"
        ((FAIL++))
    else
        echo -e "[\033[33mWARN\033[0m] $description"
        ((WARN++))
    fi
}

# 1. SSH root 登录检查
if grep -qE "^PermitRootLogin\s+no" /etc/ssh/sshd_config 2>/dev/null; then
    check "SSH root login disabled" "PASS"
else
    check "SSH root login disabled" "FAIL"
fi

# 2. 密码认证检查
if grep -qE "^PasswordAuthentication\s+no" /etc/ssh/sshd_config 2>/dev/null; then
    check "SSH password authentication disabled" "PASS"
else
    check "SSH password authentication disabled" "WARN"
fi

# 3. 空密码账户检查
EMPTY_PW=$(sudo awk -F: '$2=="" {print $1}' /etc/shadow 2>/dev/null)
if [ -z "$EMPTY_PW" ]; then
    check "No empty password accounts" "PASS"
else
    check "No empty password accounts (found: $EMPTY_PW)" "FAIL"
fi

# 4. UID 0 账户检查
ROOT_ACCOUNTS=$(awk -F: '$3==0 {print $1}' /etc/passwd | grep -v "^root$")
if [ -z "$ROOT_ACCOUNTS" ]; then
    check "No non-root UID 0 accounts" "PASS"
else
    check "No non-root UID 0 accounts (found: $ROOT_ACCOUNTS)" "FAIL"
fi

# 5. 防火墙检查
if systemctl is-active --quiet firewalld 2>/dev/null || \
   systemctl is-active --quiet ufw 2>/dev/null || \
   iptables -L -n 2>/dev/null | grep -q "Chain INPUT"; then
    check "Firewall is active" "PASS"
else
    check "Firewall is active" "FAIL"
fi

# 6. SELinux/AppArmor 检查
if getenforce 2>/dev/null | grep -qE "Enforcing|Permissive"; then
    check "SELinux is enabled" "PASS"
elif aa-status 2>/dev/null | grep -q "profiles are loaded"; then
    check "AppArmor is enabled" "PASS"
else
    check "SELinux/AppArmor is enabled" "WARN"
fi

# 7. IP 转发检查
if [ "$(sysctl -n net.ipv4.ip_forward 2>/dev/null)" = "0" ]; then
    check "IP forwarding disabled" "PASS"
else
    check "IP forwarding disabled" "FAIL"
fi

# 8. /etc/shadow 权限检查
SHADOW_PERM=$(stat -c "%a" /etc/shadow 2>/dev/null)
if [ "$SHADOW_PERM" = "600" ] || [ "$SHADOW_PERM" = "640" ] || [ "$SHADOW_PERM" = "0" ]; then
    check "/etc/shadow permissions ($SHADOW_PERM)" "PASS"
else
    check "/etc/shadow permissions ($SHADOW_PERM)" "FAIL"
fi

# 9. 自动更新检查
if systemctl is-enabled --quiet unattended-upgrades 2>/dev/null || \
   systemctl is-enabled --quiet dnf-automatic 2>/dev/null; then
    check "Automatic security updates enabled" "PASS"
else
    check "Automatic security updates enabled" "WARN"
fi

# 10. NTP 时间同步检查
if systemctl is-active --quiet chronyd 2>/dev/null || \
   systemctl is-active --quiet systemd-timesyncd 2>/dev/null || \
   systemctl is-active --quiet ntpd 2>/dev/null; then
    check "NTP time sync is active" "PASS"
else
    check "NTP time sync is active" "FAIL"
fi

echo ""
echo "========================================="
echo "  Results: PASS=$PASS  FAIL=$FAIL  WARN=$WARN"
echo "  Total checks: $((PASS + FAIL + WARN))"
echo "========================================="

安全建议与防御措施

  1. 基线先行:在系统上线前完成安全基线配置,将加固嵌入部署流程而非事后补救
  2. 自动化核查:使用 Lynis、OpenSCAP 等工具定期自动化检查基线合规状态
  3. 配置即代码:将安全配置纳入 Ansible、Puppet 或 Chef 等配置管理工具,确保一致性和可追溯性
  4. 持续监控:部署文件完整性监控(FIM)工具,检测未授权的配置变更
  5. 定期审查:每季度审查安全基线标准,根据新的威胁和漏洞及时更新
  6. 分层加固:从网络边界、操作系统、中间件到应用程序,逐层实施安全加固

总结

安全加固是纵深防御体系中最基础也是最重要的一环。CIS Benchmark 为我们提供了全面、专业的安全配置基准,结合 Lynis 和 OpenSCAP 等自动化工具,可以高效地完成基线核查和持续合规监控。安全加固不是一次性的项目,而是需要持续迭代的过程——随着业务变化、新漏洞发现和合规要求更新,安全基线也需要不断演进。将安全加固融入 DevSecOps 流程,在系统构建阶段就植入安全基因,才是实现长效安全运营的正确路径。