#!/bin/bash
# =============================================================================
# SCRIPT GIÁM SÁT BẢO MẬT TỰ ĐỘNG
# Tạo bởi: Security Audit 2025-12-08
# Sử dụng: sudo bash security_monitor.sh [project_path]
# Có thể thêm vào cronjob: 0 6 * * * /path/to/security_monitor.sh /var/www/html
# =============================================================================

set -e

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

PROJECT_PATH="${1:-/var/www/html}"
LOG_FILE="/var/log/security_monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo -e "${GREEN}=== GIÁM SÁT BẢO MẬT ===${NC}"
echo "Thời gian: $DATE"
echo "Đường dẫn: $PROJECT_PATH"
echo ""

# Khởi tạo log
echo "========================================" >> "$LOG_FILE"
echo "[$DATE] Bắt đầu quét bảo mật" >> "$LOG_FILE"
echo "========================================" >> "$LOG_FILE"

ALERT=0

# 1. Kiểm tra thư mục 777
echo -e "${YELLOW}[1/6] Kiểm tra thư mục 777...${NC}"
DIR777=$(find "$PROJECT_PATH" -type d -perm 777 2>/dev/null | wc -l)
if [ "$DIR777" -gt 0 ]; then
    echo -e "  ${RED}⚠ CẢNH BÁO: Có $DIR777 thư mục với quyền 777${NC}"
    echo "[$DATE] CẢNH BÁO: $DIR777 thư mục 777" >> "$LOG_FILE"
    find "$PROJECT_PATH" -type d -perm 777 2>/dev/null >> "$LOG_FILE"
    ALERT=1
else
    echo -e "  ${GREEN}✓ Không có thư mục 777${NC}"
fi

# 2. Kiểm tra webshell phổ biến
echo -e "${YELLOW}[2/6] Kiểm tra webshell...${NC}"
WEBSHELL=$(find "$PROJECT_PATH" -type f -name "*.php" -exec grep -l 'FilesMan\|WSO\|c99\|r57\|c100\|b374k\|weevely\|antsword\|behinder\|godzilla' {} \; 2>/dev/null | grep -v vendor | grep -v node_modules | wc -l)
if [ "$WEBSHELL" -gt 0 ]; then
    echo -e "  ${RED}⚠ CẢNH BÁO: Phát hiện $WEBSHELL file nghi ngờ webshell${NC}"
    echo "[$DATE] CẢNH BÁO: $WEBSHELL webshell" >> "$LOG_FILE"
    find "$PROJECT_PATH" -type f -name "*.php" -exec grep -l 'FilesMan\|WSO\|c99\|r57\|c100\|b374k\|weevely\|antsword\|behinder\|godzilla' {} \; 2>/dev/null | grep -v vendor | grep -v node_modules >> "$LOG_FILE"
    ALERT=1
else
    echo -e "  ${GREEN}✓ Không phát hiện webshell phổ biến${NC}"
fi

# 3. Kiểm tra backdoor đã biết (plugin_binalar_eski)
echo -e "${YELLOW}[3/6] Kiểm tra backdoor đã biết...${NC}"
BACKDOOR=$(grep -r 'plugin_binalar_eski\|ppdd' "$PROJECT_PATH" --include="*.php" 2>/dev/null | grep -v vendor | grep -v node_modules | wc -l)
if [ "$BACKDOOR" -gt 0 ]; then
    echo -e "  ${RED}⚠ CẢNH BÁO: Phát hiện $BACKDOOR backdoor đã biết${NC}"
    echo "[$DATE] CẢNH BÁO: $BACKDOOR backdoor" >> "$LOG_FILE"
    ALERT=1
else
    echo -e "  ${GREEN}✓ Không phát hiện backdoor đã biết${NC}"
fi

# 4. Kiểm tra file PHP mới trong thư mục upload
echo -e "${YELLOW}[4/6] Kiểm tra PHP trong uploads...${NC}"
UPLOAD_PHP=$(find "$PROJECT_PATH" -type f -name "*.php" \( -path "*/uploads/*" -o -path "*/images/*" -o -path "*/img/*" -o -path "*/files/*" \) 2>/dev/null | wc -l)
if [ "$UPLOAD_PHP" -gt 0 ]; then
    echo -e "  ${RED}⚠ CẢNH BÁO: Có $UPLOAD_PHP file PHP trong thư mục upload${NC}"
    echo "[$DATE] CẢNH BÁO: $UPLOAD_PHP PHP trong uploads" >> "$LOG_FILE"
    find "$PROJECT_PATH" -type f -name "*.php" \( -path "*/uploads/*" -o -path "*/images/*" -o -path "*/img/*" -o -path "*/files/*" \) 2>/dev/null >> "$LOG_FILE"
    ALERT=1
else
    echo -e "  ${GREEN}✓ Không có PHP trong thư mục upload${NC}"
fi

# 5. Kiểm tra file .env có an toàn không
echo -e "${YELLOW}[5/6] Kiểm tra bảo mật file .env...${NC}"
ENV_UNSAFE=$(find "$PROJECT_PATH" -maxdepth 3 -name ".env" ! -perm 600 2>/dev/null | wc -l)
if [ "$ENV_UNSAFE" -gt 0 ]; then
    echo -e "  ${YELLOW}⚠ CẢNH BÁO: $ENV_UNSAFE file .env không có quyền 600${NC}"
    echo "[$DATE] CẢNH BÁO: $ENV_UNSAFE .env không an toàn" >> "$LOG_FILE"
    ALERT=1
else
    echo -e "  ${GREEN}✓ Tất cả file .env đều an toàn${NC}"
fi

# 6. Kiểm tra file PHP được sửa đổi trong 24h qua
echo -e "${YELLOW}[6/6] Kiểm tra PHP sửa đổi gần đây...${NC}"
RECENT_PHP=$(find "$PROJECT_PATH" -name "*.php" -mtime -1 -type f 2>/dev/null | grep -v vendor | grep -v node_modules | wc -l)
if [ "$RECENT_PHP" -gt 20 ]; then
    echo -e "  ${YELLOW}⚠ CHÚ Ý: $RECENT_PHP file PHP được sửa trong 24h${NC}"
    echo "[$DATE] CHÚ Ý: $RECENT_PHP PHP sửa gần đây" >> "$LOG_FILE"
else
    echo -e "  ${GREEN}✓ Số file PHP sửa đổi gần đây: $RECENT_PHP${NC}"
fi

echo ""
echo "========================================" >> "$LOG_FILE"

# Kết quả tổng hợp
if [ "$ALERT" -eq 1 ]; then
    echo -e "${RED}=== PHÁT HIỆN VẤN ĐỀ BẢO MẬT ===${NC}"
    echo "Xem chi tiết tại: $LOG_FILE"
    echo "[$DATE] KẾT QUẢ: CÓ VẤN ĐỀ" >> "$LOG_FILE"
    exit 1
else
    echo -e "${GREEN}=== HỆ THỐNG AN TOÀN ===${NC}"
    echo "[$DATE] KẾT QUẢ: AN TOÀN" >> "$LOG_FILE"
    exit 0
fi
