Featured image of post AI 驱动的 VPS 安全审计:让大模型帮你发现隐藏风险

AI 驱动的 VPS 安全审计:让大模型帮你发现隐藏风险

利用 AI 大语言模型自动化 VPS 安全审计——从端口扫描到配置检查,从日志分析到漏洞预警,打造 7×24 的智能安全卫士。

为什么 VPS 安全审计需要 AI?

你有一台 VPS,上面跑着网站、数据库、甚至多个 Docker 容器。但你真的了解它的安全状况吗?

传统的安全审计依赖人工检查——登录服务器,逐个命令排查。这种方式有几个致命问题:

  • 耗时:一次完整审计可能需要数小时
  • 不连续:审计完就忘了,下次出问题已经过了几周
  • 知识门槛高:不是每个运维人员都熟悉所有安全最佳实践
  • 难以规模化:管理 10 台服务器的安全审计,工作量是指数级增长

AI 大语言模型的介入,正在彻底改变这个局面。

AI 安全审计的核心能力

1. 自动化配置审查

AI 可以读取你的系统配置,并与安全最佳实践进行比对:

# 收集系统关键配置
sudo tar czf /tmp/sysconfig.tar.gz \
  /etc/ssh/sshd_config \
  /etc/sudoers \
  /etc/security/limits.conf \
  /etc/pam.d/ \
  /etc/sysctl.conf \
  /etc/fstab \
  /etc/crontab \
  /var/log/auth.log

将打包的配置发送给 AI 模型,它会告诉你:

  • SSH 是否使用了密钥认证而非密码
  • sudoers 是否有不必要的 NOPASSWD 规则
  • 文件权限是否正确
  • 防火墙规则是否合理
  • 内核参数是否 hardened

2. 实时日志分析与威胁检测

import subprocess
import json

def collect_security_logs(hours=24):
    """收集最近 N 小时的日志"""
    since = f"{hours} hours ago"
    logs = {}
    
    # SSH 认证日志
    result = subprocess.run(
        ["journalctl", "--since", since, 
         "-u", "sshd", "--no-pager"],
        capture_output=True, text=True
    )
    logs["ssh_auth"] = result.stdout.splitlines()
    
    # 失败登录尝试
    failed = [l for l in logs["ssh_auth"] if "Failed" in l]
    logs["failed_logins"] = failed
    
    # 异常时间登录
    logs["suspicious_hours"] = [
        l for l in logs["ssh_auth"]
        if any(h in l for h in ["02:", "03:", "04:"])
    ]
    
    return logs

AI 能识别的模式包括:

  • 暴力破解:同一 IP 短时间内大量失败尝试
  • 端口扫描:不同服务的连接请求来自同一源
  • 异常登录时间:非工作时间的 root 登录
  • 新 SSH 密钥:未授权的公钥被添加到 authorized_keys
  • sudo 滥用:普通用户突然获得提权操作

3. 漏洞扫描与补丁建议

#!/bin/bash
# ai-vuln-scanner.sh - 自动化漏洞检测脚本

echo "=== VPS 安全漏洞扫描 ==="
echo "时间: $(date)"
echo ""

# 1. 检查过时的软件包
echo "[1/5] 检查过时软件包..."
apt list --upgradable 2>/dev/null | grep -v "^Listing" > /tmp/outdated.txt
if [ -s /tmp/outdated.txt ]; then
    echo "发现 $(wc -l < /tmp/outdated.txt) 个可更新包"
    cat /tmp/outdated.txt
else
    echo "✓ 所有软件包均为最新"
fi

# 2. 检查 SSH 配置弱点
echo ""
echo "[2/5] 检查 SSH 配置..."
ssh_config=$(cat /etc/ssh/sshd_config 2>/dev/null)
weaknesses=""

if echo "$ssh_config" | grep -q "PermitRootLogin yes"; then
    weaknesses="$weaknesses\n  ⚠ Root 登录已启用"
fi
if echo "$ssh_config" | grep -q "PasswordAuthentication yes"; then
    weaknesses="$weaknesses\n  ⚠ 密码认证已启用"
fi
if echo "$ssh_config" | grep -q "Port 22"; then
    weaknesses="$weaknesses\n  ⚠ 使用默认 SSH 端口"
fi

if [ -n "$weaknesses" ]; then
    echo "发现以下弱点:$weaknesses"
else
    echo "✓ SSH 配置良好"
fi

# 3. 检查开放端口
echo ""
echo "[3/5] 检查开放端口..."
ss -tlnp 2>/dev/null | grep LISTEN > /tmp/open_ports.txt
echo "开放端口:"
cat /tmp/open_ports.txt

# 4. 检查防火墙规则
echo ""
echo "[4/5] 检查防火墙状态..."
ufw status 2>/dev/null || iptables -L -n 2>/dev/null | head -20

# 5. 检查文件完整性
echo ""
echo "[5/5] 检查关键文件完整性..."
for f in /etc/passwd /etc/shadow /etc/hosts /etc/crontab; do
    if [ -f "$f" ]; then
        md5sum "$f" >> /tmp/file_checksums.txt
        echo "  ✓ $f (MD5: $(md5sum "$f" | cut -d' ' -f1))"
    fi
