Skip to content

漏洞扫描与风险评估 — Nessus/OpenVAS 使用指南

Published:
16 min read

漏洞是网络安全的阿喀琉斯之踵。即使拥有完善的安全策略和应急响应能力,如果系统中存在未修复的已知漏洞,攻击者依然可以轻松突破防线。漏洞扫描与风险评估是安全运营中不可或缺的环节,它帮助组织主动发现和修复安全弱点,将被动防御转化为主动治理。本文将深入讲解漏洞管理体系、CVSS 评分标准,并以 Nessus 和 OpenVAS(GVM) 两大扫描平台为例,展示漏洞扫描的完整实战流程。

漏洞管理生命周期

漏洞管理不是一次性的扫描活动,而是一个持续循环的过程。业界公认的漏洞管理生命周期包含以下阶段:

  1. 资产发现(Asset Discovery):识别和清点组织的所有 IT 资产,包括服务器、终端、网络设备、云资源和应用程序
  2. 漏洞扫描(Vulnerability Scanning):使用自动化工具对资产进行扫描,识别已知漏洞和配置缺陷
  3. 漏洞评估(Vulnerability Assessment):对扫描结果进行分析和验证,评估漏洞的真实风险等级
  4. 优先级排序(Prioritization):结合资产重要性、漏洞严重程度和可利用性,确定修复优先级
  5. 漏洞修复(Remediation):实施补丁安装、配置修改或其他缓解措施
  6. 验证复查(Verification):重新扫描确认漏洞已被成功修复
  7. 报告与度量(Reporting & Metrics):生成管理报告,跟踪漏洞修复趋势和关键指标(MTTR、漏洞密度等)

这个循环应当以固定的频率持续运转——高安全要求的环境建议每周扫描,一般环境至少每月一次。

CVSS 评分体系详解

通用漏洞评分系统(Common Vulnerability Scoring System, CVSS)是业界标准的漏洞严重程度量化方法。当前最新版本为 CVSS v3.1(CVSS v4.0 已发布但尚未完全普及)。

CVSS v3.1 评分维度

基础指标组(Base Metrics): 描述漏洞本身的固有特征

指标含义取值示例
Attack Vector (AV)攻击向量Network / Adjacent / Local / Physical
Attack Complexity (AC)攻击复杂度Low / High
Privileges Required (PR)所需权限None / Low / High
User Interaction (UI)用户交互None / Required
Scope (S)影响范围Unchanged / Changed
Confidentiality (C)机密性影响None / Low / High
Integrity (I)完整性影响None / Low / High
Availability (A)可用性影响None / Low / High

时间指标组(Temporal Metrics): 随时间变化的属性

环境指标组(Environmental Metrics): 根据组织自身环境调整

CVSS 评分等级

分数范围严重等级建议响应时间
9.0 - 10.0Critical(紧急)24小时内修复或缓解
7.0 - 8.9High(高)1周内修复
4.0 - 6.9Medium(中)1个月内修复
0.1 - 3.9Low(低)下一个维护窗口修复
0.0None(无)无需处理

CVE/CWE/NVD 漏洞库

理解三大漏洞标识体系对于漏洞管理至关重要:

在国内环境中,还应关注:

Nessus 安装与使用

Tenable Nessus 是全球使用最广泛的商业漏洞扫描器。Nessus Essentials 版本可免费扫描最多 16 个 IP,适合学习和小型环境使用。

安装 Nessus

# === Linux 安装(以 Debian/Ubuntu 为例)===

# 1. 从 Tenable 官网下载安装包
# https://www.tenable.com/products/nessus/nessus-essentials
# 下载对应的 .deb 包

# 2. 安装
sudo dpkg -i Nessus-10.x.x-ubuntu1604_amd64.deb

# 3. 启动 Nessus 服务
sudo systemctl start nessusd
sudo systemctl enable nessusd

# 4. 访问 Web 界面
# https://localhost:8834

# 5. 检查服务状态
sudo systemctl status nessusd

# === CentOS/RHEL 安装 ===
sudo rpm -ivh Nessus-10.x.x-el8.x86_64.rpm
sudo systemctl start nessusd
sudo systemctl enable nessusd

创建扫描策略

Nessus 提供了多种预定义扫描模板,常用的包括:

