Sécurité Cloud

Cloud Security Best Practices : AWS, Azure & GCP 2025

Lennart Meier, B.A., Social Media Manager (Cloud Focus)
January 11, 2025
15 min read
Sécurité CloudAWSAzureGCPDevSecOps

📄 Download Full Article

Get this 15 min read article as a markdown file for offline reading

Download

Cloud Security Best Practices : AWS, Azure & GCP 2025

Auteur : Lennart Meier, B.A. | Dernière mise à jour : 11 janvier 2025

Executive Summary

L'adoption du cloud continue d'accélérer : 92% des entreprises utilisent désormais des stratégies multi-cloud. Pourtant, les mauvaises configurations restent la première cause de fuites de données, responsables de 68% des incidents cloud en 2024 (Gartner Cloud Security Report).

Après 200+ évaluations de sécurité sur AWS, Azure et Google Cloud Platform, nous observons les mêmes patterns : 83% des organisations ont des buckets accessibles publiquement, 76% utilisent des politiques IAM trop permissives et 64% n'ont pas de logging/monitoring adéquat.

Ce guide fournit :

  • Des bonnes pratiques par plateforme (AWS, Azure, GCP)
  • Les erreurs courantes et leurs correctifs
  • L'automatisation sécurité via Infrastructure as Code
  • Les frameworks de conformité (ISO 27001, SOC 2, NIS2, GDPR)

Le modèle de responsabilité partagée

Concept critique : la sécurité cloud est partagée entre le fournisseur et le client.

Responsabilité partagée chez AWS

CoucheAWS responsableClient responsable
Données✅ Chiffrement, classification, accès
Application✅ Sécurité code, configuration WAF
Système d'exploitation✅ Patching, hardening (EC2)
Réseau✅ Réseau physique✅ Security groups, NACLs, VPC
Matériel✅ Sécurité physique
Facilities✅ Data centers

Simplifié :

  • AWS sécurise : l'infrastructure physique, l'hyperviseur, les services managés
  • Vous sécurisez : données, apps, OS (si applicable), config réseau, IAM

Azure & GCP : même modèle, autre nom

  • Azure : Shared Responsibility Model
  • GCP : Shared Fate Model (approche plus partenariale)

Point clé : 95% des breaches cloud proviennent de mauvaises configurations client, pas du fournisseur.


Identity & Access Management (IAM)

Principe du moindre privilège

Mauvais :

{
  "Effect": "Allow",
  "Action": "*",
  "Resource": "*"
}

Accès TOTAL à TOUT. À proscrire.

Bon (AWS) :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::my-app-bucket/uploads/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "203.0.113.0/24"
        }
      }
    }
  ]
}

Autorise uniquement S3 read/write sur un dossier précis depuis une IP donnée.

Multi-Factor Authentication (MFA)

Obligatoire pour :

  • Tous les comptes root/admin (100% requis)
  • Utilisateurs privilégiés (admins, devs avec accès prod)
  • Accès aux données/systèmes sensibles

AWS :

# Activer MFA pour root
AWS Console → Security Credentials → Assign MFA device

# Forcer MFA via IAM policy
{
  "Effect": "Deny",
  "Action": "*",
  "Resource": "*",
  "Condition": {
    "BoolIfExists": {"aws:MultiFactorAuthPresent": "false"}
  }
}

Azure :

# MFA via Conditional Access
Azure AD → Security → Conditional Access → New Policy
  Users: All users
  Cloud apps: All cloud apps
  Conditions: Any location
  Grant: Require MFA

GCP :

# Activer 2-Step Verification
Google Cloud Console → IAM → Organization policies
  → Enforce 2-Step Verification

Service Accounts & Workload Identity

Mauvaise pratique :

# Clés d'accès dans le code
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Ne jamais hardcoder des credentials.

Bonne pratique (AWS) :

# IAM Roles pour EC2/ECS/Lambda
# Pas de clés d'accès nécessaires

# Attacher un rôle à une instance
aws ec2 run-instances \
  --iam-instance-profile Name=MyAppRole \
  --image-id ami-12345678

# L'appli récupère automatiquement les credentials

Bonne pratique (Azure) :

# Managed Identity pour VMs/Apps
az vm identity assign --name MyVM --resource-group MyRG

Bonne pratique (GCP) :

# Workload Identity pour GKE
kubectl annotate serviceaccount my-app \
  iam.gke.io/gcp-service-account=my-app@project.iam.gserviceaccount.com

