Mail Gateway Queuedaki Mailleri Silme, Postfix Kuyruk Krizlerini Yönetmek: Yüz Binlerce Maili Saniyeler İçinde Temizlemek

Postfix çalıştırırken, mevcut bir posta kuyruğundan (mail queue) bir e-postayı silmek oldukça kolaydır. Belirli bir e-posta, posta sunucuları arasında “veri sonu gönderilirken [mailserver] ile bağlantı koptu — mesaj birden fazla kez gönderilmiş olabilir” (lost connection with [mailserver] while sending end of data -– message may be sent more than once) mesajlarıyla gidip geliyorsa bu işlemi yapmak isteyebilirsiniz.

Öncelikle, birkaç temel bilgi. Tüm posta kuyruğunuzu görüntülemek için bash komut satırına aşağıdakini yazın:

Bash

# postqueue -p | more 

Belirli bir e-posta adresine gönderilmiş özel bir e-postayı bulmak için grep komutunu kullanın:

Bash

# postqueue -p | grep "guvenlik.be" -B 2 -A 1
B3D7B2601F8AS    56352 Tue Feb 28 17:19:58  [email protected]
(lost connection with [mailserver] while sending end of data -- message may be sent more than once)
                                         [email protected]

Sonucunuzun ilk satırı bir mesaj kimliğini (message ID) gösterecektir (bu örnekte “B3D7B2601F8A”). Bu e-postayı silmek için aşağıdaki komutu çalıştırın:

Bash

# postsuper -d B3D7B2601F8AS
postsuper: B3D7B2601F8AS: removed
postsuper: Deleted: 1 message 

Olay müdahale (Incident Response) süreçlerinde zaman en değerli kaynaktır. Bir sabah uyandığınızda veya nöbetçi olduğunuz bir pazar gecesi, izleme ekranlarında sunucunuzun CPU’sunun %100’e dayandığını, load average değerlerinin tavan yaptığını ve Postfix (veya Proxmox Mail Gateway) kuyruğunda yüz binlerce zararlı e-postanın biriktiğini görebilirsiniz.

Hedefli bir “mail bomb” saldırısı, bir zafiyet sonucu tetiklenen sonsuz bir döngü veya kontrolden çıkmış bir uygulama… Sebep ne olursa olsun, acil bir temizlik yapmanız gerekir. Ancak kuyrukta 500.000 mail varken standart komutlar sizi kurtarmaz.

Klasik postsuper -d komutu tek iş parçacıklı (single-threaded) çalıştığı ve Postfix arka planda dosyalara kilit (lock) koyduğu için yoğun bir disk I/O darboğazı yaşarsınız. Sistem sürünür, silme işlemi saatler sürer.

Bu yazıda, spesifik bir hedeften (örneğimizde brandefense.io domaini) gelen zararlı mailleri, I/O limitlerine takılmadan multi-thread mimariyle saniyeler içinde nasıl temizleyebileceğimizi teknik detaylarıyla inceleyeceğiz.

Hayat Kurtaran O Tek Satırlık Komut

Sistemi ayağa kaldıracak ve kuyruğu agresif bir şekilde temizleyecek olan komut zincirimiz şu şekilde:

Bash

postqueue -p | awk 'BEGIN { RS = "" } /brandefense.io/ { print $1 }' | tr -d '*!' | xargs -r -n 1000 -P 10 postsuper -d

Bir güvenlik mühendisi olarak bir komutu sadece çalıştırmak yetmez, altındaki mekaniği anlamak gerekir. Gelin bu pipeline’ı (boru hattını) parçalarına ayıralım:

1. postqueue -p (Veri Toplama)

Mevcut mail kuyruğunun standart çıktısını (standart output) alır. Bu komut, mailleri listelerken tek bir satır kullanmaz; her bir mail için gönderici, alıcı, boyut ve ID bilgilerini içeren paragraf blokları oluşturur.

2. awk 'BEGIN { RS = "" } /brandefense.io/ { print $1 }' (Kritik Filtreleme)

Burada standart grep kullanmak yerine awk kullanmamızın çok önemli bir mimari sebebi var. Postfix çıktıları bloklar (paragraflar) halindedir. RS = "" (Record Separator) parametresi, awk aracına her boş satırı bir ayırıcı olarak kabul etmesini söyler. Böylece awk, satır satır okumak yerine veriyi blok blok okur. Hedef domaini (brandefense.io) içeren bloğu bulduğunda, o bloğun sadece birinci alanını (yani benzersiz Queue ID‘sini) yakalar ve ekrana basar.

3. tr -d '*!' (Veri Sanitizasyonu)

Postfix, aktif olarak işlenen maillerin ID’sinin sonuna *, beklemeye alınmış (hold) maillerin sonuna ise ! işareti koyar. postsuper silme komutu bu işaretleri tanımaz ve hata verir. tr aracı ile bu özel karakterleri budayarak saf ID’yi elde ederiz.

4. xargs -r -n 1000 -P 10 postsuper -d (Multi-Thread Silme Motoru)

İşte komutu sıradanlıktan çıkarıp “Enterprise” seviyesine taşıyan kısım burasıdır.

  • -r (No Run If Empty): Eğer kuyrukta eşleşen ID yoksa, komutu boşuna çalıştırıp hata üretmesini engeller.
  • -n 1000 (Batch Processing): Gelen on binlerce ID’yi tek tek silmek yerine, 1000’erli paketler halinde postsuper komutuna argüman olarak yollar.
  • -P 10 (Parallel Execution): İşlemi 10 farklı process (iş parçacığı) üzerinden aynı anda yürütür. Tek çekirdeğe yüklenmek yerine, sunucunun işlem gücünü paralelize ederek silme süresini saatlerden saniyelere düşürür.

Bir yanıt yazın

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