#!/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; thenecho " ? MySQL服務運行中"echo " ?? 建議配置bind-address限制訪問"
fiif grep -q "0.0.0.0:6379" netstat_output.txt; thenecho " ? Redis服務運行中"
fiif grep -q "0.0.0.0:27017" netstat_output.txt; thenecho " ? 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 ]]; thenecho " ? 發現 $high_risk_ports 個高風險端口對外開放"echo " 🔒 建議立即采取以下措施:"echo " - 使用防火墻限制高風險端口訪問"echo " - 配置服務僅監聽必要IP地址"echo " - 考慮關閉非必要服務"
elseecho " ? 未發現明顯的高風險端口"
fi# 檢查是否所有端口都對所有接口開放
if [[ $all_interfaces -gt 5 ]]; thenecho " ?? 過多端口對所有接口開放 ($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; thenecho " ? MySQL服務運行中"echo " ?? 建議配置bind-address限制訪問"
fi
- 解釋:
- 用
grep -q
靜默檢查是否存在對外開放的 MySQL 端口(3306),若存在則輸出服務運行狀態及安全建議(限制訪問 IP)。
- 用
if grep -q "0.0.0.0:6379" netstat_output.txt; thenecho " ? Redis服務運行中"
fi
- 解釋:檢查對外開放的 Redis 端口(6379),若存在則提示服務運行中(Redis 默認無認證,風險隱含在后續建議中)。
if grep -q "0.0.0.0:27017" netstat_output.txt; thenecho " ? 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
。
- 提取所有對外開放的端口號,篩選出高風險端口(21/23/135/445 等),統計數量并賦值給
if [[ $high_risk_ports -gt 0 ]]; thenecho " ? 發現 $high_risk_ports 個高風險端口對外開放"echo " 🔒 建議立即采取以下措施:"echo " - 使用防火墻限制高風險端口訪問"echo " - 配置服務僅監聽必要IP地址"echo " - 考慮關閉非必要服務"
elseecho " ? 未發現明顯的高風險端口"
fi
- 解釋:根據高風險端口數量輸出對應提示:若存在高風險端口,給出防火墻限制、端口綁定、關閉服務等建議;否則提示無明顯風險。
if [[ $all_interfaces -gt 5 ]]; thenecho " ?? 過多端口對所有接口開放 ($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的同學,不妨不看解釋先自行分析一下。