# ── Le compte PROVISIONNEUR : ce que `tools` doit fournir en plus du module ─── # # Une app qui déclare ses buckets depuis son propre dépôt doit pouvoir les # créer — donc disposer de droits d'ADMINISTRATION sur MinIO. Lui donner le # ROOT serait absurde : le root lit et écrit TOUS les objets de TOUTES les apps. # # Ce compte-ci ne peut que PROVISIONNER : créer un bucket, une politique, un # compte de service, et les attacher. Il n'a AUCUN droit de lecture ou # d'écriture sur les objets. Une app compromise pourrait créer des buckets — # une nuisance —, pas lire les vidéos d'une autre. # # Le root, lui, reste dans `kvv2/minio/config`, que seul le rôle CI `minio` # peut lire. # # ⚠ NON VÉRIFIÉ CONTRE LE SERVEUR : les noms d'actions d'administration MinIO # ci-dessous 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 de cette PR que je ne peux pas prouver ici. resource "minio_iam_policy" "provisioner" { name = "provisioner" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "admin:CreateUser", "admin:DeleteUser", "admin:ListUsers", "admin:GetUser", "admin:CreatePolicy", "admin:DeletePolicy", "admin:GetPolicy", "admin:ListUserPolicies", "admin:AttachUserOrGroupPolicy", ] Resource = ["arn:aws:s3:::*"] }, { # Créer et inspecter un bucket — mais PAS lire ni écrire ses objets : # `s3:GetObject` et `s3:PutObject` sont volontairement absents. Effect = "Allow" Action = ["s3:CreateBucket", "s3:DeleteBucket", "s3:ListAllMyBuckets", "s3:GetBucketLocation", "s3:GetBucketPolicy", "s3:PutBucketPolicy"] Resource = ["arn:aws:s3:::*"] }, ] }) } resource "random_password" "provisioner" { length = 40 special = false } resource "minio_iam_user" "provisioner" { name = "provisioner" secret = random_password.provisioner.result force_destroy = false } resource "minio_iam_user_policy_attachment" "provisioner" { user_name = minio_iam_user.provisioner.id policy_name = minio_iam_policy.provisioner.id } # Lisible par le rôle CI de CHAQUE app (règle générique ajoutée à `app_policy`) : # c'est ce qui permet à une app de provisionner ses propres buckets sans qu'on # lui confie le root. resource "vault_kv_secret_v2" "provisioner" { mount = "kvv2" name = "minio/provisioner" data_json = jsonencode({ MINIO_ENDPOINT = var.minio_endpoint MINIO_ACCESS_KEY = minio_iam_user.provisioner.id MINIO_SECRET_KEY = random_password.provisioner.result }) }