<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>confidential containers &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/confidential-containers/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Mon, 04 May 2026 09:26:24 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>confidential containers &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Utiliser un environnement d’exécution de confiance « on-premise »</title>
		<link>https://www.smalsresearch.be/utiliser-un-environnement-dexecution-de-confiance-on-premise/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26503</guid>

					<description><![CDATA[Dans cet article, nous détaillons le fonctionnement de certains aspects des conteneurs confidentiels "CoCo" et décrivons notre installation sur notre propre matériel.]]></description>
										<content:encoded><![CDATA[
<p>Dans un <a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">précédent article</a>, nous avons exposé les avantages des conteneurs confidentiels et leur architecture dans le projet «&nbsp;CoCo.&nbsp;» Dans cet article, nous approfondissons notre propos en détaillant le fonctionnement de certains aspects de CoCo et en décrivant notre installation sur notre propre matériel.</p>



<h1 class="wp-block-heading">Attestation de conteneurs</h1>



<p>Les capsules Kubernetes, utilisées comme abstraction pour les charges de travail conteneurisées confidentielles, introduisent plusieurs défis. Leur nature dynamique — création, suppression, mise à jour de conteneurs — et l’influence de l’environnement Kubernetes (variables d’environnement, contrôleurs d’admission, etc.) rendent difficile la garantie que seul le code prévu par l’utilisateur sera exécuté. Par exemple, l’injection de variables malveillantes ou la modification de la spécification d’une capsule avant son lancement peuvent compromettre la confidentialité.</p>



<p>Le projet CoCo propose une solution élégante qui consiste à utiliser un moteur de politiques de sécurité, intégré à l’environnement d’exécution du conteneur dans l’environnement d’exécution de confiance (EEC), qui applique des règles définies par l’utilisateur. Ce moteur peut, par exemple, autoriser uniquement certaines images ou commandes, et rejeter les appels problématiques (comme l’exécution de processus non autorisés). La <a href="#Figure-1">Figure 1</a> montre un exemple d’une telle politique.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>package agent_policy

# Seules certaines images de conteneurs peuvent être exécutées
default CreateContainerRequest&nbsp;:= false
CreateContainerRequest if {
    every storage in input.storages {
    some allowed_image in policy_data.allowed_images
    storage.source == allowed_image
  }
}

# Seules certaines commandes peuvent être exécutées
# via ‘kubectl exec’ dans les images de conteneurs
default ExecProcessRequest&nbsp;:= false
ExecProcessRequest if {
  input_command = concat(" ", input.process.Args)
      some allowed_command in policy_data.allowed_commands
      input_command == allowed_command
}

policy_data&nbsp;:= {
    "allowed_commands": &#91;
        "ls",
        "cat",
    &#93;,
    "allowed_images": &#91;
        "pause",
        "my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220
",
    &#93;,
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">package agent_policy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines images de conteneurs peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4">default CreateContainerRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">CreateContainerRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">every</span><span style="color: #D4D4D4"> storage</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> input.storages {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_image</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_images</span></span>
<span class="line"><span style="color: #D4D4D4">    storage</span><span style="color: #D7BA7D">.source</span><span style="color: #D4D4D4"> == allowed_image</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines commandes peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4"># via ‘kubectl exec’ dans les images de conteneurs</span></span>
<span class="line"><span style="color: #D4D4D4">default ExecProcessRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">ExecProcessRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">concat</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot; &quot;</span><span style="color: #D4D4D4">, input.process.Args)</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_command</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_commands</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> == allowed_command</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">policy_data</span><span style="color: #D4D4D4">&nbsp;:= {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_commands&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ls&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;cat&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_images&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;pause&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220</span></span>
<span class="line"><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figure-1">Figure 1 – Exemple de politique de sécurité (langage <a href="https://www.openpolicyagent.org/docs/policy-language">REGO</a>) restreignant les images pouvant être exécutées et les commandes pouvant être invoquées dans l’image. Cette politique est appliquée par un agent inclus dans la machine virtuelle confidentielle.</p>



<p>Quatre composants de la machine virtuelle confidentielle invitée sont systématiquement mesurés pour assurer leur intégrité&nbsp;: le micrologiciel (e.g., OVMF), le noyau du système d’exploitation, la ligne de commande du noyau et le système de fichiers racine (<a href="#Figure-2">Figure 2</a>). Une entité externe de confiance, généralement appelée Trustee, atteste de l’intégrité de l’invité, renforçant ainsi la chaîne de confiance.</p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture2-Composition-mesure.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture2-Composition-mesure.svg" alt="" class="wp-image-26665" style="width:500px"/></a><figcaption class="wp-element-caption">Figure 2 – Composition de la «&nbsp;mesure&nbsp;» calculée par le <a href="/outils-pour-linformatique-confidentielle/#AMD_SEV-SNP">système SEV</a> du microprocesseur AMD lors de l’attestation. La mesure est la valeur de hachage cryptographique d’une zone de la mémoire chiffrée où se trouve le micrologiciel (e.g., OVMF) dans lequel ont été injectées les valeurs de hachage cryptographique du noyau du système d’exploitation de la machine virtuelle attestée, de la ligne de commande utilisée pour lancer ce noyau et enfin du système de fichier racine.</figcaption></figure>



<p>Cependant, les conteneurs confidentiels nécessitent généralement des données d’initialisation qui ne peuvent pas être intégrées directement dans l’image de la machine virtuelle ou du conteneur applicatif, comme les certificats, les adresses des services d’attestation ou les politiques de sécurité à appliquer. Ces données, bien que non secrètes, doivent être protégées contre toute altération.</p>



<p>Ces données d’initialisation appelées <a href="https://github.com/confidential-containers/trustee/blob/main/kbs/docs/initdata.md"><code>init-data</code></a> peuvent être spécifiées sous forme de dictionnaire (e.g., fichiers JSON, TOML, YAML), encodé en base64 et passé à la capsule Kubernetes via une annotation Kubernetes (<a href="#Figure-3">Figure 3</a>). Afin de garantir leur intégrité, leur valeur de hachage cryptographique est fournie par l’agent d’attestation (fonctionnant dans la machine virtuelle confidentielle) en donnée d’entrée pour le calcul de l’attestation (cela peut se faire en utilisant le champ «&nbsp;<em>HostData&nbsp;</em>» de SEV-SNP). Il est alors possible de comparer les données d’initialisation envoyées à la machine hôte pour le lancement du conteneur avec la valeur de hachage reçue au moment de l’attestation, assurant ainsi que toute modification sera détectée lors de l’attestation à distance.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>version = "0.1.0"
algorithm = "sha256"

&#91;data&#93;

# Configuration de l’agent d’attestation
"aa.toml" = '''
&#91;token_configs&#93;
&#91;token_configs.kbs&#93;
url = "${KBS_ADDRESS}"
'''

# Configuration du gestionnaire de données secrètes
"cdh.toml" = '''
&#91;kbc&#93;
name = "cc_kbc"
url = "${KBS_ADDRESS}"

&#91;image&#93;
authenticated_registry_credentials_uri = "kbs:///${REGISTRY_AUTH_KBS_PATH}"
image_security_policy_uri = "${SECURITY_POLICY_KBS_URI}"
'''

# Politique de sécurité restreignant l’environnement du conteneur
"policy.rego"= '''
&#91;Voir Figure 1 ci-dessus&#93;
'''
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">version</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;0.1.0&quot;</span></span>
<span class="line"><span style="color: #9CDCFE">algorithm</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;sha256&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&#91;data&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration de l’agent d’attestation</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">aa.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs.kbs&#93;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration du gestionnaire de données secrètes</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">cdh.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;kbc&#93;</span></span>
<span class="line"><span style="color: #CE9178">name = &quot;cc_kbc&quot;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">&#91;image&#93;</span></span>
<span class="line"><span style="color: #CE9178">authenticated_registry_credentials_uri = &quot;kbs:///${REGISTRY_AUTH_KBS_PATH}&quot;</span></span>
<span class="line"><span style="color: #CE9178">image_security_policy_uri = &quot;${SECURITY_POLICY_KBS_URI}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Politique de sécurité restreignant l’environnement du conteneur</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">policy.rego</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">= </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;Voir Figure 1 ci-dessus&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figure-3">Figure 3 – Exemple de données d’initialisation fournies (sous forme encodée) via une annotation Kubernetes à l’agent invité CoCo dans la machine virtuelle confidentielle.</p>



<h1 class="wp-block-heading">Gestion de clés</h1>



<p>Un service extérieur de médiation de clés, qui peut être connecté à une boîte noire transactionnelle, permet au conteneur d’obtenir dynamiquement des ressources nécessaires à son fonctionnement. Si le client n’est pas déjà en possession d’un témoin de connexion précédemment obtenu du service de médiation de clés, il doit d’abord s’authentifier et le service de médiation de clés lui <a href="https://github.com/confidential-containers/trustee/blob/main/kbs/docs/kbs_attestation_protocol.md">répond avec un défi</a> auquel il doit répondre (<a href="#Figure-4">Figure 4</a>).</p>



<p>Le client génère une paire de clés cryptographiques et demande au processeur de lui fournir une attestation en incluant la valeur de hachage de sa clé publique et une valeur aléatoire unique envoyée par le service dans son défi. L’attestation qui lie clé publique du client, valeur aléatoire unique envoyée par le service et mesure de la VM confidentielle contenant le client est signée par le processeur. Le service fait appel à un agent d’attestation qui vérifie l’attestation en vérifiant la signature et en comparant la mesure à une valeur de référence.</p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-4"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture4-Protocol-authentification.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture4-Protocol-authentification.svg" alt="" class="wp-image-26664" style="width:600px"/></a><figcaption class="wp-element-caption">Figure 4 – Protocole d’authentification de la machine virtuelle confidentielle auprès du service extérieur «&nbsp;Trustee&nbsp;» composé d’un service de médiation de clés et d’un service d’attestation&nbsp;: afin de pouvoir obtenir une valeur stockée (secret, clé, etc.) par le service de médiation, le client doit d’abord prouver son authenticité via l’attestation. Ce protocole suit le modèle <a href="https://www.ietf.org/rfc/rfc9334.html">RATS (RFC9334)</a>.</figcaption></figure>



<h1 class="wp-block-heading">Installation et tests</h1>



<p>Afin de tester l’environnement CoCo, nous avons choisi d’utiliser un microprocesseur <a href="https://www.amd.com/fr/products/processors/server/epyc/9005-series/amd-epyc-9335.html">EPYC 9335</a> de la société AMD. Il met en œuvre la technologie SEV-SNP de chiffrement et de protection de l’intégrité de la mémoire vive. Nous avons assemblé une machine avec une carte mère prenant en charge ce microprocesseur (Supermicro MBD-H13SSL-NT-O) et 128 Go de mémoire vive. Il a ensuite fallu configurer le BIOS afin que les fonctionnalités souhaitées de sécurité du microprocesseur soient bien activées. Nous avons aussi opté pour la distribution Ubuntu 24.04.3 LTS du système d’exploitation Linux. Avant de pouvoir tester les fonctionnalités de sécurité du processeur, nous avons enfin dû recompiler le noyau du système d’exploitation. L’opération est en fait relativement simple grâce aux <a href="https://github.com/AMDESE/AMDSEV">scripts fournis par AMD</a>.</p>



<p>Une fois le système configuré, il est alors possible d’y installer la plateforme Docker (afin de pouvoir créer des images de conteneurs), l’interface d’exécution de conteneur <code>containerd </code>(incluse dans la distribution de Docker) et le système de gestion Kubernetes. La configuration de ces outils est assez délicate et sensible aux version. Plusieurs scripts permettant de faciliter cette installation sont <a href="https://gitlab.smalsrech.be/fape/coco-with-snp">fournis ici</a>.</p>



<p>Une fois le système installé, il nous a été possible de déployer une application existante dans des conteneurs confidentiels&nbsp;: il suffit en fait de changer le nom de classe d’exécution utilisé par Kubernetes (<code>runtimeClassName</code>) dans le fichier YAML de configuration de Kubernetes pour l’une des classes de CoCo (e.g., <code>kata-qemu-snp</code>). Bien sûr ce changement simple ne suffit pas à bénéficier des fonctionnalités de sécurité de CoCo. Il est nécessaire de modifier le cycle de production afin d’ajouter les étapes suivantes&nbsp;:</p>



<ul class="wp-block-list">
<li>Chiffrement de l’image du conteneur</li>



<li>Signature de l’image du conteneur</li>



<li>Mise à disposition des clés de chiffrement et de signature</li>
</ul>



<p>Une fois l’image du conteneur créée de la manière habituelle, par exemple avec docker build, celle-ci peut être chiffrée avec l’outil <a href="https://github.com/containers/skopeo">skopeo</a> qui prend en charge différents algorithmes&nbsp;: <a href="https://www.ietf.org/rfc/rfc7516.html">JWE (RFC7516)</a>, <a href="https://www.ietf.org/rfc/rfc4880.html">PGP (RFC4880)</a>, et <a href="https://www.ietf.org/rfc/rfc2315.html">PKCS7 (RFC2315)</a>. Cette image chiffrée peut ensuite être signée avec l’outil <a href="https://github.com/sigstore/cosign">cosign</a> et enfin chargée sur un registre d’images.</p>



<p>Au moment du lancement du conteneur, les composants CoCo inclus dans la machine virtuelle confidentielle devront pouvoir vérifier la signature et déchiffrer son image. Pour cela, il est nécessaire de mettre à disposition les clé requises. C’est là que le système de médiation de clés intervient. Comme nous l’avons vu précédemment, celui effectue un protocole d’attestation avant de fournir les clés.</p>



<p>Le déploiement des conteneurs confidentiels est transparent vis-à-vis de l’utilisateur de Kubernetes. Une fois l’invocation de la commande habituelle <code>kubectl apply</code>, une machine virtuelle légère Kata est créée. Celle-ci doit récupérer auprès du médiateur de clés, la clé d’accès au registre d’image (si celui-ci n’est pas public), la politique de sécurité à appliquer, la clé de vérification de signature et la clé de déchiffrement de l’image. Ces informations ne sont fournies qu’après l’attestation de la machine virtuelle (voir plus haut). Les agents inclus dans la machine virtuelle peuvent alors appliquer la politique de sécurité, télécharger l’image, vérifier sa signature et la déchiffrer avant de lancer le conteneur applicatif dans la machine virtuelle.</p>



<p>En ce qui concerne la communication de l’application conteneurisée avec des services extérieurs, il convient d’établir des clés de chiffrement mutuellement reconnues. Une première possibilité est que le conteneur confidentiel crée une paire de clé cryptographiques à son lancement et fournisse la valeur de hachage cryptographique de cette clé publique lors de l’attestation. C’est ce qui est utilisé dans le protocole d’authentification présenté dans la <a href="#Figure-4">Figure 4</a>. Une autre option est de fournir la clé publique d’une autorité de certification dans l’image chiffrée-puis-signée. Le conteneur pourra alors vérifier les certificats signés par cette autorité et accepter des clés de chiffrement. Une troisième option consiste à s’appuyer sur le service de médiation de clés&nbsp;: celui-ci permet au conteneur de récupérer des secrets de manière sécurisée. En fonction de l’option choisie, il conviendra de modifier plus ou moins le code de l’application.</p>



<h1 class="wp-block-heading">Protection vis-à-vis d’un administrateur</h1>



<p>Que peut faire un administrateur de la machine hôte&nbsp;? A priori, pas grand-chose, à part lancer le conteneur.</p>



<p>En effet, le mécanisme d’attestation l’empêche de substituer ou de simuler les composants de la machine virtuelle utilisée pour le lancement des conteneurs. Le chiffrement de la mémoire allouée à la machine virtuelle le bloque dans l’observation des données traitées dans la machine virtuelle et le conteneur. Le chiffrement et la signature de l’image du conteneur ne lui permettent ni de substituer un autre conteneur, ni de connaître la nature du conteneur. En supposant que l’application soit configurée pour communiquer de manière chiffrée avec les services extérieurs avec lesquelles elle doit interagir, l’administrateur ne peut pas non plus accéder aux données sensibles en observant le trafic réseau, sauf s’il a également un accès privilégié au système de création des clés. Enfin, il ne peut pas non plus interroger le conteneur via la commande <code>kubectl exec</code> car celle-ci peut être restreinte via une politique de sécurité (voir <a href="#Figure-1">Figure 1</a>).</p>



<p>En revanche, l’administrateur peut lire les journaux applicatifs enregistrés par Kubernetes sur l’hôte. Par conséquent, il est important que le fournisseur de la charge de travail prenne soin que son code ne divulgue pas des informations sensibles dans les messages journalisés de l’application.</p>



<p>Enfin, comme nous l’avons rappelé dans l’<a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">article précédent</a>, les environnements d’exécution de confiance ne sont pas parfaits et leur modèle de sécurité ne tient généralement pas compte des attaques physiques. Dans un environnement comme le G-Cloud, leur ajout offre de nombreuses possibilités. En revanche, dans un environnement où ni SMALS, ni ses clients, ni même l’État belge n’ont le moindre contrôle technique ou juridique sur l’infrastructure, il existe des risques importants qu’il convient d’évaluer sérieusement.</p>



<h1 class="wp-block-heading">Conclusion</h1>



<p>À travers cet article et <a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">le précédent</a>, nous avons mis en avant les avantages réels en termes de sécurité que pourraient apporter des microprocesseurs permettant de créer des environnements d’exécution de confiance au sein d’une infrastructure informatique. En particulier, leur utilisation « on-premise » permet de mieux protéger des applications conteneurisées d’administrateurs malveillants ou d’intrus et donc d’offrir des garanties encore plus fortes à nos Membres.</p>



<p>Plus simples d’utilisation que les méthodes cryptographiques avancées, de tels systèmes pourraient aussi nous permettre de résoudre des problèmes plus génériques que la cryptographie ou des problèmes que nous ne pouvions pas résoudre jusqu’à présent.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Een &#8220;on-premise&#8221; Trusted Execution Environment gebruiken</title>
		<link>https://www.smalsresearch.be/een-betrouwbare-runtime-omgeving-on-premise-gebruiken/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26524</guid>

					<description><![CDATA[In deze blogpost gaan we in op het onderwerp door bepaalde aspecten van "CoCo" confidential containers in detail te beschrijven en onze installatie op onze eigen hardware toe te lichten.]]></description>
										<content:encoded><![CDATA[
<p>In een <a href="/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">vorige blogpost</a> hebben we de voordelen besproken van confidential containers en hun architectuur in het CoCo-project. In deze blogpost gaan we dieper in op het onderwerp door bepaalde aspecten van CoCo in detail te beschrijven en onze installatie op onze eigen hardware toe te lichten.</p>



<h1 class="wp-block-heading">Containercertificering</h1>



<p>Het gebruik van Kubernetes-pods als abstractielaag voor vertrouwelijke container-workloads introduceert diverse uitdagingen. Door hun dynamische karakter – het maken, verwijderen, updaten van de containers – en de invloed van de Kubernetesomgeving (omgevingsvariabelen, toelatingscontrollers, enz.) valt het moeilijk te garanderen dat enkel de door de gebruiker bedoelde code wordt uitgevoerd. Zo kan het injecteren van kwaadaardige variabelen of het wijzigen van de specificatie van een pod voordat deze wordt gestart, de vertrouwelijkheid in gevaar brengen.</p>



<p>Het CoCo-project stelt een elegante oplossing voor, namelijk het gebruik van een engine voor beveiligingsbeleid, geïntegreerd in de containerruntime-omgeving binnen de trusted execution environment (TEE), die de door de gebruiker gedefinieerde regels toepast. Deze engine kan bijvoorbeeld alleen bepaalde images of commando’s toestaan en problematische verzoeken (zoals het uitvoeren van ongeoorloofde processen) afwijzen. <a href="#Figuur-1">Figuur 1</a> toont een voorbeeld van zo’n beleid.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>package agent_policy

# Seules certaines images de conteneurs peuvent être exécutées
default CreateContainerRequest&nbsp;:= false
CreateContainerRequest if {
    every storage in input.storages {
    some allowed_image in policy_data.allowed_images
    storage.source == allowed_image
  }
}

# Seules certaines commandes peuvent être exécutées
# via ‘kubectl exec’ dans les images de conteneurs
default ExecProcessRequest&nbsp;:= false
ExecProcessRequest if {
  input_command = concat(" ", input.process.Args)
      some allowed_command in policy_data.allowed_commands
      input_command == allowed_command
}

policy_data&nbsp;:= {
    "allowed_commands": &#91;
        "ls",
        "cat",
    &#93;,
    "allowed_images": &#91;
        "pause",
        "my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220
",
    &#93;,
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">package agent_policy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines images de conteneurs peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4">default CreateContainerRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">CreateContainerRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">every</span><span style="color: #D4D4D4"> storage</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> input.storages {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_image</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_images</span></span>
<span class="line"><span style="color: #D4D4D4">    storage</span><span style="color: #D7BA7D">.source</span><span style="color: #D4D4D4"> == allowed_image</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines commandes peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4"># via ‘kubectl exec’ dans les images de conteneurs</span></span>
<span class="line"><span style="color: #D4D4D4">default ExecProcessRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">ExecProcessRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">concat</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot; &quot;</span><span style="color: #D4D4D4">, input.process.Args)</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_command</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_commands</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> == allowed_command</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">policy_data</span><span style="color: #D4D4D4">&nbsp;:= {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_commands&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ls&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;cat&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_images&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;pause&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220</span></span>
<span class="line"><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figuur-1">Figuur 1 – Voorbeeld van een beperkend beveiligingsbeleid voor images die kunnen worden uitgevoerd en de commando’s die in de image kunnen worden aangeroepen. Dit beleid wordt toegepast door een agent die in de vertrouwelijke VM zit.</p>



<p>Vier componenten van de vertrouwelijke virtuele guestmachine worden altijd gecontroleerd om te bepalen of ze nog goed werken: de firmware (bijvoorbeeld OVMF), de kernel van het besturingssysteem, de kernel commandoregel en het rootbestandssysteem (<a href="#Figuur-2">Figuur 2</a>). Een vertrouwelijke externe entiteit, vaak Trustee genoemd, zorgt ervoor dat de vertrouwensketen versterkt wordt.</p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Measurement.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Measurement.svg" alt="" class="wp-image-26527" style="width:500px"/></a><figcaption class="wp-element-caption">Figuur 2 &#8211; Samenstelling van de “meting” (measurement) die door het <a href="https://www.smalsresearch.be/tools-voor-confidential-computing/">SEV-systeem</a> van de AMD-microprocessor wordt berekend tijdens de certificering. De meting is de cryptografische hashwaarde van een versleuteld geheugengebied waarin zich de firmware bevindt (bijv. OVMF). In deze firmware zijn de cryptografische hashwaarden geïnjecteerd van de OS-kernel van de geattesteerde virtuele machine, de command-line waarmee deze kernel is opgestart en, tot slot, het root-bestandssysteem. </figcaption></figure>



<p>Vertrouwelijke containers hebben echter meestal initialisatiedata nodig die niet direct in de image van de virtuele machine of de toepassingscontainer kunnen worden opgenomen, zoals certificaten, adressen van certificeringsdiensten of toe te passen beveiligingsbeleidsregels. Deze data zijn weliswaar niet geheim, maar moeten wel worden beschermd tegen wijzigingen.</p>



<p>Deze initialisatiedata, ook wel <code>init-data</code> genoemd, kunnen worden opgegeven in de vorm van een woordenboek (bijv. JSON-bestanden, TOML, YAML), gecodeerd in base64 en doorgegeven aan de Kubernetes-pod via een Kubernetes annotation (<a href="#Figuur-3">Figuur 3</a>). Om de integriteit ervan te garanderen, wordt hun cryptografische hashwaarde door de certificeringsagent (die in de vertrouwelijke virtuele machine draait) als data voor de berekening van de certificering verstrekt (dit kan worden gedaan met behulp van het veld “<em>HostData</em>” van SEV-SNP). Het is dan mogelijk om de initialisatiedata die naar de hostmachine zijn gestuurd voor het starten van de container te vergelijken met de hashwaarde die op het moment van de certificering is ontvangen, zodat elke wijziging tijdens de certificering op afstand kan worden gedetecteerd.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>version = "0.1.0"
algorithm = "sha256"

&#91;data&#93;

# Configuration de l’agent d’attestation
"aa.toml" = '''
&#91;token_configs&#93;
&#91;token_configs.kbs&#93;
url = "${KBS_ADDRESS}"
'''

# Configuration du gestionnaire de données secrètes
"cdh.toml" = '''
&#91;kbc&#93;
name = "cc_kbc"
url = "${KBS_ADDRESS}"

&#91;image&#93;
authenticated_registry_credentials_uri = "kbs:///${REGISTRY_AUTH_KBS_PATH}"
image_security_policy_uri = "${SECURITY_POLICY_KBS_URI}"
'''

# Politique de sécurité restreignant l’environnement du conteneur
"policy.rego"= '''
&#91;Voir Figure 1 ci-dessus&#93;
'''</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">version</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;0.1.0&quot;</span></span>
<span class="line"><span style="color: #9CDCFE">algorithm</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;sha256&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&#91;data&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration de l’agent d’attestation</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">aa.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs.kbs&#93;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration du gestionnaire de données secrètes</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">cdh.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;kbc&#93;</span></span>
<span class="line"><span style="color: #CE9178">name = &quot;cc_kbc&quot;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">&#91;image&#93;</span></span>
<span class="line"><span style="color: #CE9178">authenticated_registry_credentials_uri = &quot;kbs:///${REGISTRY_AUTH_KBS_PATH}&quot;</span></span>
<span class="line"><span style="color: #CE9178">image_security_policy_uri = &quot;${SECURITY_POLICY_KBS_URI}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Politique de sécurité restreignant l’environnement du conteneur</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">policy.rego</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">= </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;Voir Figure 1 ci-dessus&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figuur-3">Figuur 3 &#8211; Voorbeeld van initialisatiedata die (in gecodeerde vorm) via een Kubernetes-annotatie aan de CoCo-guestagent in de vertrouwelijke virtuele machine worden geleverd.</p>



<h1 class="wp-block-heading">Sleutelbeheer</h1>



<p>Een externe sleutelbemiddelingsdienst (key broker service), die kan worden gekoppeld aan een transactionele &#8216;black box&#8217;, stelt de container in staat om dynamisch de resources op te halen die nodig zijn voor de werking ervan. Indien de client nog niet in het bezit is van een eerder verkregen authenticatietoken van de sleutelbemiddelingsdienst, moet hij zich eerst authenticeren, waarna de sleutelbemiddelingsdienst hem <a href="https://github.com/confidential-containers/trustee/blob/main/kbs/docs/kbs_attestation_protocol.md">een challenge stuurt</a> die hij moet beantwoorden (<a href="#Figuur-4">Figuur 4</a>).</p>



<p>De client genereert een paar cryptografische sleutels en vraagt de processor om een certificaat te verstrekken met daarin de hashwaarde van zijn openbare sleutel en een unieke willekeurige waarde die door de dienst in zijn challenge is verzonden. Het certificaat dat de openbare sleutel van de client, de unieke willekeurige waarde die door de service is gestuurd en de meting van de vertrouwelijke VM die de client bevat aan elkaar koppelt, wordt door de processor ondertekend. De service gebruikt een certificeringsagent die het certificaat controleert door de handtekening te verifiëren en de meting te vergelijken met een referentiewaarde.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture4-Authantication-protocol.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture4-Authantication-protocol.svg" alt="" class="wp-image-26528" style="width:600px"/></a><figcaption class="wp-element-caption"><a>Figuur </a>4 &#8211; Protocol voor authenticatie van de vertrouwelijke virtuele machine bij de externe “Trustee”-service, bestaande uit een sleutelbemiddelingsservice en een certificeringsservice: om een opgeslagen waarde (geheim, sleutel, enz.) van de bemiddelingsservice te kunnen verkrijgen, moet de client eerst zijn authenticiteit bewijzen via de certificering. Dit protocol volgt het <a href="https://www.ietf.org/rfc/rfc9334.html">RATS-model (RFC9334)</a>.</figcaption></figure>



<h1 class="wp-block-heading">Installatie en testen</h1>



<p>Om de CoCo-omgeving te testen, hebben we gekozen voor een EPYC <a href="https://www.amd.com/en/products/processors/server/epyc/9005-series/amd-epyc-9335.html">9335-microprocessor</a> van AMD. Deze maakt gebruik van SEV-SNP-technologie voor versleuteling en bescherming van de integriteit van het RAM-geheugen. We hebben een machine geassembleerd met een moederbord dat deze microprocessor ondersteunt (Supermicro MBD-H13SSL-NT-O) en 128 GB RAM-geheugen. Vervolgens moesten we het BIOS configureren om ervoor te zorgen dat de gewenste beveiligingsfuncties van de microprocessor goed waren geactiveerd. We hebben ook gekozen voor de Ubuntu 24.04.3 LTS-distributie van het Linux-besturingssysteem. Voordat we de beveiligingsfuncties van de processor konden testen, moesten we ten slotte de kernel van het besturingssysteem opnieuw compileren. Dit is eigenlijk vrij simpel dankzij de <a href="https://github.com/AMDESE/AMDSEV">scripts die AMD heeft meegegeven</a>.</p>



<p>Eenmaal het systeem is ingesteld, kun je het Docker-platform installeren (om containerimages te maken), de containeruitvoeringsinterface <em>containerd </em>(inbegrepen in de Docker-distributie) en het Kubernetes-beheersysteem. Het instellen van deze tools is best lastig en afhankelijk van de versie. Er zijn <a href="https://gitlab.smalsrech.be/fape/coco-with-snp">verschillende scripts</a> beschikbaar om deze installatie te vergemakkelijken.</p>



<p>Nadat het systeem was geïnstalleerd, konden we een bestaande toepassing in vertrouwelijke containers zetten: je hoeft alleen maar de naam van de runtimeklasse die Kubernetes gebruikt (<code>runtimeClassName</code>) in het YAML-configuratiebestand van Kubernetes te veranderen in een van de CoCo-klassen (bijvoorbeeld <code>kata-qemu-snp</code>). Natuurlijk is deze simpele wijziging niet genoeg om te profiteren van de beveiligingsfuncties van CoCo. Je moet de productiecyclus aanpassen om de volgende stappen toe te voegen:</p>



<ul class="wp-block-list">
<li>Versleuteling van de containerimage</li>



<li>Ondertekening van de containerimage</li>



<li>Beschikbaar stellen van versleutelings- en ondertekeningssleutels</li>
</ul>



<p>Zodra de containerimage op de gebruikelijke manier is gemaakt, bijvoorbeeld met docker build, kan deze worden versleuteld met de tool <a href="https://github.com/containers/skopeo">skopeo</a>, die verschillende algoritmen ondersteunt: <a href="https://www.ietf.org/rfc/rfc7516.html">JWE (RFC7516)</a>, <a href="https://www.ietf.org/rfc/rfc4880.html">PGP (RFC4880)</a> en <a href="https://www.ietf.org/rfc/rfc2315.html">PKCS7 (RFC2315)</a>. Deze versleutelde image kan vervolgens worden ondertekend met de tool <a href="https://github.com/sigstore/cosign">cosign</a> en ten slotte worden geüpload naar een imageregister.</p>



<p>Bij het opstarten van de container moeten de CoCo-componenten in de vertrouwelijke virtuele machine de handtekening kunnen verifiëren en de image kunnen ontsleutelen. Hiervoor moeten de benodigde sleutels beschikbaar worden gesteld. Hier komt het sleutelbemiddelingssysteem om de hoek kijken. Zoals we eerder hebben gezien, voert dit systeem een certificeringsprotocol uit voordat het de sleutels verstrekt.</p>



<p>De implementatie van confidential ccontainers is transparant voor de gebruiker van Kubernetes. Zodra het gebruikelijke commando <code>kubectl apply</code> wordt aangeroepen, wordt een lichte Kata-virtuele machine aangemaakt. Deze moet bij de sleutelbemiddelaar de toegangssleutel tot het imageregister (als dit niet openbaar is), het toe te passen beveiligingsbeleid, de sleutel voor handtekeningverificatie en de sleutel voor het ontsleutelen van de image ophalen. Deze informatie wordt pas verstrekt nadat de virtuele machine is geverifieerd (zie hierboven). De agents in de virtuele machine kunnen dan het beveiligingsbeleid toepassen, de image downloaden, de handtekening controleren en deze decoderen voordat de toepassingscontainer in de virtuele machine wordt gestart.</p>



<p>Wat betreft de communicatie van de gecontaineriseerde toepassing met externe diensten, moeten wederzijds erkende versleutelingssleutels worden ingesteld. Een eerste mogelijkheid is dat de vertrouwde container bij het opstarten een cryptografisch sleutelpaar aanmaakt en de cryptografische hashwaarde van deze openbare sleutel bij de certificering verstrekt. Dit wordt gebruikt binnen het authenticatieprotocol dat in Figuur 4 wordt beschreven. Een andere optie is om de openbare sleutel van een certificeringsinstantie in de versleutelde en vervolgens ondertekende image te verstrekken. De container kan dan de certificaten checken die deze autoriteit heeft ondertekend en de encryptiesleutels aanvaarden. Een derde optie bestaat erin om te steunen op de sleutelbemiddelingsdienst: hiermee kan de container op een veilige manier geheimen ophalen. Afhankelijk van de gekozen optie moet de code van de toepassing al dan niet worden aangepast.</p>



<h1 class="wp-block-heading">Bescherming tegen een beheerder</h1>



<p>Wat kan een beheerder van de hostmachine doen?&nbsp; In principe niet veel, behalve de container opstarten.</p>



<p>Het certificeringsmechanisme zorgt er namelijk voor dat hij niets kan vervangen of simuleren wat betreft de onderdelen van de virtuele machine die wordt gebruikt om de containers te starten. Door de versleuteling van het geheugen dat aan de virtuele machine is toegewezen, heeft hij geen toegang tot de data die in de virtuele machine en de container worden verwerkt. Door de versleuteling en ondertekening van de containerimage kan hij geen andere container vervangen of de aard van de container achterhalen. In de veronderstelling dat de toepassing geconfigureerd is om versleuteld te communiceren met externe diensten waarmee ze moet interageren, kan de beheerder ook geen toegang krijgen tot gevoelige data door het netwerkverkeer te observeren, tenzij hij ook bevoorrechte toegang heeft tot het systeem voor het aanmaken van sleutels. Ten slotte kan hij de container ook niet ondervragen via het commando <code>kubectl exec</code>, omdat het kan worden beperkt door een beveiligingsbeleid (zie <a href="#Figure-1">Figuur 1</a>).</p>



<p>De beheerder kan daarentegen de toepassingslogboeken lezen die door Kubernetes op de host zijn opgeslagen. Daarom is het belangrijk dat de workload provider ervoor zorgt dat zijn code geen gevoelige informatie onthult in de gelogde berichten van de toepassing.</p>



<p>Tot slot, zoals we in de vorige blogpost al stelden, zijn vertrouwde uitvoeringsomgevingen niet perfect en houdt hun beveiligingsmodel meestal geen rekening met fysieke aanvallen. In een omgeving zoals de G-Cloud biedt de toevoeging ervan tal van mogelijkheden. In een omgeving waar echter noch SMALS, noch haar klanten, noch zelfs de Belgische Staat enige technische of juridische controle hebben over de infrastructuur, zijn er aanzienlijke risico’s die serieus moeten worden geëvalueerd.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>In deze blogpost en de <a href="https://www.smalsresearch.be/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">vorige </a>hebben we de echte voordelen belicht op het gebied van beveiliging die microprocessors kunnen bieden om &#8220;vertrouwde uitvoeringsomgevingen&#8221; binnen een IT-infrastructuur te creëren. Vooral het “on-premise” gebruik ervan  maakt het mogelijk om gecontaineriseerde toepassingen beter te beschermen tegen kwaadwillige beheerders of indringers en zo onze leden nog meer garanties te bieden.</p>



<p>Omdat ze eenvoudiger in gebruik zijn dan geavanceerde cryptografische methoden, kunnen dergelijke systemen ons ook helpen om meer generieke problemen op te lossen dan met cryptografie alleen, of problemen die we tot nu toe simpelweg niet konden oplossen.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Je data beschermen tegen beheerders: ‘on-premise’ Confidential Computing</title>
		<link>https://www.smalsresearch.be/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 07:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26512</guid>

					<description><![CDATA[In deze en de volgende blogpost kijken we naar de mogelijkheid om TEE's op onze eigen infrastructuur (on-premise) te gebruiken. Het doel is drieledig: gebruikmaken van de kracht van confidential computing om data te beschermen en nieuwe toepassingen mogelijk te maken, terwijl we een zekere controle behouden over de software- en hardwarestack, en zo het vertrouwen van onze klanten versterken.]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible&nbsp;en&nbsp;<a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">français</a>.</em></p>



<p>Wat als je systeembeheerders toegang zouden hebben tot je gevoelige data zonder dat je het weet? <em>Confidential Computing</em> biedt een oplossing: data isoleren, zelfs voor degenen die de infrastructuur beheren. Maar hoe?</p>



<p><em>Confidential Computing</em> omvat een geheel van technologieën waarmee gevoelige data zodanig worden beschermd dat ze niet hoeven te worden ontsleuteld om te worden verwerkt. Hoewel sommige technologieën, zoals homomorfe versleuteling, nog steeds erg complex zijn om te implementeren, zijn <em>Trusted Execution Environments</em> (TEE&#8217;s) inmiddels zo ver ontwikkeld dat ze kunnen worden beschouwd als belangrijke technologie bij databescherming.</p>



<p>Het belangrijkste doel van TEE&#8217;s is om een buffer te vormen tegen de <a href="https://tweakers.net/nieuws/245316/1700-politiemedewerkers-bekeken-dossier-vermoorde-lisa-buitengewoon-kwalijk.html">nieuwsgierigheid</a> van de entiteiten die de infrastructuur beheren. Technische bescherming lost echter niet alles op. Extraterritoriale wetten [<a href="#ref1">1-5</a>] en het gebruik van eigen softwarelibrary&#8217;s die door sommige IT-infrastructuurproviders worden opgelegd, kunnen deze isolatie ondermijnen.</p>



<p>In deze en de volgende blogpost kijken we naar de mogelijkheid om TEE&#8217;s op onze eigen infrastructuur (<em>on-premise</em>) te gebruiken. Het doel is drieledig: gebruikmaken van de kracht van confidential computing om data te beschermen en nieuwe toepassingen mogelijk te maken, terwijl we een zekere controle behouden over de software- en hardwarestack, en zo het vertrouwen van onze klanten versterken.</p>



<h1 class="wp-block-heading">Scheiding van rollen</h1>



<p>Laten we beginnen met een overzicht van de verschillende spelers die betrokken zijn bij de implementatie van een toepassing op een IT-infrastructuur. Hun rollen moeten strikt gescheiden zijn om de integriteit van het systeem te garanderen.</p>



<ul class="wp-block-list">
<li>De <strong>infrastructure operator</strong> beheert de hardware en infrastructuur (computing, storage, network) en onderhoudt de beveiligde runtime-omgevingen. Hij beheert de firmware-updates en de toewijzing van middelen, maar zou geen toegang mogen hebben tot de data of de uitgevoerde workloads.</li>



<li>De <strong>orchestration operator</strong>, die dezelfde kan zijn als de infrastructure operator, is verantwoordelijk voor het beheer van de serverclusters en de implementatie van de workloads. Hij configureert de benodigde middelen voor de toepassing en houdt toezicht op de bijbehorende diensten (logging, monitoring). Ook zijn rechten zouden strikt beperkt moeten blijven om elke vorm van inbreuk op de toepassing te voorkomen, terwijl de noodzakelijke orchestratie wel mogelijk blijft.</li>



<li><strong>De workload provider </strong>ontwerpt de specificaties van de toepassingen en kiest de juiste container images, waarbij hij de conformiteit en integriteit ervan garandeert. Hij moet aan de data owners (zie hieronder) laten zien dat de gebruikte code veilig is en de privacy respecteert, zonder direct toegang te geven tot gevoelige data.</li>



<li><strong>De container image provider</strong> bouwt, ondertekent en versleutelt de container images, zodat hun herkomst en veiligheid gegarandeerd zijn. Hij verstrekt de verificatie en decryptiesleutel. Zijn samenwerking met de toepassingsprovider is cruciaal om de softwareketen te garanderen en ervoor te zorgen dat de geïmplementeerde code precies dezelfde is als de geauditeerde code.</li>



<li>Ten slotte bezit <strong>de data owner</strong> de data die door de toepassingen worden verwerkt en eist hij de vertrouwelijkheid en integriteit ervan. Hij vertrouwt op de code van de toepassing (de container) en de cryptografische bewijzen die door de microprocessor worden geleverd, waardoor infrastructure en orchestration operators buiten zijn vertrouwensbereik vallen. Hij kan extra controles opleggen om ervoor te zorgen dat zijn data niet zichtbaar zijn voor of gemanipuleerd worden door onbevoegde personen.</li>
</ul>



<p>De relaties tussen deze spelers brengen specifieke uitdagingen met zich mee: de data owner moet bijvoorbeeld kunnen vertrouwen op de code van de containers (geleverd door de workload provider) om zijn data te verwerken, terwijl hij deze tegelijkertijd moet beschermen tegen andere spelers, zoals de infrastructure of orchestration operator. Met name de beheerders van deze operators mogen in geen geval toegang hebben tot de data die door de containers worden verwerkt.</p>



<h1 class="wp-block-heading">Betrouwbare runtime-omgeving</h1>



<p>Met TEE&#8217;s kan een technische barrière worden gecreëerd die het vertrouwen van de data owner in de toepassingscontainer versterkt. We hebben al uitvoerig uitgelegd hoe ze werken en wat hun voor- en nadelen zijn in een technisch rapport [<a href="#ref6">6</a>] en blogposts [<a href="#ref7">7</a>], [8]. Hier gaan we even de belangrijkste punten herhalen alvorens we de technologische keuzes voor een implementatie op onze onderzoeksinfrastructuur voorstellen.</p>



<p>Het goed functioneren van TEE&#8217;s hangt af van de hardware. Sommige moderne microprocessors maken het mogelijk om een deel van het RAM-geheugen dat is toegewezen aan een specifieke virtuele machine (VM) te reserveren en te versleutelen. Zo zal een beheerder van de hostmachine, zelfs met de hoogste privileges, alleen versleutelde data zien als hij dit geheugengebied probeert te inspecteren. Hoewel er aanvallen via side-channels bestaan (bijv. [<a href="#ref9">9</a>]), vereisen deze vanwege hun complexiteit doorgaans langdurige fysieke toegang en de toevoeging van kwaadaardige hardwarecomponenten, waardoor ze in de praktijk uiterst moeilijk uit te voeren zijn.</p>



<p>Opdat de data owner er zeker van kan zijn dat zijn toepassing in een veilige omgeving draait, gebruikt hij het <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/#Attestation">certificeringsmechanisme</a>. Dit proces genereert een cryptografische handtekening van de inhoud van het geheugen van de VM op het moment dat deze wordt opgestart. Deze handtekening wordt gecertificeerd door de fabrikant van de microprocessor.</p>



<p>Dit proces heeft zijn beperkingen, vooral als de infrastructure operator een buitenlandse onderneming is (bijvoorbeeld Amazon AWS, Google Cloud of Microsoft Azure) die zijn eigen libraries in de VM oplegt om bijvoorbeeld de juiste hardware-abstractielaag te bieden.</p>



<p>Dit heeft ons ertoe aangezet om dit soort hardware op onze eigen infrastructuur binnen het onderzoekslabo te testen, in afwachting van de mogelijkheid om dit op een dag op <a href="https://www.gcloud.belgium.be/">G-Cloud</a> toe te passen. Het voordeel hiervan is dat een klant van SMALS een toepassingscontainer op een veilige manier kan gebruiken, zonder dat een beheerder van SMALS toegang heeft tot de inhoud van de container.</p>



<p>Maar het nut van TEE&#8217;s gaat verder dan alleen bescherming tegen beheerders. Het opent de deur naar andere toepassingen.</p>



<h1 class="wp-block-heading">Use case</h1>



<p>Een eerste voorbeeld is te vinden in de Europese infrastructuur voor <a href="https://health.ec.europa.eu/ehealth-digital-health-and-care/digital-health-and-care/electronic-cross-border-health-services_nl">digitale gezondheidsdiensten (eHDSI)</a>. Daar kunnen zorgverleners in het land waar de behandeling plaatsvindt de relevante gezondheidsdata van de patiënt opvragen in het land waar de patiënt is aangesloten. Technisch gezien wordt de aanvraag via de gateway van het nationale contactpunt voor gezondheidszorg (NCPeH) van het land waar de onverwachte gezondheidsgebeurtenis plaatsvindt, doorgestuurd naar het land waar de patiënt is aangesloten. De gevraagde info moet dan worden opgehaald uit de nationale infrastructuur van het land van aansluiting, vertaald naar het Engels en getranscodeerd (de gezondheidsdata worden omgezet van het nationale coderingssysteem naar het algemeen aanvaarde coderingssysteem, bijvoorbeeld van het <a href="https://www.hl7.org.uk/standards/hl7-standards/fhir/">FHIR</a>&#8211; of <a href="https://www.ehealth.fgov.be/standards/kmehr/en">KMEHR</a>-formaat naar <a href="https://www.hl7.org.uk/standards/hl7-standards/cda-clinical-document-architecture/">CDA</a>), en vervolgens teruggestuurd en gepresenteerd worden aan de zorgverlener in het land van behandeling. Vanwege het gevoelige karakter van de data moeten deze van begin tot eind worden versleuteld, vanaf de gegevensbron op de infrastructuur van het land van aansluiting tot aan de zorgverlener in het land van behandeling. In de praktijk is dit nog niet mogelijk vanwege de grote verschillen tussen de Europese landen. Het zou echter op zijn minst mogelijk moeten zijn om te garanderen dat de data versleuteld en ontoegankelijk blijven voor alle gebruikers of beheerders tussen de bron van de data en de uitgang van de NCPeH-gateway. Een mogelijkheid is dan om TEE&#8217;s te gebruiken voor het vertalen en transcoderen van de data.</p>



<p>Een ander voorbeeld van het gebruik van TEE&#8217;s is de beveiligde samenwerking tussen entiteiten die hun ruwe data niet willen delen. In de onderwijs- en werkgelegenheidssector heeft een experiment van Bogdanov <em>et al.</em> in Estland [<a href="#ref10">10</a>] de kracht van confidential computertechnieken aangetoond. De auteurs van deze studie wilden achterhalen of werken naast een hogere opleiding ertoe leidt dat je je diploma niet op tijd behaalt – een vraag die vooral belangrijk is voor de sector van de informatie- en communicatietechnologie (ICT) in Estland. Om deze probleemstelling te beantwoorden zonder de privacy van persoonlijke data in gevaar te brengen, hebben de onderzoekers de onderwijsregisters van het ministerie van Onderwijs en Onderzoek gecombineerd met de data van de belastingdienst, dankzij een speciale techniek van confidential computing. Maar een simpelere variant met een TEE zou net zo goed hebben gewerkt voor de analyse, terwijl de fiscale vertrouwelijkheid en databescherming gewaarborgd bleven.</p>



<h1 class="wp-block-heading">CoCo</h1>



<p>Om TEE&#8217;s te gebruiken in onze eigen onderzoeksinfrastructuur bestaan er verschillende softwareoplossingen. We hebben gekozen voor het project &#8220;<a href="https://confidentialcontainers.org/">Confidential Containers (CoCo)</a>&#8220;, waarvan de broncode vrij toegankelijk is. Dit project zorgt voor een goede isolatie van de toepassingscontainers en ondersteunt het certificeringsmechanisme op een transparante manier, terwijl de flexibiliteit van de implementatie en de compatibiliteit met het <a href="https://kubernetes.io/">Kubernetes</a>-platform waarop het is gebaseerd, behouden blijven. Elke Kubernetes-pod is geïsoleerd in een zeer lichte Confidential Virtual Machine, om te garanderen dat alleen geautoriseerde applicaties toegang hebben tot gevoelige gegevens.</p>



<p>CoCo&#8217;s bevatten naast de toepassing zelf enkele noodzakelijke softwarecomponenten. Deze maken het mogelijk om de uit te voeren containerimage te downloaden, de verificatie van de certificering te vergemakkelijken en bepaalde beveiligingsbeleidsregels toe te passen. Hun programmeerinterface is relatief klein, vooral vergeleken met een oplossing waarbij een hele Kubernetes-node in een Confidential Virtual Machine wordt geplaatst. Bovendien is de image van de guest-VM statisch en generiek voor alle workloads en zelfs platforms, waardoor het eenvoudiger is om veiligheidsgaranties te bieden. Tegelijkertijd is het makkelijk om dingen te delen tussen containers in dezelfde Kubernetes-pod. De naamruimte van het netwerk van de pod blijft bijvoorbeeld binnen de confidential VM, waardoor de containers daarin zonder extra kosten vertrouwelijk met elkaar kunnen communiceren.</p>



<p>CoCo is gebaseerd op <a href="https://katacontainers.io/">Kata</a>-containers, een ander open source-project, waarmee Kubernetes-pods kunnen worden uitgevoerd binnen zeer lichte Confidential Virtual Machines (zie <a href="#Figuur-1">Figuur 1</a>). CoCo voegt echter twee cruciale componenten toe om vertrouwelijkheid en veiligheid te garanderen (zie <a href="#Figuur-2">Figuur 2</a>).</p>



<ul class="wp-block-list">
<li>De eerste heeft te maken met het <strong>ophalen van containerimages</strong>: deze worden meestal gedownload door de Kubernetes-hoofdnode met behulp van een Container Runtime Interface (CRI) zoals “containerd”, waardoor de images via het bestandssysteem zichtbaar worden voor de hostmachine. Met CoCo worden de images binnen de Confidential Virtual Machine ontsleuteld en uitgepakt, vandaar de noodzaak van de bovengenoemde componenten.</li>



<li>Het tweede onderdeel is het <strong>certificaat</strong>, dat, zoals we al hebben gezien, essentieel is voor het opzetten van een betrouwbare uitvoeringsomgeving. Om bijvoorbeeld een image te ontsleutelen, dient de guest de geheime ontsleutelingssleutel te kunnen verkrijgen, maar deze wordt alleen verstrekt als de guest zijn authenticiteit kan aantonen. Dit is de rol van twee componenten die steunen op een zogenaamd “<em><a href="https://github.com/confidential-containers/trustee">Trustee</a></em>”-systeem, dat buiten de virtuele machine staat en uit twee diensten bestaat: een certificeringsdienst om de vertrouwde runtime te valideren en een key mediation-dienst om de geheime middelen te leveren die de virtuele machine en de toepassing nodig hebben.</li>
</ul>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-1"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Voorbeeld-architectuur.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Voorbeeld-architectuur.svg" alt="" class="wp-image-26516" style="width:600px"/></a><figcaption class="wp-element-caption">Figuur 1 &#8211; Voorbeeld van een architectuur met twee Kubernetes-nodes en lichte Kata Confidential Virtual Machines, die zelf weer Kubernetes-pods bevatten. Het aan elke virtuele machine toegewezen geheugen wordt direct versleuteld door de microprocessor van node 2. Dit zorgt ervoor dat elke pod niet alleen sterk geïsoleerd is van de andere, maar ook van de kernel van de hostmachine.</figcaption></figure>



<p>CoCo levert dus de basis voor het bouwen van confidential toepassingscontainers door het mogelijk te maken deze containers binnen confidential virtuel machines uit te voeren, waarbij de geëncrypteerde en ondertekende images van de containers, de verzegelde geheimen en andere kenmerken worden beheerd. Elke container of groep containers van dezelfde toepassing kan worden toegewezen aan een confidential virtuele machine, waarbij niet alleen de werklast wordt meegenomen, maar ook processen waarmee de toepassing bepaalde beveiligingsdiensten kan aanroepen. </p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-CoCo-schematische-weergave.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-CoCo-schematische-weergave.svg" alt="" class="wp-image-26518" style="width:600px"/></a><figcaption class="wp-element-caption">Figuur 2 &#8211; Schematische weergave van een CoCo en zijn omgeving. Door het kubelet-commando te gebruiken om de implementatie van een CoCo te starten, wordt een lichte VM gemaakt met verschillende basisagenten erin. Eén agent zorgt ervoor dat de (versleutelde en ondertekende) image van de app-container wordt gedownload uit een register. De andere zorgen ervoor dat de virtuele machine zich kan authenticeren en de nodige sleutels kan ophalen om de image te ontsleutelen en de handtekening te verifiëren, voordat de container wordt gestart. Gebaseerd op <a href="https://github.com/confidential-containers/confidential-containers/blob/main/images/coco-threat-model.png">dit figuur</a>.</figcaption></figure>



<p>Alles buiten de confidential VM op de host wordt als onbetrouwbaar beschouwd, inclusief de kubelet-tool, de runtime-interface van de containers en de kernel van het besturingssysteem van de host. De uitwisseling van informatie tussen vertrouwde en niet-vertrouwde contexten wordt streng gecontroleerd, met name via dynamische en configureerbare beveiligingsbeleidsregels. Ten slotte wordt de Kubernetes-orkestratie zelf als niet-vertrouwd beschouwd, waardoor de garanties met betrekking tot de planning of de volgorde van uitvoering van de workloads beperkt zijn, met uitzondering van de implementatie ervan in een geauthenticeerde enclave.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>Confidential containers maken deel uit van een algemene beveiligingsaanpak, waarbij certificering, verificatie van images en best practices in de softwaretoeleveringsketen worden gecombineerd. Ze maken het mogelijk om use cases eenvoudiger te verwerken dan geavanceerde cryptografie (<em>confidential collaboration, private set intersection, </em>geavanceerde pseudonimisering, enz.). Puristen kunnen natuurlijk aanvoeren dat een oplossing op basis van confidential containers minder veilig is, maar in de praktijk zal deze waarschijnlijk volstaan in een on-premise omgeving, des te meer omdat het veel aspecten vereenvoudigt zodra het eenmaal is geïmplementeerd.</p>



<p>In de volgende blogpost gaan we dieper in op de installatie en het gebruik van confidential CoCo&#8217;s.</p>



<h1 class="wp-block-heading">Referenties</h1>



<p id="ref1">[<a href="https://ref1">1</a>]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C. Bômont, “Strategic Brief no.70 &#8211; 2024 &#8211; Extension of the FISA Law European ‘digital sovereignty’ far from American concerns &#8211; IRSEM”, Institut de Recherche Stratégique de l’Ecole Militaire. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.irsem.fr/en/strategic-brief-no-70-2024">https://www.irsem.fr/en/strategic-brief-no-70-2024</a></p>



<p id="ref2">[2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Michels, “Europeans, forget the US Cloud Act… worry about FISA instead (!)”. Geraadpleegd: 1 juli 2025. [Online]. Beschikbaar op: <a href="https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze">https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze</a></p>



<p id="ref3">[3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paul Kunert, “Microsoft exec admits it ‘cannot guarantee’ data sovereignty”. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/">https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/</a></p>



<p id="ref4">[4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M. Rochefort, “Microsoft face au Sénat : l’aveu qui fait vaciller la souveraineté numérique française”, clubic.com. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html">https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html</a></p>



<p id="ref5">[5]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Deridder, “Understanding Sovereignty: Who Rules your Cloud?”, Dirk Deridder. Geraadpleegd: 1 juli 2025. [Online]. Beschikbaar op: <a href="https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/">https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/</a></p>



<p id="ref6">[6]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Informatique confidentielle &#8211; État de l’art”, Smals Research, jul. 2023. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/publications/document?docid=269">https://www.smalsresearch.be/publications/document?docid=269</a></p>



<p id="ref7">[7]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Introduction à l’informatique confidentielle”, Smals Research. Geraadpleegd: 9 januari 2026. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/">https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/</a></p>



<p id="ref8">[8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Outils pour l’informatique confidentielle”, Smals Research. Geraadpleegd: 9 januari 2026. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/">https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/</a></p>



<p id="ref9">[9]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J. De Meulemeester, D. Oswald, I. Verbauwhede, en J. V. Bulck, “Battering RAM: Low-cost interposer attacks on confidential computing via dynamic memory aliasing”, gepresenteerd bij 47th IEEE Symposium on Security and Privacy (S&amp;P), mei 2026.</p>



<p id="ref10">[10]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Bogdanov, L. Kamm, B. Kubo, R. Rebane, V. Sokk, en R. Talviste, “Students and taxes: a Privacy-preserving study using secure computation”, <em>Proc. </em><em>Priv. Enhancing Technol.</em>, vol. 2016, nr. 3, pp. 117-135, jul. 2016, doi: 10.1515/popets-2016-0019.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Protéger ses données des administrateurs&#160;: l’informatique confidentielle « on-premise »</title>
		<link>https://www.smalsresearch.be/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 07:30:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26501</guid>

					<description><![CDATA[Dans cet article et le suivant, nous nous penchons sur la possibilité de déployer des EEC sur notre propre infrastructure (on-premise). L’objectif est triple : bénéficier de la puissance de l’informatique confidentielle pour protéger les données et permettre de nouveaux cas d’usage, tout en gardant un certain contrôle sur la pile logicielle et matérielle, et ainsi renforcer la confiance de nos clients.]]></description>
										<content:encoded><![CDATA[
<p><em>Dit artikel is ook beschikbaar&nbsp;in het&nbsp;<a href="/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">Nederlands</a>.</em></p>



<p>Et si vos administrateurs système pouvaient accéder à vos données sensibles sans que vous le sachiez&nbsp;? L’informatique confidentielle propose une solution&nbsp;: isoler les données, même de ceux qui gèrent l’infrastructure. Mais comment&nbsp;?</p>



<p>L’informatique confidentielle regroupe un ensemble de technologies permettant de protéger les données sensibles de telle sorte qu’il n’est pas nécessaire de les déchiffrer pour les traiter. Alors que certaines, comme le chiffrement homomorphe, sont encore très complexes à mettre en œuvre, les environnements d’exécution de confiance (EEC aussi appelés «&nbsp;<em>trusted execution environment (TEE)</em>&nbsp;» en anglais) ont atteint une bonne maturité, permettant de les considérer comme des composants importants dans la protection des données.</p>



<p>L’objectif premier des EEC est de dresser un rempart contre la curiosité des entités contrôlant l’infrastructure. Toutefois la protection technique ne résout pas tout. Les lois extraterritoriales [<a href="#ref1">1-5</a>] et l’usage de bibliothèques logicielles propriétaires imposées par certains fournisseurs d’infrastructure informatique peuvent fragiliser cette isolation.</p>



<p>Dans cet article et le suivant, nous nous penchons sur la possibilité de déployer des EEC sur notre propre infrastructure (<em>on-premise</em>). L’objectif est triple&nbsp;: bénéficier de la puissance de l’informatique confidentielle pour protéger les données et permettre de nouveaux cas d’usage, tout en gardant un certain contrôle sur la pile logicielle et matérielle, et ainsi renforcer la confiance de nos clients.</p>



<h1 class="wp-block-heading">Séparation des rôles</h1>



<p>Commençons par rappeler les différents acteurs qui interviennent lors du déploiement d’une application sur une infrastructure informatique. Leurs rôles doivent être hermétiquement séparés pour garantir l’intégrité du système.</p>



<ul class="wp-block-list">
<li><strong>L’opérateur d’infrastructure</strong> gère le matériel et les infrastructures (calcul, stockage, réseau), incluant la maintenance des environnements d’exécution de confiance. Il contrôle les mises à jour des micrologiciels et l’allocation des ressources, mais ne devrait pas pouvoir accéder aux données ou aux charges de travail exécutées.</li>



<li><strong>L’opérateur d’orchestration</strong>, qui peut être le même que l’opérateur d’infrastructure, est responsable de la gestion des grappes de serveurs et du déploiement des charges de travail. Il configure les ressources nécessaires aux applications et supervise les services associés (journalisation, surveillance). Ses privilèges devraient aussi être strictement limités afin d’éviter toute intrusion dans l&#8217;application, tout en permettant l’orchestration essentielle.</li>



<li><strong>Le fournisseur de la charge de travail</strong> conçoit les spécifications des applications et choisit les images de conteneurs adaptées, en garantissant leur conformité et leur intégrité. Il doit prouver aux propriétaires de données (voir ci-dessous) que le code utilisé est sécurisé et respectueux de la confidentialité, sans pour autant accéder directement aux données sensibles.</li>



<li><strong>Le fournisseur d’images de conteneurs</strong> construit, signe et chiffre les images conteneurs, assurant leur provenance et leur sécurité. Il fournit les clés de vérification et de déchiffrement. Sa collaboration avec le fournisseur de l’application est cruciale pour garantir la chaîne d’approvisionnement logicielle et assurer que le code déployé est exactement celui qui a été audité.</li>



<li><strong>Enfin, le propriétaire des données</strong> détient les données traitées par les applications et exige leur confidentialité et leur intégrité. Il accorde sa confiance au code de l’application (le conteneur) et aux preuves cryptographiques fournies par le microprocesseur, excluant de fait les opérateurs d’infrastructure et d’orchestration de son périmètre de confiance. Il peut imposer des vérifications supplémentaires pour s’assurer que ses données ne sont ni visibles ni manipulées par des personnes non autorisées.</li>
</ul>



<p>Les relations entre ces acteurs soulèvent des enjeux spécifiques&nbsp;: le propriétaire des données, par exemple, doit pouvoir faire confiance au code des conteneurs (fournis par le fournisseur de la charge de travail) pour traiter ses données, tout en protégeant celles-ci contre les autres acteurs comme l’opérateur d’infrastructure ou l’opérateur d’orchestration. Notamment les administrateurs de ces opérateurs ne devraient en aucun cas pouvoir avoir accès aux données traitées par les conteneurs.</p>



<h1 class="wp-block-heading">Environnement d’exécution de confiance</h1>



<p>Les EEC permettent de créer une barrière technique renforçant la confiance du propriétaire des données dans le conteneur applicatif. Nous avons déjà expliqué en détail leur fonctionnement ainsi que leurs avantages et inconvénients dans un rapport technique&nbsp;[<a href="#ref6">6</a>] et des articles de blogues&nbsp;[<a href="#ref7">7</a>], [<a href="#ref8">8</a>]. Dans cette section nous en rappelons les points clés avant de présenter des choix technologiques pour une mise en œuvre sur notre infrastructure de recherche.</p>



<p>Le bon fonctionnement des EEC réside dans le matériel. Certains micro-processeurs modernes permettent de réserver et de chiffrer une portion de la mémoire vive (RAM) dédiée à une machine virtuelle (VM) spécifique. Ainsi, un administrateur de la machine hôte, même avec les privilèges les plus élevés, ne verra que des données chiffrées s’il tente d’inspecter cette zone mémoire. Bien que des attaques par canaux auxiliaires existent (e.g.,&nbsp;[<a href="#ref9">9</a>]), leur complexité nécessite généralement un accès physique prolongé et l’ajout de composants matériels malveillants, ce qui les rend extrêmement difficiles à exécuter.</p>



<p>Pour que le propriétaire des données soit certain que son application s’exécute dans un environnement sain, il utilise le mécanisme d’<a href="/introduction-a-l-informatique-confidentielle/#Attestation">attestation</a>. Ce processus génère une signature cryptographique du contenu de la mémoire de la VM au moment de son lancement. Cette signature est certifiée par le fabricant du micro-processeur.</p>



<p>Ce processus a des limites&nbsp;notamment dans le cas où l’opérateur d’infrastructure est une société étrangère (e.g., Amazon AWS, Google Cloud ou Microsoft Azure) qui impose ses bibliothèques propriétaires dans la VM afin, par exemple, de fournir la bonne couche d’abstraction matérielle.</p>



<p>Cela nous a conduit à vouloir tester ce type de technologie dans notre laboratoire de recherche sur notre propre matériel, anticipant la possibilité de le faire un jour sur <a href="https://www.gcloud.belgium.be/">G-Cloud</a>. L’intérêt est de permettre à un client de SMALS de faire fonctionner un conteneur applicatif de manière sécurisée, sans qu’un administrateur de SMALS puisse accéder au contenu du conteneur.</p>



<p>Mais l’utilité des EEC dépasse la simple protection contre les administrateurs. Elle ouvre la voie à d’autres cas d’usage.</p>



<h1 class="wp-block-heading">Cas d’usage</h1>



<p>Un premier exemple se trouve dans le cadre de l’infrastructure européenne de <a href="https://health.ec.europa.eu/ehealth-digital-health-and-care/digital-health-and-care/electronic-cross-border-health-services_fr">services numériques de santé en ligne (eHDSI)</a>. Là, les professionnels de santé d’un pays de traitement peuvent demander les données de santé pertinentes du patient au pays d’affiliation de celui-ci. D’un point de vue technique, la demande est transmise par la passerelle du point de contact national pour la santé (NCPeH) du pays où l’événement de santé imprévu se produit, au pays d’affiliation. Les informations demandées doivent ensuite être récupérées auprès de l’infrastructure nationale du pays d’affiliation, traduites en anglais et transcodées (les données de santé sont transformées du système de codification national vers le système de codification communément accepté, par exemple du format <a href="https://www.hl7.org.uk/standards/hl7-standards/fhir/">FHIR</a> ou <a href="https://www.ehealth.fgov.be/standards/kmehr/en">KMEHR</a> vers <a href="https://www.hl7.org.uk/standards/hl7-standards/cda-clinical-document-architecture/">CDA</a>), puis renvoyées et présentées au professionnel de santé du pays de traitement. Compte tenu du caractère sensible des données, les données devraient être chiffrées de bout en bout, depuis la source de données sur l’infrastructure du pays d’affiliation jusqu’au prestataire de soins de santé dans le pays de traitement. Dans la pratique, cela n’est pas encore possible en raison des différences importantes entre les pays européens. Cependant, il devrait être possible, au minimum, de garantir que les données restent chiffrées et inaccessibles à tout utilisateur ou administrateur entre la source des données et la sortie de la passerelle NCPeH. Une possibilité consiste alors à utiliser des EEC pour effectuer la traduction et le transcodage des données.</p>



<p>Un autre exemple d’utilisation des EEC est la collaboration sécurisée entre entités ne souhaitant pas partager leurs données brutes. Dans le secteur de l’éducation et de l’emploi, une expérience menée par Bogdanov <em>et al</em> en Estonie&nbsp;[<a href="#ref10">10</a>] a montré la puissance des techniques d’informatique confidentielle. Les auteurs de cette étude ont cherché à déterminer si le fait de travailler pendant les études supérieures était corrélé à un échec d’obtention du diplôme dans les délais impartis – une question particulièrement cruciale pour le secteur des technologies de l’information et de la communication en Estonie. Pour répondre à cette problématique sans compromettre la confidentialité des données personnelles, les chercheurs ont combiné les registres d’éducation du ministère de l’Éducation et de la Recherche avec les données de paiements d’impôts du Conseil des taxes et des douanes, grâce à une technique particulière d’informatique confidentielle. Mais une variante plus simple avec un EEC eût été tout aussi efficace pour l’analyse tout en respectant le secret fiscal et la protection des données.</p>



<h1 class="wp-block-heading">CoCo</h1>



<p>Plusieurs solutions logicielles sont disponibles pour mettre à profit les EEC sur notre propre infrastructure de recherche. Nous avons choisi d’utiliser le projet «&nbsp;<a href="https://confidentialcontainers.org/">Confidential Containers (CoCo)</a>&nbsp;» dont le code source est ouvert. Il permet en effet une bonne isolation des conteneurs applicatifs et prend en charge le mécanisme d’attestation de manière transparente, tout en préservant la flexibilité de déploiement et la compatibilité avec la plateforme <a href="https://kubernetes.io/">Kubernetes</a> sur laquelle il s’appuie. Chaque capsule Kubernetes est isolée dans une machine virtuelle confidentielle très légère, de manière à garantir que seules les applications autorisées peuvent accéder aux données sensibles.</p>



<p>Les conteneurs CoCo contiennent quelques composants logiciels nécessaires en plus de l’application elle-même. Ceux-ci permettent de télécharger l’image du conteneur à exécuter, de faciliter la vérification de l’attestation et d’appliquer certaines politiques de sécurité. Leur interface de programmation est relativement petite, notamment par rapport à une solution où tout un nœud Kubernetes serait mis à l’intérieur d’une machine virtuelle confidentielle. En outre, l’image de la machine virtuelle invitée est statique et générique sur toutes les charges de travail et même les plateformes, permettant ainsi d’assurer plus simplement des garanties de sécurité. En même temps, le partage entre les conteneurs dans la même capsule Kubernetes est aisé. Par exemple, l’espace de noms du réseau de la capsule ne quitte pas la machine virtuelle confidentielle, autorisant ainsi les conteneurs qu’elle contient à communiquer de manière confidentielle sans coût supplémentaire.</p>



<p>CoCo s’appuie sur les conteneurs <a href="https://katacontainers.io/">Kata</a>, un autre projet de logiciel libre, qui permet de faire fonctionner des capsules Kubernetes à l’intérieur de machines virtuelles confidentielles très légères (voir <a href="#Figure-1">Figure 1</a>). CoCo ajoute cependant deux composants cruciaux afin d’assurer confidentialité et sécurité (voir <a href="#Figure-2">Figure 2</a>).</p>



<ul class="wp-block-list">
<li>Le premier concerne la <strong>récupération des images des conteneurs</strong>&nbsp;: celles-ci sont habituellement téléchargées par le nœud principal Kubernetes avec l’aide d’une interface d’exécution de conteneur (CRI) comme «&nbsp;<code>containerd</code>,&nbsp;» exposant ainsi les images à la machine hôte à travers le système de fichiers. Avec CoCo, les images sont déchiffrées, et décompactées à l’intérieur de la machine virtuelle confidentielle, d’où la nécessité des composants susmentionnés.</li>



<li>Le second est l’<strong>attestation</strong> qui est, comme nous l’avons déjà vu, indispensable à l’établissement d’un environnement d’exécution de confiance. Par exemple, afin de déchiffrer une image, l’invité doit pouvoir obtenir la clé secrète de déchiffrement, mais celle-ci n’est fournie que si l’invité peut prouver son authenticité. C’est le rôle de deux composants&nbsp;qui s’appuient sur un système appelé «&nbsp;<em><a href="https://github.com/confidential-containers/trustee">Trustee</a></em>,&nbsp;» extérieur à la machine virtuelle et composé de deux services&nbsp;: un service d’attestation permettant de valider la base d’exécution de confiance et un service de médiation de clés permettant de fournir les ressources secrètes nécessaires à la machine virtuelle et à l’application.</li>
</ul>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-1"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Exemple-architecture.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Exemple-architecture.svg" alt="" class="wp-image-26519" style="width:600px"/></a><figcaption class="wp-element-caption">Figure 1 &#8211; Exemple d’architecture avec deux nœuds Kubernetes et des machines virtuelles confidentielles légères Kata, elles-mêmes contenant des capsules Kubernetes. La mémoire allouée à chaque machine virtuelle est directement chiffrée par le microprocesseur du nœud 2. Cela permet une forte isolation de chaque capsule non seulement vis-à-vis des autres, mais aussi vis-à-vis du noyau de la machine hôte.</figcaption></figure>



<p>CoCo fournit donc les bases pour construire des conteneurs applicatifs confidentiels en permettant d’exécuter ces conteneurs à l’intérieur de machines virtuelles confidentielles, gérant les images chiffrées et signées des conteneurs, les secrets scellés, et d’autres caractéristiques. Chaque conteneur ou groupe de conteneurs de la même application peut être assigné à une machine virtuelle confidentielle, incluant non seulement la charge de travail, mais aussi des processus permettant à l’application d’appeler certains services de sécurité. <strong></strong></p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Schema-coco-1.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Schema-coco-1.svg" alt="" class="wp-image-26520" style="width:600px"/></a><figcaption class="wp-element-caption">Figure 2 – Représentation schématique d’un conteneur CoCo et de son environnement. À partir de l’utilisation de la commande <code>kubelet</code> pour lancer le déploiement d’un conteneur CoCo, une machine virtuelle légère est créée avec différents agents de base en son sein. L’un se charge de télécharger l’image (chiffrée et signée) du conteneur applicatif à partir d’un registre. Les autres permettent à la machine virtuelle de s’authentifier et de récupérer les clés nécessaires au déchiffrement et à la vérification de la signature de l’image, avant le lancement du conteneur. D’après <a href="https://github.com/confidential-containers/confidential-containers/blob/main/images/coco-threat-model.png">cette figure</a>.</figcaption></figure>



<p>Tout ce qui se trouve en dehors de la machine virtuelle confidentielle sur l’hôte est considéré comme non fiable, y compris l’outil <code>kubelet</code>, l’interface d’exécution de conteneurs et le noyau du système d’exploitation de l’hôte. Les échanges d’informations entre les contextes de confiance et non fiables sont strictement contrôlés, notamment via des politiques de sécurité dynamiques et configurables. Enfin, l’orchestration Kubernetes elle-même est considérée comme non fiable, limitant les garanties sur le planning ou l’ordre d’exécution des charges de travail, à l’exception de leur déploiement dans une enclave authentifiée.</p>



<h1 class="wp-block-heading">Conclusion</h1>



<p>Les conteneurs confidentiels s’inscrivent dans une démarche globale de sécurité, combinant attestation, vérification des images et bonnes pratiques de la chaîne d’approvisionnement logicielle. Ils permettent de traiter des cas d’usage plus simplement que la cryptographie avancée (collaboration confidentielle, intersection privée d’ensemble, pseudonymisation avancée, etc.). Certes les puristes argueront qu’une solution basée sur des conteneurs confidentiels est moins sûre, mais dans la pratique, elle sera probablement suffisante dans un cadre « <em>on-premise</em> », d’autant plus qu’elle simplifie beaucoup d’aspect une fois qu’elle est mise en place.</p>



<p>Dans l’article suivant, nous entrerons plus en détails dans l’installation et l’utilisation des conteneurs confidentiels CoCo.</p>



<h1 class="wp-block-heading">Références</h1>



<p id="ref1">[1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C. Bômont, «&nbsp;Strategic Brief no.70 &#8211; 2024 &#8211; Extension of the FISA Law European “digital sovereignty” far from American concerns &#8211; IRSEM&nbsp;», Institut de Recherche Stratégique de l’Ecole Militaire. Consulté le: 9 février 2026. [En ligne]. Disponible sur: <a href="https://www.irsem.fr/en/strategic-brief-no-70-2024">https://www.irsem.fr/en/strategic-brief-no-70-2024</a></p>



<p id="ref2">[2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Michels, «&nbsp;Europeans, forget the US Cloud Act… worry about FISA instead (!)&nbsp;». Consulté le: 1 juillet 2025. [En ligne]. Disponible sur: <a href="https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze">https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze</a></p>



<p id="ref3">[3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M. Rochefort, «&nbsp;Microsoft face au Sénat : l’aveu qui fait vaciller la souveraineté numérique française&nbsp;», clubic.com. Consulté le: 9 février 2026. [En ligne]. Disponible sur: <a href=" https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html">https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html</a></p>



<p id="ref4">[4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Deridder, «&nbsp;Understanding Sovereignty: Who Rules your Cloud?&nbsp;», Dirk Deridder. Consulté le: 1 juillet 2025. [En ligne]. Disponible sur: <a href="https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/">https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/</a></p>



<p id="ref5">[5]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P. Kunert, «&nbsp;Microsoft exec admits it “cannot guarantee” data sovereignty&nbsp;», The Register. Consulté le: 28 juillet 2025. [En ligne]. Disponible sur: <a href="https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/">https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/</a></p>



<p id="ref6">[6]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, «&nbsp;Informatique confidentielle &#8211; État de l’art&nbsp;», Smals Research, juill. 2023. [En ligne]. Disponible sur: <a href="https://www.smalsresearch.be/publications/document?docid=269">https://www.smalsresearch.be/publications/document?docid=269</a></p>



<p id="ref7">[7]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, «&nbsp;Introduction à l’informatique confidentielle&nbsp;», Smals Research. Consulté le: 9 janvier 2026. [En ligne]. Disponible sur: <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/">https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/</a></p>



<p id="ref8">[8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, «&nbsp;Outils pour l’informatique confidentielle&nbsp;», Smals Research. Consulté le: 9 janvier 2026. [En ligne]. Disponible sur: <a href="https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/">https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/</a></p>



<p id="ref9">[9]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J. De Meulemeester, D. Oswald, I. Verbauwhede, et J. V. Bulck, «&nbsp;Battering RAM: Low-cost interposer attacks on confidential computing via dynamic memory aliasing&nbsp;», présenté à 47th IEEE Symposium on Security and Privacy (S&amp;P), mai 2026.</p>



<p id="ref10">[10]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Bogdanov, L. Kamm, B. Kubo, R. Rebane, V. Sokk, et R. Talviste, «&nbsp;Students and taxes: a Privacy-preserving study using secure computation&nbsp;», <em>Proc. Priv. Enhancing Technol.</em>, vol. 2016, n<sup>o</sup> 3, p. 117‑135, juill. 2016, doi: 10.1515/popets-2016-0019.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
