Kubernetes-deployment beveiligen met handtekeningverificatie
Kubernetes is het ideale platform om grote groepen containers op een overzichtelijke manier te deployen, organiseren en beheren. De zogenoemde ‘container image’ (container image ) gebruik je om snel een container te maken. De images bevat een gecomprimeerde versie van het bestandssysteem van de container. De directorystructuur met alle bestanden, configuratiebestanden en de binary is dus een onderdeel van de image.
Het spreekt voor zich dat al die informatie in een veilige omgeving moet staan. Het handhaven van de veiligheid van de container images is dan ook een belangrijk aandachtspunt bij het draaien van containers in Kubernetes. Het gebruik van images die muteerbaar zijn, vormt een risico voor het veilig inzetten van Kubernetes voor containerbeheer. Een van de beste en belangrijkste manieren voor het beveiligen van deployments in Kubernetes is de handtekeningverificatie. Wat is dit? En hoe werkt handtekeningverificatie voor Kubernetes-deployment in de praktijk? Lees er alles over in deze blog.
Waarom container images betrouwbaar moeten zijn?
Om duidelijk te maken waarom container images betrouwbaar en veilig moeten zijn, is het goed om een praktijkvoorbeeld te hanteren.
Een groep security engineers werkt in een groot bedrijf dat recentelijk getroffen is door een datalek. Securityspecialisten ontdekken dat het lek verband hield met kwaadaardige code die huisde in het Kubernetes-productiecluster.Om de gebruikte container-images te valideren, gebruiken de engineers image-scanning in hun CI/CD-pijplijnen. Toch werd de container image gepubliceerd in het interne OCI-register en geïmplementeerd in het cluster. Omdat de ontwikkelteams binnen het bedrijf mutable (veranderlijke) tags op de implementaties gebruiken, accepteerde de toegangscontrole de image. De beveiligingstool aanvaarde de image toch immers ook? Het probleem? Het systeem verifieerde alleen de image naam en niet de inhoud van de container image.
Dit voorkom je door een handtekening en handtekeningverificatie van container images te eisen. Elke toekomstige image die in het Kubernetes-cluster komt, is dan dezelfde die eerder in de pijplijn is geverifieerd en voldoet aan het door de organisatie gehanteerde beveiligingsproces.
Handtekeningverificatie voor Kubernetes-deployment: de stappen
Als je jouw Kubernetes-deployments wilt beveiligen met handtekeningverificatie, moet je er allereerst voor zorgen dat alle containers die je wilt gebruiken en ondertekenen vrij zijn van kwetsbaarheden en veiligheidsissues. Door de container images na het signeren te delen met het officiële register, weet je zeker dat je alleen de door jou of het register getekende (en geïnspecteerde) images kunt deployen.
1. Sleutels genereren
Voor handtekeningverificatie bij Kubernetes-deployments gebruiken we meestal Cosign. Deze oplossing maakt deel uit van het sigstore-project en is, in samenwerking met het Linux Foundation Project, ontwikkeld door Google. Met behulp van Cosign kloon je de officiële repository en creëer je twee sleutels die beschermd zijn door geavanceerde encryptie.
Deze privésleutels beheer en ontsleutel je met een wachtwoord dat je opslaat in een secret manager of CI-systeem. Hiervoor kun je bijvoorbeeld HashiCorp Vault of Amazon KMS gebruiken. Zorg er wel voor dat de toegang beperkt is tot de scope van je pipeline en niet algemeen en voor mensen zonder de juiste machtigingen beschikbaar is in de CI/CD-tool die je gebruikt.
2. Publiceren in het register
Om een containerimage te voorzien van een handtekeningverificatie moet je de image publiceren in een register waar je als gebruiker ‘write permission’ voor hebt. Het is onmogelijk om images te signeren die (nog) niet in een register staan. Je krijgt dan een foutmelding die aangeeft dat de entiteit (de container image) niet vindbaar is.
3. Ondertekenen
Gebruik de tag ‘signed’ om de image te identificeren waarop je handtekeningverificatie wilt toepassen. Met het commando ‘cosign’ creëer je vervolgens een nieuwe tag in je OCI-register. Je kunt nu verifiëren dat de naam van de tag een samenvatting (digest) van de container image bevat die je uploadde met de tag ‘signed’.
4. De ondertekening verifiëren
De volgende stap is het definitief verifiëren van de ondertekening. Dit doe je met de publieke sleutel ‘cosign.pub’. Houd goed in de gaten dat de definitieve handtekeningverificatie niet afhankelijk is van de tag, maar van de inhoud van de container image. Door immutable tags te gebruiken, weet je zeker dat je altijd dezelfde (en dus juiste) image downloadt en gebruikt.
5. Veilig deployen met webhook en Connaisseur
De laatste stap is het deployen van container image dingen naar Kubernetes. Hiervoor kun je een webhook (geleverd door Cosign) of Connaisseur gebruiken. Na het installeren van de webhook (een manier om een doelapplicatie te voorzien van nieuwe of gewijzigde gegevens), kun je deze aanzetten in elke namespace die je wilt activeren. Dit doe je door het juiste label aan een namespace te hangen. Na deze actie kan een image alleen in Kubernetes komen als ze voorzien is van een digitale handtekening. Zo creëer je dus een extra veiligheidscheck.
Connaisseur is een tool die nog geavanceerdere opties biedt voor het verifiëren van Kubernetes-deployments. Je kunt bijvoorbeeld kiezen voor zowel alarmeren of blokkeren bij het deployen van bepaalde container images en heel exact instellen welke namespaces je wil analyseren. Standaard is Connaisseur zo geconfigureerd dat het handtekeningverificatie toepast op officiële Docker Hub images. Maar je kunt de tool ook aanpassen zodat hij eveneens de images verifieert die je ondertekent met je persoonlijke sleutels.
Conclusie
Het beveiligen van Kubernetes-deployment met handtekeningverificatie is essentieel om de veiligheid van de container images te waarborgen en ongeautoriseerde toegang te voorkomen. Door het gebruik van oplossingen zoals Cosign kan de ondertekening van container images worden beheerd en gecontroleerd, waardoor alleen de geverifieerde en geïnspecteerde images worden geïmplementeerd in het Kubernetes-cluster. Het proces omvat het genereren van sleutels, publiceren in het register, ondertekenen en verifiëren van de ondertekening. Het implementeren van handtekeningverificatie voor Kubernetes-deployments helpt bedrijven om de veiligheid van hun productieclusters te waarborgen en te voorkomen dat ze slachtoffer worden van beveiligingsinbreuken.
Heb je naar aanleiding van deze blog opmerkingen of wil je eens komen sparren over jouw doelstellingen? Neem gerust contact met ons op.