Files
tools/hashicorp-vault
arcodangeandClaude Opus 5 ec71571b98
Helm Charts / Detect changed charts (push) Successful in 16s
Helm Charts / Detect changed charts (pull_request) Successful in 16s
MinIO / Auth with gitea for vault (pull_request) Failing after 8m32s
MinIO / Tofu - minio IAC (pull_request) Has been skipped
MinIO / Auth with gitea for vault (push) Failing after 8m31s
MinIO / Tofu - minio IAC (push) Has been skipped
Helm Charts / Library charts tool (push) Has been cancelled
Helm Charts / Application charts pgcat (push) Has been cancelled
Hashicorp Vault / Auth with gitea for vault (push) Has been cancelled
Hashicorp Vault / Tofu - Vault IAC (push) Has been cancelled
Helm Charts / Library charts tool (pull_request) Has been skipped
Hashicorp Vault / Auth with gitea for vault (pull_request) Failing after 8m32s
Hashicorp Vault / Tofu - Vault IAC (pull_request) Has been skipped
Helm Charts / Application charts pgcat (pull_request) Has been skipped
refactor(minio) — chacun son périmètre : les buckets se déclarent depuis le dépôt de l'app
« Les buckets sont à déclarer dans le repo de kadans-api. On ne va pas modifier
le repo tools à chaque changement d'application. Chacun son périmètre. Tools
peut proposer un module pour standardiser la déclaration de buckets à la
limite, mais c'est tout. » (fondateur, 26/07)

C'est une erreur de fond de ma part : j'avais fait de `tools` le PROPRIÉTAIRE de
déclarations qui appartiennent aux applications. À ce rythme, chaque nouveau
bucket de n'importe quelle app devenait une PR sur l'infra partagée.

CE QUI CHANGE. `consumers.tf` disparaît, et la liste de buckets du chart se vide.
À la place, un module réutilisable `iac/modules/minio_app` : une app lui donne
son nom et ses buckets, et reçoit des buckets privés, un compte de service qui
ne peut rien toucher d'autre, et ses clés dans `kvv2/minio/<app>`.

L'OBSTACLE, ET SA RÉPONSE. Déclarer ses buckets depuis son propre dépôt suppose
des droits d'ADMINISTRATION sur MinIO. Confier le root serait absurde : il lit et
écrit tous les objets de toutes les apps. `tools` fournit donc un compte
PROVISIONNEUR aux droits minimaux — créer un bucket, une politique, un compte de
service — et AUCUN droit sur les objets. Une app compromise pourrait créer des
buckets (une nuisance), pas lire les vidéos d'une autre. Le root, lui, ne sort
toujours pas de ce pipeline.

Le rôle CI de chaque app gagne la lecture de `kvv2/data/minio/provisioner` dans
`app_policy` — générique, et c'est exactement le genre de standardisation qui
appartient au dépôt commun.

⚠ CE QUE JE N'AI PAS PU PROUVER : les noms d'actions d'administration MinIO de la
politique du provisionneur viennent de la documentation, pas d'un essai — je n'ai
pas d'identifiants admin en main. Le premier `apply` les confirmera ou les
corrigera. C'est le seul point non vérifié de cette PR, et il est signalé dans le
code à l'endroit exact.

tofu fmt propre · tofu validate réussi sur minio/iac ET hashicorp-vault/iac.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01CoafGWmRVESaWX819USUUA
2026-07-26 10:07:05 +02:00
..
2024-09-05 19:45:42 +02:00
2024-10-30 11:21:48 +01:00

Vault

  1. Les playbooks ansible configurent la base de données postgres et le minimum requis pour permetre au dépot "tools" d'appliquer via un workflow gitea action une configuration vault via tofu.
  2. Configuration des backend d'authentification et des roles pour postgres et kubernetes. Définition de rôles "${app}-ops" pour permettre au dépot d'une application de définir ses propres dépendances dans vault. Rotation de credentials postgres pour les applications.
  3. Le dépot de l'application webapp gère l'obtention de ses crédentials pour postgres.