Network Security

Virtual Private Cloud (VPC) Design

Architecture best practice :

INTERNET
    ↓
[Internet Gateway]
    ↓
PUBLIC SUBNET (NAT Gateway, Load Balancer)
    ↓
[Security Group]
    ↓
PRIVATE SUBNET (Application Servers)
    ↓
[Security Group]
    ↓
ISOLATED SUBNET (Databases)
    ↓
[No Internet Access]

Règles :

  1. Public Subnet : Load balancers, NAT, bastion hosts uniquement
  2. Private Subnet : serveurs applicatifs (pas d'accès direct Internet)
  3. Isolated Subnet : bases de données (strictement interne)

Security Groups vs. Network ACLs

Security Groups (AWS/Azure NSG/GCP Firewall Rules) :

  • Stateful (retour automatique)
  • Règles allow uniquement
  • Niveau instance

Network ACLs (AWS) / Route Tables (Azure/GCP) :

  • Stateless (autoriser deux sens)
  • Allow + Deny
  • Niveau subnet

Exemple : Web Server Security Group (AWS)

resource "aws_security_group" "web" {
  name = "web-server"
  
  # Inbound
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]  # HTTPS partout
  }
  
  ingress {
    from_port       = 3306
    to_port         = 3306
    protocol        = "tcp"
    security_groups = [aws_security_group.db.id]  # MySQL uniquement depuis DB
  }
  
  # Outbound
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Private Endpoints / Private Link

Problème : Accéder à S3/Azure Storage/GCP APIs via Internet = risque

Solution : Private endpoints pour garder le trafic dans le réseau cloud

AWS PrivateLink:

resource "aws_vpc_endpoint" "s3" {
  vpc_id       = aws_vpc.main.id
  service_name = "com.amazonaws.eu-central-1.s3"
  route_table_ids = [aws_route_table.private.id]
}

Azure Private Endpoint:

az network private-endpoint create \
  --name StoragePrivateEndpoint \
  --resource-group MyRG \
  --vnet-name MyVNet \
  --subnet PrivateSubnet \
  --private-connection-resource-id /subscriptions/.../storageAccounts/myaccount \
  --connection-name StorageConnection

Data Protection

Encryption at Rest

Tous les providers supportent :

  • Server-Side Encryption (SSE)
  • Customer-Managed Keys (CMK)
  • Client-Side Encryption

AWS S3 Encryption:

resource "aws_s3_bucket_server_side_encryption_configuration" "bucket" {
  bucket = aws_s3_bucket.mybucket.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm     = "aws:kms"
      kms_master_key_id = aws_kms_key.mykey.arn
    }
  }
}

Azure Storage Encryption:

# Par défaut : clés Microsoft
# Customer-managed:
az storage account update \
  --name mystorageaccount \
  --resource-group MyRG \
  --encryption-key-source Microsoft.Keyvault \
  --encryption-key-vault https://myvault.vault.azure.net \
  --encryption-key-name mykey

GCP Cloud Storage Encryption:

# Default: Google-managed
gsutil kms encryption \
  -k projects/my-project/locations/eu/keyRings/my-ring/cryptoKeys/my-key \
  gs://my-bucket

Encryption in Transit

Exigences :

  • TLS 1.3 (min. TLS 1.2)
  • Suites cryptographiques fortes
  • Certificats valides

Forcer HTTPS (AWS S3):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyInsecureTransport",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::mybucket/*",
        "arn:aws:s3:::mybucket"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

Classification des données & DLP

DLP natif cloud :

  • AWS Macie (PII dans S3)
  • Azure Purview (gouvernance & classification)
  • GCP DLP API (inspection & redaction)

Exemple : AWS Macie Findings

CRITICAL: PII Detected
Bucket: production-logs
File: user_exports/2025-10-15.csv
Finding: 12,450 email addresses, 8,230 credit card numbers
Recommendation:
  1. Supprimer le fichier immédiatement
  2. Restreindre l'accès au bucket
  3. Activer versioning + MFA delete
  4. Analyser la cause (PII dans logs)

Logging & Monitoring

Logs essentiels à activer

AWS CloudTrail (API Activity):

