AWS Türkçe Blog

AWS WAF için AWS Managed Rules’un davranışı nasıl özelleştirilir?

Orijinal makale: Link (Madhu Kondur ve Venugopal Pai)

AWS WAF için AWS Managed Rules (Yönetilen Kurallar), kendi kurallarınızı yazmanıza gerek kalmadan, genel uygulama güvenlik açıklarına ve sistemlerinize diğer istenmeyen erişimlere karşı korunmanıza yardımcı olmak için kullanılabilecek, AWS tarafından oluşturulan bir kurallar grubu sağlar. AWS Tehdit Araştırma Ekibi (Threat Research Team), uygulamalarınızı korumak için sürekli değişen tehdit ortamına yanıt vermek için AWS Managed Rules’u günceller.Kısa süre önce AWS WAF, kural özelleştirmesine odaklanan dört yeni özelliği kullanıma sundu:

  • Labels (Etiketler) – Bir kural eşleştirildiğinde web isteklerine eklenebilen meta veriler. Etiketler, yönetilen kuralların davranışını veya varsayılan eylemini değiştirmek için kullanılabilir.
  • Version management (Sürüm yönetimi) – Yönetilen bir kural grubunun belirli bir sürümünü seçebilirsiniz. Versioning, daha önce test edilmiş sürümlere dönmek için kullanılabilir.
  • Scope-down statements (Kapsam azaltma ifadeleri) – Bir kural grubunun değerlendirdiği isteklerin kapsamını daraltmak için kullanılabilir.
  • Custom responses (Özel yanıtlar) – Bir kural bir bağlantı isteğini engellediğinde, istemciye AWS WAF’tan özel bir HTTP yanıtı gönderebilirsiniz.

Bu blogda, yönetilen kuralları özelleştirerek güvenlik duruşunuzu iyileştirmek için bu özellikleri nasıl kullanabileceğinizi göstermek için dört kullanım örneğinden geçiyoruz.

Durum 1: Belirli bir sürümü seçerek yönetilen bir kural grubu için otomatik güncellemeleri kontrol edin

Varsayılan olarak, yönetilen kural grupları, güncellemeler kullanıma sunuldukça otomatik olarak güncellenir. Bu, mümkün olan en kısa sürede en son korumaya sahip olmanızı sağlar. Sürüm yönetimi özelliğiyle, belirli bir sürümde kalmayı seçebilirsiniz; bu, siz açıkça daha yeni bir sürüme geçene kadar güncellenmeyeceği anlamına gelir. Bu, yeni bir sürümü test etmenize ve hazır olduğunuzda onu web ACL’inize yükseltmenize ve gerekirse önceden test edilmiş bir sürüme geri dönmenize olanak tanır.

Not: En son sürüme mümkün olduğunca yakın bir sürüm kullanmanız önerilir.

Yönetilen bir kural grubu sürümü seçme

  1. AWS WAF konsolunuzda, yönetilen bir kural grubu eklediğiniz web ACL’ine gidin.
  2. Sürümünü ayarlamak istediğiniz managed rule group‘u seçin ve Edit‘i seçin.
  3. Version selection açılır menüsünde kullanmak istediğiniz sürümü seçin. Sürümün süresi dolana kadar veya başka bir sürüm seçene kadar bu sürümde kalacaksınız—sürüm süresinin sona ermesini nasıl yöneteceğinizi bu yazının ilerleyen bölümlerinde öğreneceksiniz.

Not: Güncellemeleri otomatik olarak almak istiyorsanız, sürüm olarak Default‘u seçin.

  1. Yapılandırmayı kaydetmek için Save Rule seçin.

Figure 1: Console screenshot showing the AWS Managed Rules version drop downŞekil 1: AWS Managed Rules sürümü açılır listesini gösteren konsol ekran görüntüsü

Bildirimleri ayarlama

Yönetilen bir kural grubuna yönelik güncelleme bildirimlerini almak için Amazon Simple Notification Service’i (Amazon SNS) kullanabilirsiniz. Yönetilen kural grubunun ARN’ini kullanarak SNS konusuna abone olabilirsiniz. AWS Managed Rules güncellemelerine yönelik her SNS bildirimi, bu güncellemeleri programlı olarak kullanmanıza olanak tanıyan aynı mesaj biçimini kullanır. SNS bildirim mesajı formatı hakkında daha fazla ayrıntı için, Yönetilen bir kural grubuna yönelik yeni sürümler ve güncellemelerden haberdar olma bölümüne bakın.

Amazon SNS aracılığıyla yeni kural güncellemelerinde email bildirimleri ayarlama

  1. AWS WAF konsolunuzda, yönetilen bir kural grubu eklediğiniz web ACL’ine gidin.
  2. Hakkında bildirim almak istediğiniz yönetilen kural grubunu seçin ve Edit‘i seçin.
  3. Core rule set sayfasında, Amazon SNS topic ARN’i arayın. Amazon SNS konsoluna gitmek için bağlantıyı seçin. 4. adımda kullanılacak konu ARN’ini not edin.

Figure 2: Console screenshot highlighting the SNS topic ARNŞekil 2: SNS konu ARN’ini vurgulayan konsol ekran görüntüsü

  1. Create subscription sayfasında, aşağıdaki bilgileri girin:
    Topic ARN: 3. adımdaki SNS konu ARN’ini girin.
    Protocol: Email seçin.
    Endpoint: Bildirimlerin gönderilmesini istediğiniz email adresini girin.

Figure 3: SNS Create subscription console screenshotŞekil 3: SNS Create subscription konsol ekran görüntüsü

  1. Create subscription seçin.
  2. Amazon SNS’den bir onay email’i bekleyin. Aboneliği tamamlamak için email’deki confirm subscription (aboneliği onayla) bağlantısını seçin.

CloudWatch alarmı kullanarak bir sürüm sona erme uyarısı ayarlayın

Yönetilen kural grubunun belirli bir sürümünde uzun süre kaldığınızda, önemli güncellemeleri kaçırma riskiniz vardır. Eski bir sürümde uzun süre kalmamak için, bir sürümün süresi dolmak üzereyken sizi uyaracak bir alarm kurmalısınız. Bir sürümün süresi dolduğunda, yönetilen kural grubu otomatik olarak varsayılan sürüme geçer. Bir sürümün süresi dolmak üzereyken bilgilendirilmek için DaysToExpiry‘e dayalı bir Amazon CloudWatch alarmı kullanarak bir uyarı ayarlayın. Kullanmakta olduğunuz kural kümesinin belirli bir sürümünün süresi dolmadan 60 gün önce bir bildirim ayarlamak için aşağıdaki prosedürü kullanabilirsiniz.

CloudWatch alarmı kurma

Bu, bir kural kümesinin belirli bir sürümünün süresi dolmadan 60 gün önce sizi bilgilendirir.

  1. CloudWatch konsoluna gidin.
  2. Sol gezinme bölmesinden All metrics‘i seçin ve ardından namespaces listesinden WAFV2‘yi seçin.
  3. ManagedRuleGroup, Region, Vendor, Version seçin.
  4. Son kullanma tarihini izlemek istediğiniz yönetilen kural grubunu seçin. Bu örnek AWSManagedRulesCommonRuleSet ve Version_1.0 kullanmaktadır.
  5. Graphed metric‘i seçin ve Actions altında sağ altta bulunan zil alarmı simgesini seçin. Bu simgeyi seçmek sizi CloudWatch alarm konsoluna götürecektir.

