AWS SCP’lerini kullanarak saldırı yüzeyinin azaltılması


“Yanlış gidebilecek her şey yanlış gidecek” – Murphy Yasası. Neyin yanlış gidebileceğini azaltmak istiyoruz. Saldırı yüzeyimiz ne kadar küçük olursa, endişelenmemiz gerekir. Saldırı yüzeyini (ve bilişsel yükümüzü) azaltmanın mükemmel bir yolu, AWS hizmet kontrol politikalarını (SCP’ler) kullanmaktır. Bu yazıda, ona nasıl yaklaştığımızı açıklayacağım.

SCP’ler nedir?

SCP’ler, bir IAM politikasının ne söyleyebileceğine bakılmaksızın (kök olsanız bile) bir veya daha fazla AWS hesaplarında neler yapılabileceğini ve yapılamayacağını kontrol etmek için politikalardır. SCP’ler hesaplara veya kuruluş birimlerine (OUS) uygulanabilir. Varsayılan olarak, her şeye izin verilir ve neye ihtiyacımız olmayanları inkar etmek bize bağlıdır. SCP’ler her zaman derinlemesine bir savunmadır ve IAM izinleri düzgün bir şekilde yapılandırılmışsa asla tetiklenmez, ancak mükemmel IAM yapılandırmasına güvenmek güvenmeyi sağlayabileceğimiz bir lüks değildir. SCP’ler hakkında daha fazla bilgi için SCP’lerde resmi AWS belgeleri.

Neye izin vermek veya reddetmek istiyoruz?

Tercihen, kullanmadığımız herhangi bir eylemi inkar ederiz, ancak bu büyük olasılıkla idari bir cehennemdir ve geliştiricileri günlük olarak engelleyeceğiz, bu yüzden denemeye bile karar verdik. Detective olarak, daha pragmatik bir yaklaşıma gittik:

  • Yalnızca AWS’ye izin ver hizmet Kullanıyoruz (yerine eylem)
  • Yalnızca kullandığımız bölgelere izin verin
  • Tehlikeli eylemlere izin vermemek

Bu, endişelenmemiz gereken şeyleri azaltmak ve geliştiricileri üretken tutmak arasında iyi bir denge olmuştur.

Yalnızca kullandığımız hizmetlere izin verin

Hangi hizmetleri kullandığınızı bulmanın en kolay yolu bir Organizasyon Etkinliği Rapor (aka. Kuruluşlar Erişim Raporu.) Bu rapor, hizmetlerin en son ne zaman kullanıldığını gösterir.

Rapor, bir OU veya belirli bir hesaba göre oluşturulabilir. Bizim durumumuzda, üretim OU’umuz için bir rapor oluşturmaya başladık. Böyle bir rapor oluşturmak için AWS CLI kullanabiliriz:

aws iam generate-organizations-access-report \
  --entity-path "o-XXXXXXXXXX/r-XXXX/ou-XXXX-XXXXXXXX"

Nerede entity-path AWS Organizasyonları OU üretimimiz için varlık yoludur.

Rapor oluşturulduktan sonra, kullanılan hizmetlerin listesini şu şekilde alabiliriz:

aws iam get-organizations-access-report \
  --job-id "JobId-goes-here" \
  --max-items 1000 \
  --query 'AccessDetails[?TotalAuthenticatedEntities > `0`].[ServiceName,ServiceNamespace,LastAuthenticatedTime]'

Bu, izleme döneminde kullanılan tüm hizmetlerin bir listesini verir. Hizmet adını, IAM ad alanını ve en son erişildiğinde gösterir.

Bu listeden manuel olarak geçtik ve büyük olasılıkla AWS web konsolunda ve çok eski etkinlikte belirli bir hizmete göz atan belirgin girişleri filtreledik.

Kullanılmış hizmetler listesiyle, listede olmayan bir şeyi reddeden bir politika oluşturduk:

data "aws_iam_policy_document" "allow_only_used_services" {
  statement {
    sid       = "AllowOnlyUsedServices"
    effect    = "Deny"
    resources = ["*"]

    not_actions = [
      
    ]
  }
}

Bu politika, listelenmeyen herhangi bir hizmete erişimi reddeder. not_actions. Nadiren yeni AWS hizmetlerini benimsiyoruz, böylece bu yöntem nadiren gelişimi engelliyor, ancak yeni hizmetleri değerlendirmek için uygun bir süreç sağlamamızı sağlıyor.

Yalnızca kullandığımız bölgelere izin verin

Sadece birkaç AWS bölgesi kullanıyoruz ve bunun dışında herhangi bir bölgenin kullanılmasına izin vermek için hiçbir neden yok. İlk bakışta, kullanılmayan bölgeleri engellemek için SCP’yi nasıl kullanabileceği açık görünebilir, ancak bazı hizmetler küresel olduğundan, yalnızca belirli bölgelere erişimi tam olarak kısıtlayamazsınız.

Açıklandığı gibi AWS Çok Hesap Stratejisine Yolculuğunu DetetetleştirinKontrol Kulesi kullanıyoruz. Kontrol kulesinde yapabilirsin Hangi bölgelere izin verileceğini veya reddedileceğini yapılandırınbiz de yaptık.

Bilinen tehlikeli eylemlere izin vermemek

Sadece belirli eylemlere izin vermek çok fazla iş olsa da, riskli olanları engellemek çok daha kolaydır.

Tam olarak hangi SCP’lerin uygulanacağı organizasyona bağlıdır, ancak IAM politikalarından çok daha genel olma eğilimindedirler, bu da kuruluşlar arasında paylaşılabilecekleri anlamına gelir. SCP’leri bulmak için bazı yerler:

Orada çok iyi kaynak var. Eğer ararsan aws scp site:github.com Çok sayıda örnek bulacaksınız. İlham almak için birçok farklı SCP’den geçtik ve (bizim için) bulabileceğimiz en alakalı ve en az hataya eğilimli parçaları seçtik.

Pahalı eylemler

Bazı eylemler olabilir çok masraflı. Bildiğimiz en pahalı olanları engellemeyi seçtik. Ian McKay Bazı pahalı eylemlerle öz Maliyetli hatalardan kaçınmak için engellemek isteyebilirsiniz:

data "aws_iam_policy_document" "deny_costly_actions" {
  statement {
    sid       = "DenyCostlyActions"
    effect    = "Deny"
    resources = ["*"]

    actions = [
      "acm-pca:CreateCertificateAuthority",
      "aws-marketplace:AcceptAgreementApprovalRequest",
      "aws-marketplace:Subscribe",  
      "backup:PutBackupVaultLockConfiguration",
      "bedrock:CreateProvisionedModelThroughput",
      "bedrock:UpdateProvisionedModelThroughput",
      "dynamodb:PurchaseReservedCapacityOfferings",
      "ec2:ModifyReservedInstances",   
      "ec2:PurchaseHostReservation",
      "ec2:PurchaseReservedInstancesOffering",
      "ec2:PurchaseScheduledInstances",
      "elasticache:PurchaseReservedCacheNodesOffering",
      "es:PurchaseReservedElasticsearchInstanceOffering",
      "es:PurchaseReservedInstanceOffering",
      "glacier:CompleteVaultLock",
      "glacier:InitiateVaultLock",
      "outposts:CreateOutpost",
      "rds:PurchaseReservedDBInstancesOffering",
      "redshift:PurchaseReservedNodeOffering",
      "route53domains:RegisterDomain",
      "route53domains:RenewDomain",
      "route53domains:TransferDomain",
      "s3-object-lambda:PutObjectLegalHold",
      "s3-object-lambda:PutObjectRetention",
      "s3:BypassGovernanceRetention",
      "s3:PutBucketObjectLockConfiguration",
      "s3:PutObjectLegalHold",    
      "s3:PutObjectRetention",    
      "savingsplans:CreateSavingsPlan",
      "shield:CreateSubscription",
      "snowball:CreateCluster",
    ]
  }
}

Dikkatli olmak isteyebileceğiniz bu eylemlerden bazıları. Örneğin, inkar etmek route53domains:RenewDomain Alan adlarını yöneten OU veya hesaba uygulanırsa sorunlara neden olabilir.

Kontrol kulesi kontrolleri üzerinden SCP’ler

Bizim gibi, kontrol kulesini kullanıyorsanız, etkinleştirebileceğiniz ve kontrol kulesinin yönetmesine izin verebileceğiniz birkaç düzine SCP var. Kontrol kulesinde yalnızca SCP’leri göstermek için görünümü filtreleyebilirsiniz:

Listelenen SCP’lerin bazıları varsayılan olarak etkinleştirilir, ancak çok sayıda seçme vardır.

SCP boyutu sınırları ve geçici çözümler

SCP’ler maksimum 5120 bayt olabilir, içermek Beyaz boşluk. Bu sorununla karşılaştık bkontrol aws_iam_policy_document Varsayılan olarak en aza indirilmiş JSON üretmez.

Bunun üzerinde çalışmanın birkaç yolu var:

  • Birden fazla politika kullanın (OU başına maksimum 5)
  • Politikayı bir ebeveyn OU’ya uygulayın (OU başına maksimum 5 sınırına ulaştıysanız)
  • JSON’u en aza indir

Son seçenekle gittik. Terraform’da JSON’u en aza indirecek yerleşik bir işlev yoktur, ancak koşarak en aza indirebilirsiniz. jsonencode(jsondecode())yani şöyle bir şey:

resource "aws_organizations_policy" "example" {
  name    = "example"
  type    = "SERVICE_CONTROL_POLICY"
  content = jsonencode(jsondecode(data.aws_iam_policy_document.example.json))
}

Bu, politikalarımızı Terraform’da yazmamızı sağlar (daha okunabilir, yorumlara izin verir, lirasyon verir, vb.) Ve yine de kullanılan bayt sayısını en aza indirir. SCP’ye AWS konsolu aracılığıyla göz atarsanız, en aza indirilmez, bu yüzden orada da okunabilir.

Üretimden önce SCP’leri test etmek

SCP’ler için kuru koşu yoktur, bu da bir şeyin kırılıp kırılmayacağını bilemeyeceğiniz için biraz korkutucu hale getirir.

Önemli bir şey kırma riskini azaltmak için önce SCP’lerimizi evrelememize uyguluyoruz. SCP’lerin bir süre sahnelemeye uygulanmasını sağlayarak, çığlık testi. Biri de Athena üzerinden cloudtrail sorgu Örneğin ilgili herhangi bir SCP hatası olup olmadığını görmek için:

SELECT * FROM cloudtrail_logs WHERE errorcode="AccessDenied" AND errormessage LIKE '%service control%';

Şimdiye kadar hiçbir sorunla karşılaşmayacak kadar şanslıyız ve SCP’ler uzun zamandır üretime başarılı bir şekilde uygulandı!

Çözüm

SCP’ler saldırı yüzeyimizi büyük ölçüde azaltmamıza ve savunmamızı derinlemesine geliştirmemize izin verdi. Kuru bir çalışma olmasa da her şey sorunsuz gitti ve şimdi akılda tutulması ve endişelenmesi gereken çok daha az şeyimiz var!



Source link