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…).
Services API
Guida lg231
Webhook
Quick Start
Endpoint disponibili
Base URL: https://nis2.agile.software/api/services
Auth: Header X-API-Key: nis2_xxxx — oppure Authorization: Bearer nis2_xxxx
Metodo Endpoint Scope Descrizione
POST /tokenread:all Token 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 /status— Health check piattaforma, versione, DB. Nessuna auth.
GET /compliance-summaryread:compliance Score NIS2 aggregato (0-100), domain scores Art.21, rischi aperti, incidenti
GET /risks/feedread:risks Registro rischi con livello ISO 27005, status, area. Filtri: ?level=high,critical&status=open
GET /incidents/feedread:incidents Incidenti Art.23: severity, status, notifiche CSIRT, deadline 72h, overdue
GET /controls/statusread:compliance Stato controlli per dominio: implemented / partial / missing
GET /assets/criticalread:assets Asset critici con tipo, criticità, dipendenze mappate
GET /suppliers/riskread:suppliers Fornitori: risk_level, ultimo assessment, is_flagged
GET /policies/approvedread:policies Policy approvate: titolo, area, data, versione
GET /openapi.json— Specifica 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
Header Valore
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 NIS2 Rilevanza D.Lgs. 231/2001
Incidente cybersecurity (Art.23 NIS2) Reato presupposto art.24-bis — criminalità informatica
Fornitore IT flaggato alto rischio Rischio complicità in reati informatici via supply chain
Policy sicurezza non approvata Gap nel MOG — Modello Organizzativo e di Gestione
Score NIS2 < 40% Indicatore OdV: carenza controlli, escalation consigliata
Whistleblowing sicurezza Potenziale 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
company-ms: aggiungere nis2_api_key, nis2_org_id, nis2_enabled a provider-config
shared: creare Nis2Client (curl wrapper leggero)
UI: widget NIS2 score nella company detail (gauge + badge + rischi high)
risk-ms: import rischi cyber durante assessment (categoria art.24-bis)
monitoring-ms: escalation incidenti significativi → odv_activity
monitoring-ms: policy NIS2 non approvate → alert OdV
(opz.) endpoint POST /api/integrations/nis2-webhook + subscription
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
Login su NIS2 Agile con ruolo org_admin o superiore
Vai su Settings → API Keys (sezione Integrazioni)
Click "Nuova API Key" → nome descrittivo (es: "lg231 Integration") → scope: read:all
Copia la chiave — formato nis2_XXXX... — visibile una sola volta
Nota l'Organization ID dal URL del dashboard (es: /dashboard.html dopo login)
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 Agile https://nis2.agile.software
Specifiche OpenAPI GET /api/services/openapi.json
Test Runner test-runner.php
Amministratore cristiano.benassati@gmail.com
Documento tecnico lg231 docs/integration/lg231-nis2-integration.md