Kai Ole Hartwig
9 Min. Lesezeit
Von

Grundschutz++ als Code, Teil 2: Die Anwendbarkeit als Datensatz

Jedes ISMS nach ISO 27001 hat eine Anwendbarkeitserklärung. Sie legt fest, was geprüft wird. In Teil 1 war sie eine Tabelle in Markdown, und ein Skript hat daraus eine Prüfliste gemacht. Jetzt ist sie ein OSCAL-Profil: erzeugt aus derselben Tabelle, geprüft gegen den Katalog des BSI und lesbar für jedes Werkzeug.

Teil 2 der Serie „Grundschutz++ als Code“. Die Übersicht aller Teile steht weiter unten.

01 — Warum die Anwendbarkeitserklärung zuerst

Jeder weitere Schritt der Serie braucht eine Antwort auf dieselbe Frage: Welche Anforderungen gelten überhaupt? Eine Komponente beschreibt, welche Anforderungen sie abdeckt. Eine Messung prüft, ob eine Anforderung erfüllt ist. Ein Sicherheitsplan fasst beides zusammen. Alle drei beziehen sich auf eine Auswahl aus dem Katalog.

Diese Auswahl gibt es schon. ISO 27001 verlangt sie in Abschnitt 6.1.3 d als Anwendbarkeitserklärung. Über das Mapping der Bibliothek wird daraus eine Liste von Grundschutz++-Anforderungen, wie in Teil 1 gezeigt. Solange diese Liste nur als Text existiert, muss jedes Werkzeug sie neu erraten. Deshalb ist sie das erste Dokument, das OSCAL werden sollte.

02 — Was ein OSCAL-Profil ist

Ein Katalog enthält alle Anforderungen. Ein Profil wählt daraus aus und passt an. Es verweist auf den Katalog, nennt die Anforderungen, die gelten, und kann Parameter setzen oder Texte ergänzen. Das Ergebnis lässt sich wieder zu einem Katalog auflösen, der nur noch die Auswahl enthält.

Das BSI nutzt genau diesen Mechanismus selbst. Der Anwenderkatalog von Grundschutz++ ist ein aufgelöstes Profil über mehrere Quellkataloge der Bibliothek (Kernel-G0, Methodik, Teile des Risikomanagements). Ein eigenes Profil setzt also nur eine Ebene tiefer an. Gekürzt sieht es so aus:

 

{
  "profile": {
    "uuid": "…",
    "metadata": {
      "title": "Grundschutz++ tailoring of Example GmbH",
      "last-modified": "2026-09-27T00:00:00Z",
      "version": "2026-09-27",
      "oscal-version": "1.1.3"
    },
    "imports": [{
      "href": "https://raw.githubusercontent.com/BSI-Bund/Stand-der-Technik-Bibliothek/367d775…/control_layer/Grundschutz%2B%2B/Grundschutz%2B%2B-resolved_catalog.json",
      "include-controls": [{
        "with-child-controls": "no",
        "with-ids": ["DET.2.1", "DET.3.1", "KONF.3.2", "…"]
      }]
    }],
    "merge": { "as-is": true }
  }
}

 

Zwei Dinge fallen auf. Der Katalog ist über einen festen Commit eingebunden, nicht über die aktuelle Fassung. Und das Profil nennt Kennungen, keine Texte. Die Texte des BSI bleiben im Katalog, das Profil verweist nur darauf.

03 — Vom Dokument zum Profil

Die Anwendbarkeitserklärung von Hand in JSON abzuschreiben, wäre der Fehler aus Teil 1 in neuer Form. Dann gäbe es zwei Kopien, und eine davon wäre bald falsch. Das Profil wird deshalb erzeugt, und zwar in zwei Hälften.

Die Auswahldatei ist bewusst schlicht:

 

{
  "title": "Grundschutz++ tailoring of Example GmbH",
  "version": "2026-09-27",
  "last-modified": "2026-09-27T00:00:00Z",
  "catalog": {
    "path": "control_layer/Grundschutz++/Grundschutz++-resolved_catalog.json",
    "commit": "367d775010abee641b258926bb482fcd05270059"
  },
  "applicable": ["DET.2.1", "KONF.3.2"],
  "not-applicable": [{ "id": "ARCH.6.1", "reason": "keine eigenen WAN-Strecken" }]
}

 

