Module 13 Governance 5 labs

Multi-cloud Governance & Landing Zone

Thiết kế Landing Zone chuẩn doanh nghiệp trên AWS/Azure/GCP: phân cấp account/subscription/project, IAM theo least-privilege, policy guardrail, tagging standard, budget alert và centralized logging — nền tảng governance cho mọi môi trường multi-cloud.

Công cụ thực hành AWS CLI, Azure CLI, gcloud CLI, Terraform, VS Code
Nền tảng AWS (Organizations, IAM, CloudTrail) · Azure (Management Groups, Policy) · GCP (Resource Hierarchy)
Thời điểm phát hành 23/05/2026
Ngày biên soạn 23/05/2026
Người biên soạn Trần Văn Hòa — Microsoft Certified Trainer (MCT)

Mục tiêu học tập

1. Lý thuyết cốt lõi

1.1. Landing Zone là gì?

Landing Zone là môi trường nền tảng đã được pre-configured để host workload theo chuẩn bảo mật, governance và vận hành từ ngày đầu. Hãy hình dung như một ngôi nhà: nền móng (network, IAM, security baseline) phải đổ xong trước khi dọn đồ (workload) vào. Mỗi cloud provider có framework riêng: AWS Control Tower, Azure Landing Zone (CAF), Google Cloud Foundation Toolkit.

4 giai đoạn Landing Zone

  • Design — xác định tham số: security controls, IAM, network topology, naming convention.
  • Deploy — AWS Control Tower / Azure Blueprints / GCP Deployment Manager tạo môi trường từ template.
  • Operate — quản lý ngày-ngày: enforce policy, monitor cost, review access.
  • Update — feedback từ Ops phải vòng lại Design để cải tiến liên tục.

1.2. Account / Subscription / Project Structure

Mỗi cloud có đơn vị tổ chức khác nhau nhưng cùng mục đích: phân tách blast radius, phân bổ chi phí, áp dụng policy riêng biệt.

TầngAWSAzureGCP
Root/TenantManagement AccountAzure AD TenantOrganization
GroupOrganizational Unit (OU)Management GroupFolder
Đơn vị billingAWS AccountSubscriptionProject
Policy scopeSCP (Service Control Policy)Azure Policy / InitiativeOrg Policy Constraint

Mẫu phổ biến: OU/MG Prod → Accounts/Subscriptions prod-app-team-a, prod-shared-services; OU/MG NonProddev-team-a, staging-team-a. Mỗi account/subscription là một blast-radius boundary: sự cố không lan sang account khác.

1.3. IAM & Least-Privilege

Trong cloud, mọi thứ đều là identity: người dùng, service account, lambda function, VM instance. Nguyên tắc least-privilege: cấp đúng quyền cần thiết, đúng resource, đúng thời điểm. Các cơ chế:

1.4. Policy Guardrails

Policy guardrail ngăn chặn hành động vi phạm trước khi xảy ra (preventive) hoặc phát hiện & report sau khi xảy ra (detective). Phân loại:

1.5. Tagging Standard & Cost Management

Tag là metadata gắn vào resource để identify, allocate cost, enforce policy. Tag bắt buộc tối thiểu cho doanh nghiệp:

Tag KeyGiá trị mẫuMục đích
Environmentprod / staging / devPhân tách môi trường
Ownerteam-platform / john.doeChargeback chi phí
CostCenterCC-1234Phân bổ ngân sách
Applicationmyapp-apiNhóm resource theo app
ManagedByterraform / manualTruy vết IaC ownership

1.6. Centralized Logging & Security Baseline

Centralized logging = thu thập toàn bộ audit log từ mọi account/subscription vào một kho duy nhất — không thể xóa bởi account thành viên. Các thành phần:

2. Thực hành (Labs)

LAB-061

Thiết kế multi-cloud landing zone (diagram-as-code)

CLI · VS Code · Git

🎯 Mục tiêu: Vẽ sơ đồ phân cấp account/subscription/project cho một doanh nghiệp 3 team (platform, app-a, app-b) trên cả AWS và Azure; xác định boundary, IAM scope, policy scope.

🧰 Công cụ / nền tảng: VS Code + extension "Markdown Preview Mermaid Support", Git.

📦 Chuẩn bị: Cài VS Code extension bierner.markdown-mermaid; có tài khoản GitHub.

