Eje 4: Técnicas

OSCAL - Open Security Controls Assessment Language

OSCAL transforma la documentación de cumplimiento de Word/Excel en formatos JSON/YAML legibles por máquina con cuatro capas:

  1. Catalogs - Definiciones de controles (NIST 800-53, ISO 27001, BSI IT-Grundschutz)
  2. Profiles - baselines específicas de la organización
  3. Implementation Layer - System Security Plans, Component Definitions
  4. Assessment Layer - Assessment Results, POA&M

El BSI documenta oficialmente: «OSCAL es conectable con estándares internacionales». El GCBoK define taxonomías de cumplimiento alemanas (GoBD, BSI, DSGVO) como catálogos OSCAL — esto no existe hasta ahora en el mercado.

Los catálogos OSCAL y las reglas OPA forman parte de la capa semántica legible por máquina de la ontología GitCover: describen, en el mismo lenguaje que los diccionarios L1–L6, qué requisitos se aplican y cómo se verifican (véase Conceptos: jerarquía de negocio como ontología y Glosario: ontología).

Los GCPN-Events/Flags (ciclo de vida de firma y expediente) se derivan de estos catálogos OSCAL (ao-buchfuehrung, gobd, ustg-rechnung, bmf-erechnung). La colección inmutable GCPN-EVENTS-FLAGS porta el anclaje de gobernanza (AO §146, GoBD Rz. 146/147) y se referencia en el GCPN mediante events.enum_ref.

OPA / Rego - Política como código

Open Policy Agent con el lenguaje Rego. Las reglas de cumplimiento se implementan como código, que se verifica automáticamente contra el estado de Git.

VPRM - Verifiable Process Reward Model

En el contexto del GCBoK, OPA/Rego actúa como VPRM: los guardarraíles para agentes de IA surgen mediante un conjunto de reglas determinista, no mediante ingeniería de prompts. Así, los agentes de IA no se aseguran mediante restricciones de prompt, sino mediante validación de código.

Firma GPG

Cada commit de Git relevante para el cumplimiento se firma con GPG. La firma vincula:

A partir de los metadatos .gc.md, las huellas GPG se vinculan a V7GUIDs — las identidades siguen siendo a prueba de falsificación incluso si un agente de IA manipula la estructura semántica.

GCSIG — Firma como artefacto versionado

El historial de Git por sí solo no basta como prueba de firma: un force-push puede reescribirlo. Por ello, cada firma relevante de código/commit de Git (GPG, signed commit, PR) se deposita adicionalmente como artefacto inmutable {name}.gcsig.md (esquema gcsig-1.4). Este vincula:

Así, la firma del commit queda versionada en Git y resistente a reescrituras del historial; un GCPN posterior referencia el GCSIG mediante parents[]/children[] (GCSIG:{docUid}). Creación: gc-docsign gcsig <repo> --commit <sha>.

Arquitectura de keyring GPG para la demostrabilidad forense

Para que las firmas GPG sigan siendo verificables a largo plazo —incluso años después de su creación, tras la expiración o revocación de la clave, y al reconstruir a partir de git bundle/archivos ZIP—, las claves públicas deben formar parte del repositorio. El GCBoK define para ello un patrón de keyring en el repositorio:

Estructura: .gitcover/keys/

.gitcover/
├── keys/
│   ├── team-lead.asc          # Öffentliche Schlüssel von Team-Leads
│   ├── service-accounts/      # CI/CD, Bots, Automation
│   └── identities/            # Personenbezogene Schlüssel (nur PII-Repos)
│       ├── person-a.asc
│       └── person-a_governikus.pdf  # Identitätsnachweis pgp.governikus.de
├── trusted-keys.gpg           # Gesammelter Keyring (optional, für Verifier)
└── compliance/                # GoBD/DSGVO-Dokumente

Modelo de dos niveles: TOP-Repo vs. PII-Repo

