[237] IAM Azure #264

Merged
marvin merged 5 commits from justine/237-iam-azure into develop 2026-09-10 14:18:09 +00:00
Member

Ce que ça change

L'unique droit que ce projet attribue lui-même — « Storage Blob Data
Contributor » sur le compte qui porte l'état Terraform — était posé par
bootstrap.sh et invisible partout ailleurs. Il est désormais déclaré dans
infra/terraform/acces-etat.tf, adopté par import et non recréé : le
script reste l'amorçage, Terraform devient la référence lisible, et les deux ne
peuvent plus diverger sans qu'un plan -refresh-only le montre.

Closes #237

Preuve

$ terraform state show azurerm_role_assignment.etat_donnees
resource "azurerm_role_assignment" "etat_donnees" {
principal_id = "2ec0a07d-092b-4d60-bb04-6c5d68eeb95a"
role_definition_name = "Storage Blob Data Contributor"
scope = "/subscriptions/ca5c57dd-.../storageAccounts/stenervisiong2tfstate"
}

$ bash infra/terraform/bootstrap.sh
rôle « Storage Blob Data Contributor » déjà attribué

$ terraform plan -refresh-only
Changes to Outputs: # aucune ressource proposée — les deux sources ne divergent pas

Si ça touche infra/terraform/

  • terraform plan -out=tfplan ci-dessous, avant la fusion
  • terraform apply tfplansans objet : cette MR ne crée rien. Le seul
    changement d'état est un terraform import, dont la sortie est ci-dessous.
  • Le pair a relu le plan, pas seulement le code
terraform plan -out=tfplan azurerm_monitor_action_group.capacite will be created

azurerm_monitor_metric_alert.capacite will be created

azurerm_storage_management_policy.archive[0] will be created

Plan: 3 to add, 0 to change, 0 to destroy.

Aucune de ces trois lignes n'appartient à cette MR. Ce sont les ressources
du #69, non applicables : Microsoft.Insights/actionGroups/write et
managementPolicies/write sont refusés au rôle école. Voir le commentaire sur
le #237. azurerm_role_assignment.etat_donnees n'apparaît pas : il est importé.

terraform import (le changement d'état de cette MR)

$ MSYS_NO_PATHCONV=1 terraform import azurerm_role_assignment.etat_donnees
".../roleAssignments/3d7d08f1-ab14-4766-ad74-cee73868a2df"
azurerm_role_assignment.etat_donnees: Import prepared!
Import successful!

Relecture

  • Un pair a relu et laissé un commentaire, même court
  • Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas

Relecture

  • Un pair a relu et laissé un commentaire, même court
  • Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas

Ce qui suit le code

  • docs/runbooks/ mis à jour — terraform-etat.md porte la manœuvre
    d'import, l'épinglage du principal, le remède RoleAssignmentExists, le
    retour arrière state rm et le piège MSYS_NO_PATHCONV sous Git Bash
  • docs/adr/ complété — corrections datées du 10/09 sur l'ADR 0007
    (listKeys est accordé) et l'ADR 0012 (Microsoft.Insights/* ne
    l'est pas ; l'alerte du #69 n'a jamais été en service)

Où regarder en priorité

  1. variables.tf, principal_etat_donnees. L'état est partagé par six
    membres, une attribution de rôle désigne une personne. Sans épinglage, le
    plan de chacun des cinq autres proposerait de remplacer l'attribution par
    la sienne — donc de retirer l'accès au conteneur d'état à quelqu'un.
    prevent_destroy transforme ça en erreur dure, mais l'épinglage est ce qui
    évite le problème. Contrepartie assumée : un object ID Entra est versionné,
    alors que le dépôt refuse de versionner email_alerte_capacite au motif
    inverse. Je n'ai pas trouvé d'échappatoire propre — avis bienvenu.

  2. Pas de bloc import comme dans stockage.tf. L'identifiant d'une
    attribution est un GUID tiré au hasard par bootstrap.sh, donc non
    calculable depuis la config. D'où un terraform import en ligne de commande,
    documenté au runbook. C'est une divergence de motif assumée.

  3. Les corrections de documentation. Elles touchent deux ADR et le plan de
    migration. Elles ne changent aucune décision, seulement les faits qui les
    motivaient — mais ça mérite un second regard.

## Ce que ça change L'unique droit que ce projet attribue lui-même — « Storage Blob Data Contributor » sur le compte qui porte l'état Terraform — était posé par `bootstrap.sh` et invisible partout ailleurs. Il est désormais déclaré dans `infra/terraform/acces-etat.tf`, **adopté par import** et non recréé : le script reste l'amorçage, Terraform devient la référence lisible, et les deux ne peuvent plus diverger sans qu'un `plan -refresh-only` le montre. Closes #237 ## Preuve $ terraform state show azurerm_role_assignment.etat_donnees resource "azurerm_role_assignment" "etat_donnees" { principal_id = "2ec0a07d-092b-4d60-bb04-6c5d68eeb95a" role_definition_name = "Storage Blob Data Contributor" scope = "/subscriptions/ca5c57dd-.../storageAccounts/stenervisiong2tfstate" } $ bash infra/terraform/bootstrap.sh rôle « Storage Blob Data Contributor » déjà attribué $ terraform plan -refresh-only Changes to Outputs: # aucune ressource proposée — les deux sources ne divergent pas ## Si ça touche `infra/terraform/` - [x] `terraform plan -out=tfplan` ci-dessous, **avant** la fusion - [ ] `terraform apply tfplan` — **sans objet** : cette MR ne crée rien. Le seul changement d'état est un `terraform import`, dont la sortie est ci-dessous. - [ ] Le pair a relu le plan, pas seulement le code <details><summary><code>terraform plan -out=tfplan</code></summary> azurerm_monitor_action_group.capacite will be created azurerm_monitor_metric_alert.capacite will be created azurerm_storage_management_policy.archive[0] will be created Plan: 3 to add, 0 to change, 0 to destroy. **Aucune de ces trois lignes n'appartient à cette MR.** Ce sont les ressources du #69, non applicables : `Microsoft.Insights/actionGroups/write` et `managementPolicies/write` sont refusés au rôle école. Voir le commentaire sur le #237. `azurerm_role_assignment.etat_donnees` n'apparaît pas : il est importé. </details> <details><summary><code>terraform import</code> (le changement d'état de cette MR)</summary> $ MSYS_NO_PATHCONV=1 terraform import azurerm_role_assignment.etat_donnees ".../roleAssignments/3d7d08f1-ab14-4766-ad74-cee73868a2df" azurerm_role_assignment.etat_donnees: Import prepared! Import successful! </details> ## Relecture - [ ] Un pair a relu et laissé un commentaire, même court - [ ] Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas ## Relecture - [ ] Un pair a relu et laissé un commentaire, même court - [ ] Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas ## Ce qui suit le code - [x] `docs/runbooks/` mis à jour — `terraform-etat.md` porte la manœuvre d'import, l'épinglage du principal, le remède `RoleAssignmentExists`, le retour arrière `state rm` et le piège `MSYS_NO_PATHCONV` sous Git Bash - [x] `docs/adr/` complété — corrections datées du 10/09 sur l'ADR 0007 (`listKeys` **est** accordé) et l'ADR 0012 (`Microsoft.Insights/*` ne l'est **pas** ; l'alerte du #69 n'a jamais été en service) ## Où regarder en priorité 1. **`variables.tf`, `principal_etat_donnees`.** L'état est partagé par six membres, une attribution de rôle désigne une personne. Sans épinglage, le `plan` de chacun des cinq autres proposerait de remplacer l'attribution par la sienne — donc de retirer l'accès au conteneur d'état à quelqu'un. `prevent_destroy` transforme ça en erreur dure, mais l'épinglage est ce qui évite le problème. Contrepartie assumée : un object ID Entra est versionné, alors que le dépôt refuse de versionner `email_alerte_capacite` au motif inverse. Je n'ai pas trouvé d'échappatoire propre — avis bienvenu. 2. **Pas de bloc `import` comme dans `stockage.tf`.** L'identifiant d'une attribution est un GUID tiré au hasard par `bootstrap.sh`, donc non calculable depuis la config. D'où un `terraform import` en ligne de commande, documenté au runbook. C'est une divergence de motif assumée. 3. **Les corrections de documentation.** Elles touchent deux ADR et le plan de migration. Elles ne changent aucune décision, seulement les faits qui les motivaient — mais ça mérite un second regard.
[237] Corrections
Some checks failed
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 30s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 45s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 19s
Intégration / Checkov — audit de la configuration (pull_request) Successful in 47s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m47s
Intégration / Python — qualité, tests et dépendances (pull_request) Failing after 3m35s
0b36a3b75c
justine self-assigned this 2026-09-10 11:10:31 +00:00
justine requested review from marvin 2026-09-10 11:10:38 +00:00
Member

Relecture (marvin)

Verdict : bon travail, deux points a corriger avant fusion. Le coeur --- attribution declaree en Terraform et adoptee par import --- est correct et coherent avec stockage.tf (compte + conteneur adoptes, prevent_destroy).

Verifie et OK : idempotence par-personne de bootstrap.sh (filtre az rest sur principalId && roleDefinitionId) ; #checkov:skip recentre sur la ressource ; runbook terraform-etat.md complet ; corrections de doc factuelles, sans impact sur les decisions. CI Terraform/Checkov verts ; job Python rouge mais herite de develop (#266), pas introduit ici.

A corriger

  1. GUID de principal en dur (variables.tf) + prevent_destroy = point de defaillance unique. Si l'attribution de 2ec0a07d-... disparait, le plan de tout le monde bute en erreur dure. Proposer lifecycle { ignore_changes = [principal_id, principal_type] } (supprime le footgun et le besoin de committer un object ID perso), ou au minimum justifier le choix dans l'ADR 0007. Nit lie : le commentaire du bloc locals d'acces-etat.tf parle encore d'un defaut null.

  2. docs/runbooks/stockage-secours.md non corrige : la PR affirme partout que l'alerte de capacite n'a jamais ete en service, mais ce runbook (SS3) la decrit toujours comme active. Deux runbooks contradictoires --- meme correction datee a apporter la, et verifier le rapport EC04 (#260).

Nits : outputs.tf imprime l'object ID a chaque plan ; terraform plan portera << 2 to add >> en permanence (ok, documente) ; section << ## Relecture >> dupliquee dans le corps de la PR.

## Relecture (marvin) Verdict : bon travail, deux points a corriger avant fusion. Le coeur --- attribution declaree en Terraform et adoptee par `import` --- est correct et coherent avec `stockage.tf` (compte + conteneur adoptes, `prevent_destroy`). **Verifie et OK** : idempotence par-personne de `bootstrap.sh` (filtre `az rest` sur `principalId && roleDefinitionId`) ; `#checkov:skip` recentre sur la ressource ; runbook `terraform-etat.md` complet ; corrections de doc factuelles, sans impact sur les decisions. CI Terraform/Checkov verts ; job Python rouge mais herite de `develop` (#266), pas introduit ici. **A corriger** 1. **GUID de principal en dur (`variables.tf`) + `prevent_destroy` = point de defaillance unique.** Si l'attribution de `2ec0a07d-...` disparait, le `plan` de tout le monde bute en erreur dure. Proposer `lifecycle { ignore_changes = [principal_id, principal_type] }` (supprime le footgun et le besoin de committer un object ID perso), ou au minimum justifier le choix dans l'ADR 0007. Nit lie : le commentaire du bloc `locals` d'`acces-etat.tf` parle encore d'un defaut `null`. 2. **`docs/runbooks/stockage-secours.md` non corrige** : la PR affirme partout que l'alerte de capacite n'a jamais ete en service, mais ce runbook (SS3) la decrit toujours comme active. Deux runbooks contradictoires --- meme correction datee a apporter la, et verifier le rapport EC04 (#260). **Nits** : `outputs.tf` imprime l'object ID a chaque plan ; `terraform plan` portera << 2 to add >> en permanence (ok, documente) ; section << ## Relecture >> dupliquee dans le corps de la PR.
[237] Retours PR
Some checks failed
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 32s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 45s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Intégration / Checkov — audit de la configuration (pull_request) Successful in 44s
Intégration / Python — qualité, tests et dépendances (pull_request) Failing after 3m39s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 2m47s
479f1785b3
Merge branch 'develop' into justine/237-iam-azure
Some checks failed
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 10s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 30s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 49s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 19s
Intégration / Checkov — audit de la configuration (pull_request) Successful in 44s
Intégration / Python — qualité, tests et dépendances (pull_request) Failing after 3m45s
92fe9b12b0
# Conflicts:
#	docs/runbooks/README.md
Merge branch 'develop' into justine/237-iam-azure
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 28s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 47s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Intégration / Checkov — audit de la configuration (pull_request) Successful in 46s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m17s
87eb711740
marvin merged commit 1c270c6cb6 into develop 2026-09-10 14:18:09 +00:00
marvin deleted branch justine/237-iam-azure 2026-09-10 14:18:09 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision!264
No description provided.