▶️ Các bước:

# 1. Tạo workspace
mkdir landing-zone-design && cd landing-zone-design
git init

# 2. Tạo file design
code landing-zone.md

Nội dung landing-zone.md — phân cấp AWS Organizations:

## AWS Organizations Structure

```mermaid
graph TD
    Root["Root (Management Account)"]
    Root --> OU_Prod["OU: Production"]
    Root --> OU_NonProd["OU: NonProd"]
    Root --> OU_Shared["OU: Shared Services"]
    OU_Prod --> Acc_ProdAppA["Account: prod-app-a"]
    OU_Prod --> Acc_ProdAppB["Account: prod-app-b"]
    OU_NonProd --> Acc_DevAppA["Account: dev-app-a"]
    OU_NonProd --> Acc_Staging["Account: staging-app-a"]
    OU_Shared --> Acc_LogArchive["Account: log-archive (IMMUTABLE)"]
    OU_Shared --> Acc_Security["Account: security-tooling"]
    OU_Shared --> Acc_Network["Account: network-hub"]
```

## Azure Management Group Structure

```mermaid
graph TD
    Tenant["Azure AD Tenant (Root MG)"]
    Tenant --> MG_Prod["MG: Production"]
    Tenant --> MG_NonProd["MG: NonProd"]
    Tenant --> MG_Platform["MG: Platform"]
    MG_Prod --> Sub_ProdAppA["Subscription: prod-app-a"]
    MG_Prod --> Sub_ProdAppB["Subscription: prod-app-b"]
    MG_NonProd --> Sub_Dev["Subscription: dev-shared"]
    MG_Platform --> Sub_Connectivity["Subscription: connectivity-hub"]
    MG_Platform --> Sub_Management["Subscription: management (logs)"]
```
# 3. Bổ sung bảng decision matrix: khi nào dùng Account vs OU
cat >> landing-zone.md << 'EOF'

## Decision: Khi nào tạo Account/Subscription riêng?
| Tiêu chí              | Tạo Account mới |
|-----------------------|----------------|
| Môi trường khác nhau  | Luôn luôn       |
| Team/BU khác nhau     | Khuyến nghị     |
| Compliance riêng biệt | Bắt buộc        |
| Chi phí cần tách biệt | Khuyến nghị     |
EOF

# 4. Commit
git add .
git commit -m "lab-061: multi-cloud landing zone design diagram"

🖥️ Đối chiếu GUI: Ctrl+K V trong VS Code để preview Mermaid diagram trực tiếp.

✅ Kết quả mong đợi: 2 sơ đồ render đúng; phân biệt rõ Management Account/Subscription và Workload Account/Subscription; bảng decision matrix đầy đủ.

🧹 Cleanup: giữ lại repo làm tài liệu thiết kế.

LAB-062

Tạo tagging standard và enforce bằng Azure Policy

Azure CLI · VS Code · Git

🎯 Mục tiêu: Định nghĩa tagging standard và tạo Azure Policy Initiative yêu cầu tag Environment, Owner, CostCenter trên mọi resource group; test deny effect.

🧰 Công cụ / nền tảng: Azure CLI (az), Azure Subscription (free tier đủ dùng), Git, VS Code.

📦 Chuẩn bị: az login; chạy az account show xác nhận đúng subscription.

▶️ Các bước (Azure CLI):

# 1. Tạo custom policy definition: require tag "Environment"
az policy definition create \
  --name "require-tag-environment" \
  --display-name "Require Environment tag on Resource Groups" \
  --description "Deny creation of RG without Environment tag" \
  --mode "All" \
  --rules '{
    "if": {
      "allOf": [
        {"field": "type", "equals": "Microsoft.Resources/subscriptions/resourceGroups"},
        {"field": "tags[Environment]", "exists": "false"}
      ]
    },
    "then": {"effect": "deny"}
  }'

# 2. Tạo thêm policy cho tag "Owner"
az policy definition create \
  --name "require-tag-owner" \
  --display-name "Require Owner tag on Resource Groups" \
  --mode "All" \
  --rules '{
    "if": {
      "allOf": [
        {"field": "type", "equals": "Microsoft.Resources/subscriptions/resourceGroups"},
        {"field": "tags[Owner]", "exists": "false"}
      ]
    },
    "then": {"effect": "deny"}
  }'