resource "aws_cloudtrail" "main" {
  name                          = "org-trail"
  s3_bucket_name                = aws_s3_bucket.cloudtrail.id
  include_global_service_events = true
  is_multi_region_trail         = true
  enable_log_file_validation    = true
  
  event_selector {
    read_write_type           = "All"
    include_management_events = true
    
    data_resource {
      type   = "AWS::S3::Object"
      values = ["arn:aws:s3:::*/"]
    }
  }
}

Azure Monitor / Activity Log:

az monitor diagnostic-settings create \
  --name SendToLogAnalytics \
  --resource /subscriptions/.../resourceGroups/MyRG \
  --workspace /subscriptions/.../workspaces/MyWorkspace \
  --logs '[{"category": "Administrative", "enabled": true}]'

GCP Cloud Logging:

gcloud logging sinks create my-sink \
  storage.googleapis.com/my-logs-bucket \
  --log-filter='resource.type="gce_instance"'

Security Alerts

Alertes critiques :

  1. Utilisation compte root/admin

    Alert: Root account login detected
    Action: Notification immédiate au SOC
    
  2. Privilege Escalation

    Alert: IAM policy changed to grant admin rights
    Action: Approbation + audit
    
  3. Exposition publique de ressources

    Alert: S3 bucket made public
    Action: Auto-remediate + notification
    
  4. Appels API inhabituels

    Alert: API calls from unknown geography
    Action: Vérifier compromission
    
  5. Authentifications échouées (Brute Force)

    Alert: 20+ failed login attempts in 5 minutes
    Action: Bloquer IP source
    

AWS GuardDuty (Managed Threat Detection):

resource "aws_guardduty_detector" "main" {
  enable = true
  
  finding_publishing_frequency = "FIFTEEN_MINUTES"
}

resource "aws_sns_topic_subscription" "guardduty" {
  topic_arn = aws_sns_topic.security_alerts.arn
  protocol  = "email"
  endpoint  = "security@company.com"
}

Compliance & Governance

Policy as Code

AWS Organizations SCPs:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "ec2:RunInstances"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "ec2:Region": ["eu-central-1", "eu-west-1"]
        }
      }
    }
  ]
}

Force : EC2 uniquement en régions UE (RGPD)

Azure Policy:

