Accueil

Cloud Security : Sécuriser AWS, GCP et Azure en production

Security
Difficulte: Advanced
8 min de lecture

Guide avancé cloud security 2026 : IAM least privilège, VPC best practices, secrets management (Secrets Manager, Key Vault, Secret Manager), audit et conformité, Terraform sécurisé avec checkov/tfsec et checklist multi-cloud 25+ points.

Retour aux tutoriels

L'essentiel

  • La responsabilité partagée s'arrête à l'hyperviseur : aucun provider ne détecte par défaut vos erreurs de configuration. Les cinq qui causent la majorité des incidents sont toujours les mêmes — bucket objet public, clés d'accès root AWS, politique "Action": "*", "Resource": "*" (l'équivalent cloud du chmod 777 /), Security Group ouvert à 0.0.0.0/0 sur 22/3389/3306/5432, et secrets en dur dans le code ou les variables d'environnement.
  • Un Security Group est stateful, attaché à une instance, et n'accepte que des règles d'autorisation : le trafic retour est implicite. Un NACL est stateless, attaché au sous-réseau, exige des règles entrantes ET sortantes explicites mais supporte le deny. Security Groups en première ligne pour la granularité, NACLs au-dessus pour bloquer des plages IP entières.
  • L'authentification OIDC supprime les clés statiques en CI/CD : GitHub Actions présente un JWT signé, échangé contre des credentials AWS temporaires via sts:AssumeRoleWithWebIdentity (1 h par défaut), avec validation des claims dépôt, branche et environnement. Plus aucune clé dans GitHub Secrets, plus de rotation manuelle, et chaque assume-role tracé dans CloudTrail.
  • Arbitrage Secrets Manager vs Parameter Store : Secrets Manager apporte la rotation automatique par Lambda, le versioning et la réplication multi-région pour 0,40 $ par secret et par mois ; Parameter Store est gratuit en tier Standard et coûte 0,05 $ par paramètre en Advanced (SecureString + KMS) mais n'a pas de rotation native. Credentials de base de données et clés API à faire tourner tous les 60 à 90 jours : Secrets Manager. Configuration et feature flags : Parameter Store.
  • Le code Terraform se scanne avant tout apply : checkov couvre plus de 1000 règles CIS sur AWS/GCP/Azure/Kubernetes et exporte en SARIF vers GitHub Code Scanning, tfsec est plus léger pour un retour rapide en PR — les deux en mode bloquant sur CRITICAL et HIGH. Contre le drift, combinez un terraform plan planifié la nuit, AWS Config ou driftctl, et des SCPs qui interdisent purement les modifications manuelles en production.
Prérequis
Ce guide suppose une connaissance de base des trois clouds majeurs (IAM, VPC, CLI) et de Terraform. Les exemples de code sont production-ready mais doivent être adaptés à votre contexte.

Introduction : le modèle de responsabilité partagée

La sécurité cloud repose sur un principe fondamental que la majorité des incidents vient valider de la pire façon : le modèle de responsabilité partagée. Le cloud provider sécurise l'infrastructure physique, l'hyperviseur, le réseau global et les services managés. Vous sécurisez tout le reste — configurations IAM, données, réseau virtuel, applications, secrets.

En pratique, cela signifie que AWS, GCP et Azure ne peuvent pas vous protéger contre un bucket S3 public, des clés root qui tournent en CI/CD, ou un Security Group qui ouvre le port 22 à 0.0.0.0/0. Ces erreurs, vous les faites vous-même, et le cloud provider ne les détecte pas par défaut.

Les 5 erreurs cloud les plus communes

Ces cinq patterns sont responsables de la grande majorité des incidents cloud documentés.

1. Buckets S3 (ou GCS / Azure Blob) publics — La configuration par défaut a évolué : AWS bloque désormais l'accès public par défaut depuis 2023. Mais il suffit d'une propriété mal configurée dans Terraform, d'un bucket créé manuellement avant la politique globale, ou d'un développeur qui coche "public" sans réfléchir pour exposer des téraoctets de données. Des millions de credentials, logs applicatifs et données personnelles ont été exfiltrés de cette manière.

2. Utilisation des clés root AWS — Le compte root AWS a des droits illimités et irréversibles. Créer des access keys root pour "aller plus vite" est une faute grave : ces clés ne peuvent pas être restreintes par des politiques IAM, et leur compromission signifie la compromission totale du compte. Désactivez les clés root, activez le MFA matériel et ne les utilisez jamais pour des opérations quotidiennes.

