Bilgi Bankası'na Dön

Asterisk VoIP Güvenliği ve SIP Fraud Önleme: Honeypot, Rate Limiting ve Fail2ban

İnternete açık bir IP santral (Asterisk PBX) çalıştırıyorsanız, dakikalar içinde SIP tarayıcılarının (SIPVicious / friendly-scanner) hedefi haline gelirsiniz. Saldırganların birincil hedefi, santralinizin dış hatları (PSTN / SIP Trunk) üzerinden Küba, Somali veya premium ücretli numaraları aratarak yüksek telefon faturaları (Toll Fraud / IRSF) oluşturmaktır. Bu makalede, Asterisk sunucularınızı kurumsal seviyede zırhlandıracak pratik güvenlik mimarilerini inceliyoruz.

⚠️ En Yaygın Güvenlik Açığı: Tanımsız veya rastgele aramalara açık bırakılan default context'tir. Eğer context=default içinde dış hat arama izinleri varsa, kimlik doğrulaması olmadan gönderilen INVITE paketleri doğrudan dışarıya arama başlatabilir.

1. Akıllı Dialplan Honeypot Tuzağı

Saldırganlar rastgele IP taramalarında genellikle standart ön ekleri dener: 00, 9, 9011 (uluslararası arama ön ekleri) veya 100, 1000 gibi dahili numaralar. Bu numaraları bilinçli bir 'bal küpü' (honeypot) context'ine bağlayıp tarama yapan IP'yi anında Linux kernel seviyesinde engelleyebiliriz:

; extensions.conf - Honeypot context
[honeypot-trap]
; 00 ile baslayan uluslararasi veya 9 ile baslayan dis hat arama denemeleri
exten => _00.,1,Goto(trap-action,s,1)
exten => _9.,1,Goto(trap-action,s,1)
exten => _9011.,1,Goto(trap-action,s,1)
; Tarayicilarin denedigi yaygin sahte dahili numaralar
exten => _100X,1,Goto(trap-action,s,1)
; Geriye kalan tum yetkisiz istekler
exten => _.,1,Goto(trap-action,s,1)

[trap-action]
exten => s,1,NoOp(*** SIP ATTACK DETECTED FROM: ${CHANNEL(pjsip,remote_addr)} ***)
 ; Saldirgan IP adresini al ve iptables ile blokla
 same => n,Set(ATTACKER_IP=${CUT(CHANNEL(pjsip,remote_addr),:,1)})
 same => n,System(/usr/local/bin/block-sip-attacker.sh ${ATTACKER_IP})
 ; Saldirgani gereksiz mesgul etmek icin 10 saniye beklet
 same => n,Wait(10)
 ; SIP 403 Forbidden don
 same => n,Hangup(21)

Tuzak tarafından çağrılan /usr/local/bin/block-sip-attacker.sh scripti:

#!/bin/bash
IP="$1"
if [[ $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && [[ "$IP" != "127.0.0.1" ]]; then
    # ipset uzerinden aninda 24 saatlik ban
    ipset add sip-blacklist "$IP" -exist 2>/dev/null || iptables -I INPUT -s "$IP" -j DROP
    logger -t asterisk-honeypot "Blocked SIP scanner IP: $IP"
fi

2. PJSIP Güvenlik Sıkılaştırması (pjsip.conf)

Asterisk'in yeni nesil PJSIP stack'inde aşağıdaki parametreler açık kaynak VoIP güvenliğinde hayati önem taşır:

; pjsip.conf global ayarlar
[global]
type = global
; Kullanici adlarinin var olup olmadigini saldirgana soyleme (her turlu 401/403 don)
auth_rejection_permanent = yes
; Kullanici adini gizle (User-Agent bilgisini degistir)
user_agent = Private-PBX

; Endpoint guvenlik sablonu
[secure-endpoint-template](!)
type = endpoint
; Sadece hem IP hem Digest Auth dogrulamasi
identify_by = username,ip
; Bilinmeyen abonelik isteklerini reddet
allow_subscribe = no
; TLS ve SRTP zorunlulugu
media_encryption = sdes
transport = transport-tls
; Sadece guvenli codec listesi
disallow = all
allow = opus,g722,alaw

3. Eşzamanlı Çağrı Sınırlaması (Concurrent Call Limiting)

Bir dahilinin şifresi çalınsa bile, saldırganın santral üzerinden aynı anda 50 adet uluslararası arama açıp binlerce euro zarar vermesini engellemek için Asterisk'in dahili GROUP() ve GROUP_COUNT() fonksiyonları kullanılmalıdır:

; extensions.conf - Dis Arama Grubu Limiti
[outbound-trunk]
exten => _00.,1,NoOp(Uluslararasi Arama Guvenlik Kontrolu)
 same => n,Set(CALLER_EXT=${CALLERID(num)})
 ; Dahilinin aktif arama grubunu belirle
 same => n,Set(GROUP()=ext_${CALLER_EXT})
 ; Bu dahilinin su anda aktif kac dis aramasi oldugunu say
 same => n,GotoIf($[${GROUP_COUNT(ext_${CALLER_EXT})} > 2]?call-limit-exceeded)
 ; Limit asilmadiysa aramaya devam et
 same => n,Dial(PJSIP/${EXTEN}@my-itsp,60)
 same => n,Hangup()

 same => n(call-limit-exceeded),NoOp(Guvenlik: ${CALLER_EXT} eszamanli dis arama limitini asti!)
 same => n,Playback(custom/call-limit-reached)
 same => n,Hangup(17)

4. Fail2ban ile PJSIP Brute-Force Koruması

Asterisk güvenlik loglarını (/var/log/asterisk/messages) Fail2ban ile eşleştirerek 3 başarısız şifre denemesinde IP adresini UFW / iptables ile 24 saat banlayın:

# /etc/fail2ban/jail.d/asterisk.local
[asterisk]
enabled  = true
filter   = asterisk
action   = iptables-allports[name=asterisk, protocol=all]
logpath  = /var/log/asterisk/messages
maxretry = 3
findtime = 600
bantime  = 86400

5. Özet Kontrol Listesi

  • Santralinizde default veya from-sip-external context'inden dış hat aramalarına asla izin vermeyin.
  • Tüm SIP dahili şifrelerinde en az 16 karakterli rasgele alfanümerik parolalar kullanın.
  • Mümkünse SIP portunu standart 5060 yerine rastgele bir yüksek porta veya TLS (5061) üzerine taşıyın.
  • Honeypot tuzakları ile tarayıcıları tespit edip güvenlik duvarında otomatik engelleyin.