Figure 4: CloudWatch Graphed metrics tabŞekil 4: CloudWatch Graphed metrics tabı

  1. CloudWatch alarmını aşağıdaki ayrıntılarla yapılandırın ve ardından Next‘i seçin:
    Statistic: Minimum seçin
    Period: 5 minutes seçin
    ThresholdType: Static seçin
    Operator: Lower/Equal (<=threshold) seçin
    Threshold: Değeri 60 olarak girin 
    Datapoints to alarm: Alt değeri 1 ve yüksek değeri 1 olarak girin
    Missing data treatment: Treat missing data as good (not breaching threshold) seçin
  2. Yapılandırılan alarm ALARM durumuna geçtiğinde başlatılmasını istediğiniz SNS konusunu seçin ve Next‘i seçin.
  3. Alarm için bir ad ve açıklama girin. Yapılandırmayı önizlemek için Next‘i seçin ve CloudWatch alarm oluşturma işlemini tamamlamak için Create Alarm‘ı seçin.

Ek ipuçları

  • Kullanmakta olduğunuz yönetilen bir kural grubunun sürümünün süresi dolmuşsa, AWS WAF, siz geçerli bir sürüm seçene kadar web ACL’inde herhangi bir yapılandırma değişikliğini engeller. En yeni tehditlere karşı korunmak için mümkün olan en kısa sürede en yeni sürüme geçmelisiniz.
  • DaysToExpiry metriğini yalnızca web ACL’inizden trafik akışı olduğunda alırsınız.
  • Bir web ACL’inde yönetilen bir kural grubunun iki farklı sürümünü kullanabilirsiniz. Bu, dağıtıldıktan sonra trafiğinizi nasıl etkileyeceğini görmek için iki farklı sürümü aynı anda test etmek istiyorsanız yararlı olabilir; örneğin, bir sürümü sayım modunda (count mode) ve diğerini engelle modunda (block mode) kullanın.

Not: Bu iş akışı, JSON kural düzenleyicisi ve API aracılığıyla desteklenir, ancak konsol aracılığıyla desteklenmez.

Durum 2: Yönetilen bir kural grubundaki bir kuralın neden olduğu yanlış pozitifleri azaltmak için etiketleri kullanın

Etiket (label), kuralla ilişkili eylemden bağımsız olarak, bir kuralın eşleşen web isteklerine ekleyebileceği meta verilerdir. AWS Managed Rules’un en son sürümü etiketleri destekler. Etiketleri olan isteklerle eşleşen özel kurallar oluşturarak, yönetilen bir kural grubu içindeki kuralların davranışını veya varsayılan eylemini değiştirebilirsiniz.

Örneğin, yönetilen bir kural grubunda yanlış pozitife neden olan bir kuralınız varsa, yönetilen kuralı Count olarak geçersiz kılarak ve aşağıdakine benzer bir mantıkla özel bir kural yazarak bu kuralı hafifletebilirsiniz:

IF (Statement 1) AND NOT (Statement 2) THEN Block
Statement 1 yanlış bir pozitife neden olan kuraldan oluşturulan etikette eşleşir.
Statement 2 yanlış pozitiflere neden olduğu için kuralın değerlendirilmesini istemediğiniz durumlar için istisna koşulları içerir.

Kullanmakta olduğunuz yönetilen kural grubundaki GenericRFI_QUERYARGUMENTS kuralı nedeniyle uygulamanıza yeniden yönlendirme isteklerinin engellendiği bir senaryo düşünün. Bu kural, tüm sorgu parametrelerinin değerini denetler ve bir URL’nin ortasında gömülü :// gibi web uygulamalarında uzaktan dosya eklemeden (RFI) yararlanmaya çalışan istekleri engeller. Sorgu bağımsız değişkeni kapsamındaki :// karakterleri nedeniyle engellenebilecek meşru bir yeniden yönlendirme isteği örneği aşağıdaki gibi olabilir:

https://ourdomain.com/sso/complete?scope=email profile https://www.redirect-domain.com/auth/email https://www.redirect-domain.com/auth/profile

Benzer meşru isteklerin engellenmesini önlemek için etikete göre eşleşecek özel bir kural yazabilirsiniz.

Adım 1: Belirli yönetilen kural grubunu sayma moduna (count mode) ayarlayın

İlk adım, eşleşen isteklere etiketlerin eklenmesi için belirli yönetilen kuralı sayma moduna ayarlamaktır. Ardından, yönetilen kuralın önceliği, özel kuralın önceliğinden daha yükseğe ayarlanmalıdır.

Belirli yönetilen kural grubunu sayma moduna ayarlama

  1. AWS WAF konsolunuzda web ACL’nize gidin ve Rules sekmesini seçin. Add Rule‘u ve ardından Add managed rule groups seçin.
  2. AWS managed rule groups seçin.
  3. Free rule groups altında, Core rule set‘i arayın ve Add to web ACL geçişi seçerek web ACL’inize ekleyin.
  4. Edit seçin.
  5. Kural listesinden, kuralın yanındaki Count geçiş düğmesini seçerek, yanlış pozitifler oluşturan kuralı Count eylemine ayarlayın. Bu örnek, GenericRFI_QUERYARGUMENTS kuralının eylemini Count olarak değiştirir. Bu, tüm eşleşen isteklerin öncelik sırasına göre sonraki WAF kurallarına gönderilmesini sağlar ve eşleşen bir istek olduğunda awswaf:managed:aws:commonruleset:GenericRFI_QueryArguments etiketini ekler.
  6. Save rule seçin.
  7. Kural önceliğini ayarlayabileceğiniz sonraki pencereye gitmek için tekrar Add rules seçin. Yönetilen kuralın, sonraki adımlarda oluşturacağınız özel kuraldan daha yüksek önceliğe sahip olması gerekir.
  8. Yapılandırmayı kaydetmek için Save seçin.

Adım 2: Web ACL’e yönetilen kuraldan daha düşük önceliğe sahip özel bir kural ekleyin

Web ACL’de, aradığınız etikete sahipse ve yanlış pozitife neden olan istisna koşulu yoksa istekleri engelleyen özel bir kural oluşturun. Bu özel kuralın önceliği, yönetilen kuraldan daha düşük ayarlanmalıdır.

Yönetilen kuraldan daha düşük önceliğe sahip özel bir kural ekleme

  1. AWS WAF konsolunuzda web ACL Rules sekmenize gidin ve Add Rule‘u ve ardından Add my own rules and rule groups‘u seçin.
  2. Kural tipi için Rule Builder seçin.
  3. Rule Name girin ve Type olarak Regular Rule seçin.
  4. matches all the statements (AND) seçmek için If a request açılır menüsünü kullanın.
  5. Statement 1, isteğin aradığınız etikete sahip olup olmadığını kontrol eder. Bu örnekte, aşağıdaki ayrıntılarla yapılandırılmıştır:
    Inspect: Has a label seçin
    Labels: Label seçin
    Match key: awswaf:managed:aws:commonruleset:GenericRFI_QueryArguments seçin
  6. Sonraki tüm ifadeler, taleplerin beyan kriterlerine uymaması ve meşru talepler olarak değerlendirilmesi için reddedilmelidir. Bu örnekte, isteğin sorgu dizesinde https://www.redirect-domain.com/ içerip içermediğini kontrol eden NOT Statement 2’yi ayarladık:
    Enable: Negate statement results seçin
    Inspect: All query parameters seçin
    Match type: Contains string seçin
    String to Match: https://www.redirect-domain.com/ girin
    Text transformation: None seçin
  7. Action altında, Block seçin ve Add rule seçin.
  8. Set rule Priority penceresinde, özel kuralınızın kural önceliğini AWS Managed Rules kuralından daha düşük olacak şekilde ayarlayın.
  9. Save seçin.

Durum 3: Yönetilen bir kural grubuyla eşleşen trafiğin kapsamını daraltmak için bir kapsam azaltma ifadesi kullanın

Bir kural grubunun değerlendirdiği isteklerin kapsamını daraltmak için herhangi bir kural grubuna scope-down statement eklenebilir. Bu, kural grubunun incelemesini istediğiniz istekleri filtrelemenize veya kriterleri karşılamayan istekleri filtrelemenize olanak tanır.

