Linux 安全实战:防火墙配置 + 漏洞修复(符合企业合规标准)
一、企业级防火墙配置实战
Linux 防火墙基于内核态 netfilter 框架,用户态常用工具分为三类:firewalld(动态管理,推荐生产环境)、iptables(经典工具,规则灵活)、nftables(新一代框架,性能更优)。合规配置核心要求:默认拒绝所有入站/转发流量、仅开放业务必需端口、启用审计日志、规则持久化、定期审计。
1. 合规前提准备
先清理无用服务,减少攻击面,再确认防火墙工具状态:
# 停止并禁用不必要网络服务(如rpcbind、telnet、vsftpd)
systemctl stop rpcbind telnet vsftpd
systemctl disable rpcbind telnet vsftpd
# 优先启用firewalld(CentOS/RHEL 7+、Debian/Ubuntu 20.04+)
systemctl enable --now firewalld
systemctl status firewalld # 验证状态为active(running)
2. firewalld 企业级合规配置(推荐)
firewalld 基于“区域(zone)”管理规则,public 区域默认策略严格,适合公网服务器,支持动态加载规则不中断业务。
(1)核心合规原则
- 入站规则:默认拒绝(drop),仅开放业务必需端口/服务;
- 出站规则:默认允许,可按需限制敏感流量(如恶意IP访问);
- 日志审计:记录所有被拒绝流量,支撑安全事件追溯;
- 规则持久化:写入配置文件,避免重启后失效。
(2)实战配置步骤(Web服务器示例)
配置目标 | 命令操作 | 合规说明 |
设置默认拒绝策略 | firewall-cmd --set-default-zone=public --permanent
firewall-cmd --zone=public --set-target=DROP --permanent | 遵循最小权限,阻断所有未授权入站流量 |
开放业务必需端口 | firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent | 仅开放HTTP/HTTPS,避免多余攻击面 |
限制SSH仅内网访问 | firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept' --permanent | 防止暴力破解,等保2.0明确要求 |
启用拒绝流量日志 | firewall-cmd --set-log-denied=all --permanent | 日志存储于/var/log/firewalld,支持审计追溯 |
基础DDoS防护 | firewall-cmd --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port=80 protocol=tcp limit value="100/s" accept' --permanent | 限制单IP每秒100个连接,缓解SYN洪水 |
规则生效与验证 | firewall-cmd --reload
firewall-cmd --list-all --permanent | 动态重载规则,无需重启服务,验证配置准确性 |
(3)数据库服务器额外加固
数据库端口(如MySQL 3306)需严格限制访问源,仅允许应用服务器连接:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.10" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --reload
# 备份配置,防止误操作丢失
cp -r /etc/firewalld/ /etc/firewalld_bak_$(date +%Y%m%d)
3. iptables 传统配置(兼容旧系统)
若系统未安装firewalld,可使用iptables配置,核心是确保规则持久化,避免重启失效。
(1)核心规则脚本(可直接执行)
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
# 设置默认策略:拒绝入站/转发,允许出站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环接口(本地通信必需,避免系统异常)
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立连接的流量(如SSH会话保持、业务请求响应)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放业务端口与受限SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# 启用日志,记录被拒绝流量(前缀标识,便于排查)
iptables -A INPUT -j LOG --log-prefix "[IPTABLES_DENY] " --log-level 6
# 规则持久化(按系统类型保存)
# CentOS/RHEL
service iptables save
# Debian/Ubuntu(需先安装iptables-persistent)
# apt install -y iptables-persistent
# netfilter-persistent save
(2)合规关键点
- 必须保留lo回环接口和ESTABLISHED,RELATED状态规则,否则导致系统内部通信异常;
- 配置开机自启:CentOS/RHEL执行systemctl enable iptables,Debian/Ubuntu启用netfilter-persistent;
- 日志默认输出至/var/log/messages,需定期归档,保留期限≥90天。
4. 防火墙合规审计要点
检查项 | 合规标准 | 验证命令/方法 |
默认策略 | 入站/转发默认拒绝 | firewall-cmd --list-all / iptables -L -n |
端口管控 | 仅开放业务必需端口,无高危端口暴露 | ss -tulnp(对比防火墙开放端口) |
日志审计 | 拒绝流量日志已启用,可追溯 | grep "IPTABLES_DENY" /var/log/messages |
规则持久化 | 重启后规则不丢失 | systemctl restart firewalld/iptables 后验证 |
二、漏洞全流程修复(企业合规闭环)
漏洞修复需遵循“扫描→评估→修复→验证→归档”闭环流程,避免盲目修复导致业务中断,同时满足合规对漏洞时效性、可追溯性的要求。
1. 核心合规要求
- 定期扫描:至少每月1次全量漏洞扫描,高危漏洞24小时内响应;
- 测试验证:修复前在测试环境验证补丁兼容性,避免生产故障;
- 闭环管理:修复后复测确认,记录台账并定期复查;
- 应急机制:建立0day漏洞应急响应方案,无官方补丁时采取临时缓解措施。
2. 漏洞扫描(发现问题)
结合自动化工具与轻量命令,覆盖系统、应用、配置三类漏洞,满足合规扫描要求。
扫描类型 | 推荐工具 | 实战命令/操作 | 合规说明 |
系统漏洞(CVE) | OpenVAS/Nessus、yum/apt | CentOS:yum update --security -y
Debian/Ubuntu:apt install -y debsecan && debsecan --format short | 支持等保2.0漏洞扫描,生成合规报告 |
端口/服务漏洞 | nmap | nmap -sV --script vuln 192.168.1.100 | 识别开放端口服务版本及已知漏洞 |
Web应用漏洞 | OWASP ZAP/Burp Suite | 用OWASP ZAP扫描目标URL,检测SQL注入、XSS等 | 覆盖Tomcat/Nginx等Web服务漏洞 |
配置合规漏洞 | Lynis/CIS-CAT | lynis audit system(生成详细配置漏洞报告) | 验证是否符合CIS安全基准 |
3. 漏洞分级评估(合规核心)
按CVSS评分结合业务影响划分优先级,优先修复高危漏洞,合理分配运维资源。
漏洞级别 | CVSS评分 | 修复时限 | 示例场景 |
高危 | 9.0-10.0 | 24小时内 | 远程代码执行(RCE)、内核提权(如CVE-2021-4034) |
中危 | 4.0-8.9 | 7天内 | 弱密码、敏感信息泄露 |
低危 | 0.1-3.9 | 30天内 | 非敏感信息暴露、配置冗余 |
信息 | 0.0 | 按需修复 | 软件版本信息暴露 |
评估要点
- 业务影响:非核心服务的低危漏洞可暂缓修复,优先保障生产业务;
- 修复风险:评估操作影响范围(如内核升级需重启,需申请维护窗口)。
4. 漏洞修复实战(分场景)
(1)系统漏洞修复(内核+组件)
系统漏洞主要源于未更新的软件包、过时内核,修复核心是“安全补丁升级+热修复兜底”。
# 1. 修复前备份关键数据(合规必做,避免数据丢失)
tar -zcvf /backup/system_bak_$(date +%Y%m%d).tar.gz /etc /var/www
# 2. 仅升级安全补丁(减少业务影响,不更新所有包)
# CentOS/RHEL
yum update --security -y
# Debian/Ubuntu
apt update && apt upgrade -y --security
# 3. 内核补丁处理(需重启生效,生产环境提前规划窗口)
yum update kernel -y && reboot
# 4. 内核热修复(7×24业务,无需重启,CentOS/RHEL示例)
yum install kpatch -y
kpatch load /usr/lib/kpatch/[内核版本]/[补丁名].ko
# 5. 修复验证
yum list-security --installed # CentOS/RHEL
apt-get changelog <package-name> # Debian/Ubuntu注意:禁止使用CentOS 6、Ubuntu 16.04等已停止维护(EOL)的系统版本,需升级至主流支持版本(如CentOS 7/8、Ubuntu 20.04/22.04)。
(2)高危漏洞应急修复(无官方补丁)
针对0day漏洞或无补丁场景,采取临时缓解措施,阻断攻击路径:
- SSH弱口令漏洞:禁用密码登录,启用密钥认证 sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config systemctl restart sshd # 生成SSH密钥(客户端操作) ssh-keygen -t rsa -b 4096 ssh-copy-id 用户名@服务器IP
- 禁用高危服务:关闭Telnet等非必要服务 systemctl stop telnet.socket systemctl disable telnet.socket
(3)应用漏洞修复(Web+中间件)
应用漏洞修复核心是“版本升级+配置加固”,覆盖Web应用、中间件、权限配置三类场景。
场景1:Web服务加固(Nginx/Apache)
# Nginx加固
# 1. 升级至最新稳定版
yum update nginx -y
# 2. 隐藏版本信息,禁用危险HTTP方法
vi /etc/nginx/nginx.conf
server_tokens off; # 隐藏版本
# 禁用PUT/DELETE等方法
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 403;
}
systemctl restart nginx
# Apache加固
vi /etc/httpd/conf/httpd.conf
ServerTokens Prod # 仅显示Apache,不暴露版本
ServerSignature Off
systemctl restart httpd场景2:中间件加固(Tomcat示例)
- 升级至最新稳定版:wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.80/bin/apache-tomcat-9.0.80.tar.gz;
- 禁用默认管理后台:删除webapps/manager和webapps/host-manager目录;
- 加固用户权限:修改conf/tomcat-users.xml,仅授权最小权限用户。
场景3:弱口令与权限配置修复
# 1. 配置密码复杂度策略
vi /etc/login.defs
PASS_MIN_LEN 12 # 密码最小长度12位
PASS_COMPLEXITY_CHECKS 1 # 启用复杂度检查
# 2. 检查并锁定空密码账号
grep -E '^[^:]+::' /etc/shadow # 查找空密码账号
passwd -l 账号名 # 锁定账号
# 3. 限制sudo权限,避免普通用户提权
visudo # 编辑sudoers文件(防止语法错误)
user1 ALL=(ALL) /usr/bin/ls, /usr/bin/cat # 仅授权特定命令5. 修复验证与合规闭环
- 复测漏洞:用原扫描工具(如OpenVAS、nmap)重新扫描,确认漏洞已消除;
- 记录台账:填写漏洞修复记录表,包含漏洞编号、修复时间、操作人、验证结果,归档保存≥1年;
- 定期复查:每月执行全量扫描,每季度复盘漏洞修复流程,优化应急方案。
三、企业合规附加加固措施
结合防火墙与漏洞修复,补充账号、日志、备份三类配套措施,全面满足合规要求。
1. 账号权限管理
- 禁用root远程登录:修改/etc/ssh/sshd_config,设置PermitRootLogin no,重启sshd服务;
- 最小权限授权:创建普通运维账号,通过sudo分配细分权限,定期清理无用账号(userdel 账号名);
- 入侵检测:部署fail2ban,自动封禁暴力破解IP yum install fail2ban -y systemctl start fail2ban systemctl enable fail2ban
2. 日志审计管理
- 开启系统日志:启用rsyslog服务,将防火墙日志、系统日志同步至中央日志服务器(如ELK),避免日志篡改;
- 日志留存:配置日志保留期限≥6个月,满足合规追溯要求;
- 定期审计:每周分析日志,排查异常访问、漏洞攻击等行为。
3. 备份与灾备
- 定期备份:用tar/rsync备份防火墙配置、系统配置、业务数据,备份文件异地存储;
- 灾备演练:每季度执行一次灾难恢复演练,验证备份有效性与业务恢复能力。
四、实战案例:Web服务器合规加固完整流程
- 环境准备:禁用rpcbind、telnet无用服务,启用firewalld并设置开机自启;
- 防火墙配置:仅开放80/443/22(限制192.168.1.0/24网段),启用拒绝日志,备份配置;
- 漏洞扫描:用OpenVAS扫描,发现Apache高危漏洞(CVE-2023-25690);
- 漏洞修复:升级Apache至最新版本(yum update httpd -y),重启服务;
- 验证归档:重新扫描确认漏洞消除,记录修复台账,备份系统数据;
- 定期复查:每月用lynis扫描配置漏洞,每周审计防火墙日志。
五、Linux安全合规自查脚本(自动化工具)
脚本适用于CentOS/RHEL 7+/Debian/Ubuntu 20.04+,覆盖防火墙、漏洞、服务、权限四大模块,自动生成带时间戳的自查报告,标注合规状态及修复建议,优化后贴合企业审计归档规范。
1. 优化后脚本内容
#!/bin/bash
##############################################################################
# Linux安全合规自查脚本(防火墙+漏洞修复+服务加固)
# 合规标准:等保2.0(GB/T 22239)、PCI DSS、CIS安全基准
# 检查模块:防火墙配置、系统补丁、服务加固、文件权限
# 报告规范:符合企业审计归档要求,含合规依据、风险等级、整改建议
##############################################################################
# 定义核心参数(可按企业业务调整)
REPORT_FILE="linux_compliance_report_$(date +%Y%m%d_%H%M%S).txt"
ALLOW_PORTS=("80" "443" "22") # 业务允许端口(需与企业安全基线一致)
INTERNAL_NET="192.168.1.0/24" # 内网可信网段
HIGH_RISK_PORTS=("23" "3389" "135" "139" "445") # 高危端口清单
RISK_LEVEL=("严重" "高危" "中危" "低危" "合规") # 风险等级定义
# 初始化报告(标准化格式,含审计必备要素)
{
echo "================================================================"
echo " Linux系统安全合规自查报告"
echo "================================================================"
echo "报告编号:COMP-$(date +%Y%m%d%H%M%S)"
echo "自查主机:$(hostname)(IP:$(hostname -I | awk '{print $1}'))"
echo "系统版本:$(cat /etc/os-release | grep PRETTY_NAME | cut -d '"' -f 2)"
echo "自查时间:$(date +"%Y-%m-%d %H:%M:%S")"
echo "执行账号:$(whoami)"
echo "合规标准:等保2.0(GB/T 22239)、PCI DSS V4.0、CIS Linux Benchmark"
echo "报告说明:1.风险等级分为严重/高危/中危/低危/合规;2.整改建议需留存执行记录;3.报告保存期限≥1年"
echo "================================================================"
echo -e "\n【一、防火墙配置检查】"
echo "---------------------------------------------------------------"
} > $REPORT_FILE
# 模块1:防火墙配置检查(补充合规依据,标准化风险描述)
check_firewall() {
if systemctl is-active --quiet firewalld; then
echo "1.1 防火墙状态:firewalld已启用(合规)" >> $REPORT_FILE
echo " 合规依据:等保2.0 7.1.2.2 网络访问控制要求" >> $REPORT_FILE
DEFAULT_ZONE=$(firewall-cmd --get-default-zone)
if [ "$DEFAULT_ZONE" = "public" ]; then
echo "1.2 默认区域:$DEFAULT_ZONE(合规)" >> $REPORT_FILE
else
echo "1.2 默认区域:$DEFAULT_ZONE(低危)" >> $REPORT_FILE
echo " 整改建议:执行firewall-cmd --set-default-zone=public --permanent,将默认区域改为public" >> $REPORT_FILE
fi
OPEN_PORTS=$(firewall-cmd --list-ports | cut -d '/' -f 1 | tr ' ' ',')
echo "1.3 已开放端口:$OPEN_PORTS" >> $REPORT_FILE
for PORT in ${HIGH_RISK_PORTS[@]}; do
if echo $OPEN_PORTS | grep -q $PORT; then
echo "1.4 高危端口风险:端口$PORT已开放(高危)" >> $REPORT_FILE
echo " 合规依据:PCI DSS 1.2.1 禁止开放非必要高危端口" >> $REPORT_FILE
echo " 整改建议:执行firewall-cmd --remove-port=$PORT/tcp --permanent,关闭高危端口并重启firewalld" >> $REPORT_FILE
fi
done
SSH_RULE=$(firewall-cmd --list-rich-rules | grep "port=\"22\"")
if echo $SSH_RULE | grep -q $INTERNAL_NET; then
echo "1.5 SSH访问控制:仅允许内网$INTERNAL_NET访问(合规)" >> $REPORT_FILE
else
echo "1.5 SSH访问控制:未限制内网访问(中危)" >> $REPORT_FILE
echo " 整改建议:执行firewall-cmd --add-rich-rule='rule family=\"ipv4\" source address=\"$INTERNAL_NET\" port port=\"22\" protocol=\"tcp\" accept' --permanent" >> $REPORT_FILE
fi
LOG_STATUS=$(firewall-cmd --get-log-denied)
if [ "$LOG_STATUS" = "all" ]; then
echo "1.6 防火墙日志:已启用拒绝流量日志(合规)" >> $REPORT_FILE
echo " 日志路径:/var/log/firewalld" >> $REPORT_FILE
else
echo "1.6 防火墙日志:未启用拒绝流量日志(中危)" >> $REPORT_FILE
echo " 整改建议:执行firewall-cmd --set-log-denied=all --permanent,启用日志并reload生效" >> $REPORT_FILE
fi
elif iptables -L &>/dev/null; then
echo "1.1 防火墙状态:iptables已启用(合规)" >> $REPORT_FILE
echo " 合规依据:等保2.0 7.1.2.2 网络访问控制要求" >> $REPORT_FILE
INPUT_POLICY=$(iptables -L INPUT -n | grep "policy" | awk '{print $4}')
FORWARD_POLICY=$(iptables -L FORWARD -n | grep "policy" | awk '{print $4}')
if [ "$INPUT_POLICY" = "DROP" -a "$FORWARD_POLICY" = "DROP" ]; then
echo "1.2 默认策略:入站/转发均为DROP(合规)" >> $REPORT_FILE
else
echo "1.2 默认策略:入站=$INPUT_POLICY/转发=$FORWARD_POLICY(高危)" >> $REPORT_FILE
echo " 整改建议:执行iptables -P INPUT DROP && iptables -P FORWARD DROP,设置默认拒绝并持久化规则" >> $REPORT_FILE
fi
if iptables -L INPUT -n | grep -q "LOG"; then
echo "1.3 防火墙日志:已启用拒绝流量日志(合规)" >> $REPORT_FILE
else
echo "1.3 防火墙日志:未启用拒绝流量日志(中危)" >> $REPORT_FILE
echo " 整改建议:执行iptables -A INPUT -j LOG --log-prefix \"[IPTABLES_DENY] \" --log-level 6,启用日志" >> $REPORT_FILE
fi
else
echo "1.1 防火墙状态:未启用任何防火墙(严重)" >> $REPORT_FILE
echo " 合规依据:等保2.0 7.1.2.2 强制要求网络访问控制" >> $REPORT_FILE
echo " 整改建议:立即安装并启用firewalld/iptables,配置默认拒绝策略" >> $REPORT_FILE
fi
}
# 模块2:系统漏洞与补丁检查(补充补丁管理合规要求)
check_system_vuln() {
echo -e "\n\n【二、系统漏洞与补丁检查】" >> $REPORT_FILE
echo "---------------------------------------------------------------" >> $REPORT_FILE
OS_VERSION=$(cat /etc/os-release | grep VERSION_ID | cut -d '"' -f 2)
OS_NAME=$(cat /etc/os-release | grep ID | head -1 | cut -d '=' -f 2)
if [ "$OS_NAME" = "centos" -a "$OS_VERSION" -lt 7 ] || [ "$OS_NAME" = "ubuntu" -a "$OS_VERSION" -lt 20 ]; then
echo "2.1 系统版本:$OS_NAME $OS_VERSION(严重)" >> $REPORT_FILE
echo " 合规依据:CIS Benchmark 1.1.1 禁用EOL系统版本" >> $REPORT_FILE
echo " 整改建议:升级至CentOS 7+/Ubuntu 20.04+,停止使用已停止维护版本" >> $REPORT_FILE
else
echo "2.1 系统版本:$OS_NAME $OS_VERSION(合规)" >> $REPORT_FILE
fi
echo -e "2.2 安全补丁检查:" >> $REPORT_FILE
if [ "$OS_NAME" = "centos" ]; then
SEC_PATCH=$(yum check-update --security 2>/dev/null | wc -l)
else
apt update -qq 2>/dev/null
SEC_PATCH=$(apt list --upgradable -qq | grep -i security | wc -l)
fi
if [ $SEC_PATCH -eq 0 ]; then
echo " 无待安装安全补丁(合规)" >> $REPORT_FILE
echo " 合规依据:等保2.0 7.1.6.1 补丁管理要求" >> $REPORT_FILE
else
echo " 存在$SEC_PATCH个待安装安全补丁(高危)" >> $REPORT_FILE
echo " 整改建议:CentOS执行yum update --security -y;Ubuntu执行apt upgrade -y --security,升级后重启验证" >> $REPORT_FILE
fi
if command -v lynis &>/dev/null; then
echo "2.3 漏洞扫描工具:lynis已安装(合规)" >> $REPORT_FILE
else
echo "2.3 漏洞扫描工具:lynis未安装(低危)" >> $REPORT_FILE
echo " 整改建议:CentOS执行yum install lynis -y;Ubuntu执行apt install lynis -y,用于配置漏洞扫描" >> $REPORT_FILE
fi
}
# 模块3:服务加固检查(细化SSH/Web服务合规要点)
check_service_harden() {
echo -e "\n\n【三、服务加固检查】" >> $REPORT_FILE
echo "---------------------------------------------------------------" >> $REPORT_FILE
SSH_CONFIG="/etc/ssh/sshd_config"
echo -e "3.1 SSH服务加固:" >> $REPORT_FILE
ROOT_LOGIN=$(grep -E "^PermitRootLogin" $SSH_CONFIG | cut -d ' ' -f 2)
if [ "$ROOT_LOGIN" = "no" ]; then
echo " 3.1.1 禁止root远程登录:已配置(合规)" >> $REPORT_FILE
else
echo " 3.1.1 禁止root远程登录:未配置(高危)" >> $REPORT_FILE
echo " 整改建议:sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' $SSH_CONFIG,重启sshd服务" >> $REPORT_FILE
fi
PWD_AUTH=$(grep -E "^PasswordAuthentication" $SSH_CONFIG | cut -d ' ' -f 2)
if [ "$PWD_AUTH" = "no" ]; then
echo " 3.1.2 SSH密钥认证:已启用(合规)" >> $REPORT_FILE
else
echo " 3.1.2 SSH密钥认证:未启用(中危)" >> $REPORT_FILE
echo " 整改建议:sed -i 's/^PasswordAuthentication.*/PasswordAuthentication no/' $SSH_CONFIG,配置密钥认证后重启sshd" >> $REPORT_FILE
fi
PROTOCOL=$(grep -E "^Protocol" $SSH_CONFIG | cut -d ' ' -f 2)
if [ "$PROTOCOL" = "2" ]; then
echo " 3.1.3 SSH协议版本:仅启用SSH2(合规)" >> $REPORT_FILE
else
echo " 3.1.3 SSH协议版本:可能启用SSH1(低危)" >> $REPORT_FILE
echo " 整改建议:在$SSH_CONFIG中添加Protocol 2,禁用SSH1协议" >> $REPORT_FILE
fi
echo -e "\n3.2 Web服务加固(无Web业务则忽略):" >> $REPORT_FILE
if command -v nginx &>/dev/null; then
NGINX_CONF=$(nginx -V 2>&1 | grep "conf-path" | cut -d '=' -f 2)
SERVER_TOKENS=$(grep "server_tokens" $NGINX_CONF 2>/dev/null | awk '{print $2}')
if [ "$SERVER_TOKENS" = "off;" ]; then
echo " 3.2.1 Nginx版本隐藏:已配置(合规)" >> $REPORT_FILE
else
echo " 3.2.1 Nginx版本隐藏:未配置(低危)" >> $REPORT_FILE
echo " 整改建议:在$NGINX_CONF中添加server_tokens off;,重启nginx服务" >> $REPORT_FILE
fi
elif command -v apache2 &>/dev/null; then
SERVER_TOKENS=$(grep "ServerTokens" /etc/apache2/apache2.conf 2>/dev/null | awk '{print $2}')
if [ "$SERVER_TOKENS" = "Prod" ]; then
echo " 3.2.1 Apache版本隐藏:已配置(合规)" >> $REPORT_FILE
else
echo " 3.2.1 Apache版本隐藏:未配置(低危)" >> $REPORT_FILE
echo " 整改建议:在apache2.conf中设置ServerTokens Prod,重启apache服务" >> $REPORT_FILE
fi
else
echo " 未检测到Nginx/Apache服务(无Web业务,合规)" >> $REPORT_FILE
fi
}
# 模块4:文件权限与账号检查(补充敏感文件权限合规标准)
check_file_perm() {
echo -e "\n\n【四、文件权限与账号检查】" >> $REPORT_FILE
echo "---------------------------------------------------------------" >> $REPORT_FILE
echo -e "4.1 敏感文件权限检查:" >> $REPORT_FILE
SHADOW_PERM=$(stat -c "%a" /etc/shadow)
PASSWD_PERM=$(stat -c "%a" /etc/passwd)
if [ "$SHADOW_PERM" -eq 600 ]; then
echo " 4.1.1 /etc/shadow权限:$SHADOW_PERM(合规)" >> $REPORT_FILE
echo " 合规依据:CIS Benchmark 6.1.1 敏感文件权限控制" >> $REPORT_FILE
else
echo " 4.1.1 /etc/shadow权限:$SHADOW_PERM(高危)" >> $REPORT_FILE
echo " 整改建议:执行chmod 600 /etc/shadow,限制仅root可读写" >> $REPORT_FILE
fi
if [ "$PASSWD_PERM" -eq 644 ]; then
echo " 4.1.2 /etc/passwd权限:$PASSWD_PERM(合规)" >> $REPORT_FILE
else
echo " 4.1.2 /etc/passwd权限:$PASSWD_PERM(中危)" >> $REPORT_FILE
echo " 整改建议:执行chmod 644 /etc/passwd,配置正确权限" >> $REPORT_FILE
fi
EMPTY_PWD=$(grep -E '^[^:]+::' /etc/shadow | wc -l)
if [ $EMPTY_PWD -eq 0 ]; then
echo "4.2 空密码账号:无(合规)" >> $REPORT_FILE
else
echo "4.2 空密码账号:存在$EMPTY_PWD个(严重)" >> $REPORT_FILE
echo " 整改建议:执行passwd -l 账号名锁定空密码账号,或设置复杂密码" >> $REPORT_FILE
fi
SUDO_USER=$(grep -v "^#" /etc/sudoers | grep -v "root ALL" | grep "ALL=(ALL)" | wc -l)
if [ $SUDO_USER -eq 0 ]; then
echo "4.3 sudo权限管控:无过度授权(合规)" >> $REPORT_FILE
else
echo "4.3 sudo权限管控:$SUDO_USER个用户全量授权(中危)" >> $REPORT_FILE
echo " 整改建议:通过visudo编辑sudoers文件,仅授权用户必需命令" >> $REPORT_FILE
fi
}
# 模块5:自查总结(统计风险项,生成整改清单)
check_summary() {
echo -e "\n\n【五、自查总结与整改清单】" >> $REPORT_FILE
echo "---------------------------------------------------------------" >> $REPORT_FILE
SEVERE=$(grep -c "(严重)" $REPORT_FILE)
HIGH=$(grep -c "(高危)" $REPORT_FILE)
MEDIUM=$(grep -c "(中危)" $REPORT_FILE)
LOW=$(grep -c "(低危)" $REPORT_FILE)
COMPLIANT=$(grep -c "(合规)" $REPORT_FILE)
echo "风险统计:" >> $REPORT_FILE
echo " 严重风险项:$SEVERE 项(需立即整改,整改时限≤24小时)" >> $REPORT_FILE
echo " 高危风险项:$HIGH 项(整改时限≤24小时)" >> $REPORT_FILE
echo " 中危风险项:$MEDIUM 项(整改时限≤7天)" >> $REPORT_FILE
echo "
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/566.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。