# 3. Tạo Policy Initiative gom 2 policy trên
SUBSCRIPTION_ID=$(az account show --query id -o tsv)

az policy set-definition create \
  --name "tagging-standard-initiative" \
  --display-name "Tagging Standard Initiative" \
  --definitions "[
    {\"policyDefinitionId\": \"/subscriptions/${SUBSCRIPTION_ID}/providers/Microsoft.Authorization/policyDefinitions/require-tag-environment\"},
    {\"policyDefinitionId\": \"/subscriptions/${SUBSCRIPTION_ID}/providers/Microsoft.Authorization/policyDefinitions/require-tag-owner\"}
  ]"

# 4. Assign initiative tới subscription
az policy assignment create \
  --name "assign-tagging-standard" \
  --display-name "Tagging Standard Assignment" \
  --policy-set-definition "tagging-standard-initiative" \
  --scope "/subscriptions/${SUBSCRIPTION_ID}"

echo "Policy assigned. Waiting ~30s for propagation..."
sleep 30
# 5. TEST: thử tạo RG không có tag → phải bị Deny
az group create --name "test-no-tag-rg" --location "eastus"
# Kết quả: RequestDisallowedByPolicy error

# 6. TEST: tạo RG có đủ tag → phải thành công
az group create \
  --name "test-tagged-rg" \
  --location "eastus" \
  --tags Environment=dev Owner=john.doe CostCenter=CC-1234
# Kết quả: Created successfully

# 7. Xác nhận tag đã gắn
az group show --name "test-tagged-rg" --query tags

🖥️ Đối chiếu GUI: Azure Portal → Policy → Assignments → xem assignment và compliance state.

✅ Kết quả mong đợi: RG không tag bị từ chối với error RequestDisallowedByPolicy; RG có đủ tag tạo thành công; az group show trả về tags JSON đúng.

🧹 Cleanup:

az group delete --name "test-tagged-rg" --yes --no-wait
az policy assignment delete --name "assign-tagging-standard" --scope "/subscriptions/${SUBSCRIPTION_ID}"
az policy set-definition delete --name "tagging-standard-initiative"
az policy definition delete --name "require-tag-environment"
az policy definition delete --name "require-tag-owner"
LAB-063

Tạo policy guardrail mẫu — AWS SCP & Azure Policy Deny

AWS CLI · Azure CLI · VS Code

🎯 Mục tiêu: Viết SCP (AWS) chặn deploy resource ngoài region cho phép; viết Azure Policy chặn tạo resource không dùng HTTPS; kiểm tra enforcement.

🧰 Công cụ / nền tảng: AWS CLI + Organizations (cần Management Account), Azure CLI, VS Code.

📦 Chuẩn bị: AWS: cấu hình aws configure với credentials của Management Account. Azure: az login.

▶️ Phần A — AWS SCP: chặn region ngoài ap-southeast-1:

# 1. Tạo file SCP JSON
cat > scp-region-lock.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyNonApSoutheast1",
      "Effect": "Deny",
      "NotAction": [
        "iam:*",
        "organizations:*",
        "route53:*",
        "budgets:*",
        "waf:*",
        "cloudfront:*",
        "sts:*",
        "support:*",
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": ["ap-southeast-1"]
        }
      }
    }
  ]
}
EOF

# 2. Tạo SCP trong Organizations
aws organizations create-policy \
  --name "DenyNonSEA1Region" \
  --description "Block all resource creation outside ap-southeast-1" \
  --type SERVICE_CONTROL_POLICY \
  --content file://scp-region-lock.json

# Lưu policy ID từ output
POLICY_ID=$(aws organizations list-policies \
  --filter SERVICE_CONTROL_POLICY \
  --query "Policies[?Name=='DenyNonSEA1Region'].Id" \
  --output text)
echo "SCP ID: $POLICY_ID"

# 3. Attach SCP vào OU (thay  bằng ID thực)
# aws organizations attach-policy --policy-id $POLICY_ID --target-id 

▶️ Phần B — Azure Policy: chặn Storage Account dùng HTTP:

# 1. Tạo policy definition chặn Storage không dùng HTTPS
az policy definition create \
  --name "deny-storage-http" \
  --display-name "Deny Storage Account allowing HTTP traffic" \
  --mode "All" \
  --rules '{
    "if": {
      "allOf": [
        {"field": "type", "equals": "Microsoft.Storage/storageAccounts"},
        {"field": "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly", "equals": "false"}
      ]
    },
    "then": {"effect": "deny"}
  }'