AmazonIPReputationList‘e göre değerlendirilmesini istemediğiniz bir güvenilir IP adresi listeniz olduğunu düşünün. Trafiği değerlendirmeden hariç tutmak için bir scope-down statement kullanarak bu güvenilir IP adreslerinin engellenmesini önleyebilirsiniz.

Adım 1: İzin verilen IP listesi için IP seti oluşturun

İlk adım, izin verilen IP listesini içeren bir IP seti oluşturmaktır. IP seti, belirli bir AWS Bölgesi için oluşturulabilir veya web ACL’i bir Amazon CloudFront dağıtımıyla ilişkilendirilmişse küresel olabilir.

IP seti oluşturma

  1. AWS WAF konsolunda IP sets seçin ve sonra Create IP set seçin.
  2. IP set name kısmına Allowed IPs girin. IP addresses kısmında izin vermek istediğiniz IP’leri girin. Choose Create IP set when done. İşiniz bittiğinde IP seti oluştur’u seçin.

Figure 5: Console screenshot creating an IP setŞekil 5: IP seti oluşturan konsol ekran görüntüsü

Adım 2: Yönetilen kural grubuna bir scope-down statement ekleyin

IP setini oluşturduktan sonra, IP setindeki IP’lerden kaynaklanan trafiğin yönetilen kural grubundaki kurallara göre değerlendirilmemesi için yönetilen kural grubunuza bir kapsam azaltma ifadesi ekleyebilirsiniz.

Bir scope-down statement ekleme

  1. Web ACL’inizin Rules sekmesinde, Add Rule‘u seçin ve Add managed rule groups‘u seçin.
  2. AWS managed rule groups seçin.
  3. Free rule groups altında, web ACL’e eklemek için Amazon IP reputation list‘i açın ve Edit‘i seçin.
  4. Enable scope-down statement seçin.

Figure 6: Console screenshot showing enabling the scope-down statementŞekil 6: Scope-down statement’ın etkinleştirildiğini gösteren konsol ekran görüntüsü

  1. Yalnızca daha önce oluşturulan izin verilen IP’ler listesinden kaynaklanmayan isteklerin bu kural grubu için değerlendirilmesi için koşulu ekleyin. doesn’t match the statements (NOT) öğesini seçmek için If a request açılır menüsünü kullanın.
    Inspect: Originates from an IP address in seçin
    IP set: Allowed-IPs seçin
    IP address to use as the originating address: Source IP address seçin

Figure 7: Scope down statement configuration console screenshotŞekil 7: Scope down statement konfigürasyonu konsol ekran görüntüsü

  1. Bu kuralı web ACL’inize eklemek için Save rule seçin.

Durum 4: Yönetilen bir kural grubu için varsayılan engelleme eylemini değiştirmek için özel yanıtları kullanın

AWS WAF, gelen bir isteği engellediğinde yanıt kodu 403’ü (yasak) geri gönderir. Kural erişimi engellediğinde istemciye özel bir HTTP yanıtı göndermek yerine custom response (özel yanıt) özelliğini kullanabilirsiniz. Özel yanıtı kullanarak durum kodunu, yanıt başlıklarını ve yanıt gövdesini özelleştirebilirsiniz.

Uygulamanıza VPN üzerinden bağlanıyor olabilecek bir istemciye yanıt vermek istediğinizi varsayalım. 400 hata kodu (Bad Request) ve statik bir gövde mesajı (“Lütfen bir VPN üzerinden bağlanmayı denemeyin”) göndererek, kullanıcıya bu davranışın önerilmediğini bildirmek için özel bir yanıt kullanmak istiyorsunuz. Bunu yapmak için AWS Managed Rule grubu AWSManagedRulesAnonymousIpList‘i kullanabilir ve ardından awswaf:managed:aws:anonymous-ip-list:AnonymousIPList etiketini kullanarak özel kurallar ayarlayabilirsiniz.

Adım 1: Özel bir yanıt gövdesi oluşturun

