适用场景
安全基线检查是服务器安全管理的起点。本文以 Linux 安全基线检查 为核心,提供一套可一键运行的审计脚本,自动检查 SSH 配置、账号权限、文件权限、内核网络参数、防火墙与软件更新等关键项,并输出合规/不合规报告,适用于服务器上线前检查、等保 2.0 合规测评与日常安全巡检。
前置条件
- Linux 发行版:CentOS 7/8、RHEL、Ubuntu 20.04+、Debian 11+
- 需要 root 权限执行检查命令
- bash 4.0 及以上
原理说明
安全基线检查基于配置合规基准:把安全运维的最佳实践固化为检查规则,逐项比对服务器当前配置与基准值,输出“合规/不合规/风险”三态结果。常见检查维度包括:
- SSH 安全:禁止 root 直接登录、启用密钥认证、修改默认端口
- 账号与权限:空口令账号、UID=0 高危账号、敏感文件权限
- 内核与网络:IP 转发、SYN Cookies、反向路径过滤等参数
- 服务与补丁:高危服务暴露、安全更新状态
脚本将每一项检查封装为函数,统一输出格式,便于扩展与归档。
操作步骤
第一步:创建审计目录与脚本文件
mkdir -p /opt/security-audit
vim /opt/security-audit/baseline_check.sh
第二步:编写基线检查脚本(核心代码)
#!/bin/bash
# /opt/security-audit/baseline_check.sh - Linux 安全基线检查脚本
PASS=0; FAIL=0; WARN=0
report() { # $1=状态 $2=检查项 $3=说明
case "$1" in
PASS) echo "[PASS] $2"; PASS=$((PASS+1));;
FAIL) echo "[FAIL] $2 - $3"; FAIL=$((FAIL+1));;
WARN) echo "[WARN] $2 - $3"; WARN=$((WARN+1));;
esac
}
# 1. SSH 配置检查
root_login=$(grep -E '^PermitRootLogin' /etc/ssh/sshd_config | awk '{print $2}')
[ "$root_login" = "no" ] && report PASS "SSH 禁止 root 登录" || report FAIL "SSH 禁止 root 登录" "当前值: ${root_login:-未设置}"
pwd_auth=$(grep -E '^PasswordAuthentication' /etc/ssh/sshd_config | awk '{print $2}')
[ "$pwd_auth" = "no" ] && report PASS "SSH 仅密钥认证" || report WARN "SSH 仅密钥认证" "当前值: ${pwd_auth:-未设置}"
# 2. 账号安全检查
empty_pwd=$(awk -F: '($2==""){print $1}' /etc/shadow)
[ -z "$empty_pwd" ] && report PASS "无空口令账号" || report FAIL "无空口令账号" "存在: $empty_pwd"
uid0=$(awk -F: '($3==0){print $1}' /etc/passwd | grep -v '^root$')
[ -z "$uid0" ] && report PASS "无 UID=0 非 root 账号" || report FAIL "UID=0 账号" "存在: $uid0"
# 3. 文件权限检查
perm=$(stat -c %a /etc/shadow)
[ "$perm" = "640" -o "$perm" = "600" ] && report PASS "/etc/shadow 权限合规" || report FAIL "/etc/shadow 权限" "当前: $perm"
# 4. 内核网络参数检查
syn=$(sysctl -n net.ipv4.tcp_syncookies)
[ "$syn" = "1" ] && report PASS "SYN Cookies 已开启" || report FAIL "SYN Cookies" "当前值: $syn"
fwd=$(sysctl -n net.ipv4.ip_forward)
[ "$fwd" = "0" ] && report PASS "IP 转发已关闭" || report WARN "IP 转发" "当前值: $fwd (路由场景可忽略)"
# 5. 防火墙启用检查
fw=0
command -v firewalld >/dev/null && systemctl is-active firewalld 2>/dev/null | grep -q active && fw=1
command -v ufw >/dev/null && ufw status 2>/dev/null | grep -q active && fw=1
[ $fw -eq 1 ] && report PASS "防火墙已启用" || report WARN "防火墙已启用" "firewalld/ufw 均未运行"
# 6. 安全更新检查
up=0
command -v yum >/dev/null && up=$(yum -q check-update 2>/dev/null | grep -c '^[a-z]')
command -v apt >/dev/null && up=$(apt list --upgradable 2>/dev/null | grep -c upgradable)
[ "${up:-0}" -gt 0 ] && report WARN "系统更新" "有 ${up} 个软件包待更新" || report PASS "系统更新"
# 7. 全局可写文件检查
ww=$(find / -xdev -type f -perm -0002 2>/dev/null | head -5)
[ -z "$ww" ] && report PASS "无全局可写文件" || report WARN "全局可写文件" "$ww"
echo "----------------------------------------"
echo "检查完成: PASS=$PASS FAIL=$FAIL WARN=$WARN"
第三步:执行检查并生成报告
chmod +x /opt/security-audit/baseline_check.sh
bash /opt/security-audit/baseline_check.sh | tee /opt/security-audit/report_$(date +%F).log
配置验证
脚本输出应类似:
[PASS] SSH 禁止 root 登录
[FAIL] SSH 仅密钥认证 - 当前值: yes
[WARN] 防火墙已启用 - firewalld/ufw 均未运行
----------------------------------------
检查完成: PASS=6 FAIL=2 WARN=3
针对 FAIL/WARN 项执行加固:修改 /etc/ssh/sshd_config 后执行 systemctl restart sshd,再次运行脚本确认对应项变为 PASS;报告文件建议归档留存,作为等保测评的审计证据。
常见问题
Q1:检查脚本会不会影响线上业务?
不会。本脚本全部为只读检查,仅执行 grep、stat、sysctl、find 等查询命令,不修改任何配置。唯一可能产生少量 IO 的是 find 全局扫描,建议在业务低峰期执行。
Q2:某些检查项不符合业务场景怎么办?
基线检查支持“豁免”:例如路由器/网关主机必须开启 IP 转发。可将脚本中对应检查的 FAIL 改为 WARN,或维护一个 exclude.conf 文件记录豁免项并在报告中注明豁免原因,确保审计可追溯。
Q3:如何批量检查多台服务器?
借助 Ansible 批量下发:将脚本放入 playbook 的 files 目录,用 copy 模块分发后通过 shell 模块执行并取回日志;也可配合 gather_facts 将检查结果统一汇总到控制端。
总结
安全基线检查是安全运维的常态化动作。本文提供的一键式 Linux 安全基线检查 脚本覆盖 SSH、账号、权限、内核参数、防火墙、补丁六大类核心检查项,输出可归档的合规报告,配合 Ansible 可扩展到数百台服务器的批量审计。建议每月执行一次,并在每次重大配置变更后重新检查,防止“配置漂移”引入安全风险。