What we do · expertise

Security & Governance

Architectures where a leak is not an option.

Encryption, fine-grained access control, complete audit logging, segmentation. We audit existing data stacks and we tool the technical requirements of NIS2 — without ever claiming to make you compliant on your behalf.

KeycloakIstioCiliumcert-managerOWASPTalos
Engagement models
Audit & architecture · Open source support
Node operating system
Talos Linux — immutable, no shell
Machine access
gRPC API, mandatory mTLS — client written by us
Secrets
OpenBao, unsealed by you
Network
Cilium default deny, egress enumerated
Certifications held
None: no SecNumCloud, no HDS, no ISO 27001

Method

Operating an operating system that has no shell.

Talos Linux has no shell. No interactive session, no SSH daemon, no package manager, a read-only root filesystem. A node receives a declarative configuration document at boot and conforms to it; everything else — reading logs, listing disks, rebooting, upgrading, querying etcd members, producing a support bundle — is a method on a gRPC API, authenticated by client certificate. There is no password path.

What that changes reads in both directions, and both have to be held at once. On the security side: no command interpreter to compromise, no package set to drift, no manual change that survives a reboot, and every administrative act becomes a typed call, therefore loggable and replayable. On the operations side: you no longer repair a node by hand. You fix the configuration and reapply, or you replace the node. And you depend entirely on your API client.

So we wrote ours. talos-rust-client is a gRPC client in Rust: fourteen files, 8,316 lines, of which the typed API surface is generated from SideroLabs' official protos; the connector, the talosconfig parsing and the error types are written by hand. mTLS is not a configuration option there. The certificate authority, the client certificate and the client key are three mandatory fields, and their absence is a typed error before any connection is attempted — not a warning in a log. It is published on crates.io under the MIT OR Apache-2.0 dual licence.

The rest of the posture follows the same principle: the rule lives in the system, not in a binder. Secrets sit in OpenBao, whose unseal shares you hold; the network is default-deny under Cilium, with egress enumerated destination by destination; internal certificates are issued and renewed by cert-manager; the whole platform is described in a GitOps repository where each component is an application reconciled continuously, ordered by sync waves. An auditor does not have to believe us: they read the repository and count.

On compliance, the wording is fixed and will not move. Built to tool the technical requirements of NIS2 — shared responsibility matrix published. § The directive places risk-management measures on the entity, not on its supplier, and we hold no certification of any kind.

The repository this code comes from

talos-rust-client

Talos gRPC client in Rust, published on crates.io. Typed API surface generated from SideroLabs' official protos; mTLS connector, talosconfig parsing and error types written by hand.

Files
14
Lines
8,316
Licence
MIT OR Apache-2.0

github.com/nudibranches-tech/talos-rust-client

Measured over src/, excluding tests and examples.

src/connector.rs Rust
    async fn connect_normal(self) -> Result<Channel> {
        // Validate required fields
        let ca_cert = self
            .ca_cert
            .ok_or_else(|| Error::MissingConfig("CA certificate".to_string()))?;
        let client_cert = self
            .client_cert
            .ok_or_else(|| Error::MissingConfig("Client certificate".to_string()))?;
        let client_key = self
            .client_key
            .ok_or_else(|| Error::MissingConfig("Client key".to_string()))?;

        // Create tonic Certificate and Identity
        let ca = Certificate::from_pem(ca_cert);
        let identity = Identity::from_pem(client_cert, client_key);

        // Configure TLS
        let mut tls_config = ClientTlsConfig::new().ca_certificate(ca).identity(identity);
        …
Opening a connection to a Talos node. Three fields are required before any network call: the certificate authority, the client certificate and the key. A degraded path is deliberately missing — the only route without certificate verification is maintenance mode, reserved for bootstrapping a blank node and flagged by an explicit warning in the code.
src/lib.rs Rust
// Re-export commonly used client types
pub use cluster::cluster_service_client::ClusterServiceClient;
pub use inspect::inspect_service_client::InspectServiceClient;
pub use machine::machine_service_client::MachineServiceClient;
pub use security::security_service_client::SecurityServiceClient;
pub use storage::storage_service_client::StorageServiceClient;
pub use time::time_service_client::TimeServiceClient;
A node's entire administrative surface. Machine, cluster, storage, time, security, inspection: six services, and nothing else. That is the exhaustive list of what an operator can do to a Talos machine — compare it with what a root shell allows on a conventional distribution.

Scope

What we do, and what we do not do.

An audit starts from what exists: what is actually exposed, who actually has access, where the data leaves.

What we do

  • Audit an existing data stack: exposed surface, effective rights as opposed to documented rights, egress paths, key management.
  • Move nodes onto an immutable, shell-less system where every administrative action is an authenticated call.
  • Segment: default deny on the network, enumerated egress, multi-tenant separation, identities carried by a directory you operate.
  • Get secrets out of repositories and environment variables: OpenBao in high availability, encrypted backups, unsealing on your side.
  • Make the audit trail usable: who read what, when, from where, retained for a period decided with you.
  • Tool the technical requirements of NIS2 and the GDPR, and publish the shared responsibility matrix, requirement by requirement.

What we do not do

  • We do not run penetration tests or red team exercises: that is a separate profession, and an architecture audit is no substitute for it.
  • We do not hold your secrets. Keys and unseal shares stay on your side, including when we operate the system.
  • We hold neither SecNumCloud, nor HDS, nor ISO 27001, and we do not imply otherwise.

Engagements

Two comparable engagements.

Described by the setup that was put in place and by what it produced.

Embedded engagement · ongoing, more than 12 months

National banking group

Engineers embedded in the client's teams, on their repository and their delivery chain. What was done by hand is now described, versioned and reviewed.

KubernetesArgo CDOpenTofuAnsibleGrafanaOpenTelemetry

Sovereign cloud · ongoing

Montpellier Métropole

An internal cloud for data and inference, deployed under public control: the models run on the authority's own infrastructure, and the logs stay on its side.

KubernetesvLLMKeycloakPostgreSQLMinIO

See all four engagements

Get in touch

Have the stack read by someone who did not build it.

An audit starts from what exists: what is actually exposed, who actually has access, where the data leaves. The deliverable is a written report, with its assumptions, its blind spots, and a list of what we could not verify for lack of access.