PJSIP absichern

In pjsip.conf gibt es eine Reihe von Optionen, die direkt auf die Angriffsfläche wirken:

[global]
type=global
; Reihenfolge, in der eingehende Requests einem Endpoint
; zugeordnet werden. "anonymous" steht absichtlich ganz hinten —
; wenn Sie keinen Gast-Zugang brauchen, lassen Sie es ganz weg.
endpoint_identifier_order=auth_username,username,ip

Am Endpoint selbst:

[2000]
type=endpoint
; KEIN anonymer Zugang
context=intern
; Starke Passwörter über auth=...
auth=2000
aors=2000
; IP-Einschränkung wenn möglich
acl=intern
; Anzahl gleichzeitiger Anrufe begrenzen (Toll-Fraud-Bremse)
device_state_busy_at=3

Der ACL-Block:

[intern]
type=acl
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/24
permit=10.0.0.0/8

User-Enumeration erschweren

Damit Angreifer über unterschiedliche Fehlerantworten nicht herausfinden können, welche Nebenstellen existieren, lässt Asterisk einige Härtungs-Parameter pro Endpoint zu:

[2000]
type=endpoint
; ...
inband_progress=no
allow_subscribe=no       ; SUBSCRIBE nur, wo es wirklich gebraucht wird

Anonyme Anrufe

Wenn Sie keinen öffentlich erreichbaren "Gast-Zugang" wollen (und das wollen Sie in den meisten Fällen nicht), entfernen Sie anonymous aus der endpoint_identifier_order. Ohne dieses Matching wirft Asterisk nicht authentifizierte INVITEs ab.

Toll-Fraud-Bremsen im Dialplan

Unabhängig von PJSIP lohnt sich im Dialplan eine Kosten-Bremse:

[von-extern]
; Alle eingehenden Trunk-Anrufe dürfen nur ins eigene Netz,
; NIEMALS raus über den Trunk.
exten => _X.,1,NoOp(Eingang)
 same => n,Goto(intern,${EXTEN},1)

[intern]
; Ausgehende Premium-/Auslands-Nummern nur, wenn PIN bekannt
exten => _00[1-9]X.,1,Authenticate(${OUT_PIN})
 same => n,Dial(PJSIP/${EXTEN}@provider,60)

; Hohe Kosten-Länder komplett sperren
exten => _001[9]XX.,1,Congestion()   ; Beispiel: bestimmte Präfixe ablehnen

Die Variable ${OUT_PIN} stammt aus der [globals]-Section und ist eine PIN, die niemand "nebenbei" weiß.