From 56d04219434f7b3118258aab713c0f6b89de393d Mon Sep 17 00:00:00 2001 From: arcodange Date: Mon, 7 Sep 2026 08:22:44 +0200 Subject: [PATCH 1/2] =?UTF-8?q?minio=5Fapp=20:=20le=20compte=20de=20servic?= =?UTF-8?q?e=20peut=20refermer=20et=20abandonner=20un=20t=C3=A9l=C3=A9vers?= =?UTF-8?q?ement=20en=20parts=20(kadans#1033)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `ListObjectParts` et `AbortMultipartUpload` rendaient 403 AccessDenied avec les identifiants de kadans-api — mesuré le 2026-09-07 sur le homelab, en rejouant les appels de contrôle exacts de l'API depuis un poste. Ouvrir et déposer les parts sont des PutObject et passaient ; l'assemblage n'a jamais pu avoir lieu, et toute vidéo de plus d'une part échouait à la confirmation derrière « stockage injoignable ». Co-Authored-By: Claude Fable 5.1 --- minio/iac/modules/minio_app/main.tf | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/minio/iac/modules/minio_app/main.tf b/minio/iac/modules/minio_app/main.tf index 0a5cb0b..ad2dbe8 100644 --- a/minio/iac/modules/minio_app/main.tf +++ b/minio/iac/modules/minio_app/main.tf @@ -56,8 +56,21 @@ resource "minio_iam_policy" "app" { Version = "2012-10-17" Statement = [ { - Effect = "Allow" - Action = ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"] + Effect = "Allow" + # ⚠ LES DEUX ACTIONS DU MULTIPART QUE `s3:PutObject` NE COUVRE PAS — mesuré + # le 2026-09-07 sur le homelab, avec les identifiants de kadans-api rejoués + # depuis un poste : ouvrir un téléversement et déposer ses parts passent + # (ce sont des PutObject), mais `ListObjectParts` rend 403 AccessDenied. + # L'app ne pouvait donc JAMAIS refermer un téléversement en parts : toute + # vidéo qui dépasse la taille d'une part échouait à l'assemblage, à tous + # les coups, derrière un « stockage injoignable » qui ne nommait rien. + # `AbortMultipartUpload` était refusé pareil : l'app ne pouvait pas non + # plus abandonner ce qu'elle avait ouvert — seule la règle de cycle de vie + # ci-dessus ramassait, un jour plus tard. + Action = [ + "s3:GetObject", "s3:PutObject", "s3:DeleteObject", + "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload", + ] Resource = [for b in var.buckets : "arn:aws:s3:::${b}/*"] }, { -- 2.54.0 From 2502bc48135bdbf367cb4554995cb3f8c52380bb Mon Sep 17 00:00:00 2001 From: arcodange Date: Mon, 7 Sep 2026 08:23:11 +0200 Subject: [PATCH 2/2] =?UTF-8?q?minio=5Fapp=20:=20le=20README=20dit=20ce=20?= =?UTF-8?q?que=20le=20compte=20de=20service=20peut=20faire=20d'un=20t?= =?UTF-8?q?=C3=A9l=C3=A9versement=20en=20parts=20(kadans#1033)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- minio/iac/modules/minio_app/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/minio/iac/modules/minio_app/README.md b/minio/iac/modules/minio_app/README.md index 1bb653b..881da3f 100644 --- a/minio/iac/modules/minio_app/README.md +++ b/minio/iac/modules/minio_app/README.md @@ -41,6 +41,10 @@ des variables dans le Deployment. - les **téléversements abandonnés** sont ramassés au bout d'un jour (voir plus bas : c'est de l'hygiène de protocole, pas un choix de l'app) ; - le compte de service ne peut **rien** toucher d'autre que ces buckets-là ; +- le compte de service peut **refermer et abandonner un téléversement en + parts** — `ListMultipartUploadParts` et `AbortMultipartUpload`, les deux + actions que `PutObject` ne couvre pas (sans elles, l'assemblage rend 403 et + aucun objet de plus d'une part n'arrive jamais — mesuré le 2026-09-07) ; - ses clés vont dans `kvv2/minio/`, que le module Vault central autorise déjà l'app à lire (règle **inconditionnelle** : le chemin porte le nom de l'app, donc il ne peut exposer que ses propres clés). -- 2.54.0