{
  "if": {
    "allOf": [
      {
        "field": "type",
        "equals": "Microsoft.Storage/storageAccounts"
      },
      {
        "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
        "notEquals": "Deny"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}

Force : stockage privé par défaut

GCP Organization Policies:

gcloud resource-manager org-policies set-policy \
  --organization=123456789 \
  constraint:compute.vmExternalIpAccess \
  - deniedValues: ["*"]

Force : pas de VMs avec IP externe

Compliance Frameworks

Certifications des fournisseurs :

  • ISO 27001, ISO 27017, ISO 27018
  • SOC 1, SOC 2, SOC 3
  • PCI DSS Level 1
  • GDPR-compliant (si bien configuré)
  • HIPAA eligible (avec BAA)

Votre responsabilité :

  • Configurer les services correctement
  • Implémenter les contrôles requis
  • Documenter
  • Auditer régulièrement

Outils :

  • AWS Audit Manager
  • Azure Compliance Manager
  • GCP Security Command Center

Erreurs de configuration fréquentes (Top 10)

1. Buckets accessibles publiquement

Erreur :

aws s3api put-bucket-acl --bucket mybucket --acl public-read

Impact : fuite de données, violation RGPD, dommage réputationnel

Fix :

resource "aws_s3_bucket_public_access_block" "mybucket" {
  bucket = aws_s3_bucket.mybucket.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

Vérifier tous les buckets :

aws s3api list-buckets --query "Buckets[].Name" | \
  xargs -I {} aws s3api get-bucket-acl --bucket {}

2. Politiques IAM trop permissives

Erreur : *:*

Fix : AWS IAM Access Analyzer

aws accessanalyzer create-analyzer \
  --analyzer-name my-analyzer \
  --type ACCOUNT

aws accessanalyzer list-findings --analyzer-arn arn:aws:...

3. MFA absent sur comptes privilégiés

Fix : Forcer MFA via Conditional Access (Azure) ou IAM policies (AWS)

4. Données non chiffrées au repos

Fix : Activer le chiffrement par défaut sur tous les services de stockage

5. Absence de logging/monitoring

Fix : Activer CloudTrail/Azure Monitor/Cloud Logging + alertes

6. Segmentation réseau faible

Fix : Implémenter une architecture VPC/subnet stricte + security groups

7. Ports de management exposés

Erreur : RDP (3389) ou SSH (22) ouverts vers 0.0.0.0/0

Fix : Bastion hosts ou AWS Systems Manager Session Manager

8. Patch management insuffisant

Fix :

  • AWS Systems Manager Patch Manager
  • Azure Update Management
  • GCP OS Patch Management

9. Backups/DR insuffisants

Fix :

  • Backups automatisés avec rétention
  • Réplication cross-region
  • Tests réguliers de restauration

10. Shadow IT / ressources non gérées

Fix :

  • Politiques de tagging
  • Cost allocation tags
  • Audits réguliers d'inventaire

Multi-Cloud Security

Défis :

  • Modèles IAM différents
  • Services sécurité variés
  • Conformité complexe
  • Fragmentation des outils

Solutions :

1. CSPM :

  • Wiz
  • Prisma Cloud
  • Orca Security
  • Microsoft Defender for Cloud

2. Identité unifiée :

  • Okta
  • Azure AD
  • Google Cloud Identity

3. Infrastructure as Code :

provider "aws" {
  region = "eu-central-1"
}

provider "azurerm" {
  features {}
}

provider "google" {
  project = "my-project"
  region  = "europe-west1"
}

# Politiques de sécurité cohérentes partout

DevSecOps: Security Automation

Shift-Left Security

Pre-Commit:

git secrets --install
git secrets --register-aws

CI/CD Pipeline:

name: Security Scan

on: [push]

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: TruffleHog Scan
        uses: trufflesecurity/trufflehog@main
      - name: SonarQube Scan
        uses: sonarsource/sonarqube-scan-action@master
      - name: Trivy Scan
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: 'myapp:latest'
      - name: Checkov Scan
        uses: bridgecrewio/checkov-action@master
        with:
          directory: terraform/
      
      # Fail si problèmes critiques
      - name: Check Results
        run: |
          if [ "$CRITICAL_ISSUES" -gt 0 ]; then
            echo "Critical security issues found!"
            exit 1
          fi

Infrastructure as Code Security

Scanner Terraform :

checkov -d terraform/
tfsec .

# Exemple de finding:
CRITICAL: S3 bucket not encrypted
  File: s3.tf:12
  Fix: Add encryption block

Auto-Remediation:

import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    bucket = event['detail']['requestParameters']['bucketName']
    s3.put_bucket_encryption(
        Bucket=bucket,
        ServerSideEncryptionConfiguration={
            'Rules': [{
                'ApplyServerSideEncryptionByDefault': {
                    'SSEAlgorithm': 'AES256'
                }
            }]
        }
    )

    print(f"Enabled encryption on {bucket}")

Cost Optimization vs. Security

Arbitrages courants :

MesureImpact coûtRecommandation
VPC Flow Logs+5-10%Indispensable
GuardDuty€5-10/compte/moisEssentiel
KMS Keys€1/clé/mois + APIDonnées sensibles
Multi-AZ DB+100%Obligatoire prod
CloudTrail Data EventsCoûteuxBuckets sensibles

Optimiser :

  • Savings Plans / Reservations
  • Right-size des instances (dev/test éteints la nuit)
  • Supprimer les ressources inutilisées (volumes, snapshots, IPs)
  • Spot instances pour workloads non critiques

Mais ne jamais compromettre :

  • Chiffrement
  • Logging
  • Backups
  • MFA

Conclusion

La sécurité cloud est complexe mais maîtrisable avec méthode :

Security Checklist :

  • MFA pour tous les comptes privilégiés
  • IAM least-privilege
  • Chiffrement at rest & in transit
  • Logging complet activé
  • Alertes sécurité
  • Blocage accès public par défaut
  • Private endpoints
  • Segmentation réseau
  • Scans de vulnérabilités
  • Backups & DR testés
  • Formation sécurité
  • Pen tests annuels

ATLAS Advisory a sécurisé 200+ environnements cloud, évitant ~€45M de coûts potentiels.

Besoin d'aide cloud security ?
Contactez notre équipe : cloud@atlas-advisory.eu

Découvrez notre service de conseil Cloud Security.


Resources

AWS Security:

Azure Security:

GCP Security:

Multi-Cloud:

Tools:

Related Articles:

Need Expert Cybersecurity Consulting?

Our team of certified security professionals can help implement the strategies discussed in this article.

Schedule a Consultation