3. Politiques IAM avec wildcard (*)"Action": "*", "Resource": "*" donne à n'importe quelle ressource tous les droits sur tout le compte. C'est l'équivalent cloud du chmod 777 /. Pourtant, cette configuration se retrouve régulièrement dans des rôles d'automatisation "pour aller vite". Le blast radius d'une compromission est alors maximal.

4. Security Groups ouverts à 0.0.0.0/0 — Ouvrir les ports SSH (22), RDP (3389) ou les bases de données (3306, 5432) à Internet entier expose vos instances à des scanners automatisés qui tentent des authentifications en permanence. Chaque jour, des milliers de machines bot scannent l'intégralité des plages IP AWS à la recherche de ces ports ouverts.

5. Secrets dans les variables d'environnement ou le code source — Clés API en dur dans le code, credentials de base de données dans les variables d'environnement de la définition de tâche ECS, tokens dans les Dockerfiles. Ces secrets se retrouvent dans les logs, les images Docker, les dépôts Git et les snapshots. Utilisez les services de secrets managés décrits dans ce guide.

1. IAM Security : least privilège en pratique

Le principe de moindre privilège (least privilège) est simple à énoncer et difficile à maintenir à l'échelle. Une politique IAM correcte donne exactement les droits nécessaires à une ressource pour accomplir sa tâche, ni plus, ni moins.

AWS IAM : rôles vs utilisateurs

La règle générale : les humains utilisent SSO (AWS IAM Identity Center), les workloads utilisent des rôles IAM, et les utilisateurs IAM traditionnels avec des clés d'accès longue durée sont à éviter sauf cas spécifiques documentés.

Exemple d'une politique IAM least privilège pour une Lambda qui lit depuis S3 et écrit dans DynamoDB :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ReadSpecificS3Bucket",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": "arn:aws:s3:::mon-bucket-prod/data/*"
    },
    {
      "Sid": "WriteSpecificDynamoTable",
      "Effect": "Allow",
      "Action": [
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:GetItem"
      ],
      "Resource": "arn:aws:dynamodb:eu-west-1:123456789012:table/MaTable"
    },
    {
      "Sid": "DecryptWithSpecificKey",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": "arn:aws:kms:eu-west-1:123456789012:key/mrk-abc123"
    }
  ]
}

Créer ce rôle et l'attacher à une Lambda via AWS CLI :

# 1. Créer le rôle avec une trust policy pour Lambda
aws iam create-role 
  --role-name lambda-data-processor 
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "lambda.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

# 2. Créer la politique inline (ou managed)
aws iam put-role-policy 
  --role-name lambda-data-processor 
  --policy-name least-privilege-policy 
  --policy-document file://policy.json

# 3. Attacher la politique AWSLambdaBasicExecutionRole pour les logs CloudWatch
aws iam attach-role-policy 
  --role-name lambda-data-processor 
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

# 4. Vérifier les permissions effectives
aws iam simulate-principal-policy 
  --policy-source-arn arn:aws:iam::123456789012:role/lambda-data-processor 
  --action-names s3:GetObject s3:DeleteObject 
  --resource-arns arn:aws:s3:::mon-bucket-prod/data/fichier.csv

AWS Organizations et SCPs

Les Service Control Policies (SCPs) sont des garde-fous organisationnels : elles définissent le maximum de permissions qu'un compte peut avoir, indépendamment des politiques IAM internes. Même un administrateur d'un compte membre ne peut pas dépasser ce que la SCP autorise.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyRootAccountActions",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:PrincipalArn": "arn:aws:iam::*:root"
        }
      }
    },
    {
      "Sid": "DenyLeavingOrganization",
      "Effect": "Deny",
      "Action": "organizations:LeaveOrganization",
      "Resource": "*"
    },
    {
      "Sid": "DenyDisablingCloudTrail",
      "Effect": "Deny",
      "Action": [
        "cloudtrail:StopLogging",
        "cloudtrail:DeleteTrail",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    },
    {
      "Sid": "RestrictRegions",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "eu-west-1",
            "eu-west-3",
            "us-east-1"
          ]
        }
      }
    }
  ]
}

AWS IAM Access Analyzer

Access Analyzer détecte automatiquement les ressources accessibles depuis l'extérieur du compte ou de l'organisation. Activez-le dans chaque région et région globale :

# Activer Access Analyzer dans toutes les régions actives
for region in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
  aws accessanalyzer create-analyzer 
    --analyzer-name "org-analyzer-${region}" 
    --type ORGANIZATION 
    --region "$region" 2>/dev/null && echo "Créé : $region"
