bash
#!/bin/bash
# 系统服务端口安全扫描 - 修正版
echo "=== 系统服务端口安全扫描报告 ==="
# 1. 高风险端口识别
echo "⚠️ 对外开放的高风险端口:"
awk '
/0.0.0.0:21/ {print " 端口 21 - FTP (明文传输)\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:23/ {print " 端口 23 - Telnet (明文传输)\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:135/ {print " 端口 135 - RPC Endpoint Mapper\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:445/ {print " 端口 445 - SMB/CIFS\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:3306/ {print " 端口 3306 - MySQL数据库\n ⚠️ 对所有IP开放,建议限制访问IP"}
/0.0.0.0:27017/ {print " 端口 27017 - MongoDB数据库\n ⚠️ 对所有IP开放,建议限制访问IP"}
' netstat_output.txt
# 2. 端口绑定分析
echo -e "\n=== 端口绑定分析 ==="
all_interfaces=$(grep "0.0.0.0:" netstat_output.txt | wc -l)
localhost_only=$(grep "127.0.0.1:" netstat_output.txt | wc -l)
specific_ip=$(grep -E "(192\.168\.|10\.|172\.)" netstat_output.txt | wc -l)
echo " 对所有接口开放的端口数: $all_interfaces"
echo " 仅本地访问的端口数: $localhost_only"
echo " 绑定特定IP的端口数: $specific_ip"
echo " 对外开放的端口:"
grep "0.0.0.0:" netstat_output.txt | awk '{split($4, a, ":"); print " - " a[2]}' | sort -n | uniq
# 3. 数据库服务检查
echo -e "\n=== 数据库服务检查 ==="
if grep -q "0.0.0.0:3306" netstat_output.txt; then
echo " ✅ MySQL服务运行中"
echo " ⚠️ 建议配置bind-address限制访问"
fi
if grep -q "0.0.0.0:6379" netstat_output.txt; then
echo " ✅ Redis服务运行中"
fi
if grep -q "0.0.0.0:27017" netstat_output.txt; then
echo " ✅ MongoDB服务运行中"
echo " ⚠️ 建议配置bindIp和认证"
fi
# 4. 服务关联分析
echo -e "\n=== 服务关联分析 ==="
web_ports=$(grep -c "0.0.0.0:80\|0.0.0.0:443" netstat_output.txt)
ssh_ports=$(grep -c "0.0.0.0:22" netstat_output.txt)
db_ports=$(grep -c "0.0.0.0:3306\|0.0.0.0:27017\|0.0.0.0:5432" netstat_output.txt)
echo " Web服务端口: $web_ports 个"
echo " SSH服务端口: $ssh_ports 个"
echo " 数据库端口: $db_ports 个"
# 5. 安全建议
echo -e "\n=== 安全建议 ==="
# 修正原来的awk语法错误
high_risk_ports=$(grep "0.0.0.0:" netstat_output.txt | awk '{split($4, a, ":"); print a[2]}' | grep -E "^(23|21|135|445|3389|5900)$" | wc -l)
if [[ $high_risk_ports -gt 0 ]]; then
echo " ❌ 发现 $high_risk_ports 个高风险端口对外开放"
echo " 🔒 建议立即采取以下措施:"
echo " - 使用防火墙限制高风险端口访问"
echo " - 配置服务仅监听必要IP地址"
echo " - 考虑关闭非必要服务"
else
echo " ✅ 未发现明显的高风险端口"
fi
# 检查是否所有端口都对所有接口开放
if [[ $all_interfaces -gt 5 ]]; then
echo " ⚠️ 过多端口对所有接口开放 ($all_interfaces 个)"
echo " 🔧 建议配置服务绑定到特定IP地址"
fi
# 提供具体的优化建议
echo " 💡 具体优化建议:"
echo " - MySQL: 配置 bind-address=127.0.0.1 或特定IP"
echo " - Redis: 配置 bind 127.0.0.1"
echo " - MongoDB: 配置 bindIp 和启用认证"
echo " - 使用iptables或firewalld配置访问控制策略"
echo " - 定期扫描开放端口,确保符合安全策略"
# 6. 监控建议
echo -e "\n=== 监控建议 ==="
echo " 📊 建议监控以下指标:"
echo " - 端口开放情况变化"
echo " - 异常连接尝试"
echo " - 服务访问日志"
echo " - 端口扫描活动"
echo -e "\n=== 扫描完成 ==="
echo "建议定期执行端口安全扫描,及时发现和修复安全风险"
代码详解
#!/bin/bash
-
解释 :指定脚本解释器为
bash
,是 Linux 脚本的标准开头,确保脚本可直接执行。系统服务端口安全扫描 - 修正版
echo "=== 系统服务端口安全扫描报告 ==="
-
解释 :
-
注释说明脚本功能(系统服务端口安全扫描,且为修正版)。
-
输出扫描报告的标题,明确脚本的核心目的是生成安全扫描报告。
1. 高风险端口识别
echo "⚠️ 对外开放的高风险端口:"
-
-
解释 :
-
注释标记第一部分功能(识别高风险端口)。
-
输出提示信息,告知用户接下来将展示对外开放的高风险端口。
awk '
/0.0.0.0:21/ {print " 端口 21 - FTP (明文传输)\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:23/ {print " 端口 23 - Telnet (明文传输)\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:135/ {print " 端口 135 - RPC Endpoint Mapper\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:445/ {print " 端口 445 - SMB/CIFS\n 🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:3306/ {print " 端口 3306 - MySQL数据库\n ⚠️ 对所有IP开放,建议限制访问IP"}
/0.0.0.0:27017/ {print " 端口 27017 - MongoDB数据库\n ⚠️ 对所有IP开放,建议限制访问IP"}
' netstat_output.txt
-
-
解释 :
-
使用
awk
工具处理netstat_output.txt
(端口监听状态文件)。 -
匹配规则:当文件中出现 "
0.0.0.0:端口号
"(表示端口对外开放)时,输出对应端口的服务名称、风险等级及建议。 -
目的:精准定位常见高风险端口的对外开放情况,并直观展示风险。
2. 端口绑定分析
echo -e "\n=== 端口绑定分析 ==="
-
-
解释 :
-
注释标记第二部分功能(分析端口绑定情况)。
-
输出标题,
-e
允许解析转义字符\n
,实现换行分隔不同部分。all_interfaces=(grep "0.0.0.0:" netstat_output.txt | wc -l) localhost_only=(grep "127.0.0.1:" netstat_output.txt | wc -l)
specific_ip=$(grep -E "(192.168.|10.|172.)" netstat_output.txt | wc -l)
-
-
解释 :
-
定义变量统计不同绑定类型的端口数量:
all_interfaces
:统计对外开放(绑定0.0.0.0
)的端口数(grep
筛选后用wc -l
计数)。localhost_only
:统计仅本地访问(绑定127.0.0.1
)的端口数。specific_ip
:统计绑定内网 IP(192.168.、10.、172. 开头)的端口数。
echo " 对所有接口开放的端口数: all_interfaces" echo " 仅本地访问的端口数: localhost_only"
echo " 绑定特定IP的端口数: $specific_ip"
-
-
解释:输出上述统计结果,直观展示端口绑定的分布情况。
echo " 对外开放的端口:"
grep "0.0.0.0:" netstat_output.txt | awk '{split($4, a, ":"); print " - " a[2]}' | sort -n | uniq -
解释 :
-
筛选对外开放的端口,用
awk
的split
函数从监听地址中提取端口号。 -
用
sort -n
按数字排序,uniq
去重,最终列出所有对外开放的端口号。3. 数据库服务检查
echo -e "\n=== 数据库服务检查 ==="
-
-
解释 :
-
注释标记第三部分功能(检查数据库服务端口)。
-
输出标题,分隔不同分析模块。
if grep -q "0.0.0.0:3306" netstat_output.txt; then
echo " ✅ MySQL服务运行中"
echo " ⚠️ 建议配置bind-address限制访问"
fi
-
-
解释 :
-
用
grep -q
静默检查是否存在对外开放的 MySQL 端口(3306),若存在则输出服务运行状态及安全建议(限制访问 IP)。if grep -q "0.0.0.0:6379" netstat_output.txt; then
echo " ✅ Redis服务运行中"
fi
-
-
解释:检查对外开放的 Redis 端口(6379),若存在则提示服务运行中(Redis 默认无认证,风险隐含在后续建议中)。
if grep -q "0.0.0.0:27017" netstat_output.txt; then
echo " ✅ MongoDB服务运行中"
echo " ⚠️ 建议配置bindIp和认证"
fi -
解释:检查对外开放的 MongoDB 端口(27017),若存在则输出服务状态及建议(限制 IP + 启用认证)。
4. 服务关联分析
echo -e "\n=== 服务关联分析 ==="
-
解释 :
-
注释标记第四部分功能(关联服务与端口)。
-
输出标题,分析不同类型服务的端口开放情况。
web_ports=(grep -c "0.0.0.0:80\|0.0.0.0:443" netstat_output.txt) ssh_ports=(grep -c "0.0.0.0:22" netstat_output.txt)
db_ports=$(grep -c "0.0.0.0:3306|0.0.0.0:27017|0.0.0.0:5432" netstat_output.txt)
-
-
解释 :
-
统计不同服务类型的对外开放端口数:
web_ports
:Web 服务(80/443 端口)数量(\|
表示 "或")。ssh_ports
:SSH 服务(22 端口)数量。db_ports
:数据库服务(MySQL/3306、MongoDB/27017、PostgreSQL/5432)数量。
echo " Web服务端口: web_ports 个" echo " SSH服务端口: ssh_ports 个"
echo " 数据库端口: $db_ports 个"
-
-
解释:输出服务关联的端口数量,从业务维度汇总端口开放数据。
5. 安全建议
echo -e "\n=== 安全建议 ==="
-
解释 :
- 注释标记第五部分功能(生成安全建议)。
- 输出标题,基于前文分析提供可执行的安全措施。
-
解释 :
-
提取所有对外开放的端口号,筛选出高风险端口(21/23/135/445 等),统计数量并赋值给
high_risk_ports
。if [[ high_risk_ports -gt 0 ]]; then echo " ❌ 发现 high_risk_ports 个高风险端口对外开放"
echo " 🔒 建议立即采取以下措施:"
echo " - 使用防火墙限制高风险端口访问"
echo " - 配置服务仅监听必要IP地址"
echo " - 考虑关闭非必要服务"
else
echo " ✅ 未发现明显的高风险端口"
fi
-
-
解释:根据高风险端口数量输出对应提示:若存在高风险端口,给出防火墙限制、端口绑定、关闭服务等建议;否则提示无明显风险。
if [[ all_interfaces -gt 5 ]]; then echo " ⚠️ 过多端口对所有接口开放 (all_interfaces 个)"
echo " 🔧 建议配置服务绑定到特定IP地址"
fi -
解释:若对外开放的端口数超过 5 个,提示风险并建议绑定特定 IP(减少暴露面)。
echo " 💡 具体优化建议:"
echo " - MySQL: 配置 bind-address=127.0.0.1 或特定IP"
echo " - Redis: 配置 bind 127.0.0.1"
echo " - MongoDB: 配置 bindIp 和启用认证"
echo " - 使用iptables或firewalld配置访问控制策略"
echo " - 定期扫描开放端口,确保符合安全策略" -
解释:针对关键服务(MySQL/Redis/MongoDB)给出具体配置建议,同时提供通用措施(防火墙、定期扫描)。
6. 监控建议
echo -e "\n=== 监控建议 ==="
echo " 📊 建议监控以下指标:"
echo " - 端口开放情况变化"
echo " - 异常连接尝试"
echo " - 服务访问日志"
echo " - 端口扫描活动" -
解释 :
-
注释标记第六部分功能(提供监控建议)。
-
输出需长期监控的指标,确保端口安全状态可追踪。
echo -e "\n=== 扫描完成 ==="
echo "建议定期执行端口安全扫描,及时发现和修复安全风险"
-
-
解释:脚本结束提示,强调定期扫描的重要性(持续安全保障)。
结语
对于刚学完shell的同学,不妨不看解释先自行分析一下。