OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Architecture

SecNumCloud-ready

OpenKeel is designed to be SecNumCloud-ready: what is compliant today, what is in progress and what is left to evolve, requirement by requirement, each with its evidence in the code.

What SecNumCloud-ready means

SecNumCloud (ANSSI, framework 3.2) qualifies a service run by a provider, not a piece of software. The framework covers organisation, human resources, physical security, operations, incident management and protection from extra-European law (§ 19.6) as much as technique.

OpenKeel therefore cannot be "SecNumCloud qualified". It aims to be a SecNumCloud-ready foundation: software that blocks no technical requirement of the framework, provides the expected mechanisms (traceability, segregation, encryption, strong authentication) and the documentation that lets the provider demonstrate compliance during the audit.

  • Each line points to evidence: a file, a test or a configuration
  • Status as of 2026-11-10
  • Organisation, people and premises stay with the provider

Where we stand

  • 15requirements compliant
  • 4in progress
  • 18left to evolve

Counted from the tables below; the provider's share is listed apart.

Every internal flow encrypted in TLS

An internal PKI run by cert-manager (issuer openkeel-ca) signs the services' certificates; the MariaDB operator's CA signs the database's. Every service verifies the server it talks to.

FlowProtocolTrust
Clients → Ingress → APIsHTTPS, re-encrypted to HTTPS backends (Skyline, Nova console, Zun wsproxy)Public certificate; internal cert-manager certificates
API ↔ APIREST over HTTPS, https internal URLs in the catalogInternal PKI, cert-manager issuer openkeel-ca
Services → MariaDBSQL over TLS, required by the serverCA of the MariaDB operator, verified by every service
Services → RabbitMQAMQPS (RPC and notifications)Internal PKI openkeel-ca
Neutron → OVN NB/SBOVSDB over ssl:, mutual TLSOVN client and server certificates

No Memcached and no Redis any more: no component read them, and okadm removes them from existing installations. Only the admin ports :9090 (health, metrics), the Erlang distribution between the RabbitMQ nodes and the RGW gateway of --ceph-s3 still serve plain traffic inside the cluster. The whole table is in the code (global.tls.internal, on by default) and was verified on the lab on 2026-11-08.

Images: a controlled registry, an SBOM and a signature

Every image a production cluster runs comes from the provider's registry: OpenKeel's own, built from the workspace, and the third-party ones, copied there with their SBOM. Both are signed with the provider's key.

ImagesRegistrySBOM and provenanceSignature
OpenKeel services, okadm, web siteBuilt by make release and pushed to REGISTRY; the charts point to it (global.imageRegistry)SPDX SBOM per platform and SLSA provenance, attached by BuildKit in the image index; exported by make sbomcosign, by digest of the index (make sign), covering the attestations
okadm binariesRelease files in dist/cli, with SHA256SUMSSPDX SBOM per binary (syft)Checksums
Prerequisites: cert-manager, MariaDB and RabbitMQ operators, MariaDB, RabbitMQ, TraefikCopied registry to registry by make mirror-prereqs, every platform, one prefix per upstream registryThe publisher's SBOM when the copy keeps one, otherwise a syft SBOM attached with cosign attest (MIRROR_SBOM=1)Every copy signed with the OpenKeel key
Ironic (upstream Kolla images)Pinned by digest in okadm's release manifest, pulled through global.imageRegistryThrough the mirror (MIRROR_EXTRA_IMAGES)Through the mirror

The cluster pulls from the mirror without any chart change: one hosts.toml per upstream registry for containerd, machine.registries.mirrors under Talos. No signature, SBOM or image digest is sent to the public Sigstore services (build/cosign/signing-config-private.json). Source: BUILD.md.

Compliant today

Done in the code and in the charts, or documented for the provider.

