| name | cloud-defense-hardening |
| description | Guide complet de durcissement et défense cloud — CIS benchmarks, Security Score, hardening AWS/GCP/Azure, least privilege, network segmentation, encryption, logging, et monitoring |
| category | cybersecurite |
Cloud Defense & Hardening — Guide Multi-Cloud
Principes Fondamentaux
Shared Responsibility Model
┌─────────────────────────────────────────────────┐
│ CUSTOMER │
│ Données, Chiffrement côté client, IAM, Réseau │
├─────────────────────────────────────────────────┤
│ CLOUD PROVIDER │
│ Infrastructure physique, Hyperviseur, Réseau │
│ (AWS: jusqu'à l'OS hôte | SaaS: jusqu'à l'app) │
└─────────────────────────────────────────────────┘
Pillars de la Défense Cloud
- Identity & Access — Least privilege, MFA, Zero Trust
- Network Security — Segmentation, micro-segmentation, WAF
- Data Protection — Encryption at rest/in transit, key management
- Logging & Monitoring — Audit trails, SIEM, threat detection
- Compliance — CIS benchmarks, regulatory frameworks
- Incident Response — Playbooks, forensic readiness
- Infrastructure — Secure IaC, patch management, scanning
1. CIS Benchmarks par Provider
AWS CIS Foundations Benchmark
pip install prowler
prowler aws -g cis_1.4
prowler aws -g cis_1.5
prowler aws -M csv,json,html
GCP CIS Benchmark
prowler gcp -p <project-id> -g cis_1.2
scout gcp --project-id <project>
Azure CIS Benchmark
prowler azure -g cis_2.0
az security secure-score list --output table
2. IAM Hardening
AWS IAM Hardening
aws iam update-account-password-policy \
--minimum-password-length 16 \
--require-symbols \
--require-numbers \
--require-uppercase-characters \
--require-lowercase-characters \
--allow-users-to-change-password \
--max-password-age 90 \
--password-reuse-prevention 24
aws iam list-user-policies --user-name <user>
aws iam put-user-permissions-boundary \
--user-name <user> \
--permissions-boundary arn:aws:iam::...:policy/boundary
aws iam create-policy --policy-name EnforceMFAPolicy --policy-document file://mfa-policy.json
aws accessanalyzer create-analyzer --analyzer-name <name> --type ACCOUNT
GCP IAM Hardening
gcloud iam service-accounts list
gcloud iam service-accounts disable <email>
gcloud projects get-iam-policy <project> --format json | jq '.bindings[] | select(.role | test("owner|editor"))'
gcloud projects add-iam-policy-binding <project> \
--member user:email@domain.com \
--role roles/storage.objectViewer \
--condition "expression=request.time < timestamp('2026-01-01T00:00:00Z'),title=temp-access"
gcloud compute project-info add-metadata --metadata enable-oslogin=TRUE
Azure RBAC Hardening
az role definition create --role-definition @custom-role.json
az rest --method get --url "https://management.azure.com/providers/Microsoft.Authorization/roleEligibilityScheduleInstances?api-version=2020-10-01"
az vm assign-identity --name <vm> --resource-group <RG>
3. Data Protection
Encryption at Rest
aws kms create-key --description "Production Key"
aws s3api put-bucket-encryption --bucket <name> --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"<key-id>"}}]}'
gcloud kms keyrings create prod --location global
gcloud kms keys create prod-key --keyring prod --location global --purpose encryption
gcloud storage buckets update gs://<bucket> --encryption-key projects/<project>/locations/global/keyRings/prod/cryptoKeys/prod-key
az storage account update --name <account> --resource-group <RG> --encryption-key-name <key> --encryption-key-source Microsoft.Keyvault
Encryption in Transit
gcloud compute ssl-policies create tls-1-2 --profile MODERN --min-tls-version 1.2
az webapp update --name <app> --resource-group <RG> --https-only true
Secrets Management
aws secretsmanager rotate-secret --secret-id <name>
gcloud secrets add-iam-policy-binding <secret> --member user:email@domain.com --role roles/secretmanager.secretAccessor
az keyvault update --name <vault> --enable-soft-delete true --enable-purge-protection true
4. Network Security
AWS Network Hardening
aws ec2 create-flow-logs --resource-type VPC --resource-id vpc-xxx --traffic-type ALL --log-group-name vpc-flow-logs
aws ec2 create-network-acl-entry --network-acl-id acl-xxx --rule-number 100 --protocol tcp --port-range From=443,To=443 --cidr-block 10.0.0.0/8 --rule-action allow --egress
aws wafv2 create-web-acl --name waf-prod --scope REGIONAL --default-action Allow={} --rules file://waf-rules.json
aws shield create-subscription
aws ec2 create-vpc-endpoint --vpc-id vpc-xxx --service-name com.amazonaws.region.s3
GCP Network Hardening
gcloud compute firewall-rules create deny-all --direction INGRESS --priority 65535 --action DENY --rules all
gcloud compute networks subnets update <subnet> --enable-private-ip-google-access
gcloud access-context-manager perimeters create <perimeter> --perimeter-type regular --resources projects/<project> --restricted-services storage.googleapis.com
gcloud compute security-policies create waf-policy
gcloud compute security-policies rules create 1000 --security-policy waf-policy --action "deny(403)" --expression "evaluatePreconfiguredExpr('xss-v33-stable')"
gcloud compute packet-mirrorings create mirror --collector-ilb <ilb> --network <vpc> --filter direction=INGRESS
Azure Network Hardening
az network nsg rule create --nsg-name <NSG> --resource-group <RG> --name Allow-HTTPS --priority 100 --direction Inbound --access Allow --protocol Tcp --destination-port-ranges 443 --source-address-prefixes VirtualNetwork
az network firewall create --name <fw> --resource-group <RG> --sku AZFW_VNet
az network ddos-protection create --resource-group <RG> --name ddos-protection --vnets <vnet>
az network private-endpoint create --name <pe> --resource-group <RG> --vnet-name <vnet> --subnet <subnet> --private-connection-resource-id <resource-id>
5. Logging & Monitoring
AWS Logging
aws cloudtrail create-trail --name prod-trail --s3-bucket-name <bucket> --is-multi-region-trail --enable-log-file-validation
aws cloudtrail update-trail --name prod-trail --is-organization-trail
aws guardduty create-detector --enable
aws securityhub enable-security-hub
aws configservice put-config-rule --config-rule file://s3-public-read-prohibited.json
aws cloudwatch put-metric-alarm --alarm-name RootActivity --metric-name RootAccountUsage --namespace AWS/CloudTrail --statistic Sum --period 300 --evaluation-periods 1 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold
GCP Logging
gcloud projects get-iam-policy <project> --format json | jq '.auditConfigs'
gcloud logging sinks create prod-sink bigquery.googleapis.com/projects/<project>/datasets/audit --log-filter="severity>=WARNING"
gcloud scc notifications create <notification> --organization <org> --description "Security alerts"
gcloud scc mute-configs create auto-mute --description "Auto-mute low severity"
Azure Monitoring
az monitor diagnostic-settings create --name "audit" --resource <id> --logs '[{"category":"AuditEvent","enabled":true}]' --workspace <ws-id>
az sentinel setting set --workspace-name <ws> --resource-group <RG> --entity-analytics enabled
az policy assignment create --policy "Audit unrestricted network access to storage accounts" --name audit-storage
az monitor metrics alert create --name "High CPU" --resource-group <RG> --scopes <vm-id> --condition "avg Percentage CPU > 90" --window-size 5m --evaluation-frequency 1m
6. Infrastructure as Code Security
Terraform Security
checkov -d ./terraform/ --framework terraform
checkov -f main.tf --output cli,sarif
tfsec ./terraform/
tfsec --config-file .tfsec/config.yml
terrascan scan -d ./terraform/ -t aws
Secure IaC Patterns
# AWS S3 — private par défaut
resource "aws_s3_bucket" "data" {
bucket = "secure-bucket-${var.environment}"
}
resource "aws_s3_bucket_public_access_block" "data" {
bucket = aws_s3_bucket.data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_server_side_encryption_configuration" "data" {
bucket = aws_s3_bucket.data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "aws:kms"
}
}
}
# GCP — deny public buckets
resource "google_storage_bucket_iam_binding" "no_public" {
bucket = google_storage_bucket.data.name
role = "roles/storage.objectViewer"
members = [
"serviceAccount:${google_service_account.data.email}"
]
}
# Azure — deny public network access
resource "azurerm_storage_account" "secure" {
name = "securesa${var.environment}"
account_tier = "Standard"
account_replication_type = "GRS"
allow_nested_items_to_be_public = false
public_network_access_enabled = false
network_rules {
default_action = "Deny"
}
}
7. Container Security
Image Scanning
trivy image --severity CRITICAL,HIGH <image>
trivy repo --severity CRITICAL https://github.com/org/repo
trivy fs --severity CRITICAL ./deployment/
grype <image> --fail-on high
clair-scanner --ip <host> --report output.json <image>
Admission Controllers
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: deny-privileged
spec:
validationFailureAction: enforce
rules:
- name: check-privileged
match:
resources:
kinds:
- Pod
validate:
message: "Privileged containers are not allowed"
pattern:
spec:
containers:
- securityContext:
privileged: false
8. Cloud Security Tools Matrix
| Outil | AWS | GCP | Azure | Usage |
|---|
| Prowler | ✓ | ✓ | ✓ | Audit CIS + custom |
| ScoutSuite | ✓ | ✓ | ✓ | Configuration audit |
| Checkov | ✓ | ✓ | ✓ | IaC scanning |
| Trivy | ✓ | ✓ | ✓ | Image/FS/Repo scan |
| CloudSploit | ✓ | ✓ | ✓ | Security scanning |
| kube-bench | ✓ | ✓ | ✓ | K8s CIS benchmark |
| kubescape | ✓ | ✓ | ✓ | K8s security |
| tfsec | ✓ | ✓ | ✓ | Terraform security |
| Security Hub | ✓ | ✗ | ✗ | AWS native |
| Security Command Center | ✗ | ✓ | ✗ | GCP native |
| Defender for Cloud | ✗ | ✗ | ✓ | Azure native |
Ressources