AWS Control Tower Kurulumu ve Yapılandırması

Büyük ölçekli AWS ortamlarını yönetmeye çalışanlar için hesap kaosunun ne kadar hızlı büyüyebildiğini biliyorsunuzdur. Bir anda elimizde onlarca hesap oluyor, her birinde farklı güvenlik politikaları, farklı maliyet merkezleri ve birbirinden kopuk yapılar ortaya çıkıyor. İşte AWS Control Tower tam bu noktada devreye giriyor. Multi-account stratejisini merkezi bir şekilde yönetmek, güvenlik baseline’larını otomatik uygulamak ve uyumluluk gereksinimlerini karşılamak için geliştirilmiş bu servis, AWS ortamınızı gerçek anlamda yönetilebilir hale getiriyor.

Bu yazıda AWS Control Tower’ı sıfırdan nasıl kuracağınızı, hangi ön koşulları sağlamanız gerektiğini, Landing Zone oluştururken nelere dikkat etmeniz gerektiğini ve production ortamında sık karşılaşılan sorunları nasıl çözeceğinizi adım adım ele alacağız.

AWS Control Tower Nedir ve Neden Kullanmalıyız?

AWS Control Tower, AWS Organizations üzerine inşa edilmiş bir yönetim ve yönetişim (governance) servisidir. Tek başına Organizations kullanarak da multi-account yapı kurabilirsiniz, ancak Control Tower buna ek olarak şunları sağlar:

  • Landing Zone: Otomatik olarak yapılandırılmış, güvenli bir multi-account ortamı
  • Guardrails (Korumaları): Önceden tanımlanmış politikalar ve kısıtlamalar
  • Account Factory: Standartlaştırılmış hesap oluşturma süreci
  • AWS SSO entegrasyonu: Merkezi kimlik yönetimi
  • Merkezi loglama: CloudTrail ve Config verileri tek bir S3 bucket’ında

Gerçek dünya senaryosunu düşünelim: Bir fintech şirketinde çalışıyorsunuz ve GDPR, PCI-DSS gibi uyumluluk gereksinimlerini karşılamanız gerekiyor. Her geliştirici ekibinin kendi hesabında istediği gibi kaynak oluşturması kabul edilemez. Control Tower ile “kimse us-east-1 dışında kaynak oluşturamasın” ya da “root hesabında MFA olmadan işlem yapılamasın” gibi kuralları platform seviyesinde zorlayabilirsiniz.

Ön Koşullar ve Hazırlık

Control Tower kurulumuna başlamadan önce bir kontrol listesi gözden geçirelim.

AWS hesap gereksinimleri:

  • Yönetim (management) hesabı olarak kullanacağınız AWS hesabı temiz olmalı. Mevcut Organizations yapısı varsa dikkatli olun.
  • Hesapta daha önce Control Tower kurulmamış olmalı
  • AWS Organizations henüz aktif değilse Control Tower otomatik oluşturuyor, zaten varsa mevcut yapıyla entegre edebilirsiniz

IAM izinleri:

  • Kurulumu yapacak kullanıcının AdministratorAccess yetkisi olması gerekiyor
  • Root hesabıyla kurulum yapmak önerilmiyor, IAM kullanıcısı tercih edin

Bölge (Region) seçimi:

  • Control Tower home region olarak belirlediğiniz bölge sonradan değiştirilemez
  • Organizasyonunuzun bulk’u neredeyse o bölgeyi seçin
  • eu-west-1 (İrlanda) veya eu-central-1 (Frankfurt) Avrupa bazlı şirketler için uygun tercihler

E-posta adresleri: Control Tower iki ek hesap oluşturuyor: Log Archive ve Audit. Bu hesaplar için kullanılmamış, erişilebilir e-posta adresleri hazırlayın. Örneğin:

AWS CLI kurulumunuz yoksa başlamadan önce yapılandırın:

# AWS CLI kurulumu (Linux)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# Yapılandırma
aws configure
# AWS Access Key ID: [buraya access key]
# AWS Secret Access Key: [buraya secret key]
# Default region name: eu-central-1
# Default output format: json

# Hesap kimliğinizi doğrulayın
aws sts get-caller-identity

Landing Zone Kurulumu