flowchart LR

    classDef playbook stroke:#0f0,fill:#440,stroke-width: 1px
    classDef tofu stroke:#f00,fill:#404,stroke-width: 2px
    classDef argocd stroke:#00f,fill:#044,stroke-width: 3px
    classDef database stroke:#bb0,fill:#ff0,stroke-width: 5px,color: black
    classDef secret stroke:#f00,fill:#f00,stroke-width: 5px,color: yellow
    classDef secretOperator stroke:#f00,fill:DarkRed,stroke-width: 5px,color: Orange

    subgraph git_code[factory.git]
        subgraph ansible_collection
            setup_playbook[playbook arcodange.factory.setup]:::playbook
            tools_playbook[playbook arcodange.factory.tools]:::playbook
        end
        git_code_tofu_vault{{tofu}}:::tofu
    end

    subgraph git_tools[tools.git]
        argocd_tools{{Argo CD Apps}}:::argocd
        git_tools_tofu_vault{{tofu}}:::tofu
    end

    subgraph git_webapp[webapp.git]
        webapp["Go(lang) web app"]
        argocd_webapp{{Argo CD App}}:::argocd
        git_webapp_tofu_vault{{tofu}}:::tofu
    end

    subgraph servers
        subgraph k3s
            subgraph k3s_ns_tools[ns:tools]
                argocd{{Argo CD}}:::argocd
                pgbouncer
                subgraph vault
                    subgraph vault_auth[auth]
                        subgraph vault_auth_openid[openid]
                        end
                        vault_auth_jwt[jwt]
                        vault_auth_k8s[kubernetes]
                        vault_auth_jwt_role_gitea_cicd[gitea_cicd role]
                        vault_auth_jwt_role_gitea_cicd_webapp_ops[gitea_cicd_webapp ops role]
                        vault_auth_k8s_role_vso[vault-secret-operator role]
                        vault_auth_k8s_role_webapp[webapp role]
                        subgraph policies
                            policy_default[default]
                            policy_webapp[webapp]
                            policy_webapp_ops[webapp ops]
                            policy_admin[admin]
                            policy_vso[edit-vso-client-cache]
                        end
                    end
                    subgraph vault_secrets[secrets]
                        subgraph kvv2
                            google/credentials
                            webapp/config
                        end
                    end
                    subgraph vault_postgres[postgres]
                        creds/creds-editor
                        creds/webapp
                    end
                    subgraph vault_transit[transit]
                    end
                end
                vault-secret-operator:::secretOperator
            end
            subgraph k3s_ns_webapp[ns:webapp]
                webapp_deployment[deployment:webapp]
                webapp_postgres_creds_secret[secret:postgres creds]:::secret
                webapp_config_secret[secret:config]:::secret
                webapp_service_account[sa:webapp]
            end
        end
        subgraph postgres
            root_credentials
            postgres_db[(postgres)]:::database
            webapp_credentials:::secret
            webapp_db[(webpp)]:::database

            vault_creds_editor_role{{credentials_editor}}
        end
    end

    setup_playbook -. setup postgres .-> postgres
    
    tools_playbook -.-o git_code_tofu_vault
    git_code_tofu_vault -..-> vault_auth_openid
    git_code_tofu_vault -..-> vault_auth_jwt -- tofu:factory --- vault_auth_jwt_role_gitea_cicd
    git_code_tofu_vault -..-> kvv2
    git_code_tofu_vault -..-> google/credentials

    linkStyle 0,1 stroke:#ff3,stroke-width:1px,color:DarkKhaki;
    linkStyle 2,3,5,6 stroke:#f3f,stroke-width:2px,color:DarkOrange;
    
    git_tools -.-o argocd_tools
    argocd_tools -.-> pgbouncer
    argocd_tools -.-> vault
    argocd_tools -.-> vault-secret-operator
    argocd_tools o--o argocd

    linkStyle 7,8,9,10,11 stroke:#3ff,stroke-width:3px,color:DarkSlateBlue;

    git_tools_tofu_vault -..-> vault_auth_k8s -- sa:vso --- vault_auth_k8s_role_vso
    git_tools_tofu_vault -..-> webapp/config
    git_tools_tofu_vault -..-> vault_transit
    git_tools_tofu_vault -..-> vault_postgres
    vault_auth_k8s ---> k3s
    vault_postgres --> pgbouncer x==> postgres; webapp_deployment --> pgbouncer

    linkStyle 12,14,15,16 stroke:#f3f,stroke-width:2px,color:DarkOrange;
    linkStyle 18,19,20 stroke:gold,stroke-width:2px;
    
    vault_transit x---x vault-secret-operator
    vault-secret-operator x---x vault_auth_k8s_role_vso

    vault_auth_jwt_role_gitea_cicd x--x policy_default
    vault_auth_k8s_role_vso x--x policy_vso

    creds/webapp -.-> webapp_credentials
    creds/webapp -.-> vault-secret-operator
    vault-secret-operator -.-> webapp_postgres_creds_secret
    webapp/config -.-> vault-secret-operator
    vault-secret-operator -.-> webapp_config_secret

    argocd_webapp -.-> k3s_ns_webapp
    webapp --o webapp_deployment
    webapp_postgres_creds_secret --o webapp_deployment
    webapp_deployment --> webapp_service_account

    vault_auth_jwt -- tofu:tools --- vault_auth_jwt_role_gitea_cicd_webapp_ops
    vault_auth_jwt_role_gitea_cicd_webapp_ops x--x policy_webapp_ops
    vault_auth_k8s -- sa:webapp --- vault_auth_k8s_role_webapp x-- tofu:webapp --x policy_webapp

    git_webapp_tofu_vault -.-> vault_auth_k8s_role_webapp
    git_webapp_tofu_vault -.-> creds/webapp


    root_credentials x--x postgres_db
    webapp_credentials x--x webapp_db

    tools_playbook --> vault_creds_editor_role
    vault_creds_editor_role -. change password .-> webapp_credentials
    vault_postgres x--x vault_creds_editor_role