Asterisk SIP セキュリティ

2013年5月17日 (金) 23:28時点におけるTakahashi (トーク | 投稿記録)による版 (SIPのユーザ名/パスワードを、わかりにくくする)

AsteriskのSIPのセキュリティを向上させる方法

目次

大前提

 まず第一に用事がない(外からREGISTさせる必要がない)Asteriskはインターネットから到達可能な所に置かない、つまりインターネットに出さない/開かないのが当然の措置です。一般的な内線網であれば、外部との接続にはゲートウェイ等が用いられるためIPリーチャブルなところにAsteriskを置く必要はありません。
 サンプル設定ファイルをそのまま使用してはいけません。サンプル設定ファイルの中身は「誰でも」見られますし、公開されています。つまり攻撃者も同じ情報を入手できるということです。
 当たり前の話ですが、外部に対してサーバを開くことの危険性を理解していないのであれば、サーバをインターネット上に出すべきではありません。

allowguest

 現在配布しているサンプル設定ファイルでは allowguest=no を指定してありますが、以前配布していたものにはこの指定がなく、デフォルトの yes になっていましたので注意してください。
 基本 sip.conf には allowguest=no を指定しておいて下さい。yes を指定する場合/理由は自分で調べてください。

総当たり対策

SIPのユーザ名、パスワードを総当たりしてくる攻撃の対策方法。
総当たりで来るので、対策はそこそこ面倒です。

iptablesなどソースIPによるフィルタリング

 一般的なセキュリティ対策と同様に通す/通さないIPアドレスが明確な場合には効果的な対策のひとつです。
 特定のIPアドレスないしは、レンジからのREGISTERやSIPのセッションしか通さないのであれば、そのIPアドレスに対してのみSIP(5060)とRTP(UDPの10000~20000など)を開きます。
 ただしこの方法は「相手」のIPアドレスが明確な場合にのみ使える方法です。

Fail2banを使用する

fail2ban はログファイルを検査することにより、iptablesへ登録することでブロックする方式のツールです。SSHへのBruto Forceアタック対策などに使用されますが、Asteriskのログ検査を行うことでSIPをブロックするのにも使用できます。
SIP-Fail2ban

ドメイン認証を使う

sip.confのグローバルに以下の設定を追加します。

domain=nanntoka.kanntoka.tld

こうすると、SIPチャネルはこのドメインを持つものからのREGISTER以外は受付けなくなります。ただし、IPアドレスをドメインに使っている場合には、このIPアドレスも併記する必要があります。

domain=nanntoka.kanntoka.tld
domain=192.168.1.120

このように複数を記述することができます。
ただしこの方法は簡単に裏をかかれる可能性が高いので過信してはいけません。設定したから安全だと思わないように。他のセキュリティ対策を必ず併用してください。

SIPのユーザ名/パスワードを、わかりにくくする

パスワードを長くする

まず第一にパスワードを長くし、わかりにくい文字列に変更すると総当たりされた場合に、ヒットする確率を下げることができます。

ピア名を長くする

サンプルの設定ファイルでは簡素化のために"内線番号=SIPピア名"という形で記述していますが、これは必ずしもイコールである必要はありません。ここをイコールにしている理由は

exten => _2XX,1,Dial(SIP/${EXEN})

のように内線番号そのままでSIPピアにダイヤルしたいからです。もし、この利便性を捨ててかまわないのであれば、以下のような記述はアリです。

---sip.conf---
[4207f1257d2a12cb]
username=4207f1257d2a12cb
secret=なんちゃら
 ・
 ・
---extensions.conf
exten => 201,1,Dial(SIP/4207f1257d2a12cb)

内線番号とSIPのピア名の紐付けを行っているのはextenです。なので、extenの中で正しく記述されていれば、SIPのピア(ユーザ)名は内線番号と一致している必要はありません。

上の応用

上の方法を応用して、「ひみつのフレーズ」を付加することでピア(ユーザ)名を「わかりにくく」することが可能です。ただし、この「ひみつのフレーズ」を知られてしまっては意味がないので注意してください。
まず sip.conf はこんな感じ

---sip.conf---
[5e8518af331d-201]
username=5e8518af331d-201
secret=なんちゃら
 ・
 ・

次にextensions.confはこんな感じ

exten => _201.,1,Dial(SIP/5e8518af331d-${EXTEN})

このフレーズの部分 5e8518af331d を使うことで、ピア名を長くしてしまうわけです。

Asterisk 11の名前付きACLを使う

Asterisk 11から名前付きACL(Named ACL)が使用可能になっています。これを使うことで、SIPのピア毎にアクセス制御をかけることが可能です。

外にかけられないように対策

勝手に外(外線)に対して発信できないように規制をかけることで、電話を勝手に使われて費用が発生してしまうことを防ぐことができます。

外線プレフィックスを特殊なものにしてしまう

一般的に外線発信を単に、頭'0'で始めたり'0'ないしは'9' (03-, 003-のスタイル)で行えるようにしてしまっている所が多いと思います。これをワザと変なものにしてしまいます。例えば567とか何か適当なプレフィックスを外線発信用としてしまえば、ユーザ/パス総当たり->外線プレフィックス総当たり と両方を破って外に出られてしまうという危険性はかなり低くなります。

exten => _567.,1,Dial(SIP/${EXTEN:3}@outband-gateway)

とかのように書いてしまいます。

内線番号によって発信規制する

これはREGISTERされてCIDを騙られると効果はありませんが、特定の内線からのみ外線発信しておくことで若干は効果が期待できます。

発信先規制を入れる

海外に通話できる番号を禁止してしまいましょう。そうすれば海外に対して発信できないので超高額な電話代の請求をされる可能性は、ぐっと低くなります。
例えば頭が'00'とか'010'に対しては発信させないようにextenで書いてしまいます。ですが、これでは国際通話ができないので不便という場合には「超長いプレフィックス」などを使うとダイヤルできるようにしておくと良いでしょう。