> ## Documentation Index
> Fetch the complete documentation index at: https://docs.snakysec.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Controls catalog

# Controls Catalog

Catalogue des 220 contrôles évalués (CIS M365 v6.0.1 + CISA SCuBA v1.5.0), leur schéma JSON, et les conventions de rédaction.

## Inventaire

**Total : 220 contrôles évalués** (CIS 140 + SCuBA 94 — 14 contrôles sont partagés entre les deux frameworks via mapping croisé).

| Framework         | Product area   | Contrôles | Fichier                                |
| ----------------- | -------------- | --------: | -------------------------------------- |
| CIS M365 v6.0.1   | Entra ID       |        60 | `src/frameworks/cis/entra.json`        |
| CIS               | Defender       |        20 | `src/frameworks/cis/defender.json`     |
| CIS               | Teams          |        17 | `src/frameworks/cis/teams.json`        |
| CIS               | SharePoint     |        13 | `src/frameworks/cis/sharepoint.json`   |
| CIS               | Exchange       |        12 | `src/frameworks/cis/exchange.json`     |
| CIS               | Fabric         |        12 | `src/frameworks/cis/fabric.json`       |
| CIS               | Purview        |         4 | `src/frameworks/cis/purview.json`      |
| CIS               | Intune         |         2 | `src/frameworks/cis/intune.json`       |
| CISA SCuBA v1.5.0 | Exchange (EXO) |        30 | `src/frameworks/scuba/exo.json`        |
| SCuBA             | Entra ID (AAD) |        22 | `src/frameworks/scuba/aad.json`        |
| SCuBA             | Defender       |        17 | `src/frameworks/scuba/defender.json`   |
| SCuBA             | Teams          |        13 | `src/frameworks/scuba/teams.json`      |
| SCuBA             | Purview        |         9 | `src/frameworks/scuba/purview.json`    |
| SCuBA             | SharePoint     |         3 | `src/frameworks/scuba/sharepoint.json` |

## Convention ID

* **CIS** : `CIS-<AREA>-<x.x.x>` (exemples : `CIS-ENTRA-5.2.3.1`, `CIS-DEFENDER-4.1.2`)
* **SCuBA** : `MS.<AREA>.<x.x>v<N>` (exemples : `MS.AAD.3.3v2`, `MS.EXO.15.1v1`)

## Schéma d'un contrôle

```jsonc theme={null}
{
  "id": "CIS-ENTRA-1.1.1",
  "title": "Ensure 'Users can register applications' is set to 'No'",
  "level": 1,                              // CIS L1 | L2 (absent pour SCuBA)
  "method": "automated",                   // automated | manual
  "severity": "high",                      // critical | high | medium | low

  // Un seul des blocs `graph` ou `cmdlet` selon le provider
  "graph": {
    "apiVersion": "v1.0",                  // v1.0 | beta
    "endpoint": "/policies/authorizationPolicy",
    "check": {
      "property": "defaultUserRolePermissions.allowedToCreateApps",
      "operator": "eq",
      "expected": false
    }
  },
  "cmdlet": {
    "module": "ExchangeOnlineManagement",  // ExchangeOnlineManagement | MicrosoftTeams | PnP.PowerShell
    "cmdlet": "Get-OrganizationConfig",
    "property": "AuditDisabled",
    "expected": false
  },

  "remediation": {
    "instructions": "...",
    "portalUrl": "https://entra.microsoft.com/...",
    "graphSetUrl": "https://..."
  },

  "mappings": {
    "cis": "1.1.1",
    "iso27001": "A.5.15",
    "nistCsf2": "PR.AC-01"
  },

  "requiredPermissions": ["Policy.Read.All"],
  "requiredLicense": null,                 // ex: "AAD_PREMIUM_P2"

  "applicability": {
    "hybridOnly": false,                   // true → not_applicable si cloud-only
    "cloudOnly": false
  },

  "manualValidation": {                    // obligatoire si method=manual
    "steps": ["...", "..."],
    "expectedState": "...",
    "references": ["CIS §1.1.1", "ANSSI-PSSI §4.2"]
  }
}
```

## Opérateurs de check

| Opérateur                                  | Description                        |
| ------------------------------------------ | ---------------------------------- |
| `eq` / `neq`                               | Égalité / inégalité stricte        |
| `gt` / `gte` / `lt` / `lte`                | Comparaison numérique              |
| `contains` / `containsAll` / `containsAny` | Présence dans un array             |
| `in` / `notIn`                             | Présence dans une liste attendue   |
| `exists` / `notExists`                     | Propriété présente / absente       |
| `matches`                                  | Regex                              |
| `and` / `or`                               | Compound (`conditions[]` imbriqué) |

## Règles de rédaction

1. **`method: "automated"` par défaut.** Ne jamais downgrader en `manual` sans discussion explicite (feedback utilisateur standing).
2. **Vérifier endpoint + property via Microsoft Learn MCP** avant d'ajouter/modifier un contrôle (`microsoft_docs_search`, `microsoft_docs_fetch`). La mémoire est peu fiable sur les props Graph.
3. **Pas d'ID object hardcodé tenant-spécifique** — utiliser discovery queries ou config par tenant.
4. **Severity mapping** :
   * `critical` : exposition directe (compte admin, données exfiltrables)
   * `high` : conf. sécu MFA/CA/elevation
   * `medium` : logs, audit, observabilité
   * `low` : branding, UX admin

## Ajouter un contrôle

1. Invoquer le skill **verify-props** pour valider endpoint + propriété.
2. Éditer `src/frameworks/<framework>/<area>.json`.
3. Respecter le schéma ci-dessus (tous les champs requis).
4. Si compound check nécessaire → `check: { and: [{...}, {...}] }`.
5. Exécuter le runner sur un tenant de test (`Invoke-CISAudit.ps1 -ProductArea <area>`).

## Ajouter une logique d'évaluation

Pour un nouveau pattern (JSONPath complexe, aggregation, cross-reference) : étendre `Invoke-MsspControlCheck` dans `src/modules/Mssp.Graph.psm1`.
