DevSecOps-projecten

Infrastructure as Code

Azure k3s-platform

Een klein Kubernetes-platform op productieniveau in Azure, alleen uit code gebouwd: Terraform maakt de cloud-onderdelen, Ansible hardt de servers en installeert k3s, en een pipeline voert elke wijziging na beoordeling uit, zonder opgeslagen secrets.

  • Terraform
  • Azure
  • Ansible
  • k3s
  • Helm
  • Prometheus
  • Grafana
  • Loki
  • Fluent Bit
  • cert-manager
  • Key Vault
  • GitHub Actions
  • OIDC

In het kort

3
VM's met één commando
0
secrets in de pipeline (OIDC)
2
controles voor een wijziging: plan en goedkeuring
1
commando om alles te verwijderen

Het doel

Handmatig gebouwde servers groeien uit elkaar, niemand weet wie wat heeft gewijzigd, en een verloren VM opnieuw bouwen kost een dag. Het doel: een platform waarin de hele omgeving code is, elke wijziging eerst als plan wordt beoordeeld, de servers elke keer op dezelfde manier worden gehard en de kosten onder controle blijven.

Wat het laat zien

Infrastructure as Code
Terraform (azurerm 4) met twee modules (netwerk, node) en remote state in Azure Storage met Entra ID-login.
Netwerk
VNet en NSG met standaard weigeren, NAT-gateway voor uitgaand verkeer, een Standard Load Balancer voor 80/443, beheertoegang alleen vanaf jouw IP.
Identiteit en secrets
GitHub OIDC (geen client-secret), managed identities op de VM's, het k3s-join-token in Key Vault.
Hardening
SSH, sysctl, auditd, fail2ban, automatische updates; k3s-versleuteling van secrets, Pod Security, audit-log en een versleuteld pod-netwerk.
Observability
Prometheus, Alertmanager, Grafana, Loki, Fluent Bit met eigen alarmregels, en Azure Monitor voor de systeemlogs.
Kostenbeheersing
Een budget met voorspellingsalarm, kleine VM-groottes, een log-limiet en één commando om alles te verwijderen.

Architectuur

De Azure-omgeving. Alleen de load balancer is openbaar voor websites; SSH en de Kubernetes-API antwoorden alleen aan het beheer-IP.

The Azure k3s platform: network, nodes, cluster, Key Vault, monitoring and the pipelineAzure — resource group (Terraform)VNet 10.40.0.0/16 · NSG: deny by defaultAdmin laptopadmin_cidrs onlyGitHub ActionsOIDC loginno stored secretUserswebsitesInternetupdates, imagesk3s servercontrol plane · tainted10.40.1.10 · public IPk3s agent 110.40.1.20no public IPk3s agent 210.40.1.21no public IPIn the cluster· Traefik ingress· cert-manager· Prometheus· Alertmanager· Grafana· Loki + Fluent Bit· WireGuard pod network· your appsKey Vaultk3s join token (RBAC)Log Analyticssyslog via Azure Monitor AgentStandard Load Balancer80 / 443 → agentsNAT gatewayall outbound trafficBudget alertforecast at 80 %Storage account: Terraform stateEntra ID login · versioningSSH 22 · API 644380/443ingressoutidentitylogsplan / apply

Stap voor stap

  1. Pull request

    terraform fmt en validate, tflint en een Trivy-IaC-scan. Daarna logt de pipeline met OIDC in bij Azure en zet het plan als reactie in de pull request.

  2. Beoordeling

    Een mens leest het plan: wat wordt gemaakt, gewijzigd of verwijderd. In Azure is nog niets veranderd.

  3. Toepassen

    Na de merge wacht de apply op goedkeuring van de omgeving "production". Dan bouwt Terraform precies het beoordeelde plan.

  4. Configureren

    Ansible hardt de drie Ubuntu-servers, installeert k3s met versleuteling en audit-log en voegt de platform-charts toe.

  5. Elke nacht

    Een drift-controle draait terraform plan. Als Azure afwijkt van de code, opent hij een issue.

Bewijs uit een echte run

Run op de branch main op 2026-10-27, uit GitHub Actions. Tijd per job:

  • fmt, validate, tflint, Trivy 23s
  • ansible-lint (production profile) 22s

Open deze run (opens in a new tab)

Beveiligingsmaatregelen

MaatregelWat het tegenhoudt
NSG standaard weigeren + admin_cidrsSSH en de Kubernetes-API open op internet.
Geen openbaar IP op de agentsDirecte aanvallen op de worker-nodes.
GitHub OIDCEen langlevend cloud-secret dat uit de CI kan lekken.
Key Vault + managed identityHet cluster-join-token in bestanden of in Git.
Plan-beoordeling + goedkeuringEen onverwachte verwijdering in productie.
tflint + Trivy-IaC-scanOnveilige of foute instellingen voordat ze Azure bereiken.
Nachtelijke drift-controleHandmatige wijzigingen waar niemand van weet.
Budget-alarmEen vergeten lab dat elke dag geld kost.

Probeer het zelf

az login && make bootstrap      # once: state storage + GitHub OIDC app
cp terraform/terraform.tfvars.example terraform/terraform.tfvars   # your IP and SSH key
make init plan apply            # VNet, NSG, NAT, load balancer, 3 VMs, Key Vault, monitoring
make configure                  # Ansible: hardening, k3s, platform charts
make kubeconfig && KUBECONFIG=./kubeconfig kubectl get nodes
make destroy                    # after the demo: everything is gone

Wat ik geleerd heb

  • Een helder plan in de pull request is het beste beoordelingsmiddel: je leest wat er verandert, niet de code.
  • Veilige standaarden horen in de code: de webpoorten blijven dicht tot je ze bewust opent.
  • Een platform dat je in minuten kunt verwijderen en opnieuw bouwen, is goedkoper en veiliger dan een platform dat je niet durft aan te raken.
Volgende casestudy Veilige delivery-pipeline