Özel bir yanıt oluşturmanın ilk adımı, özel bir yanıt gövdesi oluşturmaktır. Bu, özel yanıt gönderildiğinde gösterilecek mesajdır.

Özel bir yanıt gövdesi oluşturma

  1. AWS WAF konsolunda web ACL’inizi açın ve Custom response bodies sekmesini seçin.
  2. Create custom response body seçin.
  3. Response body object name kısmına, bu yanıt için bir ad girin—örneğin, Custom-body-IP-list.
  4. Yanıt gövdesi için Content type seçin.
  5. Response body kısmına, istemciye geri göndermek istediğiniz yanıtı girin.
  6. Save seçin.

Figure 8: Custom response body creation on the AWS WAF consoleŞekil 8: AWS WAF konsolunda özel yanıt gövdesi oluşturma

Adım 2: Yönetilen kural grubunun eylemlerini geçersiz kılın

Özel yanıtınızı göndermek için kullandığınız kural, sayım modunda (count mode) olmalıdır. Bu, tüm eşleşen isteklerin öncelik sırasına göre sonraki WAF kurallarına gönderilmesini sağlayacaktır. Aşağıdaki örnekte, AWSManagedRulesAnonymousIpList yönetilen kural grubundaki AnonymousIPList kuralı, sayım moduna ayarlanmıştır. Yönetilen bir kural grubunun eyleminin nasıl geçersiz kılınacağı hakkında daha fazla ayrıntı için Bir kural grubunun veya kurallarının eylemlerini geçersiz kılmaya bakın.

Figure 9: console screenshot overriding an AWS Managed Rules ruleŞekil 9: AWS Managed Rules kuralını geçersiz kılan konsol ekran görüntüsü

Adım 3: İsteği engellemek ve müşteriye özel bir yanıt göndermek için bir kural oluşturun

Bu adım için AWS WAF etiketleri özelliğini kullanacaksınız. Yukarıdaki Durum 2’de açıklandığı gibi, yönetilen kural tarafından oluşturulan etiketle eşleşen özel bir kural oluşturmanız gerekir. Bu durumda, özel kural, özel yanıtınızı gönderecek şekilde yapılandırılmalıdır.

Özel bir kural oluşturma

  1. Custom response bölümünü genişletin ve Enable‘ı seçin.
  2. Response code altında, istemciye geri göndermek istediğiniz özel HTTP durum kodunu girin.
  3. (İsteğe bağlı) Özel bir yanıt başlığı eklemek istiyorsanız Response headers bölümünü kullanın.
  4. Choose how you would like to specify the response body altında, Adım 1’de oluşturduğunuz özel yanıt gövdesini seçin.
  5. (İsteğe bağlı) Günlüklerdeki etkinliği izlemek için ek etiketler oluşturmak istiyorsanız Add label‘ı kullanabilirsiniz.
  6. Add rule seçin.
  7. Özel kuralınızın kural önceliğini AWS Managed Rules kuralından daha düşük olacak şekilde ayarlayın.
  8. Save seçin.

Figure 10: Console screenshot configuring a custom response body for a ruleŞekil 10: Bir kural için özel bir yanıt gövdesi yapılandıran konsol ekran görüntüsü

Özet

Bu blogda, etiketler, sürüm yönetimi, scope-down statements ve özel yanıtlar gibi yeni AWS WAF özelliklerinin, web uygulamalarınızı korumak ve riski en aza indirmek için AWS Managed Rules davranışını özelleştirmenize nasıl yardımcı olabileceğini gösterdik. Bu özellikleri, isteklere izin vermek veya istekleri engellemek için etiketleri ve istek özelliklerini birleştirerek AWS Managed Rules’u özelleştirmek ve günlükleri filtrelemeye yardımcı olmak için etiketleri kullanmak gibi çeşitli şekillerde kullanabilirsiniz.

AWS WAF ile ilgili diğer Güvenlik Blogu gönderilerinde AWS WAF hakkında daha fazla bilgi edinebilirsiniz.