GraphQL API Koruması
¶
Wallarm, temel WAAP abonelik planı kapsamında olsa bile GraphQL üzerinde düzenli saldırıları (SQLi, RCE, vb.) tespit eder. Bununla birlikte, protokolün bazı özellikleri aşırı bilgi ifşası ve DoS ile ilişkili GraphQL'e özgü saldırıların uygulanmasına olanak tanır. Bu belge, GraphQL istekleri için bir dizi sınır (GraphQL politikası) belirleyerek API'larınızı bu saldırılardan korumak için Wallarm'ın nasıl kullanılacağını anlatır.
Extended protection (gelişmiş koruma) niteliğinde olan GraphQL API Koruması, gelişmiş API Security abonelik planının bir parçasıdır. Plan satın alındığında, korumayı başlatmak için kuruluşunuzun GraphQL politikasını Detect GraphQL attacks kuralında (node 4.10.4 ve üzeri gerekir) ayarlayın.
Supported GraphQL formats¶
GraphQL sorguları tipik olarak bir GraphQL sunucu uç noktasına HTTP POST istekleri olarak gönderilir. İstek, sunucuya gönderilen gövdenin medya tipini belirtmek için bir CONTENT-TYPE
başlığı içerir. Wallarm, CONTENT-TYPE
için:
-
yaygın kullanılan seçenekler:
application/json
veapplication/graphql
-
ayrıca ortaya çıkabilen seçenekler:
text/plain
vemultipart/form-data
GraphQL sorguları HTTP GET istekleri olarak da gönderilebilir. Bu durumda, sorgu URL'deki bir sorgu parametresi olarak dahil edilir. GET istekleri GraphQL sorguları için kullanılabilse de, özellikle daha karmaşık sorgular için POST isteklerine kıyasla daha az yaygındır. Bunun nedeni, GET isteklerinin genellikle idempotent operasyonlar (yani sonuçları farklılık göstermeden tekrarlanabilen işlemler) için kullanılması ve uzun sorgular için sorun yaratabilecek uzunluk kısıtlamalarına sahip olmalarıdır.
Wallarm, GraphQL istekleri için hem POST hem de GET HTTP metodlarını destekler.
Kuralın Oluşturulması ve Uygulanması¶
GraphQL politikasını ayarlayıp uygulamak için:
-
Proceed to Wallarm Console:
- Rules → Add rule or your branch → Add rule.
- Attacks / Incidents → attack/incident → hit → Rule.
- API Discovery (if enabled) → your endpoint → Create rule.
-
Mitigation controls → GraphQL API protection seçeneğini seçin.
-
If request is kısmında, kuralın uygulanacağı uç nokta URI'sini ve diğer koşulları tanımlayın:
- GraphQL uç noktanızın URI'si (rota içinde, genellikle
/graphql
içerir) - POST veya GET metodu - bkz. Supported GraphQL formats; kuralın hem POST hem de GET istekleri için aynı sınırlamaları uygulamasını istiyorsanız yöntem belirtilmemiş bırakılabilir
-
CONTENT-TYPE
başlık değerini ayarlayın - bkz. Supported GraphQL formatsNot: Kuralın hangi koşul kombinasyonlarıyla uygulanacağını belirleyebilirsiniz, örneğin URI kullanılabilir ve diğer koşullar belirtilmeyebilir veya uç nokta belirtilmeden
CONTENT-TYPE
başlığıapplication/graphql
olarak ayarlanabilir. Farklı koşullar içeren ve farklı sınırlar ve tepkiler belirleyen birkaç kural da oluşturabilirsiniz.
- GraphQL uç noktanızın URI'si (rota içinde, genellikle
-
Trafik metriklerinize uygun olarak GraphQL istekleri için eşik değerleri belirleyin (boş bırakılırsa/seçilmezse bu kriter için herhangi bir sınırlama uygulanmaz):
- Maximum total query size in kilobytes - tüm bir GraphQL sorgusunun boyutu için üst sınır belirler. Aşırı büyük sorgular göndererek sunucu kaynaklarını tüketmeye yönelik Denial of Service (DoS) saldırılarını önlemek için çok önemlidir.
- Maximum value size in kilobytes - bir GraphQL sorgusu içindeki herhangi bir bireysel değerin (değişken veya sorgu parametresi fark etmez) maksimum boyutunu belirler. Bu sınır, değişkenler veya argümanlar için aşırı uzun string değerler göndererek sunucuyu yenmek isteyen saldırılara karşı yardımcı olur.
- Maximum query depth - bir GraphQL sorgusu için izin verilen maksimum derinliği belirler. Sorgu derinliğinin sınırlandırılması, kötü niyetle hazırlanmış, çok katmanlı sorgulardan kaynaklanan performans sorunları veya kaynak tükenmesi yaşanmasını engeller.
- Maximum number of aliases - tek bir GraphQL sorgusunda kullanılabilecek alias sayısını sınırlar. Alias sayısının sınırlandırılması, çok karmaşık sorgular oluşturmak amacıyla alias işlevselliğinden yararlanarak yapılan Resource Exhaustion ve DoS saldırılarını engeller.
- Maximum batched queries - tek bir istek içerisinde gönderilebilecek toplu sorgu sayısını sınırlar. Bu parametre, saldırganların hız sınırlandırma gibi güvenlik önlemlerini aşmak için birden fazla işlemi tek bir istekte birleştirdiği toplu saldırıları önlemek için esastır.
- Block/register introspection queries - etkinleştirildiğinde, sunucu GraphQL şemanızın yapısını açığa çıkarabilecek introspection isteklerini potansiyel saldırı olarak değerlendirecektir. Şemanın saldırganlara karşı korunması için introspection sorgularının devre dışı bırakılması veya izlenmesi kritik bir önlemdir.
- Block/register debug requests - bu seçeneği etkinleştirirseniz, debug modu parametresi içeren istekler potansiyel saldırı olarak değerlendirilecektir. Bu ayar, üretimde debug modunun yanlışlıkla etkin bırakılması durumlarını tespit etmek ve saldırganların hassas bilgileri açığa çıkarabilecek aşırı hata raporlama mesajlarına erişmesini engellemek için faydalıdır.
Varsayılan olarak, bir politika POST istekleri için maksimum sorgu boyutunu 100 KB, değer boyutunu 10 KB, sorgu derinliği ve toplu sorgu limitlerini 10, alias sayısını 5 olarak ayarlar; ayrıca introspection ve debug sorgularını reddeder (varsayılan değerleri kendi yaygın meşru GraphQL sorgu istatistiklerinize göre değiştirebilirsiniz):
GraphQL saldırılarını Keşfetme¶
Wallarm Console → Attacks bölümünde GraphQL politika ihlallerini (GraphQL saldırıları) inceleyebilirsiniz. GraphQL'e özgü arama anahtarlarını veya ilgili filtreleri kullanın: