fix(argocd): beperk productie-Applications met restrictief AppProject#78
fix(argocd): beperk productie-Applications met restrictief AppProject#78anneschuth wants to merge 7 commits into
Conversation
|
LGTM met restjes. Statische platform-AppProject die Geverifieerd
Twee kleinigheden1. Comment/config mismatch
2.
|
Follow-up: kleine augmentation (`fac878c7`) + LGTM voor mergeEén kleinigheid uit de eerdere review gefixt: `orphanedResources.warn: false` paste niet bij de comment "alleen waarschuwen". Flipped naar `warn: true` — manueel toegepaste cluster-resources die niet in git staan worden nu zichtbaar in de Argo UI. Nuttig detectiemechanisme bovenop de project-scoping, geen destructieve auto-prune. De `Namespace` in `clusterResourceWhitelist` (defense-in-depth, nog niet actief gebruikt) blijft staan zoals voorgesteld. Geen actie nodig. Verificatie deep-audit (sinds initial review)
Pre-merge gate (verplicht, zoals PR-tekst noemt)```bash Plus Argo dry-run op staging voor zowel `production-infrastructure` als `user-applications` onder `rig-platform`. Als de SOPS-versleutelde overlays of de externe `argo-applications`-repo cluster-scoped kinds buiten `{Namespace, ClusterRole, ClusterRoleBinding}` blijken te bevatten, faalt de sync zichtbaar daar — uitbreiding van de whitelist daar, niet `*`. Apart (sandbox-overlay, niet-blokkerend)`sandboxed-local` blijft op `default`-AppProject met ``/``/`*`. Tweede instap-pad met platform-wide blast radius. Verdient een parallelle PR met dezelfde restrictie (eenvoudiger qua scope, geen SOPS-overlay onbekenden). Schrijf ik op als follow-up. LGTM voor merge na staging-gate. |
Follow-up issues aangemaakt
|
fac878c to
ccc2bac
Compare
Veiligheidsupdate: clusterResourceWhitelist leegNa overleg: onze Argo ServiceAccount heeft op productie geen rechten om cluster-scoped resources aan te maken (ClusterRole, ClusterRoleBinding, Namespace, etc.). Die worden out-of-band door het ODCN-platformteam beheerd. De eerdere whitelist met Augmentation
Restrictie is daarmee strakker dan eerst: voorheen claimde Argo dat het 3 cluster-kinds mocht beheren (zonder de rechten), nu is het expliciet null. |
De twee productie-Applications (production-infrastructure en user-applications) draaiden in het ingebouwde 'default' AppProject met prune + selfHeal. 'default' staat sourceRepos '*', destinations '*' en clusterResourceWhitelist '*' toe. Gevolg: iedereen die naar 'main' van een van de twee GitHub-bronrepo's kan pushen krijgt willekeurige cluster-brede objecten (inclusief ClusterRoleBindings) automatisch toegepast én self-healed. Dat is een volledige overname van het productiecluster via een git-push. Wijziging: - Nieuw AppProject 'rig-platform' met sourceRepos gepind op exact de twee legitieme repo-URL's, destinations gepind op de in-cluster API server plus uitsluitend rig-prd-operations en rig-system, en een conservatieve clusterResourceWhitelist. - Beide Applications van project 'default' naar 'rig-platform' verplaatst. - AppProject toegevoegd aan de odcn-production kustomization. Vooraf bestaand en onafhankelijk van andere wijzigingen.
De comment beschreef "alleen waarschuwen" maar warn stond op false, wat juist géén waarschuwing geeft. Op true gezet zodat manueel toegepaste ClusterRoleBindings of andere resources die niet in git staan zichtbaar worden in de Argo UI — nuttig detectiemechanisme bovenop de project-scoping, zonder destructieve auto-prune toe te voegen.
Onze Argo ServiceAccount heeft op productie geen rechten om cluster-scoped resources aan te maken; die worden out-of-band door ODCN beheerd. Een whitelist met ClusterRole/ClusterRoleBinding/Namespace was misleidend (deed in praktijk niks omdat Argo ze toch niet kan maken). Lege whitelist blokkeert nu expliciet elke cluster-scoped sync-poging, zonder bestaande resources te raken.
Live verificatie: production-infrastructure en user-applications Apps syncen uitsluitend naar rig-prd-operations. De rig-system destination was overgekomen van een sandbox-context en is op odcn-production dood.
53bc94c to
07cd904
Compare
Sandbox krijgt dezelfde restrictie als odcn-production maar gepin op Forgejo in-cluster repos en rig-system namespace. Maakt het mogelijk het AppProject-patroon op sandbox te valideren voordat we naar productie syncen.
rig-prd-operations / rig-system bevatten bootstrap-resources (Argo, OPI, Keycloak, etc.) die niet door Argo gemanaged worden — die zouden tientallen ruis-warnings genereren zonder actie. Namespace-opsplitsing als follow-up.
|
Deze PR mergen we als laatste in de security-batch — om volledige controle te houden over de productie-rollout. Sandbox-validatie geslaagd: AppProject + Application project-switch toegepast op Productie-resource-audit (live): 170 resources totaal, 0 cluster-scoped, 0 buiten Rollback-pad: revert PR + |
Probleem (vooraf bestaand, onafhankelijk)
De twee productie-Applications staan in het ingebouwde
defaultAppProject:argocd-application-production-infrastructure.yaml-> repoRijksICTGilde/RIG-Cluster.git, padinfrastructure/bootstrap/clusters/odcn,prune: true,selfHeal: trueargocd-application-user-applications.yaml-> externe repoRijksICTGilde/argo-applications.git, padodcn-production,prune: true,selfHeal: trueEr bestaat nergens in de repo een AppProject CR die
defaultinperkt. Het ingebouwdedefaultproject staat standaardsourceRepos: '*',destinations: '*'enclusterResourceWhitelist: '*'toe.Supply-chain takeover-pad
Iedereen die naar
mainvan een van beide GitHub-bronrepo's kan pushen, krijgt willekeurige cluster-brede Kubernetes-objecten automatisch toegepast. MetclusterResourceWhitelist: '*'valt daar ook eenClusterRoleBindingonder die een door de aanvaller gecontroleerde ServiceAccount aancluster-adminbindt.selfHeal: trueherstelt elke handmatige terugdraai automatisch binnen seconden. Netto: één git-push = overname van het productiecluster. De externe repoargo-applicationsvergroot het aanvalsoppervlak buiten dit cluster.Wijziging
AppProjectrig-platformin de odcn-production overlay:sourceReposgepind op exact de twee legitieme repo-URL's, geen wildcard. Dit alleen al sluit de takeover via een willekeurige andere repo uit.destinationsgepind ophttps://kubernetes.default.svcplus uitsluitend de namespaces waar deze apps legitiem deployen:rig-prd-operations(dedestination.namespacevan beide Applications) enrig-system(waar de infrastructuur-overlay aantoonbaar resources plaatst).clusterResourceWhitelistconservatief:Namespace,ClusterRole,ClusterRoleBinding(external-dns levert aantoonbaar een ClusterRole + ClusterRoleBinding). Géén*.namespaceResourceWhitelistbewust breed (*/*): de blast radius is al ingeperkt door de destination-namespace-pinning; een strakke namespaced-whitelist zou de platform-sync stilletjes breken zonder extra winst.project: defaultnaarproject: rig-platform.kustomization.yaml.VERPLICHTE validatie op staging vóór merge
kustomizeis lokaal niet beschikbaar en de productie-SOPS-sleutel ontbreekt, dus lokaal is alleen geverifieerd dat de YAML parst en dat de kustomization-referenties kloppen. Voor merge is het volgende verplicht op staging:kustomize buildvan de odcn-production overlay (met SOPS-plugin) moet slagen.*.Een te strakke whitelist breekt de productie-GitOps. Niet mergen zonder groene staging-validatie.
Aanbeveling
Branch protection inschakelen op
mainvan zowelRijksICTGilde/RIG-ClusteralsRijksICTGilde/argo-applications(verplichte review, geen force-push). Het AppProject perkt de schade in; branch protection adresseert het instappunt.