Control Tower’ı AWS Console üzerinden başlatmak en güvenli yol. Console’da “Control Tower” aratın ve servise gidin.

İlk Kurulum Adımları

“Set up landing zone” butonuna tıkladığınızda karşınıza birkaç önemli yapılandırma ekranı gelecek.

Home Region seçimi: Dediğimiz gibi bu karar geri alınamaz. Türkiye’deki şirketler için genellikle eu-central-1 veya eu-west-1 tercih ediliyor.

Additional regions: Hangi bölgelerde kaynak oluşturulmasına izin vereceğinizi belirliyorsunuz. Governance amacıyla sadece ihtiyacınız olan bölgeleri ekleyin.

Log Archive hesabı e-postası: Tüm CloudTrail loglarının ve Config kayıtlarının toplanacağı hesap.

Audit hesabı e-postası: Güvenlik araçlarının çalışacağı, okuma erişimi olan hesap.

Kurulum yaklaşık 30-60 dakika sürüyor. Bu süreçte Control Tower arka planda şunları yapıyor:

  • AWS Organizations oluşturuyor veya mevcut yapıyla entegre ediyor
  • Log Archive ve Audit hesaplarını oluşturuyor
  • CloudTrail organization trail başlatıyor
  • AWS Config recorder’ları aktif hale getiriyor
  • AWS SSO’yu yapılandırıyor
  • Core guardrails’i uyguluyor

Kurulum sürecini CLI ile izleyebilirsiniz:

# Landing zone kurulum durumunu kontrol edin
aws controltower list-landing-zones 
  --region eu-central-1 
  --query 'landingZones[*].{Arn:arn,Status:status}' 
  --output json

# Organizations yapısını görüntüleyin
aws organizations list-roots 
  --query 'Roots[*].{Id:Id,Name:Name,Arn:Arn}'

# Oluşturulan OU'ları listeleyin
aws organizations list-organizational-units-for-parent 
  --parent-id <root-id> 
  --query 'OrganizationalUnits[*].{Id:Id,Name:Name}'

Organizational Unit (OU) Yapısını Tasarlamak

Control Tower varsayılan olarak iki OU oluşturuyor: Security ve Sandbox. Ancak gerçek bir production ortamı için bu yeterli değil.

Yaygın bir OU yapısı şöyle olabilir:

  • Root

– Security (Control Tower tarafından oluşturuluyor) – Infrastructure (Shared services, networking, DNS) – Workloads – Production – Non-Production (Dev, Test, Staging) – Sandbox (geliştiricilerin deneme yapacağı hesaplar) – Suspended (kapatılacak hesaplar geçici olarak burada)

Bu yapıyı CLI ile oluşturalım:

# Root OU ID'sini alalım
ROOT_ID=$(aws organizations list-roots 
  --query 'Roots[0].Id' 
  --output text)

# Infrastructure OU oluştur
aws organizations create-organizational-unit 
  --parent-id $ROOT_ID 
  --name "Infrastructure"

# Workloads OU oluştur
WORKLOADS_OU=$(aws organizations create-organizational-unit 
  --parent-id $ROOT_ID 
  --name "Workloads" 
  --query 'OrganizationalUnit.Id' 
  --output text)

# Production alt OU'su
aws organizations create-organizational-unit 
  --parent-id $WORKLOADS_OU 
  --name "Production"

# Non-Production alt OU'su
aws organizations create-organizational-unit 
  --parent-id $WORKLOADS_OU 
  --name "Non-Production"

echo "OU yapısı oluşturuldu"

Account Factory ile Yeni Hesap Oluşturma

Control Tower’ın en güçlü özelliklerinden biri Account Factory. Her yeni hesap için standart güvenlik yapılandırmasını otomatik uygulayan bu mekanizma, hesap oluşturma sürecini tekrarlanabilir ve güvenli hale getiriyor.

Console üzerinden “Account Factory > Create account” yolunu izleyebilirsiniz. Ancak programatik yol çok daha verimli, özellikle birden fazla hesap oluşturacaksanız.

Account Factory for Terraform (AFT) kullanmak production için kesinlikle öneririm. Ancak temel senaryodan başlayalım:

# Service Catalog aracılığıyla hesap oluşturma
# Önce ürün ID'sini bulun
aws servicecatalog search-products 
  --filters Key=FullTextSearch,Value="AWS Control Tower Account Vending Machine" 
  --query 'ProductViewSummaries[*].{Id:ProductId,Name:Name}'

# Provisioning artifact ID'sini alın
PRODUCT_ID="prod-xxxxxxxxxx"  # yukarıdan aldığınız ID

aws servicecatalog describe-product 
  --id $PRODUCT_ID 
  --query 'ProvisioningArtifacts[-1].{Id:Id,Name:Name}'

AFT ile hesap oluşturmak için önce AFT modülünü Terraform ile deploy etmeniz gerekiyor:

# main.tf - AFT kurulumu
module "aft" {
  source = "aws-ia/control_tower_aft/aws"
  version = "1.11.1"

  ct_management_account_id    = "111111111111"
  log_archive_account_id      = "222222222222"
  audit_account_id            = "333333333333"
  aft_management_account_id   = "444444444444"

  ct_home_region              = "eu-central-1"
  tf_backend_secondary_region = "eu-west-1"

  tf_version      = "1.5.7"
  tf_distribution = "oss"

  aft_feature_cloudtrail_data_events      = true
  aft_feature_enterprise_support          = false
  aft_feature_delete_default_vpcs_enabled = true
}

AFT ile yeni bir hesap talebi oluşturmak için account-request.tf dosyası hazırlanır:

# account-request.tf
module "production_web_account" {
  source = "./modules/aft-account-request"

  control_tower_parameters = {
    AccountEmail              = "[email protected]"
    AccountName               = "prod-web-application"
    ManagedOrganizationalUnit = "Workloads/Production"
    SSOUserEmail              = "[email protected]"
    SSOUserFirstName          = "Platform"
    SSOUserLastName           = "Team"
  }

  account_tags = {
    Environment   = "Production"
    CostCenter    = "engineering"
    Application   = "web-platform"
    Owner         = "platform-team"
    CreatedBy     = "AFT"
  }

  change_management_parameters = {
    change_requested_by = "Platform Team"
    change_reason       = "Yeni web uygulaması production hesabı"
  }

  account_customizations_name = "production-baseline"
}

Guardrails (Koruma Kuralları) Yönetimi

Guardrails, Control Tower’ın politika motoru. İki türü var:

Preventive guardrails: SCP (Service Control Policy) tabanlı, belirli eylemleri tamamen engelliyor. Detective guardrails: AWS Config tabanlı, uyumsuz kaynakları tespit edip bildiriyor.

Control Tower bazı guardrails’i zorunlu (mandatory) uyguluyor. Bunları devre dışı bırakamazsınız. Bir kısmı ise isteğe bağlı (elective).

Sık kullanılan guardrail örnekleri:

  • Disallow Changes to Encryption Configuration for Amazon S3 Buckets: S3 şifreleme ayarlarının değiştirilmesini engelliyor
  • Disallow Internet Access for an Amazon VPC Instance Managed by Systems Manager: SSM üzerinden yönetilen instance’ların internete çıkmasını kısıtlıyor
  • Detect Whether Public Access to Amazon S3 Buckets is Allowed: Public S3 bucket’larını tespit ediyor

CLI ile guardrail durumunu kontrol edelim:

# Aktif guardrails'i listele
aws controltower list-enabled-controls 
  --target-identifier "arn:aws:organizations::111111111111:ou/o-xxxx/ou-xxxx-xxxxxxxx" 
  --query 'enabledControls[*].{Arn:controlIdentifier,Status:statusSummary.status}' 
  --output table

# Belirli bir OU'ya guardrail ekle
aws controltower enable-control 
  --control-identifier "arn:aws:controltower:eu-central-1::control/AWS-GR_RESTRICT_ROOT_USER" 
  --target-identifier "arn:aws:organizations::111111111111:ou/o-xxxx/ou-xxxx-xxxxxxxx"

# Guardrail durumunu izle
aws controltower get-control-operation 
  --operation-identifier "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Merkezi Loglama ve Monitoring Yapılandırması

Control Tower kurulumundan sonra mutlaka yapmanız gereken şeylerden biri merkezi loglama yapılandırmasını doğrulamak ve genişletmek.

Log Archive hesabında S3 bucket’ı otomatik oluşturuluyor, ancak ekstra güvenlik önlemleri eklemekte fayda var:

# Log Archive hesabına geçiş yapın (cross-account role ile)
aws sts assume-role 
  --role-arn "arn:aws:iam::222222222222:role/AWSControlTowerExecution" 
  --role-session-name "LogArchiveSession" 
  --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'

# Ortam değişkenlerini ayarlayın (yukarıdaki çıktıdan)
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_SESSION_TOKEN="..."

# Log bucket'ını kontrol edin
aws s3 ls | grep aws-controltower

# Bucket versioning ve MFA delete durumunu kontrol edin
BUCKET_NAME="aws-controltower-logs-222222222222-eu-central-1"
aws s3api get-bucket-versioning --bucket $BUCKET_NAME
aws s3api get-bucket-encryption --bucket $BUCKET_NAME

# Lifecycle policy ekleyin (log maliyetlerini yönetmek için)
aws s3api put-bucket-lifecycle-configuration 
  --bucket $BUCKET_NAME 
  --lifecycle-configuration file://lifecycle-policy.json

lifecycle-policy.json içeriği:

{
  "Rules": [
    {
      "ID": "archive-old-logs",
      "Status": "Enabled",
      "Filter": {
        "Prefix": ""
      },
      "Transitions": [
        {
          "Days": 90,
          "StorageClass": "STANDARD_IA"
        },
        {
          "Days": 365,
          "StorageClass": "GLACIER"
        }
      ],
      "Expiration": {
        "Days": 2555
      }
    }
  ]
}

AWS SSO (IAM Identity Center) Entegrasyonu

Control Tower, AWS IAM Identity Center (eski adıyla SSO) kurulumunu otomatik yapıyor. Ekibinizin farklı hesaplara nasıl erişeceğini tanımlamak için permission set’ler oluşturmanız gerekiyor.

# SSO Instance ARN'ını alın
SSO_INSTANCE_ARN=$(aws sso-admin list-instances 
  --query 'Instances[0].InstanceArn' 
  --output text)

# Identity store ID
IDENTITY_STORE_ID=$(aws sso-admin list-instances 
  --query 'Instances[0].IdentityStoreId' 
  --output text)

# Developer permission set oluştur
aws sso-admin create-permission-set 
  --instance-arn $SSO_INSTANCE_ARN 
  --name "DeveloperAccess" 
  --description "Gelistiriciler icin standart erisim" 
  --session-duration "PT8H" 
  --relay-state "https://console.aws.amazon.com/"

# Permission set'e managed policy ekle
PERMISSION_SET_ARN="arn:aws:sso:::permissionSet/ssoins-xxxx/ps-xxxx"

aws sso-admin attach-managed-policy-to-permission-set 
  --instance-arn $SSO_INSTANCE_ARN 
  --permission-set-arn $PERMISSION_SET_ARN 
  --managed-policy-arn "arn:aws:iam::aws:policy/PowerUserAccess"

# Kullanıcı oluştur
aws identitystore create-user 
  --identity-store-id $IDENTITY_STORE_ID 
  --user-name "ahmet.yilmaz" 
  --display-name "Ahmet Yilmaz" 
  --name '{"FamilyName":"Yilmaz","GivenName":"Ahmet"}' 
  --emails '[{"Value":"[email protected]","Type":"work","Primary":true}]'

Yaygın Sorunlar ve Çözümleri

Kurulum ve günlük operasyonlarda sıkça karşılaşılan problemler:

Sorun 1: Landing Zone kurulumu takılı kalıyor

Kurulum 2 saatten uzun sürüyorsa büyük ihtimalle bir servis limiti ya da IAM izin sorunu var. CloudFormation stack’lerini kontrol edin:

# Tüm region'lardaki CloudFormation stack durumlarını kontrol et
for region in eu-central-1 eu-west-1 us-east-1; do
  echo "=== Region: $region ==="
  aws cloudformation list-stacks 
    --region $region 
    --stack-status-filter CREATE_FAILED UPDATE_FAILED ROLLBACK_FAILED 
    --query 'StackSummaries[*].{Name:StackName,Status:StackStatus,Reason:StackStatusReason}' 
    --output table
done

Sorun 2: Hesap fabrika hataları

Account Factory ile hesap oluşturma başarısız oluyorsa Service Catalog loglarına bakın:

# Service Catalog provisioned products durumu
aws servicecatalog scan-provisioned-products 
  --query 'ProvisionedProducts[?Status==`ERROR`].{Id:Id,Name:Name,StatusMessage:StatusMessage}'

Sorun 3: Guardrail ihlalleri

Bir hesabın guardrail’ı ihlal ettiğini tespit ettiyseniz:

# Config rule uyumsuzluklarını listele (Audit hesabından)
aws configservice describe-compliance-by-config-rule 
  --compliance-types NON_COMPLIANT 
  --query 'ComplianceByConfigRules[*].{Rule:ConfigRuleName,Compliance:Compliance.ComplianceType}' 
  --output table

# Uyumsuz kaynakları detaylı incele
aws configservice get-compliance-details-by-config-rule 
  --config-rule-name "aws-controltower-disallow-public-access-actions-to-amazon-s3-buckets" 
  --compliance-types NON_COMPLIANT

Production Geçiş Önerileri

Mevcut AWS ortamınızı Control Tower’a geçiriyorsanız dikkat etmeniz gerekenler:

  • Mevcut hesapları kayıt edin (enroll): Control Tower’ı kurduktan sonra mevcut hesapları Account Factory üzerinden kayıt edebilirsiniz. Bu işlem hesaptaki kaynakları değiştirmez ama guardrail’ları uygular.
  • SCP çakışmalarını kontrol edin: Zaten SCP’leriniz varsa Control Tower’ın ekleyecekleriyle çakışabilir.
  • CloudTrail duplikasyonunu önleyin: Zaten organization trail’ınız varsa Control Tower yenisini oluşturmaya çalışacak, bu da hatalara yol açabilir.
  • Test ortamında deneyin: Production’da Control Tower kurmadan önce mutlaka yeni bir management hesabında test yapın.

Drift tespiti için düzenli kontrol önemli. Control Tower’ın beklediği yapıdan sapma olduğunda bunu tespit etmek gerekiyor:

# Control Tower drift durumunu kontrol et
aws controltower get-landing-zone 
  --landing-zone-identifier "arn:aws:controltower:eu-central-1:111111111111:landingzone/xxxxxxxxxxxxxxxx" 
  --query 'landingZone.driftStatus'

# Drift varsa repair işlemi başlat (Console üzerinden önerilir)
# CLI ile de yapılabilir ancak önce kaynakları manuel doğrulayın
aws controltower reset-landing-zone 
  --landing-zone-identifier "arn:aws:controltower:eu-central-1:111111111111:landingzone/xxxxxxxxxxxxxxxx"

Maliyet Yönetimi Konusunda Bir Not

Control Tower’ın kendisi için ayrı bir ücret yok, ancak kullandığı servislerin maliyetleri var. CloudTrail organization trail, AWS Config recorder’ları, S3 depolama ve CloudWatch logları maliyete katkıda bulunuyor. 50 hesaplı bir organizasyonda aylık 200-500 dolar arası ek maliyetle karşılaşabilirsiniz. Budget alarm’larını kurmayı ihmal etmeyin.

Sonuç

AWS Control Tower, ciddi bir AWS ortamı yönetiyorsanız kaçınılmaz bir tercih haline geliyor. İlk kurulum biraz zaman alıyor ve bazı kararlar geri dönüşü olmayan nitelikte (home region gibi), bu yüzden planlama aşamasına yeterli zaman ayırın.

Landing Zone’u kurduktan sonra asıl iş OU yapısını doğru tasarlamak, Account Factory’yi ekip süreçlerinize entegre etmek ve guardrail’ları organizasyonunuzun risk toleransına göre yapılandırmak. AFT’yi (Account Factory for Terraform) production ortamları için mutlaka değerlendirin, çünkü hesap oluşturma sürecini tamamen kodla yönetebilmek uzun vadede çok büyük kolaylık sağlıyor.

Güvenlik ekibinizin Audit hesabına erişimini düzenlediğinizden ve merkezi loglama yapılandırmasının doğru çalıştığından emin olduktan sonra Control Tower’ı gerçek anlamda güvenli bir AWS altyapısının temel taşı olarak kullanmaya başlayabilirsiniz. Sorularınız olursa yorum bölümünde buluşalım.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir