[infra] Checkov est rouge sur develop : huit constats sur le compte de stockage, dont deux vrais manques #249
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision#249
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Exigence couverte
ENF-11 · Chaîne d'approvisionnement (scan bloquant). Touche aussi ENF-05 (continuité, fenêtre de récupération) et ENF-13 (coût).
Épreuve servie
EC04 · Cloud et sécurisation
Charge estimée
une demi-journée
Ce qu'on veut obtenir
Depuis la fusion du #72 (PR #242), la tâche « Checkov — audit de la configuration » est rouge sur
develop, et toute demande de fusion en hérite. Ce n'est pas un défaut de la chaîne : le scan fait son travail, sur un compte de stockage que le #69 (PR fusionnée avant lui) avait déclaré entre-temps.Rejoué en local avec le checkov épinglé du dépôt (
3.3.16,infra/terraform/requirements-ci.txt) et la configuration versionnée :Les huit portent tous sur
azurerm_storage_account.archive(infra/terraform/stockage.tf:83-183). Ils se répartissent en deux familles très inégales, et c'est tout l'enjeu de ce ticket.Six règles inapplicables ici, et le dépôt écrit déjà pourquoi. Chacune a son argument dans
stockage.tfou dans l'exception voisineCKV2_AZURE_21de.checkov.yml— ils sont vérifiables, ce qui est la condition posée par le #72 pour qu'une exception soit légitime :CKV_AZURE_59public_network_access_enabled = falsetrue, l. 118-131 : un point de terminaison privé n'est pas permis par l'abonnement école, etfalsecouperait leterraform initqui lit l'état dans ce compteCKV2_AZURE_33CKV2_AZURE_40shared_access_key_enabled = falsetrue, l. 133-145 : nécessaire au jeton SAS du #70CKV2_AZURE_1Devops-cours-projet-eadl(ADR 0007), comme le dit déjà l'exceptionCKV2_AZURE_21CKV_AZURE_33CKV2_AZURE_21: demande un paramètre de diagnostic et un espace Log Analytics, hors droits — et aucune queue n'est utiliséeCKV_AZURE_206LRSest ce quebootstrap.sha créé (l. 88-99) ; monter en GRS double le stockage facturé, ce qui relève de l'ENF-13Deux vrais manques, et ils ne doivent PAS être exemptés. Les éteindre serait exactement ce que l'en-tête de
.checkov.ymlrefuse en capitales — « CE QUI N'EST PAS UNE EXCEPTION ACCEPTABLE : ça fait rougir la chaîne » :CKV2_AZURE_38— suppression réversible désactivée.stockage.tfl. 147-158 le dit lui-même : « L'activer serait un vrai gain pour l'archive comme pour l'état — c'est une décision à prendre, pas un effet de bord à subir ». Etdocs/runbooks/stockage-secours.md§ « Activer la suppression réversible » ajoute : « à ouvrir en ticket plutôt qu'à glisser dans une demande de fusion qui parle d'autre chose ». D'où ce ticket.CKV2_AZURE_41— aucune politique d'expiration des SAS. Non discuté nulle part. Directement utile au #70, qui va émettre un jeton.Critères d'acceptation
checkov --directory infra/terraform --config-file infra/terraform/.checkov.ymlsort en code 0, et la tâche « Checkov » est verte surdevelop.CKV2_AZURE_38est satisfaite par undelete_retention_policyréellement posé dans le blocblob_properties, pas par une exception. La durée retenue est écrite avec son coût.CKV2_AZURE_41est satisfaite par un blocsas_policyréellement posé, pas par une exception. Siexpiration_actionvautLogplutôt queBlock, le motif est écrit — unBlockmal dimensionné casserait le #70.infra/terraform/.checkov.yml, une par ligne, chacune avec un motif qu'un relecteur peut vérifier dans le dépôt — la forme que le #72 impose. Aucune exemption ne dit « ça fait rougir la chaîne ».terraform planmontre0 to destroysurazurerm_storage_account.archive: le compte porte l'état de Terraform et sonprevent_destroydoit rester non sollicité.docs/runbooks/stockage-secours.mdne présente plus la suppression réversible comme « non posée aujourd'hui », et son § 7 dit comment revenir en arrière.Comment on le vérifie
Et, sur l'abonnement, avant tout
apply:Mesure préparatoire déjà faite. Les deux correctifs ont été essayés en local sur une copie : un
sas_policy(expiration_period = "0.08:00:00",expiration_action = "Log") et undelete_retention_policy { days = 7 }font passer le compte de 8 constats à 6, et les 6 restants sont exactement les six inapplicables du tableau ci-dessus.Passedmonte de 9 à 11. Ce n'est pas unplan, seulement le scan : la vérification sur l'abonnement reste à faire.Manuel d'exploitation à mettre à jour
docs/runbooks/stockage-secours.md— le § « Activer la suppression réversible » devient un état posé, avec sa durée et son coût, et le § 7 « Retour arrière » gagne la ligne correspondante.docs/runbooks/ci.md§ « Terraform et sécurité IaC » si la liste des exceptions y est reprise.Risque et retour arrière
Le risque n'est pas le scan, c'est la ressource. Ce compte porte l'état de Terraform : il est adopté par un bloc
importet protégé parprevent_destroy.sas_policyetdelete_retention_policysont modifiables en place et ne devraient rien remplacer — mais c'est leplanqui le dit, pas ce ticket, et unapplyqui annoncerait un remplacement doit être interrompu.expiration_action = "Log"journalise sans rejeter : un jeton SAS plus long que la politique reste valide. Passer àBlockest un second geste, à ne pas confondre avec celui-ci — il casserait le #70 si la période est mal dimensionnée.La suppression réversible a un coût : les blobs supprimés restent facturés pendant la fenêtre de rétention. Sur une archive quotidienne, c'est la taille d'une journée multipliée par la fenêtre. À chiffrer dans le ticket, ENF-13.
Retour arrière : retirer les deux blocs ramène l'état d'aujourd'hui ; la fenêtre de rétention déjà écoulée ne se rattrape pas, mais rien n'est perdu.