git clone github.com/ohartwig/grundschutz-worksheets
cd grundschutz-worksheets
npm ci   # nur für validate.mjs

C=367d775010abee641b258926bb482fcd05270059
CAT=control_layer/Grundschutz++/Grundschutz++-resolved_catalog.json

node profile.mjs auswahl.json > profil.json
node validate.mjs profil.json
node worksheet.mjs $CAT --profile profil.json --commit $C

 

Die letzte Zeile schließt den Kreis. Das Arbeitsblatt aus Teil 1 liest jetzt das Profil statt einer Liste von Anhang-A-Maßnahmen. Heraus kommen genau die Anforderungen, die gelten. Beim Schreiben waren es bei mir 257 von 280.

Nichts fällt still heraus

Der letzte Punkt hat sich gleich beim ersten Lauf ausgezahlt. Zwei Zeilen trugen in der Spalte für das Niveau einen Zusatz, den das erste Muster nicht kannte. Heraus kamen 278 statt 280 Anforderungen, ohne jede Warnung.

04 — Die Lücke im Format: nicht anwendbar, weil …

Eine Anwendbarkeitserklärung sagt nicht nur, was gilt. Sie sagt auch, was nicht gilt, und warum. Genau dafür hat ein OSCAL-Profil kein Feld. Es kann Anforderungen einschließen oder ausschließen, aber nicht begründen.

Es gibt drei Auswege:

Ich habe den dritten Weg gewählt:

 

"back-matter": {
  "resources": [{
    "uuid": "…",
    "title": "Not applicable: ARCH.6.1",
    "description": "keine eigenen WAN-Strecken",
    "props": [
      { "name": "control-id", "ns": "https://github.com/ohartwig/grundschutz-worksheets/ns", "value": "ARCH.6.1" },
      { "name": "tailoring", "ns": "https://github.com/ohartwig/grundschutz-worksheets/ns", "value": "not-applicable" }
    ]
  }]
}

 

OSCAL sieht diese Aussage eigentlich im Sicherheitsplan vor. Den gibt es erst in Teil 5. Bis dahin steht die Begründung im Profil, maschinenlesbar und gegen das Schema gültig.

Geltung ist nicht Erfüllung

Eine Anforderung, die gilt, aber noch offen ist, bleibt im Profil. Ob etwas gilt und ob es erfüllt ist, sind zwei Fragen. Die erste beantwortet das Profil. Die zweite beantworten Messungen, und die kommen in Teil 4. Wer beides in eine Datei mischt, bekommt eine Anwendbarkeitserklärung, die sich mit jedem Befund ändert.

05 — Deterministisch erzeugen

Ein erzeugtes Dokument ist nur dann prüfbar, wenn dieselbe Eingabe dieselben Bytes liefert. Sonst zeigt jeder Merge Request einen Diff über die ganze Datei, und niemand liest ihn.

Die Probe darauf ist einfach. Eine einzige Anforderung auf „nicht anwendbar“ gesetzt, und der Diff zeigt genau das: die Kennung verschwindet aus der Auswahl, ein Back-Matter-Eintrag kommt dazu, zwei Zähler ändern sich. Sonst nichts.

Die Pipeline prüft das bei jeder Änderung. Sie erzeugt das Profil neu und vergleicht es mit der eingecheckten Fassung. Weicht es ab, ist der Merge Request rot. Eine geänderte Tabelle ohne neues Profil kommt so nicht durch, eine Handkorrektur am JSON auch nicht.

06 — Prüfen gegen das Schema

NIST veröffentlicht zu jeder OSCAL-Version ein JSON-Schema. Das Werkzeug validate.mjs prüft jede Datei gegen das Schema der Version, die sie selbst angibt. Das ist nötig, weil die Bibliothek des BSI mehrere Versionen mischt: Kataloge und Profile in 1.1.3, das Mapping und neuere Komponentendefinitionen in 1.2.2, ältere Komponentendefinitionen noch in 1.1.2. Nicht jede Datei der Bibliothek besteht die Prüfung. Zwei Komponentendefinitionen und das ISO-Mapping selbst weichen vom Schema ihrer Version ab.

Ein Hinweis aus der Praxis für alle, die ihre CI-Runner nur mit IPv6 betreiben: github.com und die Downloads der Releases haben keine IPv6-Adresse, raw.githubusercontent.com schon. Der Check im eigenen Repository lädt deshalb nur den abhängigkeitsfreien Generator über raw.githubusercontent.com. Die Prüfung gegen das Schema läuft beim Erzeugen und in der CI des öffentlichen Repositorys.