SUBSCRIPTION_ID=$(az account show --query id -o tsv)

# 2. Assign policy
az policy assignment create \
  --name "deny-storage-http-assignment" \
  --policy "deny-storage-http" \
  --scope "/subscriptions/${SUBSCRIPTION_ID}"

sleep 30  # propagation delay

# 3. TEST: thử tạo storage với httpsOnly=false
az group create --name "policy-test-rg" --location "eastus" \
  --tags Environment=dev Owner=test CostCenter=CC-999

az storage account create \
  --name "policyteststore$(date +%s)" \
  --resource-group "policy-test-rg" \
  --location "eastus" \
  --sku Standard_LRS \
  --https-only false
# Kết quả mong đợi: RequestDisallowedByPolicy

# 4. TEST đúng: tạo storage với httpsOnly=true
az storage account create \
  --name "policygoodstore$(date +%s)" \
  --resource-group "policy-test-rg" \
  --location "eastus" \
  --sku Standard_LRS \
  --https-only true
# Kết quả mong đợi: Succeeded

✅ Kết quả mong đợi: AWS SCP tạo thành công với Policy ID; Azure: storage HTTP bị deny, storage HTTPS tạo được.

🧹 Cleanup:

# Azure cleanup
az group delete --name "policy-test-rg" --yes --no-wait
az policy assignment delete --name "deny-storage-http-assignment" --scope "/subscriptions/${SUBSCRIPTION_ID}"
az policy definition delete --name "deny-storage-http"

# AWS: detach và delete SCP (nếu đã attach)
# aws organizations detach-policy --policy-id $POLICY_ID --target-id 
aws organizations delete-policy --policy-id $POLICY_ID
LAB-064

Tạo budget alert trên AWS và Azure

AWS CLI · Azure CLI · PowerShell

🎯 Mục tiêu: Tạo budget $50/tháng trên AWS với alert khi đạt 80% và 100%; tạo budget tương đương trên Azure; xác nhận alert notification được cấu hình đúng.

🧰 Công cụ / nền tảng: AWS CLI (Budgets), Azure CLI, PowerShell (Windows).

📦 Chuẩn bị: AWS: cần quyền budgets:CreateBudget trên management/member account. Azure: az login với quyền Contributor trở lên.

▶️ Phần A — AWS Budget:

# 1. Lấy Account ID
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
echo "Account ID: $AWS_ACCOUNT_ID"

# 2. Tạo file budget JSON
cat > budget-50usd.json << 'EOF'
{
  "BudgetName": "monthly-50usd-limit",
  "BudgetLimit": {"Amount": "50", "Unit": "USD"},
  "TimeUnit": "MONTHLY",
  "BudgetType": "COST",
  "CostFilters": {},
  "CostTypes": {
    "IncludeTax": true,
    "IncludeSubscription": true,
    "UseBlended": false,
    "IncludeRefund": false,
    "IncludeCredit": false,
    "IncludeUpfront": true,
    "IncludeRecurring": true,
    "IncludeOtherSubscription": true,
    "IncludeSupport": true,
    "IncludeDiscount": true,
    "UseAmortized": false
  }
}
EOF

# 3. Tạo notification JSON
cat > budget-notifications.json << 'EOF'
[
  {
    "Notification": {
      "NotificationType": "ACTUAL",
      "ComparisonOperator": "GREATER_THAN",
      "Threshold": 80,
      "ThresholdType": "PERCENTAGE"
    },
    "Subscribers": [
      {"SubscriptionType": "EMAIL", "Address": "[email protected]"}
    ]
  },
  {
    "Notification": {
      "NotificationType": "ACTUAL",
      "ComparisonOperator": "GREATER_THAN",
      "Threshold": 100,
      "ThresholdType": "PERCENTAGE"
    },
    "Subscribers": [
      {"SubscriptionType": "EMAIL", "Address": "[email protected]"}
    ]
  }
]
EOF

# 4. Tạo budget
aws budgets create-budget \
  --account-id $AWS_ACCOUNT_ID \
  --budget file://budget-50usd.json \
  --notifications-with-subscribers file://budget-notifications.json