RequirementSecNumCloud 3.2StateEvidenceNext step
Control of the code, no dependency on a non-European vendor§ 19DoneOpen source Go rewrite of Keystone, Nova, Neutron, Cinder, Glance, Manila, Barbican… (openkeel-*); no telemetry, no outbound call to a third partyRebuild the images in a European CI
Logging of API actionsch. 12DoneA CADF event per call on every API (internal/audit), Keystone identity events (internal/notify), counters openkeel_audit_events_{sent,dropped,failed}_totalAdd kube-apiserver and the Talos API to the trail
Retention and integrity of the logsch. 12DoneDocumented in openkeel-chart/docs/audit-trail.md: WORM archive (object lock, compliance mode), 12 months with 3 online (Loki 400 d), NTP on the Talos nodes, alerts on losses, SIEM rulesProve it on a real platform (provider)
Access control of the APIsch. 9DoneOpenStack RBAC policies (admin, member, reader, service, project and system scopes) enforced by every service; 403 refusals as in OpenStack, covered by the conformance testsCut over-privileged service accounts
Secrets and key managementch. 10DoneBarbican in Go with a PKCS#11 HSM (internal/crypto/p11.go, SoftHSM tests) or Vault / OpenBao; KEK rotation (internal/manage/rotate.go)ANSSI-qualified HSM in production
Isolation of tenant containersch. 13DoneZun under Kata Containers by default (RuntimeClass kata): one kernel per tenant container—
Encryption of the network control planech. 10, 13DoneOVN Northbound / Southbound in mutual TLS (ssl:) between Neutron, ovn-octavia-provider, FWaaS, VPNaaS, ovn-bgp-agent and OVN central—
Optional APIs can be turned offch. 13Doneec2-api can be disabled in the Configurator (component ec2-api of its catalogue)—
Multi-factor authenticationch. 9DoneKeystone: TOTP method (internal/keystone/totp.go) and per-user MFA rules (options.multi_factor_auth_rules, internal/api/mfa_test.go)OIDC federation
Encryption of database flowsch. 10DoneMariaDB with TLS required (infrastructure.mariadb.tls.required: true), the MariaDB operator's CA verified by every service (global.tls.trustedCAs, passed by okadm to every release), tls=skip-verify refused; applied and verified on the lab (require_secure_transport ON)Check Galera replication in TLS on a three-node cluster (the lab has one node)
TLS suites of the listenersch. 10Doneinternal/tlsx in all 16 services (a copy of Keystone's): TLS 1.2 minimum, ECDHE with AES-GCM or ChaCha20 only (ANSSI TLS guide), certificate re-read on renewal; RabbitMQ limited to TLS 1.2/1.3 and AEAD suites—
Smaller attack surface: no unused data servicech. 13DoneMemcached and Redis removed: no component read them; okadm removes them from existing installations (internal/deploy/retired.go)—
Encryption of every internal flowch. 10Doneglobal.tls.internal: true by default: internal cert-manager CA (openkeel-ca), one certificate per chart (ECDSA P-256, 90 days); RabbitMQ over AMQPS only; https:// internal URLs and internal catalogue; Ingress to verified HTTPS backends (Traefik ServersTransport, nginx annotations); okadm step rabbitmq-trust; status reports of ovn-octavia-provider to a dedicated TLS listener of Neutron (openkeel-neutron-lbaas:9878, off the admin port). Verified on the lab on 2026-11-08: 18 listeners in HTTPS with a verified certificate, plain HTTP refused, AMQP connections in TLS 1.3Network capture: no application flow in clear outside :9090
Integrity and traceability of the OpenKeel imagesch. 14DoneEvery image built with --sbom=true --provenance=mode=max (ATTEST=1, default): an SPDX SBOM per platform (Debian packages of the distroless base, every Go module) and the SLSA provenance in the image index; make sbom exports them into dist/sbom, with the SBOM of each okadm binary; make sign signs each index by digest with cosign, which covers its attestations (build/sbom.sh, BUILD.md)Enforce the signatures at admission
Third-party images on a controlled registry, with an SBOMch. 14Donemake mirror-prereqs copies the images of the prerequisites (cert-manager, MariaDB and RabbitMQ operators, MariaDB, RabbitMQ, Traefik: 14 images) registry to registry, every platform, from okadm's release manifest; containerd or Talos redirect each upstream registry to the mirror; MIRROR_SBOM=1 exports an SBOM per copy, attaches one with cosign attest where the publisher has none, and signs every copy with the OpenKeel key; OpenKeel images and the Ironic images, pinned by digest, are pulled through global.imageRegistryMirror the images KubeVirt and CDI derive at run time

Chapter numbers orient the reading; they are to be checked against the published framework before the compliance matrix is built. Source: openkeel-docs/SECNUMCLOUD-STATUS.md.

In progress

RequirementSecNumCloud 3.2StateEvidenceNext step
Uniform TLS suitesch. 10In progressServices (tlsx) and RabbitMQ aligned; the public side of the ingress controllers is leftANSSI TLS profile on the public entry points of the Ingress
Consistent charts—In progressName clash of the svc.volumes helper between sub-charts (mounting the trusted CAs)Prefix the helpers per chart
Images built and controlled by the providerch. 14In progressmake release builds every image multi-arch from the workspace (rootless distroless, UID 65532, no shell) with its SBOM, provenance and signature; the default signing config uses none of the public Sigstore services (build/cosign/); Ironic still runs upstream Kolla (Python) images, mirrored by digestRun make release in a European CI; replace the Kolla images
Vulnerability watch on the imagesch. 14In progressmake vuln (govulncheck, go mod verify) on every Go module; the SBOMs of the OpenKeel and third-party images can be scanned without pulling them again (grype, trivy sbom)Scan the SBOMs at each release and periodically for new CVEs

To evolve: identity, access and least privilege

RequirementSecNumCloud 3.2StateEvidenceNext step
Administrator MFA through an IdPch. 9To doLocal TOTP onlyOIDC federation in Keystone (European IdP, MFA carried by the IdP), mapped to roles
MFA for Kubernetes administratorsch. 9To doAccess by kubeconfig with a client certificate (okadm access)OIDC and MFA to the kube-apiserver, named Kubernetes roles, no permanent cluster-admin
Authenticated Configuratorch. 9To doUI without login; its ClusterRole patches nodes and reads every log (deploy/kustomize/base/rbac.yaml)OIDC authentication, a smaller ClusterRole, access from the administration IS only
Minimal service accountsch. 9To doadmin role for ec2-api (all_tenants), Masakari, Zun (binding:host_id), Skyline and neutron-vpnaas; openstack-exporter with the admin passwordDedicated roles and targeted policy rules per service; a read-only exporter (system reader)

To evolve: encryption at rest, erasure and cryptography

RequirementSecNumCloud 3.2StateEvidenceNext step
A key per tenant for volumesch. 10To doCinder records the fixed key 00000000-0000-0000-0000-000000000000 and leaves encryption to the StorageClassLink Cinder to Barbican: one key per encrypted volume, in the tenant's project
Disk encryptionch. 10To do—Longhorn LUKS per volume; encryption of MariaDB, Glance and Swift
Erasure at contract endch. 19To do—Crypto-shredding: destroy the project's Barbican keys, with a traced procedure
No obsolete algorithmch. 10To doEC2 v0/v1 signatures in HMAC-SHA1 accepted by Keystone (internal/keystone/ec2sign.go)An option to accept only v2 (SHA-256) and v4, the old ones off by default in production
Qualified HSMch. 10To doGeneric PKCS#11 tested on SoftHSMValidate with an ANSSI-qualified HSM

To evolve: supply chain

RequirementSecNumCloud 3.2StateEvidenceNext step
Signatures enforced at admissionch. 14To doImages signed and attested, but the cluster runs any imageKyverno verifyImages or the Sigstore policy-controller with cosign.pub, on OpenKeel's and the operators' images alike

To evolve: administration IS, traceability and flows

RequirementSecNumCloud 3.2StateEvidenceNext step
Separate administration ISch. 9, 13; PA-022To doA written proposal: zones Z1, Z2 and Z3 (openkeel-docs/SECNUMCLOUD-ADMIN-SI.md)Administration network, bastion, administration workstations (provider)
Control plane separated from the data planech. 13To doOne Talos cluster carries the APIs and the tenant workloadsStep 1: single-cluster hardening, centralised Nova and Zun agents (no DSN on the hypervisors); target: separate control and data clusters
Logging of platform administrationch. 12To doOnly the OpenStack APIs are tracedAudit policy of the kube-apiserver, logs of the Talos API, the bastion and the BMCs, archived like the CADF trail
Encrypted admin portsch. 10To doHealth and metrics on :9090 in plain HTTP, inside the cluster; the status reports of ovn-octavia-provider no longer go there: Neutron serves them on a dedicated TLS listenerTLS (or Prometheus mTLS) on :9090, or a NetworkPolicy that lets only Prometheus in
No non-European remote support§ 19.6To doRemote support of the storage arrays (Pure1, vendor remote access) not turned off by OpenKeelDocument and check that it is off in the production install guide
Erlang distribution of RabbitMQch. 10To doTraffic between the RabbitMQ nodes (port 25672) not encrypted, inside the clusterTLS for the Erlang distribution (ssl_dist), which the operator does not manage
RGW gateway (--ceph-s3)ch. 10To doRGW reaches Keystone in verified HTTPS (caBundleRef), but serves S3 and Swift in plain HTTP on port 80 inside the clusterRGW's secure port with a certificate of the internal CA
okadm calls to the APIsch. 10To doThrough the Kubernetes API server's service proxy in https:: encrypted, the Pods' certificates not verifiedCall through the Ingress, or verify on the client side

Target: three zones, not two

The OpenKeel APIs are part of the service sold to tenants: they are not the administration IS. The proposal therefore separates three zones, and the administration interfaces of Z2 and Z3 (kube-apiserver, Talos API, BMC, etcd, admin ports) are reachable from Z1 only.

ZoneContentWho gets in
Z1, administration ISAdministration workstations, bastion, administrators' IdP (MFA), okadm runner and Git repository of the values, Configurator, log collection and storage (Loki, SIEM, WORM bucket), signed registry mirrorAdministrators only, from their workstations
Z2, control plane of the serviceOpenKeel APIs, conductors, schedulers, MariaDB, RabbitMQ, Barbican, public IngressTenants (public APIs through the Ingress); administrators through Z1
Z3, data planeHypervisors (KubeVirt), Zun nodes (Kata), storage (Longhorn), network gateways (OVN gateway, BGP)Tenants (their VMs and containers); administrators through Z1

Recommendation of the proposal: an administration network and a hardened single cluster now, in every production deployment; centralised Nova and Zun agents as the first development; separate control and data clusters as the target for a qualified offer. Nothing of it is implemented yet.

Order of work

  1. 1

    Internal TLS

    Finish TLS on every internal flow, then check it with a network capture.

  2. 2

    Identity and keys

    OIDC and MFA for administrators, encryption at rest with a key per tenant.

  3. 3

    Supply chain and administration

    Images built in a European CI, signatures enforced at admission, the administration IS and the separation of the planes.

  4. 4

    Matrix and pre-audit

    The requirement matrix, an internal review, then a pre-audit by a qualified auditor.

The provider's share

Most of the framework concerns the provider who runs the service. OpenKeel does not replace it, but it must not stand in the way, and it supplies part of the evidence.

Organisation and people

Security policy, roles, clearances and training of the staff. OpenKeel provides named roles and the audit trail of their actions.

Physical security

Data centres, access control to the rooms and the hardware. OpenKeel runs on the provider's own servers, in France and in Europe.

Operations

Changes, backups, vulnerability and capacity management. okadm plans, installs and upgrades one component at a time; Grafana shows the state of every service.

Incident management

Detection, handling and notification of incidents. The CADF trail, Loki and the Prometheus alerts give the facts.

Protection from extra-European law

§ 19.6: ownership, location of data and support in the European Union. OpenKeel is open source, with no telemetry and no outbound call.

Evidence for the audit

Configurations, policies and logs gathered in the compliance matrix, versioned with the code.

Towards qualification

StepWhatOutcome
Requirement matrixSecNumCloud 3.2 chapter by chapter: owner (OpenKeel or provider), mechanism, evidenceCompliance matrix versioned with the code
Internal reviewEach piece of evidence checked on a production-mode installReview report, open gaps tracked
Pre-auditQualified auditor, on a full pilot platformPre-audit report and treatment plan
PASSI penetration testPublic APIs, VM and Kata escape to the control plane, administration ISReport, fixes and retest
CSPN (optional)Critical components: Keystone, Barbican, Kata and KubeVirt isolationFirst-level certification of the chosen components