Ce que nous faisons · expertise

Sécurité & Gouvernance

Des architectures où la fuite n'est pas une option.

Chiffrement, contrôle d'accès granulaire, journalisation complète, cloisonnement. Nous auditons les piles data existantes et nous outillons les exigences techniques de NIS2 — sans jamais prétendre vous rendre conforme à votre place.

KeycloakIstioCiliumcert-managerOWASPTalos
Modes adaptés
Audit & architecture · Support open source
Système des nœuds
Talos Linux — immuable, sans shell
Accès machine
API gRPC, mTLS obligatoire — client écrit par nous
Secrets
OpenBao, descellé par vous
Réseau
Cilium en refus par défaut, sorties énumérées
Qualifications détenues
Aucune : ni SecNumCloud, ni HDS, ni ISO 27001

Méthode

Opérer un système d'exploitation qui n'a pas de shell.

Talos Linux n'a pas de shell. Pas de session interactive, pas de démon SSH, pas de gestionnaire de paquets, un système de fichiers racine en lecture seule. Un nœud reçoit un document de configuration déclaratif au démarrage et s'y conforme ; tout le reste — lire les journaux, lister les disques, redémarrer, monter de version, interroger les membres etcd, produire un paquet de diagnostic — est une méthode d'une API gRPC, authentifiée par certificat client. Il n'existe pas de chemin par mot de passe.

Ce que cela change se lit dans les deux sens, et il faut les tenir ensemble. Du côté de la sécurité : aucun interpréteur de commandes à compromettre, aucun paquet à faire dériver, aucune modification manuelle qui survive au redémarrage, et chaque acte d'administration devient un appel typé, donc journalisable et rejouable. Du côté de l'exploitation : on ne répare plus un nœud à la main. On corrige la configuration et on réapplique, ou on remplace le nœud. Et l'on dépend entièrement de son client d'API.

Nous avons donc écrit le nôtre. talos-rust-client est un client gRPC en Rust : quatorze fichiers, 8 316 lignes, dont la surface d'API typée générée depuis les proto officiels de SideroLabs ; le connecteur, la lecture du talosconfig et les types d'erreur sont écrits à la main. Le mTLS n'y est pas une option de configuration. L'autorité de certification, le certificat client et la clé cliente sont trois champs obligatoires, et leur absence est une erreur typée avant toute tentative de connexion — pas un avertissement dans un journal. Le tout est publié sur crates.io sous double licence MIT ou Apache-2.0.

Le reste de la posture suit le même principe : la règle vit dans le système, pas dans un classeur. Les secrets sont dans OpenBao, dont vous détenez les parts de descellement ; le réseau est en refus par défaut sous Cilium, avec les sorties énumérées destination par destination ; les certificats internes sont émis et renouvelés par cert-manager ; l'ensemble de la plateforme est décrit dans un dépôt GitOps où chaque composant est une application réconciliée en continu, ordonnée par vagues de synchronisation. Un auditeur n'a pas à nous croire : il lit le dépôt et compte.

Sur la conformité, la formulation est fixe et ne bougera pas. Conçu pour outiller les exigences techniques de NIS2 — matrice de responsabilité partagée publiée. § La directive fait porter les mesures de gestion des risques à l'entité, pas à son fournisseur, et nous ne détenons par ailleurs aucune qualification.

Le dépôt d'où vient ce code

talos-rust-client

Client gRPC Talos en Rust, publié sur crates.io. Surface d'API typée générée depuis les proto officiels de SideroLabs ; connecteur mTLS, lecture du talosconfig et erreurs écrits à la main.

Fichiers
14
Lignes
8 316
Licence
MIT OR Apache-2.0

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

Mesures relevées sur src/, hors tests et exemples.

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);
        …
L'ouverture d'une connexion à un nœud Talos. Trois champs sont exigés avant tout appel réseau : l'autorité de certification, le certificat client et la clé. Il manque volontairement un chemin dégradé — la seule voie sans vérification de certificat est le mode maintenance, réservé à l'amorçage d'un nœud vierge et signalé par un avertissement explicite dans le 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;
La surface d'administration d'un nœud, en entier. Machine, cluster, stockage, temps, sécurité, inspection : six services, et rien d'autre. C'est la liste exhaustive de ce qu'un exploitant peut faire sur une machine Talos — à comparer avec ce qu'autorise un shell root sur une distribution classique.

Périmètre

Ce que nous faisons, ce que nous ne faisons pas.

Un audit part de l'existant : ce qui est réellement exposé, qui a réellement accès, par où les données sortent.

Ce que nous faisons

  • Auditer une pile data existante : surface exposée, droits réels par opposition aux droits documentés, chemins de sortie, gestion des clés.
  • Passer les nœuds sur un système immuable, sans shell, dont chaque action d'administration est un appel authentifié.
  • Cloisonner : refus par défaut au réseau, sorties énumérées, séparation multi-tenant, identités portées par un annuaire que vous opérez.
  • Sortir les secrets des dépôts et des variables d'environnement : OpenBao en haute disponibilité, sauvegardes chiffrées, descellement chez vous.
  • Rendre le journal d'audit exploitable : qui a lu quoi, quand, depuis où, et conservé sur une durée décidée avec vous.
  • Outiller les exigences techniques de NIS2 et du RGPD, et publier la matrice de responsabilité partagée, exigence par exigence.

Ce que nous ne faisons pas

  • Nous ne faisons ni test d'intrusion, ni exercice de red team : c'est un autre métier, et un audit d'architecture ne le remplace pas.
  • Nous ne détenons pas vos secrets. Les clés et les parts de descellement restent chez vous, y compris lorsque nous exploitons.
  • Nous ne détenons ni SecNumCloud, ni HDS, ni ISO 27001, et nous ne le laissons pas entendre.

Missions

Deux engagements comparables.

Décrits par le dispositif mis en place et par ce qu'il a produit.

Régie · en cours, plus de 12 mois

Groupe bancaire national

Des ingénieurs embarqués dans les équipes du client, sur leur dépôt et leur chaîne de production. Ce qui se faisait à la main est décrit, versionné et relu.

KubernetesArgo CDOpenTofuAnsibleGrafanaOpenTelemetry

Cloud souverain · en cours

Montpellier Métropole

Un cloud interne de données et d'inférence, déployé sous maîtrise publique : les modèles tournent sur l'infrastructure de la collectivité, et les journaux restent de son côté.

KubernetesvLLMKeycloakPostgreSQLMinIO

Voir les quatre missions

Prendre contact

Faire regarder la pile par quelqu'un qui ne l'a pas construite.

Un audit part de l'existant : ce qui est réellement exposé, qui a réellement accès, par où sortent les données. Le livrable est un rapport écrit, avec ses hypothèses, ses angles morts, et la liste de ce que nous n'avons pas pu vérifier faute d'accès.