Nessus MCP Server

Um servidor MCP para interagir com o scanner de vulnerabilidades Tenable Nessus.

Documentação

Servidor MCP Nessus

Um servidor Model Context Protocol (MCP) para interagir com o scanner de vulnerabilidades Tenable Nessus. Este servidor permite que assistentes de IA realizem varreduras e análises de vulnerabilidades por meio do protocolo MCP.

Ele se comunica com uma instância real do Nessus por meio de sua API REST usando autenticação por chave de API. Se nenhum NESSUS_URL/NESSUS_ACCESS_KEY/NESSUS_SECRET_KEY estiver definido, ele usa um modo simulado autocontido para desenvolvimento e testes locais.

Recursos

  • Varredura de Vulnerabilidades: Inicie e monitore varreduras de vulnerabilidades em alvos especificados
  • Gerenciamento de Varreduras: Liste, acompanhe e recupere resultados de varreduras de vulnerabilidades
  • Análise de Vulnerabilidades: Pesquise e obtenha informações detalhadas sobre vulnerabilidades específicas
  • Modo Simulado: Modo simulado totalmente funcional para testes sem uma chave de API do Nessus

Ferramentas

O servidor fornece as seguintes ferramentas:

Nome da FerramentaDescrição
list_scan_templatesLista os modelos de varredura disponíveis no Nessus
start_scanInicia uma nova varredura de vulnerabilidades em um alvo
get_scan_statusVerifica o status de uma varredura em execução
get_scan_resultsObtém os resultados de uma varredura concluída
list_scansLista todas as varreduras e seus status
get_vulnerability_detailsObtém informações detalhadas sobre uma vulnerabilidade específica
search_vulnerabilitiesPesquisa vulnerabilidades por palavra-chave

Instalação

Pré-requisitos

  • Node.js 20 ou superior
  • TypeScript (para desenvolvimento)

Compilando a partir do código-fonte

  1. Clone o repositório:

    git clone https://github.com/Cyreslab-AI/nessus-mcp-server.git
    cd nessus-mcp-server
    
  2. Instale as dependências:

    npm install
    
  3. Compile o servidor:

    npm run build
    

Uso

Executando em Modo Simulado

Por padrão, o servidor executa em modo simulado, que não requer uma chave de API do Nessus:

node build/index.js

Executando com uma instância real do Nessus

Para conectar a uma instância real do Nessus, defina as seguintes variáveis de ambiente:

NESSUS_URL=https://your-nessus-instance:8834
NESSUS_ACCESS_KEY=your-access-key
NESSUS_SECRET_KEY=your-secret-key

O servidor é alternado para o modo real assim que todas as três estiverem definidas; caso contrário, ele executa em modo simulado.

Em seguida, execute o servidor:

node build/index.js

Gerando um par de chaves de API

Na interface web do Nessus: Configurações > Minha Conta > Chaves de API > Gerar. O Nessus mostra a chave de acesso e a chave secreta apenas uma vez no momento da geração, então armazene-as em um local seguro (por exemplo, um gerenciador de segredos ou a configuração de ambiente do seu cliente MCP) — o próprio Nessus não pode mostrá-las novamente.

As solicitações são autenticadas com o cabeçalho HTTP X-ApiKeys: accessKey=<key>; secretKey=<key> em cada chamada. Não há etapa separada de login/sessão, nem cookie ou token para renovar.

Certificados autoassinados

O Nessus é muito comumente implantado com um certificado TLS autoassinado. Por padrão, este servidor verifica certificados rigorosamente e falhará contra uma instância autoassinada. Para aceitar explicitamente a omissão da verificação de certificado (por exemplo, para uma instância interna em que você confia), defina:

NESSUS_ALLOW_SELF_SIGNED=true

Deixe isso não definido (ou false) sempre que a instância tiver um certificado emitido por uma CA confiável. O servidor registra um aviso no stderr na inicialização sempre que isso estiver habilitado.

Notas de design sobre o mapeamento do modo real