done

echo ""
echo "=== 扫描完成 ==="
echo "将结果发送给 AI 获取详细分析报告..."

4. AI 分析报告生成

收集完数据后,将其发送给 AI 模型获取专业报告:

import requests

def generate_audit_report(log_data, config_issues, vuln_results):
    """生成 AI 驱动的安全审计报告"""
    
    prompt = f"""你是一个资深 Linux 安全专家。请根据以下 VPS 审计数据,生成一份详细的安全评估报告。

## 发现的问题

### SSH 配置弱点
{config_issues}

### 异常登录活动
{log_data.get('failed_logins', [])[:10]}

### 过时软件包
{vuln_results.get('outdated_packages', [])}

### 开放端口
{vuln_results.get('open_ports', [])}

## 请按以下格式输出报告:

### 📊 安全评分
给出 0-100 的评分,并说明理由

### 🔴 高危问题(需立即处理)
列出所有需要立即修复的问题

### 🟡 中危问题(建议尽快处理)
列出建议优化的配置

### 🟢 低风险项
列出可逐步改进的项目

### 🛠 修复建议
针对每个问题提供具体的命令行修复步骤

### 📋 持续监控建议
推荐需要设置的监控项和告警规则"""

    # 调用 AI API(以 OpenRouter 为例)
    response = requests.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "HTTP-Referer": "https://selfvps.net",
            "X-Title": "VPS Security Audit"
        },
        json={
            "model": "meta-llama/llama-3.1-8b-instruct:free",
            "messages": [{"role": "user", "content": prompt}]
        }
    )
    
    return response.json()["choices"][0]["message"]["content"]

完整的 AI 安全审计工作流

下面是一个完整的自动化方案,可以在你的 VPS 上部署:

第一步:创建审计脚本

#!/bin/bash
# /opt/ai-security-audit/run-audit.sh

AUDIT_DIR="/var/lib/security-audit/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$AUDIT_DIR"

echo "🔍 开始 VPS 安全审计..."
echo "📁 报告目录: $AUDIT_DIR"

# 1. 系统信息收集
uname -a > "$AUDIT_DIR/system_info.txt"
hostnamectl >> "$AUDIT_DIR/system_info.txt"
df -h >> "$AUDIT_DIR/system_info.txt"
free -h >> "$AUDIT_DIR/system_info.txt"
uptime >> "$AUDIT_DIR/system_info.txt"

# 2. 用户账户审计
echo "=== 用户账户 ===" > "$AUDIT_DIR/users.txt"
awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $3, $6, $7}' /etc/passwd >> "$AUDIT_DIR/users.txt"
echo "=== 特权用户 ===" >> "$AUDIT_DIR/users.txt"
awk -F: '$3 == 0 {print $1, $3}' /etc/passwd >> "$AUDIT_DIR/users.txt"

# 3. 网络状态
echo "=== 监听端口 ===" > "$AUDIT_DIR/network.txt"
ss -tlnp >> "$AUDIT_DIR/network.txt"
echo "=== 连接统计 ===" >> "$AUDIT_DIR/network.txt"
ss -s >> "$AUDIT_DIR/network.txt"
echo "=== ARP 表 ===" >> "$AUDIT_DIR/network.txt"
arp -an >> "$AUDIT_DIR/network.txt" 2>/dev/null

# 4. 服务状态
echo "=== 运行中的服务 ===" > "$AUDIT_DIR/services.txt"
systemctl list-units --type=service --state=running >> "$AUDIT_DIR/services.txt"

# 5. 安全日志
echo "=== 最近登录 ===" > "$AUDIT_DIR/login_history.txt"
last -20 >> "$AUDIT_DIR/login_history.txt"
echo "=== 失败登录 ===" >> "$AUDIT_DIR/login_history.txt"
journalctl -u sshd --since "24 hours ago" --no-pager 2>/dev/null | grep "Failed" >> "$AUDIT_DIR/login_history.txt"

# 6. 文件权限检查
echo "=== 世界可写文件 ===" > "$AUDIT_DIR/world_writable.txt"
find /etc -perm -o+w -type f 2>/dev/null >> "$AUDIT_DIR/world_writable.txt"
echo "=== SUID 文件 ===" >> "$AUDIT_DIR/world_writable.txt"
find / -perm -4000 -type f 2>/dev/null >> "$AUDIT_DIR/world_writable.txt"

echo "✅ 数据采集完成,正在生成报告..."

# 7. 压缩数据
tar czf "$AUDIT_DIR/data.tar.gz" -C "$AUDIT_DIR" .

echo "📦 审计报告已保存到: $AUDIT_DIR/"
echo "下一步: 将数据发送给 AI 进行分析"

第二步:设置定时任务

# 编辑 crontab
crontab -e

# 每周日凌晨 3 点执行安全审计
0 3 * * 0 /opt/ai-security-audit/run-audit.sh >> /var/log/security-audit.log 2>&1

# 每天检查 SSH 异常登录
0 */6 * * * /opt/ai-security-audit/check-ssh-alerts.sh