Nivel Repositorio Contenido Relevancia para la DSGVO
Organizativo TOP-Repo (Tenant Organizational Platform) Claves de team lead, cuentas de servicio, bots de CI/CD, ancla de confianza trusted-keys.gpg Sin datos personales — conforme a la DSGVO
Personal PII-Repo (Personal Identifiable Information) Claves de desarrolladores, pruebas de identidad (confirmaciones de Governikus), huellas GPG personales PII — acceso solo mediante claims de Org-Unit (véase abajo)

Esta separación refleja los dos niveles de responsabilidad sobre PII:

  1. Legal — nivel de tenant (entidad jurídica, p. ej., GCC, GCD, GCP)
  2. Organizativo — PMO/Divisiones/Departamentos/Ubicaciones (≈ AD Organizational Unit)

Verificación aislada del keyring local

Un verificador (o auditor 10 años después) verifica sin depender del keyring GPG local:

# Nur Repository-Schlüssel nutzen, lokalen Keyring ignorieren
gpg --no-default-keyring --keyring .gitcover/keys/team-lead.asc \
    --verify-commit <commit-hash>

Validez temporal y ciclo de vida de las claves

La pregunta «¿Era válida la firma en el momento del commit?» se responde mediante la integración en el repositorio:

Relevancia para la documentación de procedimientos GoBD y NIS2

Véase también: La serie de artículos «GoBD-Verfahrensanweisungen für Git» en el GCBoK (módulo 3: integridad criptográfica, módulo 4: firmas y autenticidad) profundiza en estos temas. El proyecto de investigación GitCover.IdP (BSFZ 288-335-338/2026-1) investiga la integración del IdP.

uuidV7 - UUID versión 7

UUID versión 7 compatible con RFC 4122: basada en tiempo, ordenable, resistente a colisiones. La extensión específica de GitCover con un identificador de clase de 14 bits convierte las UUID en V7GUIDs (véase Conceptos).

Modelo de épocas temporales (real · tenant · person)

División de normas: Las normas RFC para GUID ordenables temporalmente (RFC 9562/4122) describen exclusivamente la estructura — disposición de bits, longitud y posición del campo de timestamp, versión y variante. La semántica —qué significa el timestamp, en particular la época temporal como magnitud de referencia y la clasificación en el sufijo— la norma GCBoK (especificación V7GUID, esquema OSS v7guid-epoch-mode-1.0). Por tanto, un modo como person no infringe la estructura RFC; es una semántica GCBoK sobre una estructura conforme a RFC.

El timestamp de 48 bits (unix_ts_ms, RFC 9562) es sin signo y ordenable; su época de referencia es en GitCover un modo definido (union/enum, esquema OSS v7guid-epoch-mode-1.0):

Modo Época Propósito
real Unix 1970-01-01Z estándar RFC; tiempo real (del sistema)
tenant época del tenant (p. ej., fecha de constitución) derivación determinista de clase/TenantId
person época de personas (por defecto 1900-01-01Z) tiempos PII de nacimiento/históricos anteriores a 1970 representables en positivo

El prefijo RFC (timestamp + versión + variante) sigue siendo la interfaz del Normative-Root al Customizing («herencia de interfaces»); el sufijo (resto de los 128 bits) porta la clasificación GitCover (L1–L6, categorías/patrones de bits, búsqueda por registro/palabra clave). Los valores temporales anteriores a la época elegida son un error definido (sin wrap de signo): la aritmética de .NET es con signo (DateTimeOffset devuelve long negativos para pre-1970), y solo se documenta no negativo — así se conservan el orden y el formato RFC, mientras que los datos históricos (p. ej., fechas de nacimiento, PII) siguen siendo clasificables.