done

# Lister les findings (ressources publiques ou cross-account)
aws accessanalyzer list-findings 
  --analyzer-arn arn:aws:access-analyzer:eu-west-1:123456789012:analyzer/org-analyzer-eu-west-1 
  --filter '{"status": {"eq": ["ACTIVE"]}}'

GCP : Workload Identity et bindings conditionnels

Sur GCP, Workload Identity Federation remplace les clés de service (service account keys) pour les workloads externes. Le principe est identique à OIDC : le workload s'authentifie avec son token natif, GCP l'échange contre un token de service account temporaire.

# workload-identity-binding.yaml
# Permet à GitHub Actions de se faire passer pour un service account GCP
apiVersion: iam.googleapis.com/v1
kind: WorkloadIdentityPoolProvider
metadata:
  name: github-provider
spec:
  workloadIdentityPool: projects/123456/locations/global/workloadIdentityPools/github-pool
  displayName: "GitHub Actions Provider"
  oidc:
    issuerUri: "https://token.actions.githubusercontent.com"
  attributeMapping:
    google.subject: "assertion.sub"
    attribute.repository: "assertion.repository"
    attribute.ref: "assertion.ref"
  attributeCondition: >
    attribute.repository == "mon-org/mon-repo" &&
    attribute.ref == "refs/heads/main"
# Créer le pool et le provider
gcloud iam workload-identity-pools create "github-pool" 
  --project="mon-projet-gcp" 
  --location="global" 
  --display-name="GitHub Actions Pool"

gcloud iam workload-identity-pools providers create-oidc "github-provider" 
  --project="mon-projet-gcp" 
  --location="global" 
  --workload-identity-pool="github-pool" 
  --display-name="GitHub Actions Provider" 
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository" 
  --issuer-uri="https://token.actions.githubusercontent.com" 
  --attribute-condition="attribute.repository=='mon-org/mon-repo'"

# Lier le provider au service account (binding conditionnel)
gcloud iam service-accounts add-iam-policy-binding 
  "[email protected]" 
  --project="mon-projet-gcp" 
  --role="roles/iam.workloadIdentityUser" 
  --member="principalSet://iam.googleapis.com/projects/123456/locations/global/workloadIdentityPools/github-pool/attribute.repository/mon-org/mon-repo"

Azure : PIM et Conditional Access

Azure Privileged Identity Management (PIM) permet d'accorder des droits élevés de manière temporelle (just-in-time) plutôt que permanente. Les administrateurs activent leur rôle pour une durée limitée avec justification et validation optionnelle.

# Assigner un rôle éligible (pas permanent) via PIM
az role assignment create 
  --assignee "[email protected]" 
  --role "Contributor" 
  --scope "/subscriptions/sub-id/resourceGroups/rg-prod" 
  --description "PIM eligible assignment - requires activation"

# Lister les assignations PIM actives
az rest 
  --method GET 
  --url "https://management.azure.com/subscriptions/sub-id/providers/Microsoft.Authorization/roleEligibilityScheduleInstances?api-version=2020-10-01"

# Conditional Access : bloquer l'accès hors MFA pour les admins
az ad conditional-access policy create 
  --name "Require MFA for admins" 
  --state "enabled" 
  --conditions '{
    "users": {"includeRoles": ["62e90394-69f5-4237-9190-012177145e10"]},
    "applications": {"includeApplications": ["All"]}
  }' 
  --grant-controls '{
    "operator": "OR",
    "builtInControls": ["mfa"]
  }'

Contenu Premium

Ce tutoriel avancé est réservé aux membres premium.

9,90€ / mois
  • Tous les tutoriels avancés
  • Nouveaux contenus chaque semaine
  • Suivi de progression
  • Annulation à tout moment
MR

Écrit par

Morgann Riu

Expert en cybersécurité et administration Linux. Je partage mes connaissances à travers des tutoriels gratuits et des formations pour aider les administrateurs systèmes et développeurs à sécuriser leurs infrastructures.

Questions fréquentes

