İ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.
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
defaultveyafrom-sip-externalcontext'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.