AllRisk × NIS2 Agile

# Integrazione AllRisk ← NIS2 Agile

Esporta il risk register cyber NIS2 verso AllRisk per consolidamento nel registro rischi enterprise. Importazione automatica dei rischi HIGH/CRITICAL tramite API Key.

## Scenario di integrazione

AllRisk è il registro rischi enterprise centralizzato. NIS2 Agile gestisce i rischi cyber in ottica normativa (ISO 27005 / NIS2). L'integrazione permette di:

1

### Consolidamento automatico

I rischi HIGH/CRITICAL di NIS2 vengono automaticamente importati in AllRisk come rischi di categoria "Cyber/IT" con score e deadline normalizzati.

2

### Aggiornamento bidirezionale

AllRisk notifica NIS2 tramite webhook se un rischio enterprise si trasforma in minaccia cyber (es. incidente supply chain → rischio NIS2).

3

### Reporting unificato

Report rischi enterprise unico che include dimensione NIS2 con compliance score per ogni categoria di rischio cyber (Art.21 domains).

## Mappatura campi NIS2 → AllRisk

Campo NIS2 Agile | Campo AllRisk | Trasformazione
--- | --- | ---
`risk_code` | `external_ref` | Prefisso `NIS2-` + codice
`title` | `risk_name` | Diretta
`risk_level` | `severity` | critical→5, high→4, medium→3, low→2
`likelihood` × `impact` | `risk_score` | Scala 0–25 → 0–100
`category` | `risk_category` | Mappato su tassonomia AllRisk "Cyber"
`nis2_article` | `regulatory_ref` | Prefisso "NIS2 Art."
`treatment` | `response_strategy` | mitigate→Reduce, accept→Accept, ecc.
`review_date` | `next_review` | Diretta (ISO 8601)

## Import automatico — Script PHP

    // AllRisk — import_nis2_risks.php (cron settimanale)

    $apiKey    = getenv('NIS2_API_KEY');
    $orgId     = getenv('NIS2_ORG_ID');
    $baseUrl   = 'https://nis2.agile.software/api';
    $allriskOrgId = getenv('ALLRISK_ORG_ID');

    // Fetch rischi HIGH/CRITICAL aperti da NIS2
    $response = nis2Get($baseUrl . '/services/risks-feed', [
        'level'  => 'high',
        'status' => 'open',
        'limit'  => 200,
    ], $apiKey, $orgId);

    $risks = $response['data']['risks'] ?? [];
    $imported = 0;

    foreach ($risks as $risk) {
        $allriskPayload = [
            'external_ref'       => 'NIS2-' . $risk['risk_code'],
            'risk_name'          => $risk['title'],
            'risk_category'      => 'Cyber/IT',
            'severity'           => mapSeverity($risk['risk_level']),
            'risk_score'         => round($risk['risk_score'] / 25 * 100),
            'regulatory_ref'     => 'NIS2 ' . ($risk['nis2_article'] ?? 'Art.21'),
            'response_strategy'  => mapTreatment($risk['treatment']),
            'source_system'      => 'NIS2 Agile',
            'organization_id'    => $allriskOrgId,
        ];

        // Upsert: aggiorna se external_ref esiste, crea altrimenti
        AllRiskApiClient::upsertRisk($allriskPayload);
        $imported++;
    }

    error_log("[NIS2→AllRisk] Importati {$imported} rischi");

    function mapSeverity(string $level): int {
        return match($level) { 'critical' => 5, 'high' => 4, 'medium' => 3, default => 2 };
    }
    function mapTreatment(string $t): string {
        return match($t) {
            'mitigate' => 'Reduce', 'accept' => 'Accept',
            'transfer' => 'Transfer', default => 'Avoid'
        };
    }

## Webhook NIS2 → AllRisk (real-time)

Configura webhook per importazione immediata dei nuovi rischi HIGH/CRITICAL:

    # Settings → Webhook in NIS2 Agile
    URL:    https://allrisk.certisource.it/api/v1/webhooks/nis2
    Events: risk.high_created, compliance.score_changed, incident.significant

    // AllRisk — webhook receiver per NIS2
    $payload = verifyAndDecode($_SERVER['HTTP_X_NIS2_SIGNATURE'], file_get_contents('php://input'));

    if ($payload['event'] === 'risk.high_created') {
        $risk = $payload['data']['risk'];
        AllRiskApiClient::upsertRisk([
            'external_ref' => 'NIS2-' . $risk['id'],
            'risk_name'    => $risk['title'],
            'severity'     => $risk['risk_level'] === 'critical' ? 5 : 4,
            'source_system'=> 'NIS2 Agile',
            'alert'        => true, // Notifica CRO AllRisk
        ]);
    }
    http_response_code(200);

Nota architetturale: Il flusso è unidirezionale NIS2 → AllRisk. Per il flusso inverso (AllRisk → NIS2), AllRisk chiama l'API NIS2 per creare rischi cyber direttamente tramite le API JWT (POST /api/risks/create) usando le credenziali dell'utente integration.