Quelle est la différence entre un Security Group AWS et un NACL ?
Un Security Group est un pare-feu statefull attaché à une instance ou à une interface réseau : si vous autorisez le trafic entrant, le trafic retour est automatiquement autorisé. Il ne supporte que des règles d'autorisation (pas de deny explicite). Un Network ACL (NACL) est un pare-feu stateless attaché à un sous-réseau : vous devez explicitement autoriser le trafic entrant ET sortant, et les règles de deny sont supportées. Les NACLs s'appliquent à tout le subnet, les Security Groups à des ressources individuelles. En pratique, utilisez les Security Groups comme première ligne de défense (granulaires, statefull) et les NACLs comme couche de contrôle supplémentaire au niveau réseau pour bloquer des plages IP entières.
Pourquoi ne jamais utiliser les clés d'accès IAM root AWS ?
Le compte root AWS dispose de droits illimités sur l'intégralité du compte : suppression de ressources, fermeture du compte, accès à la facturation, révocation des politiques d'organisation. Une clé root compromise signifie une compromission totale et irréversible. AWS recommande explicitement de ne jamais créer de clés d'accès root : désactivez-les si elles existent et verrouillez le compte root avec un MFA matériel (YubiKey). Pour les opérations quotidiennes, créez des utilisateurs IAM avec les permissions minimales nécessaires, ou mieux, utilisez des rôles IAM pour les workloads et SSO pour les humains.
Comment fonctionne l'authentification OIDC entre GitHub Actions et AWS sans clés statiques ?
GitHub Actions supporte OpenID Connect (OIDC) : GitHub agit comme un fournisseur d'identité de confiance. Le workflow obtient un token JWT signé par GitHub, l'échange contre des credentials AWS temporaires via sts:AssumeRoleWithWebIdentity. AWS vérifie la signature JWT contre les clés publiques OIDC de GitHub et valide les claims (repository, branche, environnement). Aucune clé AWS n'est jamais stockée dans GitHub Secrets. Les credentials obtenus sont temporaires (durée configurable, 1h par défaut) et scopés au rôle IAM. Cette approche élimine la rotation manuelle des clés, réduit la surface d'attaque et offre une traçabilité complète dans CloudTrail.
Quelle est la différence entre AWS Secrets Manager et Parameter Store ?
Secrets Manager est conçu spécifiquement pour les secrets : rotation automatique intégrée (Lambda), versioning, réplication multi-région, chiffrement KMS obligatoire. Il coûte 0,40 USD par secret par mois. Parameter Store (SSM) est plus polyvalent : configurations non-sensibles (tier Standard, gratuit), secrets (tier Advanced, 0,05 USD par paramètre) avec chiffrement KMS optionnel, mais sans rotation automatique native. Utilisez Secrets Manager pour les credentials de bases de données, clés API et certificats nécessitant une rotation automatique. Utilisez Parameter Store pour les configurations d'application, feature flags et paramètres non-critiques. Les deux s'intègrent nativement avec IAM, CloudTrail et les services AWS.
Comment checkov et tfsec s'intègrent-ils dans un pipeline CI/CD ?
Checkov et tfsec analysent statiquement le code Terraform avant tout apply. Checkov (Bridgecrew/Prisma) couvre plus de 1000 règles CIS Benchmarks, couvre AWS/GCP/Azure/Kubernetes et supporte SARIF pour l'intégration GitHub Code Scanning. Tfsec est plus léger et rapide, idéal pour des checks rapides en PR. En pratique, intégrez les deux en mode fail-on-error dans la PR : le plan Terraform ne se génère pas si des misconfigurations critiques sont détectées. Vous pouvez exclure des règles spécifiques avec des annotations inline (checkov:skip, tfsec:ignore) quand le risque est accepté et documenté. Sentinel (HashiCorp) ajoute une couche de policy-as-code côté Terraform Cloud pour les guardrails organisationnels.
Comment détecter un drift de configuration sur l'infrastructure cloud ?
Le drift se produit quand l'état réel de l'infrastructure diverge de l'état déclaré dans le code Terraform. Plusieurs approches complémentaires : terraform plan en mode read-only dans un pipeline planifié (toutes les heures ou nuits) détecte les changements hors-bande. AWS Config avec des règles de conformité déclenche des alertes en temps réel sur les modifications. CloudTrail + EventBridge permet de déclencher une Lambda qui relance un plan Terraform à chaque modification de ressource critique. Driftctl (outil dédié) compare l'état cloud réel avec le state Terraform et liste les ressources non gérées. La meilleure défense reste de bloquer les modifications manuelles via des SCPs (AWS Organizations) ou des politiques d'organisation GCP/Azure qui interdisent les actions directes en production.

Partager ce tutoriel

Cet article vous a plu ?

Cet article vous a-t-il été utile ?

Merci pour votre retour !

Commentaires

Recommandé pour vous

Article de fond sur le sujet

Checklist Sécurité Linux

30 points essentiels pour sécuriser un serveur Linux. Recevez aussi les nouveaux tutoriels par email.

Pas de spam. Désabonnement en 1 clic.