NIS2 Agile come Provider di Compliance

NIS2 Agile espone una Services API REST che permette a sistemi esterni di leggere score di conformità, rischi, incidenti e controlli in tempo reale. Auth via API Key dedicata, rate limiting 100 req/ora, firma HMAC-SHA256 per webhook outbound.

Provider Disponibili
Disponibile

231 Agile (lg231)

Integrazione compliance D.Lgs. 231/2001 + NIS2. Incidenti cyber → OdV, rischi IT → registro 231, score NIS2 nel dashboard aziendale.

Guida integrazione →
Pianificato

AllRisk Agile

Feed rischi cyber per piattaforma ERM unificata. Risk score NIS2 mappato su categorie ISO 31000.

Pianificato

SustainAI Agile

Cybersecurity come pillar ESG. Score NIS2 nel report di sostenibilità (CSRD, GRI 418).

Disponibile

SIEM / SOC Esterni

Webhook su incident.created e risk.created_high verso qualsiasi endpoint HTTPS (Splunk, Elastic, PagerDuty…).

Endpoint disponibili
Base URL: https://nis2.agile.software/api/services
Auth: Header X-API-Key: nis2_xxxx — oppure Authorization: Bearer nis2_xxxx
MetodoEndpointScopeDescrizione
POST/tokenread:allToken exchange: API Key → JWT 15 min. lg231 usa questo JWT per le chiamate successive.
POST/ssosso:login (o read:all)SSO federato: passa email + ruolo + responsabilità → JWT NIS2 2h. Utente creato se non esiste. Auditato.
GET/statusHealth check piattaforma, versione, DB. Nessuna auth.
GET/compliance-summaryread:complianceScore NIS2 aggregato (0-100), domain scores Art.21, rischi aperti, incidenti
GET/risks/feedread:risksRegistro rischi con livello ISO 27005, status, area. Filtri: ?level=high,critical&status=open
GET/incidents/feedread:incidentsIncidenti Art.23: severity, status, notifiche CSIRT, deadline 72h, overdue
GET/controls/statusread:complianceStato controlli per dominio: implemented / partial / missing
GET/assets/criticalread:assetsAsset critici con tipo, criticità, dipendenze mappate
GET/suppliers/riskread:suppliersFornitori: risk_level, ultimo assessment, is_flagged
GET/policies/approvedread:policiesPolicy approvate: titolo, area, data, versione
GET/openapi.jsonSpecifica OpenAPI 3.0 in JSON
Esempio risposta /compliance-summary
// GET /api/services/compliance-summary // X-API-Key: nis2_Abc123... { "success": true, "data": { "organization": { "id": 5, "name": "Azienda XYZ", "sector": "energia", "nis2_entity_type": "essential" }, "compliance": { "overall_score": 73, "label": "Parziale", "domain_scores": [ { "domain": "Gestione del rischio", "score": 80, "status": "compliant" }, { "domain": "Sicurezza supply chain", "score": 45, "status": "partial" } ] }, "risks": { "total": 12, "open": 8, "high_critical": 3 }, "incidents": { "total": 2, "open": 1, "significant": 1, "overdue": 0 } } }
Headers risposta
HeaderValore
X-NIS2-API-Version1.0
X-NIS2-Org-IdID organizzazione (intero)
X-RateLimit-Limit100 (req/ora per chiave)
X-RateLimit-RemainingRichieste rimaste nella finestra
Per l'agente Claude di lg231: questo tab descrive esattamente cosa implementare in lg231 Agile per consumare NIS2 come provider di compliance cybersecurity.
Perché integrare 231 con NIS2
Evento NIS2Rilevanza D.Lgs. 231/2001
Incidente cybersecurity (Art.23 NIS2)Reato presupposto art.24-bis — criminalità informatica
Fornitore IT flaggato alto rischioRischio complicità in reati informatici via supply chain
Policy sicurezza non approvataGap nel MOG — Modello Organizzativo e di Gestione
Score NIS2 < 40%Indicatore OdV: carenza controlli, escalation consigliata
Whistleblowing sicurezzaPotenziale escalation verso OdV 231
1. Aggiungere NIS2 al provider-config (company-ms)

File: services/company-ms/public/index.php — route PATCH /companies/{id}/provider-config