Algumas ferramentas deste servidor não têm equivalente exato 1:1 na API REST do Nessus, então as seguintes decisões foram tomadas:

  • start_scan: scan_type (basic-network-scan / web-app-scan / compliance-scan) é um nome lógico, não um UUID de modelo do Nessus (esses são específicos da instância e retornados por GET /editor/scan/templates). Este servidor resolve o nome lógico para um modelo correspondendo primeiro aos valores conhecidos de name do modelo, recorrendo a uma correspondência difusa com o nome/título do modelo. start_scan então cria a varredura (POST /scans) e imediatamente a inicia (POST /scans/{id}/launch), já que a ferramenta é chamada de "iniciar", não "criar".
  • get_scan_results: os resultados reais da varredura são agregados por plugin em toda a varredura (do resumo vulnerabilities de GET /scans/{id}), não os registros totalmente enriquecidos e por vulnerabilidade que os dados simulados retornam. Buscar texto completo de CVSS/descrição/remediação para cada plugin significaria uma chamada extra à API do Nessus por descoberta, o que não escala para varreduras com muitas descobertas. Use get_vulnerability_details com um plugin_id específico dos resultados para detalhar informações completas de uma única descoberta.
  • get_vulnerability_details: no modo simulado, isso aceita um ID de CVE. Contra uma instância real do Nessus, deve ser um ID de plugin do Nessus numérico (por exemplo, 156327), porque a API REST do Nessus local não tem endpoint que resolva um CVE ou palavra-chave arbitrária para um plugin — apenas GET /plugins/plugin/{id} (consulta por ID de plugin numérico) existe. Uma entrada em formato de CVE no modo real retorna um erro claro e documentado em vez de falhar silenciosamente.
  • search_vulnerabilities: o Nessus não tem um único endpoint de "pesquisar todas as vulnerabilidades" — as descobertas só existem no contexto dos resultados de uma varredura. No modo real, esta ferramenta aceita um scan_id opcional para limitar a pesquisa a uma varredura; sem ele, a pesquisa cobre as varreduras concluídas mais recentemente atualizadas (limitadas a 10, para limitar o número de chamadas de API em instâncias com muitas varreduras). Esta é uma decisão deliberada de escopo, documentada na própria descrição da ferramenta.

Usando com Claude for Desktop

Para usar este servidor com Claude for Desktop:

  1. Edite seu arquivo de configuração do Claude for Desktop:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
  2. Adicione a configuração do servidor:

{
  "mcpServers": {
    "nessus": {
      "command": "node",
      "args": ["/path/to/nessus-mcp-server/build/index.js"],
      "env": {
        "NESSUS_URL": "https://your-nessus-instance:8834",
        "NESSUS_ACCESS_KEY": "your-access-key",
        "NESSUS_SECRET_KEY": "your-secret-key",
        "NESSUS_ALLOW_SELF_SIGNED": "false"
      }
    }
  }
}

Para o modo simulado, você pode omitir a seção env.

Exemplos de Interação

Iniciando uma Varredura

start_scan:
  target: 192.168.1.1
  scan_type: basic-network-scan

Obtendo Resultados de Varredura

get_scan_results:
  scan_id: scan-1234567890

Pesquisando Vulnerabilidades

search_vulnerabilities:
  keyword: log4j

Contra uma instância real do Nessus, opcionalmente limite a pesquisa a uma varredura:

search_vulnerabilities:
  keyword: log4j
  scan_id: 42

Desenvolvimento

Estrutura do Projeto

  • src/index.ts: Ponto de entrada principal do servidor
  • src/nessus-api.ts: Cliente da API do Nessus com fallback simulado
  • src/mock-data.ts: Dados simulados de vulnerabilidades para testes
  • src/tools/: Implementações das ferramentas
  • src/utils/: Funções utilitárias

Adicionando Novas Ferramentas

  1. Defina o esquema da ferramenta e o manipulador no arquivo apropriado em src/tools/
  2. Importe e registre a ferramenta em src/index.ts

Status de verificação

As solicitações em modo real são implementadas diretamente contra o contrato documentado da API REST do Tenable Nessus (endpoints, corpos de solicitação e formatos de resposta). Elas foram verificadas por:

  • Uma compilação TypeScript limpa (npm run build).
  • Exercitar cada ferramenta via stdio em modo real contra um NESSUS_URL inacessível (por exemplo, https://localhost:1), confirmando que o servidor inicia, aceita solicitações e retorna uma resposta isError limpa com uma mensagem descritiva (conexão recusada, TLS, tempo limite, etc.) em vez de travar ou recorrer silenciosamente a dados simulados.

Elas não foram verificadas contra uma instância real do Nessus, pois nenhuma estava disponível no ambiente em que foi construído. Se você conectar isso a uma instância real e algo não corresponder (por exemplo, um nome de modelo que sua instância não tem, ou um campo de resposta que difere por versão do Nessus), abra uma issue.

Licença

MIT

Aviso Legal

Este servidor não é afiliado ou endossado pela Tenable. Nessus é uma marca registrada da Tenable, Inc.