07 — Was das Profil jetzt trägt

Das Profil ist klein und unspektakulär. Genau das macht es nützlich. Jeder weitere Schritt kann sich darauf beziehen, statt die Auswahl neu zu bestimmen.

08 — Die Serie im Überblick

  1. Grundschutz++ gegen die eigene Dokumentation: die Methode, der Katalog als Datenmodell, der Abgleich mit IaC und GitOps.
  2. Die Anwendbarkeit als Datensatz: die Anwendbarkeitserklärung als OSCAL-Profil. Dieser Beitrag.
  3. Container, die sagen, welche Anforderungen sie erfüllen: eine signierte Komponentendefinition an jedem Image, das die Pipeline baut.
  4. Messung als Nachweis: nächtliche Prüfungen schreiben ihre Ergebnisse als OSCAL. Dazu die zweite Ebene, die im laufenden System findet, was kein Repository kennt.
  5. Das ISMS als Build-Produkt: ein Sicherheitsplan, der zusammengebaut statt geschrieben wird, mit einer ehrlichen Bilanz des Aufwands.

Ein Teil erscheint erst, wenn der beschriebene Schritt im Betrieb läuft und gemessen ist. Der Code dazu liegt vorher in grundschutz-worksheets. Die Titel werden hier verlinkt, sobald der jeweilige Beitrag online ist.

Häufige Fragen

Geht das auch ohne ISO 27001?+

Ja. Die Auswahldatei braucht nur Kennungen und Begründungen. Woher die Auswahl kommt, ist dem Generator egal. Mit ISO 27001 liefert das Mapping der Bibliothek einen guten Startpunkt.

Was passiert, wenn das BSI den Katalog ändert?+

Nichts, solange das Profil auf einen festen Commit zeigt. Wer den Commit anhebt, erzeugt das Profil neu. Kennungen, die es im neuen Katalog nicht mehr gibt, bringen den Generator zum Abbruch. So fällt jede Änderung auf.

Ersetzt das Profil die Anwendbarkeitserklärung?+

Nein. Die Anwendbarkeitserklärung bleibt das Dokument, das Menschen lesen und freigeben. Das Profil wird daraus erzeugt und nie von Hand bearbeitet. Ändert sich die Erklärung, wird das Profil neu erzeugt.

Brauche ich OSCAL, um Grundschutz++ zu nutzen?+

Nein. Die Anforderungen lassen sich auch als Arbeitsblatt lesen. OSCAL lohnt sich, sobald mehrere Werkzeuge dieselbe Auswahl brauchen: Arbeitsblätter, Komponenten, Messungen und ein Sicherheitsplan.

Fazit

Die Anwendbarkeitserklärung ist das kleinste OSCAL-Dokument mit der größten Wirkung. Sie legt fest, worauf sich alles andere bezieht. Als Profil wird sie aus der eigenen Doku erzeugt, gegen den Katalog und das Schema geprüft und bei jeder Änderung neu verglichen. Die Lücke im Format für begründete Ausschlüsse lässt sich sauber überbrücken, bis der Sicherheitsplan sie aufnimmt.

Weiter mit Teil 3: Container, die sagen, welche Anforderungen sie erfüllen.

Ich mache deine Anwendbarkeitserklärung maschinenlesbar. Erzeugt aus deiner Doku, geprüft gegen Grundschutz++.

Abgleich deiner Anwendbarkeitserklärung mit der Stand-der-Technik-Bibliothek, ein OSCAL-Profil für deinen Geltungsbereich und eine Pipeline, die es bei jeder Änderung neu erzeugt und prüft.

Plattform-Betrieb statt Beratung auf Papier: Auf Wunsch baue ich die nächsten Schritte gleich mit, von der Komponentendefinition bis zum Sicherheitsplan.

Termin buchen →

Über den Autor

Foto von Kai Ole Hartwig.

Kai Ole Hartwig

Freiberuflicher DevSecOps-Berater · OnlyOle Consulting

Programmiert seit 2002 – autodidaktisch gelernt, 2012 mit KO-Web selbständig gemacht. Über 100 Projekte, Fokus auf Security, Performance, Automatisierung und Qualität. Heute freiberuflich: DevSecOps-Beratung, Schulungen und Softwareentwicklung.