256 lines
8.8 KiB
JSON
256 lines
8.8 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://govoplan.add-ideas.de/schemas/backup-evidence-v1.json",
|
|
"title": "GovOPlaN coordinated backup and restore evidence",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"schema_version",
|
|
"evidence_id",
|
|
"installation_id",
|
|
"deployment_subject",
|
|
"release",
|
|
"recovery_point",
|
|
"components",
|
|
"restore_drill",
|
|
"issued_at",
|
|
"expires_at",
|
|
"revoked",
|
|
"signatures"
|
|
],
|
|
"properties": {
|
|
"schema_version": { "const": "1" },
|
|
"evidence_id": { "$ref": "#/$defs/token" },
|
|
"installation_id": { "$ref": "#/$defs/token" },
|
|
"deployment_subject": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["profile", "topology", "subject_ref"],
|
|
"properties": {
|
|
"profile": { "enum": ["evaluation", "self-hosted"] },
|
|
"topology": { "$ref": "#/$defs/token" },
|
|
"subject_ref": { "$ref": "#/$defs/reference" }
|
|
}
|
|
},
|
|
"release": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"channel",
|
|
"version",
|
|
"manifest_sha256",
|
|
"composition_sha256",
|
|
"api_image",
|
|
"web_image"
|
|
],
|
|
"properties": {
|
|
"channel": { "$ref": "#/$defs/token" },
|
|
"version": { "$ref": "#/$defs/token" },
|
|
"manifest_sha256": { "$ref": "#/$defs/sha256" },
|
|
"composition_sha256": { "$ref": "#/$defs/sha256" },
|
|
"api_image": { "$ref": "#/$defs/digest_image" },
|
|
"web_image": { "$ref": "#/$defs/digest_image" }
|
|
}
|
|
},
|
|
"recovery_point": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "captured_at", "consistency", "rpo_seconds", "write_fence"],
|
|
"properties": {
|
|
"id": { "$ref": "#/$defs/token" },
|
|
"captured_at": { "type": "string", "format": "date-time" },
|
|
"consistency": {
|
|
"enum": ["provider-atomic", "application-quiesced", "transaction-consistent"]
|
|
},
|
|
"rpo_seconds": { "$ref": "#/$defs/duration" },
|
|
"write_fence": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["mode", "token_sha256", "established_at"],
|
|
"properties": {
|
|
"mode": {
|
|
"enum": ["provider-snapshot", "application-quiesce", "transaction-boundary"]
|
|
},
|
|
"token_sha256": { "$ref": "#/$defs/sha256" },
|
|
"established_at": { "type": "string", "format": "date-time" }
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["database", "objects", "configuration", "key_custody"],
|
|
"properties": {
|
|
"database": { "$ref": "#/$defs/database" },
|
|
"objects": { "$ref": "#/$defs/objects" },
|
|
"configuration": { "$ref": "#/$defs/configuration" },
|
|
"key_custody": { "$ref": "#/$defs/key_custody" }
|
|
}
|
|
},
|
|
"restore_drill": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"drill_id",
|
|
"recovery_point_id",
|
|
"started_at",
|
|
"completed_at",
|
|
"isolated_target_ref",
|
|
"release_manifest_sha256",
|
|
"migration_heads_sha256",
|
|
"representative_object_manifest_sha256",
|
|
"database_verified",
|
|
"objects_verified",
|
|
"configuration_verified",
|
|
"key_custody_verified",
|
|
"semantic_checks",
|
|
"measured_rpo_seconds",
|
|
"measured_rto_seconds",
|
|
"evidence_ref"
|
|
],
|
|
"properties": {
|
|
"drill_id": { "$ref": "#/$defs/token" },
|
|
"recovery_point_id": { "$ref": "#/$defs/token" },
|
|
"started_at": { "type": "string", "format": "date-time" },
|
|
"completed_at": { "type": "string", "format": "date-time" },
|
|
"isolated_target_ref": { "$ref": "#/$defs/reference" },
|
|
"release_manifest_sha256": { "$ref": "#/$defs/sha256" },
|
|
"migration_heads_sha256": { "$ref": "#/$defs/sha256" },
|
|
"representative_object_manifest_sha256": { "$ref": "#/$defs/sha256" },
|
|
"database_verified": { "const": true },
|
|
"objects_verified": { "const": true },
|
|
"configuration_verified": { "const": true },
|
|
"key_custody_verified": { "const": true },
|
|
"semantic_checks": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 128,
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "status", "evidence_ref"],
|
|
"properties": {
|
|
"id": { "$ref": "#/$defs/token" },
|
|
"status": { "const": "passed" },
|
|
"evidence_ref": { "$ref": "#/$defs/reference" }
|
|
}
|
|
}
|
|
},
|
|
"measured_rpo_seconds": { "$ref": "#/$defs/duration" },
|
|
"measured_rto_seconds": { "$ref": "#/$defs/duration" },
|
|
"evidence_ref": { "$ref": "#/$defs/reference" }
|
|
}
|
|
},
|
|
"issued_at": { "type": "string", "format": "date-time" },
|
|
"expires_at": { "type": "string", "format": "date-time" },
|
|
"revoked": { "const": false },
|
|
"signatures": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"maxItems": 16,
|
|
"items": { "$ref": "#/$defs/signature" }
|
|
}
|
|
},
|
|
"$defs": {
|
|
"token": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 128,
|
|
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
|
|
},
|
|
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
"digest_image": {
|
|
"type": "string",
|
|
"maxLength": 300,
|
|
"pattern": "^[^@\\s]+@sha256:[0-9a-f]{64}$"
|
|
},
|
|
"reference": {
|
|
"type": "string",
|
|
"minLength": 3,
|
|
"maxLength": 2048,
|
|
"pattern": "^[A-Za-z][A-Za-z0-9+.-]*:[^\\s]+$"
|
|
},
|
|
"duration": { "type": "integer", "minimum": 0, "maximum": 2592000 },
|
|
"protected_key": {
|
|
"type": "object",
|
|
"properties": {
|
|
"protected": { "const": true },
|
|
"encryption_key_ref": { "$ref": "#/$defs/reference" },
|
|
"captured_at": { "type": "string", "format": "date-time" }
|
|
}
|
|
},
|
|
"database": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"provider", "artifact_ref", "artifact_sha256", "snapshot_id", "lsn",
|
|
"protected", "encryption_key_ref", "captured_at"
|
|
],
|
|
"properties": {
|
|
"provider": { "$ref": "#/$defs/token" },
|
|
"artifact_ref": { "$ref": "#/$defs/reference" },
|
|
"artifact_sha256": { "$ref": "#/$defs/sha256" },
|
|
"snapshot_id": { "$ref": "#/$defs/token" },
|
|
"lsn": { "type": "string", "minLength": 1, "maxLength": 256 },
|
|
"protected": { "const": true },
|
|
"encryption_key_ref": { "$ref": "#/$defs/reference" },
|
|
"captured_at": { "type": "string", "format": "date-time" }
|
|
}
|
|
},
|
|
"objects": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"provider", "artifact_ref", "manifest_sha256", "version_id",
|
|
"object_count", "total_bytes", "protected", "encryption_key_ref", "captured_at"
|
|
],
|
|
"properties": {
|
|
"provider": { "$ref": "#/$defs/token" },
|
|
"artifact_ref": { "$ref": "#/$defs/reference" },
|
|
"manifest_sha256": { "$ref": "#/$defs/sha256" },
|
|
"version_id": { "$ref": "#/$defs/token" },
|
|
"object_count": { "type": "integer", "minimum": 0 },
|
|
"total_bytes": { "type": "integer", "minimum": 0 },
|
|
"protected": { "const": true },
|
|
"encryption_key_ref": { "$ref": "#/$defs/reference" },
|
|
"captured_at": { "type": "string", "format": "date-time" }
|
|
}
|
|
},
|
|
"configuration": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["artifact_ref", "sha256", "protected", "encryption_key_ref", "captured_at"],
|
|
"properties": {
|
|
"artifact_ref": { "$ref": "#/$defs/reference" },
|
|
"sha256": { "$ref": "#/$defs/sha256" },
|
|
"protected": { "const": true },
|
|
"encryption_key_ref": { "$ref": "#/$defs/reference" },
|
|
"captured_at": { "type": "string", "format": "date-time" }
|
|
}
|
|
},
|
|
"key_custody": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["provider", "keyset_ref", "keyset_version", "recoverable", "captured_at"],
|
|
"properties": {
|
|
"provider": { "$ref": "#/$defs/token" },
|
|
"keyset_ref": { "$ref": "#/$defs/reference" },
|
|
"keyset_version": { "$ref": "#/$defs/token" },
|
|
"recoverable": { "const": true },
|
|
"captured_at": { "type": "string", "format": "date-time" }
|
|
}
|
|
},
|
|
"signature": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["key_id", "algorithm", "value"],
|
|
"properties": {
|
|
"key_id": { "$ref": "#/$defs/token" },
|
|
"algorithm": { "const": "ed25519" },
|
|
"value": { "type": "string", "minLength": 1, "maxLength": 256 }
|
|
}
|
|
}
|
|
}
|
|
}
|