Kafayı yiyecektim resmen. Uzun süredir çalışan bir otomasyon sistemim vardı, birkaç dış servisin sağlık durumunu HEAD isteği atarak düzenli kontrol eden basit bir bot. Her şey yolundaydı, ta ki bir sabah ana sistemimden o servislere erişemediğimi fark edene kadar. İlk başta ağ sorunu sandım, sonra kendi kodumu suçladım. Meğerse sorun şuradaymış: Servis sağlayıcısı, düzenli aralıklarla gelen bu HEAD isteklerini, DDoS saldırısının probing/scanner aşaması zannetmiş ve sunucunun loglarına bakıp IP adresimi kalıcı olarak kara listeye almış!
Olayı anlamak için saatler harcadım. Botun logları temizdi, hata yoktu. Hatta istek aralığını (interval) kontrol ettim, dakikada 1 istek gibi son derece makul bir süreydi. Destek ekibine ulaşmam saatler sürdü. Sonunda bir mühendis açıkladı: "Otomatik güvenlik sistemi, belirli bir pattern'da gelen ve yanıt alamadığı HEAD isteklerini şüpheli sınıflandırıyor. Sizin IP'den gelen trafik bu profile %100 uyuyordu."
Yani şaka gibi ama, sadece `200 OK` alıp çıkmak istediğimiz şu masum kod parçası bize mal oldu:
Python:
import requests
try:
response = requests.head("https://api.saglikli-servis.com/health", timeout=5)
if response.status_code == 200:
print("Servis ayakta.")
except:
print("Bir sorun var!")
Buradan çıkardığım en büyük ders: Kendi sunucundan değil, dağıtık ve güvenilir bir monitoring servisi kullan. Ya da en azından User-Agent başlığını çok net bir şekilde (ör: "CompanyX-HealthCheck-Bot/1.0") belirt ve belki GET isteği atıp sadece başlıkları oku. Ama en iyisi, bu işi Cloud provider'ların hazır araçlarına bırakmak.
Şu an geçici olarak farklı bir IP ve daha uzun aralıklarla, daha "insani" bir pattern izleyen bir kontrol mekanizması kurdum. Ama o kara listeden çıkmak için hala uğraşıyorum.
Siz de benzer bir saçmalık yaşadınız mı? Sağlık kontrolü için HEAD mi yoksa GET mi kullanmak daha doğru? Yoksa bu kadar paranoyak bir güvenlik politikası normal mi sizce?