扫描模板适用场景扫描强度
Basic Network Scan通用网络漏洞扫描中等
Advanced Scan自定义深度扫描可配置
Credentialed Patch Audit带凭据的补丁审计深度
Web Application TestsWeb 应用漏洞扫描中等
Malware Scan恶意软件检测中等
Policy Compliance Auditing合规性审计深度

创建自定义扫描策略的关键配置:

执行凭据扫描

凭据扫描(Credentialed Scan)能够深入到系统内部,检测已安装软件的补丁级别、本地配置缺陷等,准确率远高于非凭据扫描。

# SSH 凭据配置建议:
# 1. 创建专用扫描账户
sudo useradd -m nessus-scan
sudo passwd nessus-scan

# 2. 配置 sudo 权限(允许必要的检测命令)
echo "nessus-scan ALL=(ALL) NOPASSWD: /usr/bin/find, /usr/bin/cat, /usr/sbin/dmidecode, /usr/bin/rpm, /usr/bin/dpkg" | \
    sudo tee /etc/sudoers.d/nessus-scan

# 3. 或使用 SSH 密钥认证(推荐)
sudo -u nessus-scan ssh-keygen -t ed25519 -f /home/nessus-scan/.ssh/id_ed25519 -N ""
# 将公钥分发到目标主机

报告分析要点

Nessus 扫描完成后,重点关注以下内容:

OpenVAS (GVM) 开源替代方案

Greenbone Vulnerability Management(GVM,前身为 OpenVAS)是最强大的开源漏洞扫描解决方案,适合预算有限但需要企业级扫描能力的团队。

Docker 部署 GVM

使用 Docker 是部署 GVM 最简便的方式,避免了复杂的依赖和编译过程。

# === 使用 Docker Compose 部署 GVM ===

# 1. 创建部署目录
mkdir -p /opt/gvm && cd /opt/gvm

# 2. 创建 docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
  gvm:
    image: securecompliance/gvm:latest
    container_name: gvm
    ports:
      - "9392:9392"  # GSA Web 界面
    volumes:
      - gvm_data:/data
    environment:
      - GVM_ADMIN_PASSWORD=YourStrongPassword123!
      - GVM_UPDATE_FEED=true
    restart: unless-stopped

volumes:
  gvm_data:
EOF

# 3. 启动容器(首次启动需要较长时间同步漏洞库)
docker compose up -d

# 4. 查看初始化日志
docker logs -f gvm

# 5. 访问 Web 界面
# https://localhost:9392
# 默认用户名: admin
# 密码: 上面设置的 GVM_ADMIN_PASSWORD

# 6. 手动更新漏洞库(Feed)
docker exec -it gvm /usr/bin/greenbone-feed-sync

使用 GVM 命令行工具(gvm-cli)

# 安装 gvm-tools(Python 客户端)
pip3 install gvm-tools

# 列出可用的扫描配置
gvm-cli tls --hostname localhost --port 9390 \
    --xml '<get_configs/>'

# 创建扫描目标
gvm-cli tls --hostname localhost --port 9390 \
    --xml '<create_target>
             <name>Internal Servers</name>
             <hosts>192.168.1.0/24</hosts>
             <port_range>T:1-65535</port_range>
           </create_target>'

# 创建并启动扫描任务
gvm-cli tls --hostname localhost --port 9390 \
    --xml '<create_task>
             <name>Weekly Internal Scan</name>
             <config id="[扫描配置ID]"/>
             <target id="[目标ID]"/>
           </create_task>'

GVM 扫描配置建议

扫描配置说明适用场景
Full and fast全面且快速的扫描日常漏洞扫描(推荐)
Full and very deep最全面深入的扫描安全评估、合规检查
Discovery仅资产发现网络资产梳理
Host Discovery主机存活检测快速发现在线主机

漏洞优先级排序与修复策略

面对扫描报告中数百甚至数千个漏洞,合理的优先级排序至关重要。

SSVC 决策树模型

卡内基梅隆大学 CERT/CC 提出的 Stakeholder-Specific Vulnerability Categorization(SSVC)框架提供了一种结构化的优先级决策方法:

决策因素考量维度
Exploitation(利用状态)是否已有野外利用?PoC 是否公开?
Exposure(暴露程度)资产是否面向互联网?是否在 DMZ 中?
Utility(攻击价值)漏洞是否可自动化利用?影响范围有多大?
Impact(业务影响)受影响资产的业务重要性如何?