# 5. Xác nhận budget đã tạo
aws budgets describe-budgets \
  --account-id $AWS_ACCOUNT_ID \
  --query "Budgets[?BudgetName=='monthly-50usd-limit']"

▶️ Phần B — Azure Budget (PowerShell):

# Dùng PowerShell (Windows) hoặc Azure CLI
$SUBSCRIPTION_ID = az account show --query id -o tsv

# Tạo budget qua Azure CLI (REST API)
az consumption budget create \
  --budget-name "monthly-50usd-limit" \
  --amount 50 \
  --time-grain Monthly \
  --start-date "2026-05-01" \
  --end-date "2027-12-31" \
  --resource-group-filter "prod-app-a-rg" \
  --category Cost

# Thêm alert notification (80% actual)
az consumption budget create \
  --budget-name "monthly-50usd-limit-alert" \
  --amount 50 \
  --time-grain Monthly \
  --start-date "2026-05-01" \
  --end-date "2027-12-31" \
  --category Cost \
  --notifications "[{\"enabled\":true,\"operator\":\"GreaterThan\",\"threshold\":80,\"contactEmails\":[\"[email protected]\"],\"thresholdType\":\"Actual\"}]"

# Xác nhận
az consumption budget list --query "[?name=='monthly-50usd-limit-alert']"

🖥️ Đối chiếu GUI: AWS: Billing Console → Budgets. Azure: Cost Management + Billing → Budgets → xem budget chart và alert thresholds.

✅ Kết quả mong đợi: AWS: describe-budgets trả về budget object với 2 notification (80%, 100%). Azure: budget hiển thị trong Cost Management với alert threshold đã cấu hình.

🧹 Cleanup:

# AWS
aws budgets delete-budget --account-id $AWS_ACCOUNT_ID --budget-name "monthly-50usd-limit"

# Azure
az consumption budget delete --budget-name "monthly-50usd-limit-alert"
LAB-065

Thiết kế centralized logging — CloudTrail + Log Analytics

AWS CLI · Azure CLI · VS Code

🎯 Mục tiêu: Bật CloudTrail multi-region cho AWS account và gửi logs vào S3 với encryption; tạo Log Analytics Workspace trên Azure và kết nối Diagnostic Settings từ resource group; query log xác nhận dữ liệu vào đúng.

🧰 Công cụ / nền tảng: AWS CLI (CloudTrail, S3, KMS), Azure CLI (Monitor, Log Analytics).

📦 Chuẩn bị: AWS: quyền cloudtrail:*, s3:*, kms:*. Azure: Contributor + Log Analytics Contributor.

▶️ Phần A — AWS CloudTrail:

# 1. Tạo S3 bucket cho log archive (bucket name phải unique)
BUCKET_NAME="cloudtrail-logs-$(aws sts get-caller-identity --query Account --output text)-$(date +%s)"
REGION="ap-southeast-1"

aws s3api create-bucket \
  --bucket $BUCKET_NAME \
  --region $REGION \
  --create-bucket-configuration LocationConstraint=$REGION

echo "Bucket: $BUCKET_NAME"