// Aggiungere ai $allowed: $allowed = [ 'certisource_pat', 'anthropic_api_key', 'openai_api_key', // ── Nuovo provider NIS2 ── 'nis2_api_key', // chiave da NIS2 → Settings → API Keys 'nis2_org_id', // ID org NIS2 (dal URL dashboard o /api/services/status) 'nis2_enabled', // bool: abilitare pull automatico ];
2. NIS2Client (shared lib o inline)
class Nis2Client { const BASE_URL = 'https://nis2.agile.software/api/services'; public static function get(string $endpoint, string $apiKey, array $query = []): array { $url = self::BASE_URL . $endpoint; if ($query) $url .= '?' . http_build_query($query); $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_HTTPHEADER => [ 'X-API-Key: ' . $apiKey, 'Accept: application/json', 'X-Caller: lg231-agile/1.0', ], ]); $body = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $code === 200 && $body ? ['success' => true, 'data' => json_decode($body, true)] : ['success' => false, 'http_code' => $code]; } }
3. Widget score NIS2 nella company view
// In company detail view PHP/JS: $nis2Key = $meta['nis2_api_key'] ?? null; if ($nis2Key) { $summary = Nis2Client::get('/compliance-summary', $nis2Key); // Mostrare gauge score + badge essential/important + rischi high // Link: https://nis2.agile.software/dashboard.html }
4. Escalation incidenti → OdV (monitoring-ms)
// Job periodico (cron o hook) nel monitoring-ms: $incidents = Nis2Client::get('/incidents/feed', $apiKey, ['significant' => 1, 'status' => 'open']); foreach (($incidents['data']['incidents'] ?? []) as $inc) { // Crea odv_activity: // type: 'cyber_incident_notifica' // description: 'Incidente NIS2 significativo: ' . $inc['title'] // priority: $inc['overdue'] ? 'urgent' : 'high' // source: 'nis2_agile' // reference_id: $inc['id'] }
3b. SSO federato — apertura diretta NIS2 da lg231
Quando un utente lg231 clicca "Apri NIS2" dal suo dashboard, lg231 chiama POST /api/services/sso e redirige l'utente su NIS2 già autenticato, portando con sé ruolo e responsabilità. Ogni accesso SSO è tracciato nell'audit trail.
// In lg231, quando l'utente clicca "Apri NIS2 Agile": $ssoResp = Nis2Client::post('/sso', $apiKey, [ 'user_email' => $currentUser['email'], 'user_name' => $currentUser['first_name'] . ' ' . $currentUser['last_name'], 'user_role' => 'compliance_manager', // mappa da ruolo lg231 'caller_system' => 'lg231', 'caller_user_id' => $currentUser['id'], 'responsibilities' => [ ['area' => 'MOG 231', 'scope' => 'art.24-bis criminalità informatica'], ['area' => 'OdV', 'scope' => 'monitoraggio cyber risk'], ], ]); if ($ssoResp['success']) { $jwt = $ssoResp['data']['data']['token']; $redirectUrl = $ssoResp['data']['data']['redirect_url']; // Redirect con token nel fragment (sicuro, non nel server log) header('Location: ' . $redirectUrl . '#sso_token=' . urlencode($jwt)); }
NIS2 lato frontend: in dashboard.html aggiungere:
const ssoToken = location.hash.match(/#sso_token=([^&]+)/)?.[1];
if (ssoToken) { localStorage.setItem('nis2_token', ssoToken); location.hash = ''; }
Checklist implementazione lg231
Nota CORS: tutte le chiamate a NIS2 devono avvenire server-to-server (PHP cURL), non da browser. NIS2 non accetta origini lg231 in CORS per sicurezza.
NIS2 invia notifiche push su eventi tramite webhook HTTPS firmati HMAC-SHA256. Il sistema esterno riceve la notifica in tempo reale senza polling.
Eventi disponibili
incident.created Nuovo incidente di sicurezza registrato → odv_activity
incident.deadline_warning Scadenza Art.23 (24h/72h) entro 4 ore → alert urgente OdV
risk.created_high Nuovo rischio HIGH o CRITICAL creato → risk register 231
compliance.score_changed Variazione score NIS2 > 5% → aggiorna widget
policy.approved Nuova policy di sicurezza approvata → aggiorna MOG ref
supplier.risk_flagged Fornitore IT flaggato alto rischio → supply chain 231
Registrare una subscription
POST https://nis2.agile.software/api/webhooks/subscriptions Authorization: Bearer {jwt_token} Content-Type: application/json { "url": "https://lg231.agile.software/api/integrations/nis2-webhook", "events": ["incident.created", "incident.deadline_warning", "risk.created_high"], "description": "lg231 Agile integration" } // Risposta: { "id": 1, "secret": "whsec_abc123..." } // Salvare il secret in companies.metadata.nis2_webhook_secret
Verifica firma HMAC (endpoint ricevente)
$secret = $meta['nis2_webhook_secret']; $body = file_get_contents('php://input'); $expected = 'sha256=' . hash_hmac('sha256', $body, $secret); $received = $_SERVER['HTTP_X_NIS2_SIGNATURE'] ?? ''; if (!hash_equals($expected, $received)) { http_response_code(401); exit; } $event = $_SERVER['HTTP_X_NIS2_EVENT'] ?? ''; $payload = json_decode($body, true); switch ($event) { case 'incident.created': // crea odv_activity... break; case 'risk.created_high': // aggiungi a risk register... break; }
Creare la prima API Key
  1. Login su NIS2 Agile con ruolo org_admin o superiore
  2. Vai su Settings → API Keys (sezione Integrazioni)
  3. Click "Nuova API Key" → nome descrittivo (es: "lg231 Integration") → scope: read:all
  4. Copia la chiave — formato nis2_XXXX... — visibile una sola volta
  5. Nota l'Organization ID dal URL del dashboard (es: /dashboard.html dopo login)
  6. In lg231: salva via PATCH /companies/{id}/provider-config con nis2_api_key e nis2_org_id
Test rapido (curl)
# 1. Verifica senza auth curl https://nis2.agile.software/api/services/status # 2. Compliance summary curl -H "X-API-Key: nis2_TUA_CHIAVE" \ https://nis2.agile.software/api/services/compliance-summary | python3 -m json.tool # 3. Incidenti significativi aperti curl -H "X-API-Key: nis2_TUA_CHIAVE" \ "https://nis2.agile.software/api/services/incidents/feed?significant=1&status=open" # 4. Rischi high/critical curl -H "X-API-Key: nis2_TUA_CHIAVE" \ "https://nis2.agile.software/api/services/risks/feed?level=high,critical"
Contatti e riferimenti
App NIS2 Agilehttps://nis2.agile.software
Specifiche OpenAPIGET /api/services/openapi.json
Test Runnertest-runner.php
Amministratorecristiano.benassati@gmail.com
Documento tecnico lg231docs/integration/lg231-nis2-integration.md