修复优先级矩阵

优先级条件修复时限
P0-立即修复CVSS ≥ 9.0 且已有在野利用 且 面向互联网24小时
P1-紧急修复CVSS ≥ 7.0 且已有 PoC 利用代码72小时
P2-计划修复CVSS ≥ 7.0 且无公开利用 或 CVSS 4.0-6.9 且面向互联网2周
P3-常规修复CVSS 4.0-6.9 且内网资产1个月
P4-低优先级CVSS < 4.0 或风险已通过其他控制措施缓解季度维护

自动化漏洞扫描流程

将漏洞扫描集成到 CI/CD 和运维流程中,实现持续化的安全检测。

定时扫描脚本示例

#!/bin/bash
# 自动化漏洞扫描脚本(基于 OpenVAS/GVM)
# 建议通过 crontab 设置每周执行

SCAN_DATE=$(date +%Y%m%d)
REPORT_DIR="/opt/gvm/reports"
MAIL_TO="security-team@company.com"

mkdir -p "${REPORT_DIR}"

echo "[$(date)] Starting weekly vulnerability scan..."

# 使用 gvm-tools 的 Python API 执行扫描
python3 << 'PYEOF'
from gvm.connections import TLSConnection
from gvm.protocols.gmp import Gmp
from gvm.transforms import EtreeTransform

connection = TLSConnection(hostname='localhost', port=9390)
transform = EtreeTransform()

with Gmp(connection=connection, transform=transform) as gmp:
    gmp.authenticate('admin', 'password')

    # 获取扫描任务ID(需预先创建)
    tasks = gmp.get_tasks()
    for task in tasks.findall('.//task'):
        task_id = task.get('id')
        task_name = task.find('name').text
        if task_name == 'Weekly Internal Scan':
            # 启动扫描任务
            gmp.start_task(task_id)
            print(f"Started task: {task_name} ({task_id})")
            break

PYEOF

echo "[$(date)] Scan initiated. Reports will be available in GVM web interface."

Nessus API 自动化示例

# 使用 Nessus REST API 启动扫描

NESSUS_URL="https://localhost:8834"
API_KEY="accessKey=YOUR_ACCESS_KEY;secretKey=YOUR_SECRET_KEY"

# 列出扫描任务
curl -sk -H "X-ApiKeys: ${API_KEY}" \
    "${NESSUS_URL}/scans" | python3 -m json.tool

# 启动指定扫描
SCAN_ID=5
curl -sk -X POST -H "X-ApiKeys: ${API_KEY}" \
    "${NESSUS_URL}/scans/${SCAN_ID}/launch"

# 导出扫描报告(PDF格式)
curl -sk -X POST -H "X-ApiKeys: ${API_KEY}" \
    -H "Content-Type: application/json" \
    -d '{"format":"pdf"}' \
    "${NESSUS_URL}/scans/${SCAN_ID}/export"

安全建议与防御措施

  1. 建立漏洞管理流程:将漏洞扫描纳入安全运营标准流程,明确扫描频率、责任人和修复SLA
  2. 凭据扫描优先:尽量使用凭据扫描模式,非凭据扫描的漏洞发现率仅为凭据扫描的 30%-50%
  3. 关注上下文:不要仅依赖 CVSS 分数,要结合资产暴露面、业务重要性和威胁情报综合评估
  4. 跟踪修复进度:建立漏洞修复跟踪机制,设定修复时限并定期复查
  5. 扫描与补丁管理联动:将漏洞扫描结果与补丁管理系统对接,实现自动化的补丁分发
  6. 持续监控新漏洞:订阅 CVE 通知和厂商安全公告,在新漏洞公开后第一时间评估影响

总结

漏洞扫描与风险评估是构建主动防御体系的核心能力。无论选择商业产品 Nessus 还是开源方案 GVM/OpenVAS,关键在于建立持续、系统化的漏洞管理流程。扫描只是起点,真正的价值在于对漏洞的准确评估、合理排序和有效修复。建议安全团队将漏洞管理指标(如平均修复时间 MTTR、漏洞修复率、高危漏洞占比等)纳入安全运营 KPI,通过数据驱动的方式持续提升组织的安全水位。