# 2. Gắn bucket policy cho CloudTrail write (policy template)
cat > s3-cloudtrail-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSCloudTrailAclCheck",
      "Effect": "Allow",
      "Principal": {"Service": "cloudtrail.amazonaws.com"},
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::${BUCKET_NAME}"
    },
    {
      "Sid": "AWSCloudTrailWrite",
      "Effect": "Allow",
      "Principal": {"Service": "cloudtrail.amazonaws.com"},
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::${BUCKET_NAME}/AWSLogs/*",
      "Condition": {
        "StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}
      }
    }
  ]
}
EOF

aws s3api put-bucket-policy \
  --bucket $BUCKET_NAME \
  --policy file://s3-cloudtrail-policy.json

# 3. Bật versioning và block public access
aws s3api put-bucket-versioning \
  --bucket $BUCKET_NAME \
  --versioning-configuration Status=Enabled

aws s3api put-public-access-block \
  --bucket $BUCKET_NAME \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

# 4. Tạo CloudTrail multi-region
aws cloudtrail create-trail \
  --name "org-audit-trail" \
  --s3-bucket-name $BUCKET_NAME \
  --is-multi-region-trail \
  --enable-log-file-validation \
  --include-global-service-events

# 5. Bật trail
aws cloudtrail start-logging --name "org-audit-trail"

# 6. Xác nhận trail đang running
aws cloudtrail get-trail-status --name "org-audit-trail" \
  --query '{IsLogging: IsLogging, LatestDeliveryTime: LatestDeliveryTime}'

▶️ Phần B — Azure Log Analytics Workspace:

# 1. Tạo Resource Group cho management
az group create \
  --name "management-rg" \
  --location "southeastasia" \
  --tags Environment=management Owner=platform-team CostCenter=CC-PLATFORM

# 2. Tạo Log Analytics Workspace
az monitor log-analytics workspace create \
  --resource-group "management-rg" \
  --workspace-name "central-log-workspace" \
  --location "southeastasia" \
  --sku PerGB2018 \
  --retention-time 90

# Lấy Workspace ID
WORKSPACE_ID=$(az monitor log-analytics workspace show \
  --resource-group "management-rg" \
  --workspace-name "central-log-workspace" \
  --query id -o tsv)

echo "Workspace ID: $WORKSPACE_ID"

# 3. Tạo Diagnostic Setting cho Activity Log (subscription level)
SUBSCRIPTION_ID=$(az account show --query id -o tsv)

az monitor diagnostic-settings create \
  --name "activity-log-to-workspace" \
  --resource "/subscriptions/${SUBSCRIPTION_ID}" \
  --workspace $WORKSPACE_ID \
  --logs '[{"category": "Administrative", "enabled": true},
           {"category": "Security", "enabled": true},
           {"category": "ServiceHealth", "enabled": true},
           {"category": "Alert", "enabled": true},
           {"category": "Policy", "enabled": true}]'

# 4. Sau ~5 phút, query log để xác nhận
az monitor log-analytics query \
  --workspace $WORKSPACE_ID \
  --analytics-query "AzureActivity | where TimeGenerated > ago(1h) | summarize count() by OperationNameValue | top 10 by count_" \
  --output table

🖥️ Đối chiếu GUI: AWS: CloudTrail Console → Event history → xem API calls. Azure: Log Analytics → Logs → chạy KQL query.

✅ Kết quả mong đợi: AWS: IsLogging: true; S3 bucket nhận log files sau vài phút. Azure: query KQL trả về bảng OperationNameValue với count > 0.

🧹 Cleanup:

# AWS
aws cloudtrail stop-logging --name "org-audit-trail"
aws cloudtrail delete-trail --name "org-audit-trail"
aws s3 rb s3://$BUCKET_NAME --force

# Azure
az monitor diagnostic-settings delete \
  --name "activity-log-to-workspace" \
  --resource "/subscriptions/${SUBSCRIPTION_ID}"
az group delete --name "management-rg" --yes --no-wait

3. Tình huống doanh nghiệp thực tế

Bối cảnh

Một fintech startup tăng trưởng nhanh, 5 team product chạy riêng lẻ trên cùng 1 AWS account và 1 Azure subscription. Team nào cũng có full admin. Cuối tháng hóa đơn không rõ ai tiêu cái gì; một developer vô tình xóa S3 bucket production; security audit phát hiện 3 S3 bucket public.

Cách xử lý (Landing Zone Approach)

  • Phân tách account: tạo OU Prod/NonProd/Shared, mỗi team product có account riêng → blast radius nhỏ, không ai xóa nhầm resource của team khác.
  • IAM least-privilege: xóa AdministratorAccess khỏi developer; tạo Role DevReadWrite chỉ có quyền trên namespace/tag của team; dùng SCP chặn s3:DeleteBucket nếu không có MFA.
  • Policy guardrail: SCP DenyS3PublicAccess ở OU level; Azure Policy deny-storage-http → không thể vô tình để bucket/storage public.
  • Tagging + budget: enforce tag Team, Environment; budget per account → biết ngay team nào tốn nhiều nhất, alert trước khi vượt ngân sách.
  • Centralized logging: CloudTrail từ tất cả account → S3 Log Archive (chỉ Security team đọc được) → GuardDuty → alert → điều tra ngay sự cố S3 deletion.
  • Kết quả: chi phí phân bổ rõ ràng; không còn sự cố cross-team; audit pass nhờ immutable trail logs.

📚 Nguồn tham khảo

Module 12: Hybrid Cloud Design Module 14: Docker & Container Image
Zalo