#!/bin/bash # Momentry Core 安全配置檢查腳本 # 版本: 1.0 # 更新時間: 2026-04-22 set -e echo "=========================================" echo "Momentry Core 安全配置檢查" echo "=========================================" echo "" # 顏色定義 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 檢查函數 check_pass() { echo -e "${GREEN}[✓] $1${NC}" } check_warn() { echo -e "${YELLOW}[!] $1${NC}" } check_fail() { echo -e "${RED}[✗] $1${NC}" } # 1. 環境變數檢查 echo "1. 環境變數檢查" echo "----------------" # 檢查必要的環境變數 required_vars=( "DATABASE_URL" "REDIS_URL" "MOMENTRY_API_KEY" ) for var in "${required_vars[@]}"; do if [ -z "${!var}" ]; then check_warn "環境變數 $var 未設置" else if [[ "$var" == *"PASSWORD"* ]] || [[ "$var" == *"KEY"* ]] || [[ "$var" == *"SECRET"* ]]; then # 敏感信息只顯示是否存在,不顯示值 check_pass "環境變數 $var 已設置 (敏感信息已隱藏)" else check_pass "環境變數 $var 已設置" fi fi done echo "" # 2. 數據庫安全檢查 echo "2. 數據庫安全檢查" echo "------------------" # 檢查 PostgreSQL 連接 if command -v psql &>/dev/null && [ -n "$DATABASE_URL" ]; then if psql "$DATABASE_URL" -c "SELECT 1" &>/dev/null; then check_pass "PostgreSQL 連接正常" # 檢查 SSL 連接 ssl_status=$(psql "$DATABASE_URL" -c "SHOW ssl" -t 2>/dev/null | tr -d '[:space:]' || echo "unknown") if [ "$ssl_status" == "on" ]; then check_pass "PostgreSQL SSL 已啟用" else check_warn "PostgreSQL SSL 未啟用" fi else check_fail "PostgreSQL 連接失敗" fi else check_warn "PostgreSQL 客戶端未安裝或 DATABASE_URL 未設置" fi echo "" # 3. Redis 安全檢查 echo "3. Redis 安全檢查" echo "------------------" # 檢查 Redis 連接 if command -v redis-cli &>/dev/null && [ -n "$REDIS_URL" ]; then # 提取 Redis 主機和端口 redis_host=$(echo "$REDIS_URL" | sed -n 's/.*:\/\/\([^:/]*\).*/\1/p') redis_port=$(echo "$REDIS_URL" | sed -n 's/.*:\([0-9]*\)$/\1/p') if [ -z "$redis_port" ]; then redis_port=6379 fi if redis-cli -h "$redis_host" -p "$redis_port" ping &>/dev/null; then check_pass "Redis 連接正常" # 檢查 Redis 是否需要密碼 if echo "$REDIS_URL" | grep -q "@"; then check_pass "Redis 使用密碼認證" else check_warn "Redis 未使用密碼認證" fi else check_fail "Redis 連接失敗" fi else check_warn "Redis 客戶端未安裝或 REDIS_URL 未設置" fi echo "" # 4. API 安全檢查 echo "4. API 安全檢查" echo "----------------" # 檢查 API Key 格式 if [ -n "$MOMENTRY_API_KEY" ]; then if [[ "$MOMENTRY_API_KEY" =~ ^m(user|admin|service|temp)_[a-f0-9]{32}_[0-9]{10}_[a-f0-9]{8}$ ]]; then check_pass "API Key 格式正確" else check_fail "API Key 格式不正確" fi else check_warn "MOMENTRY_API_KEY 未設置" fi echo "" # 5. 文件權限檢查 echo "5. 文件權限檢查" echo "----------------" # 檢查敏感文件權限 sensitive_files=( ".env" ".env.development" "scripts/security_check.sh" ) for file in "${sensitive_files[@]}"; do if [ -f "$file" ]; then perms=$(stat -f "%Sp" "$file") if [[ "$perms" == *"rw-------"* ]] || [[ "$perms" == *"rw-r-----"* ]]; then check_pass "$file 權限設置正確 ($perms)" else check_warn "$file 權限可能過寬 ($perms),建議設置為 600 或 640" fi fi done echo "" # 6. 依賴包安全檢查 echo "6. 依賴包安全檢查" echo "------------------" # 檢查 Rust 依賴 if [ -f "Cargo.toml" ]; then if command -v cargo-audit &>/dev/null; then echo "運行 cargo audit 檢查安全漏洞..." cargo audit if [ $? -eq 0 ]; then check_pass "Rust 依賴包無已知安全漏洞" else check_warn "Rust 依賴包存在安全漏洞,請運行 cargo update 修復" fi else check_warn "cargo-audit 未安裝,無法檢查 Rust 依賴安全" echo "安裝 cargo-audit: cargo install cargo-audit" fi fi echo "" # 7. 網絡安全檢查 echo "7. 網絡安全檢查" echo "----------------" # 檢查本地服務端口 local_ports=(3002 3003 5432 6379 9090 3000) for port in "${local_ports[@]}"; do if lsof -i :$port &>/dev/null; then service_name="" case $port in 3002) service_name="Momentry API (生產)" ;; 3003) service_name="Momentry API (開發)" ;; 5432) service_name="PostgreSQL" ;; 6379) service_name="Redis" ;; 9090) service_name="Prometheus" ;; 3000) service_name="Grafana" ;; esac # 檢查是否只允許本地訪問 if netstat -an | grep ":$port" | grep -q "LISTEN" && ! netstat -an | grep ":$port" | grep -q "0.0.0.0"; then check_pass "$service_name ($port) 只允許本地訪問" else check_warn "$service_name ($port) 可能允許外部訪問,請檢查防火牆規則" fi fi done echo "" # 8. 安全配置建議 echo "8. 安全配置建議" echo "----------------" echo "建議執行以下安全加固措施:" echo "1. 啟用數據庫 SSL/TLS 連接" echo "2. 配置 Redis 密碼認證" echo "3. 定期更新 API Key" echo "4. 設置文件系統權限" echo "5. 定期運行依賴安全檢查" echo "6. 配置防火牆限制外部訪問" echo "7. 啟用 API 請求限流" echo "8. 配置安全日誌和監控" echo "" echo "=========================================" echo "檢查完成" echo "=========================================" # 總結報告 echo "" echo "安全檢查總結:" echo "- 環境變數: 檢查完成" echo "- 數據庫安全: 檢查完成" echo "- Redis 安全: 檢查完成" echo "- API 安全: 檢查完成" echo "- 文件權限: 檢查完成" echo "- 依賴包安全: 檢查完成" echo "- 網絡安全: 檢查完成" echo "" echo "建議:" echo "1. 定期運行此檢查腳本" echo "2. 修復所有警告和錯誤" echo "3. 保持依賴包更新" echo "4. 監控安全日誌" exit 0