Regla de nombres de JSON de instancia (`

El registro de datos base (JSON de instancia) de un objeto se deposita en la ruta del repositorio Git —y por tanto en el WorkingDirectory— como {docType}.{classId}.json (docType = abreviatura de clase, classId = V7GUID-Class-Identifier; p. ej., PII_PERSON.01a12f72-4c75-74f1-8626-dd1ae65b6062.json). Esto es un índice natural: las herramientas cercanas al SO encuentran los datos de instancia mediante {docType} y/o {classId}, sin conocer un nombre de archivo fijo. Se aplica a todos los artefactos de datos (entre otros, PII persons/<uuidv7>/, entradas de registro, esquemas de comprobante).

Base temporal y de flags (GitCover.Core)

Git como IdP - Identity Provider

Repositorios Git basados en Gitea como Single Source of Truth (SSoT) para un sistema integrado de gestión de identidades y accesos (IAM). El proyecto de investigación reconocido por el BSFZ investiga si las organizaciones/equipos de Git pueden representar clientes OAuth2 y permisos y gestionar de forma eficiente más de 1.000 usuarios.

Los datos personales (PII) están sujetos en el stack GitCover a una doble responsabilidad, que se refleja en la arquitectura de repositorios y en los claims OIDC:

Nivel Ámbito Tipo de repositorio Claim OIDC Ejemplo
1. Legal Tenant (entidad jurídica) TOP-Repo + PII-Repo tenant_id (basado en V7GUID) GCC, GCD, GCP, ADA
2. Organizativo PMO / División / Departamento / Ubicación PII-Repo (de grano fino) org_unit_id (≈ AD Organizational Unit) GCC-Portfolio, GCD-IT, GCP-Sales

Asignación persona a rol (puente PII) — trabajo pendiente

Asignación persona a rol (puente PII) — trabajo pendiente

Los contenedores de firma GCPN referencian participantes (attendees) como Actors (rol en el tenant, función en la empresa) y solo contienen personas pseudonimizadas (persons.mappings con referencia a PII). La asignación canónica persona → roles → Org-Units reside en el círculo PII (gitignored) — para un modelo integral, las siguientes relaciones aún deben elaborarse en detalle en el GCBoK:

Relación Estado en GCBoK Trabajo pendiente
User → Role Enfoque (Git-Repo = IdP; documento de firma como portador de claims) Definición de roles por tenant (GF, GS-Verwalter, Auditor) como vocabulario normativo — análogo a kinds.json/status_flags.json en el OSS-Normative-Root
Role → Group Equipos Gitea (Org → Team → Member) Mapeo equipo Gitea ↔ rol; convención de slug de equipo + conexión others.json (allowed_repos)
Group → Org-Unit L2 Department como ancla de Org-Unit (02-konzepte) Rellenar departments.json por tenant (actualmente AFJD-Master: entradas vacías); convención de texto claro de org_unit_id (GCC-Portfolio, etc.)
Org-Unit → Tenant claim de dos niveles (tenant_id legal, org_unit_id organizativo) Rellenar others.json por TOP-Repo (actualmente vacío); documentar el mapeo de claims en la Inlet-Pipeline
Person (PII) → User PII-Repo (gitignored) Esquema PII para el mapeo persona↔rol (DSGVO: minimización, referencia pseudonimizada como en GCPN persons.mappings)

Vinculación: gcpn-container-2.7 → attendees (roles en el expediente) → persons.mappings (referencia PII pseudonimizada) → PII-Repo (asignación canónica). Hasta la elaboración, las referencias pseudonimizadas aquí documentadas se consideran una solución transitoria.

Jerarquía de claims en la Inlet-Pipeline

La Inlet-Pipeline (véase Procedimientos: aislamiento de mandantes lee el others.json según el claim del usuario e inyecta las rutas permitidas:

{
  "tenant_id": "0197a3b2-f3c0-7b00-8001-000000000042",
  "org_unit_id": "ORG-1-Portfolio",
  "allowed_repos": [
    "TOP",
    "PII/ORG-1-Portfolio"
  ]
}

Así, un usuario con org_unit_id = ORG-1-Portfolio obtiene acceso al PII-Repo del portafolio, pero no a PII/ORG-2-IT — incluso con el mismo tenant_id.

Véase también: El proyecto de investigación sobre GitCover.IdP se describe en Proyectos de investigación. La arquitectura de keyring (TOP vs. PII) se describe arriba en «Arquitectura de keyring GPG».