系统网络端口安全扫描脚本及详解

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

  • 解释

    • 筛选对外开放的端口,用awksplit函数从监听地址中提取端口号。

    • 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的同学,不妨不看解释先自行分析一下。