第三步:设置告警通知

#!/usr/bin/env python3
"""
ai-security-alarm.py - AI 驱动的安全告警系统
检测到异常时发送通知
"""

import smtplib
import requests
from email.mime.text import MIMEText
from datetime import datetime, timedelta

def check_ssh_anomalies():
    """检查 SSH 登录异常"""
    import subprocess
    
    # 获取最近 1 小时的失败登录
    result = subprocess.run(
        ["journalctl", "-u", "sshd", "--since", "1 hour ago", "--no-pager"],
        capture_output=True, text=True
    )
    
    failed_logins = [
        line for line in result.stdout.splitlines()
        if "Failed password" in line
    ]
    
    if len(failed_logins) > 5:
        # 提取 IP 地址
        import re
        ips = re.findall(r'from (\d+\.\d+\.\d+\.\d+)', '\n'.join(failed_logins))
        ip_counts = {}
        for ip in ips:
            ip_counts[ip] = ip_counts.get(ip, 0) + 1
        
        # 找出攻击频率最高的 IP
        top_ip = max(ip_counts, key=ip_counts.get)
        
        return {
            "alert": True,
            "type": "brute_force",
            "ip": top_ip,
            "attempts": ip_counts[top_ip],
            "total_failed": len(failed_logins)
        }
    
    return {"alert": False}

def send_notification(alert_data):
    """发送告警通知"""
    subject = f"🚨 VPS 安全告警: {alert_data['type'].upper()}"
    
    body = f"""
时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}
类型: {alert_data['type']}
来源 IP: {alert_data.get('ip', 'N/A')}
尝试次数: {alert_data.get('attempts', 'N/A')}

请立即检查您的 VPS 安全状态!
    """
    
    msg = MIMEText(body)
    msg["Subject"] = subject
    msg["From"] = "security@selfvps.net"
    msg["To"] = "admin@example.com"
    
    # 发送邮件
    try:
        with smtplib.SMTP("localhost", 25) as server:
            server.send_message(msg)
        print(f"✅ 告警邮件已发送至 {msg['To']}")
    except Exception as e:
        print(f"❌ 邮件发送失败: {e}")
        # 备选方案: 发送 Telegram 通知
        send_telegram_alert(subject, body)

def send_telegram_alert(subject, body):
    """通过 Telegram Bot 发送告警"""
    BOT_TOKEN = "YOUR_BOT_TOKEN"
    CHAT_ID = "YOUR_CHAT_ID"
    
    message = f"{subject}\n\n{body}"
    
    requests.post(
        f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
        json={"chat_id": CHAT_ID, "text": message}
    )

if __name__ == "__main__":
    alert = check_ssh_anomalies()
    if alert.get("alert"):
        send_notification(alert)
    else:
        print("✅ 未检测到异常,一切正常")

使用 AI 模型的选择

模型适用场景成本速度
Llama 3.1 8B快速配置审查免费(本地)毫秒级
Claude Haiku详细分析报告秒级
GPT-4o mini复杂漏洞分析秒级
Qwen 2.5中文报告生成免费秒级

对于 VPS 安全审计,推荐 本地运行小模型 + 云端大模型 的组合:

# 本地运行 Llama 3.1 8B 做初步筛选
ollama run llama3.1:8b <<EOF
请检查以下 SSH 配置是否存在安全隐患:
$(cat /etc/ssh/sshd_config)

只返回问题列表,不要解释。
EOF

# 将详细数据发送到云端 AI 做深度分析
curl -X POST https://api.openrouter.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-3.5-haiku",
    "messages": [{
      "role": "user",
      "content": "请分析以下 VPS 安全审计数据,给出修复建议..."
    }]
  }'

实际案例:一次 AI 发现的安全事件

上个月,一位读者通过这套方案发现了一个严重问题:

问题描述:AI 日志分析检测到某台 VPS 在过去 24 小时内有 347 次失败的 SSH 登录尝试,来源 IP 分布在 12 个不同的地址段。

AI 分析结论:这是典型的分布式暴力破解攻击,攻击者使用了常见的弱密码字典。

修复措施

  1. 立即启用 fail2ban 阻止攻击 IP
  2. 将 SSH 端口从 22 改为非标准端口
  3. 禁用密码认证,仅允许密钥登录
  4. 为 root 账户设置额外的 IP 白名单限制

整个过程从发现问题到修复完成不到 15 分钟——如果没有 AI 辅助,这种攻击可能潜伏数周而不会被察觉。

总结

AI 驱动的 VPS 安全审计不是要取代传统安全工具,而是为它们提供一个"大脑":

  • 传统工具负责收集数据(日志、配置、端口)
  • AI负责理解数据、识别模式、给出建议
  • 自动化脚本负责执行修复和持续监控

在你的 VPS 上部署这套方案,只需要:

  1. 一个定时运行的审计脚本
  2. 一个 AI API 访问权限
  3. 一套告警通知机制

投资不到 1 小时的设置时间,换来的是 7×24 不间断的专业安全守护。


这篇文章对你有帮助吗?欢迎在评论区分享你的 VPS 安全经验!

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials