Cloud Security Best Practices : AWS, Azure & GCP 2025
📄 Download Full Article
Get this 15 min read article as a markdown file for offline reading
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
| Couche | AWS responsable | Client 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 :
- Public Subnet : Load balancers, NAT, bastion hosts uniquement
- Private Subnet : serveurs applicatifs (pas d'accès direct Internet)
- 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 :
-
Utilisation compte root/admin
Alert: Root account login detected Action: Notification immédiate au SOC -
Privilege Escalation
Alert: IAM policy changed to grant admin rights Action: Approbation + audit -
Exposition publique de ressources
Alert: S3 bucket made public Action: Auto-remediate + notification -
Appels API inhabituels
Alert: API calls from unknown geography Action: Vérifier compromission -
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 :
| Mesure | Impact coût | Recommandation |
|---|---|---|
| VPC Flow Logs | +5-10% | Indispensable |
| GuardDuty | €5-10/compte/mois | Essentiel |
| KMS Keys | €1/clé/mois + API | Données sensibles |
| Multi-AZ DB | +100% | Obligatoire prod |
| CloudTrail Data Events | Coûteux | Buckets 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:
- Google Cloud Security Best Practices
- GCP Security Command Center
- Google Cloud Architecture Framework - Security
Multi-Cloud:
- Cloud Security Alliance (CSA)
- CIS Benchmarks - AWS, Azure, GCP
- NIST Cloud Computing Security
Tools:
- ScoutSuite - Multi-cloud auditing
- Prowler - AWS/Azure/GCP assessment
- CloudMapper - AWS network visualization
- Steampipe - SQL for cloud APIs
Related Articles:
Need Expert Cybersecurity Consulting?
Our team of certified security professionals can help implement the strategies discussed in this article.
Schedule a Consultation