ゼロからはじめるぜ! Twilio – シーズン3: SIP Trunking編 第8回

masa_prof2.jpgこんにちは、ネットワークエンジニアのまさです。

いよいよこのシーズンも最終回です。今回は、これまでに「おいおい話します」と先延ばしていたことについてお話します。SIPトランク環境における自衛手段、セキュリティに関するお話です。

ここからが私の専門分野になります。

過去の回で再三に渡り「検証環境・テスト用サーバーでやってください、別サービスが稼働中の本番環境でやらないでください。」とお話していた理由があります。この警告を無視して続けていた方はきっと居ないと信じておりますが、インターネットに出ているサーバーである以上、常に心ない悪い子に晒され続けていることを忘れてはなりません。そして自衛手段を取る責任は他でもない、私たち自身にあります。

 

この環境で直面するリスクとは何なのか?

 

実際に見て頂くのが早いです。これまでに構築したAsteriskサーバーにログインしてください。
ログインしたら root権限になりましょう。

Asterisk のコマンドラインコンソール(現在アクティブなログもリアルタイム表示)
# asterisk -vvvr

Asteriskのログ
# more /var/log/asterisk/messages

もしくは
# tail /var/log/asterisk/messages

前者を実行すると、ホスト名*CLI> というプロンプトになり、現在Asteriskに発生しているイベントがリアルタイムに表示されます。しばらくこのまま何もせず眺めていてください。

過去の回でもこのコマンドを実行していて気づいた人もいるかもしれませんが、よくわからないホストからRegistをあげようとしているログがそれなりの数来ている のです。しばらく眺めていても出ない人で、このシリーズを読みながらAsteriskを立てっぱなしにしている人は、後者のコマンドでAsteriskのログを眺めてみてください。以下は私の環境になりますが、こんなログが、しかも結構な数で出ていませんか?

※一部伏せ字にしてあります。

[Jul 5 21:39:53] NOTICE[23616] chan_sip.c: Registration from '"2010" <sip:2010@X.X.X.X:5060>' failed for '91.236.75.157:5066' - Wrong password
[Jul 5 21:39:59] WARNING[23616] chan_sip.c: Timeout on xxxxxxxxxxxxxxxxxxxx on non-critical invite transaction.
[Jul 5 21:39:59] NOTICE[23616] chan_sip.c: Registration from '"301" <sip:301@X.X.X.X:5060>' failed for '91.236.75.157:5071' - Wrong password
[Jul 5 21:45:01] WARNING[23616] chan_sip.c: Timeout on xxxxxxxxxxxxxxxxxxxx on non-critical invite transaction.
[Jul 5 21:45:10] WARNING[23616] chan_sip.c: Timeout on xxxxxxxxxxxxxxxxxxxx on non-critical invite transaction.
[Jul 5 21:45:13] NOTICE[23616] chan_sip.c: Registration from '"123456" <sip:123456@X.X.X.X:5060>' failed for '91.236.75.157:5091' - Wrong password
[Jul 5 21:46:10] NOTICE[23616] chan_sip.c: Failed to authenticate device 1001<sip:1001@X.X.X.X>;tag=0e358bc8
[Jul 5 21:46:59] NOTICE[23616] chan_sip.c: Registration from '"6666" <sip:6666@X.X.X.X:5060>' failed for '91.236.75.157:5084' - Wrong password
[Jul 5 21:47:08] NOTICE[23616] chan_sip.c: Registration from '"5010" <sip:5010@X.X.X.X:5060>' failed for '91.236.75.157:5083' - Wrong password
[Jul 5 21:47:10] NOTICE[23616] chan_sip.c: Registration from '"8010" <sip:8010@X.X.X.X:5060>' failed for '91.236.75.157:5064' - Wrong password
[Jul 5 21:47:12] NOTICE[23616] chan_sip.c: Registration from '"210" <sip:210@X.X.X.X:5060>' failed for '91.236.75.157:5072' - Wrong password
[Jul 5 21:47:15] NOTICE[23616] chan_sip.c: Registration from '"310" <sip:310@X.X.X.X:5060>' failed for '91.236.75.157:5072' - Wrong password
[Jul 5 21:47:16] NOTICE[23616] chan_sip.c: Registration from '"1031" <sip:1031@X.X.X.X:5060>' failed for '91.236.75.157:5065' - Wrong password
[Jul 5 21:47:27] NOTICE[23616] chan_sip.c: Registration from '"301" <sip:301@X.X.X.X:5060>' failed for '91.236.75.157:5075' - Wrong password
[Jul 5 21:47:32] NOTICE[23616] chan_sip.c: Registration from '"9001" <sip:9001@X.X.X.X:5060>' failed for '91.236.75.157:5086' - Wrong password
[Jul 5 21:47:38] NOTICE[23616] chan_sip.c: Registration from '"601" <sip:601@X.X.X.X:5060>' failed for '91.236.75.157:5061' - Wrong password
[Jul 5 21:47:38] NOTICE[23616] chan_sip.c: Registration from '"2222" <sip:2222@X.X.X.X:5060>' failed for '91.236.75.157:5087' - Wrong password

 

もう、お分かりでしょうか? Registration from で始まり Wrong password で終わっているこれらの行、すべてインターネット上の悪い子が、あなたのAsteriskに対して内線をぶら下げようとやってきた足あとです。

なぜこんなことをするのでしょうか?

もう少しログを見てみましょう。こんな行もおそらく見つかるはずです。
[Jul 6 09:56:20] NOTICE[29261] Ext. 110048422886570: Dialing out from "1009" <1009> to 10048422886570 through Twilio Provider
[Jul 6 09:56:52] WARNING[27688] chan_sip.c: Retransmission timeout reached on transmission ff081bb26db09b067e1bbdd14f07d591 for seqno 1 (Critical Response) -- See https://wiki.asterisk.org/wiki/display/AST/SIP+Retransmissions
Packet timed out after 32000ms with no response

 

この行は、内線 1009 から 10048422886570 という外線番号にダイヤルしようとした形跡です。私たちがこれまでやってきた環境構築において内線 1009 というコンテキストは作っていないので、この1009の内線が何かをやらかすことは無いのですが、もし、1009のコンテキストを作り、Regist用のユーザー名・パスワードが一致してぶら下がることに成功してたらどうなるでしょうか?

思い出してください、Twilio管理画面に設定したSIPトランクのセキュリティクレデンシャル(Asterisk がTwilio経由で外線をかけるための認証情報) はすでにAsterisk に登録されています。Asterisk が外線を発信するたびに、この情報を使ってTwilioに認証をかけますが、当然、正しい認証情報が登録済みのため、すでにTwilio経由で外線をかける環境は整っているのです。

つまり、内線がぶら下がることができれば、その内線からは extensions.conf に設定した「先頭にプッシュする番号」さえ合っていれば、Twilioを介した外線ダイヤルは無条件で成立する のです。

これが、私が今まで訴えてきた

・壊してもいいサーバーでやりましょう
・内線番号は複雑にしておきます
・ユーザー名とパスワードは絶対にやぶられてはいけない

の理由です。どうやって見つけてくるのかは分からないですが、この悪い子、結構な数います。おそらく、IPアドレスを総舐めにしつつ、SIPのデフォルトポートである 5060番をひたすらスキャンし、応答があったらそこに内線番号をローラー作戦であてがってぶら下がり試行をしてくるのでしょう。よく色々なことを考えるもんだなと思います。

先ほどの外線時の先頭にプッシュする番号ですが、「0発信」や「9発信」はよくある外線時のプッシュ番号なので、悪い子もそれを想定して、先頭に 0 をダイヤルしてくるケースが多い。セキュリティー対策を行っていない環境においては「4649発信」とか「5963発信」とか工夫して堅牢性を上げましょう。

このように、SIPといえど、リスクがあるインターネット上で実現していることを忘れないで下さい。
忘れて欲しくないので、もう一つお見せします。

このシリーズを読みながらずっとAsteriskを立てたままにしている方は、Twilio管理画面にログインし、エラスティックSIPトランキング>ログ を見てください。Failed になっている外線発信のログが大量にありませんか? (もしCompleted になっていたらその外線、成立しています。ユーザーとパスワードが簡単すぎた、ぶっこ抜かれた、いずれにしても緊急事態です。大至急パスワードを変えてください!)

zerotwilio_3-8-1.jpg



隙があれば電話をタダ乗りしようとする輩はこんなにたくさんいるのです。


かといって、嫌だ、怖いよう、もうやらない!! と諦めてしまうのはもったいない。このような側面をきちんと理解して対策すれば、便利な技術ですし、シンプルに「0発信」にしたって安全です。

これからその話をします。

 

SIPトランク: 安全のしおり

 

飛行機座席の前ポケットにある「安全のしおり」、読んでる人は1割にも満たないという話をどこかで読んだことがあります。いざ、飛行機が急降下をはじめた時、やれ救命胴衣はどこにあるんだっけ、どうやっていつ膨らませたらいいんだっけ、そういえば非常口はどこだっけ? そもそも、私はなぜ今飛行機に搭乗しているんだろう、どこに向かおうとしてるんだ? ・・・そんなことが頭に浮かぶならまだいいほうですが、急降下が始まったら、恐ろしさで毛布や枕を抱きかかえるか、エチケット袋に顔を突っ込んでいるのが精一杯じゃないでしょうか?

生きて帰れるものが帰れなくなる、そんなことになりたくなければ「安全のしおり」には目を通すべきだし、滑走路に向かう途中のキャビンアテンダントのプチ演劇はありがたく鑑賞するべきです。ニュージーランド航空は、映画「ホビット」のピーター・ジャクソン監督を引張りだし、壮絶なムービーをこさえてまで搭乗客へアテンション プリーズしています。

SIPトランクにおける「安全のしおり」ですが、防衛手段についてお話します。大きくこの3つです。

・ゲストの不許可
・Regist のユーザー名・パスワード強化
・IPアドレスフィルタリングによる接続制限

まず、最初の「ゲストの不許可」ですが、結論からいうと、残念ながら現在のところこれは不可能です。第3回でお話をしましたが、Twilioを介して外線からAsteriskに着信するためには、TwilioはAsteriskに対して Non-Registered型 でやってきます。よって allowguest=yes でTwilioからの接続を受け付けるしかありません。

となると、まず最初の砦はここ、Asterisk にそう簡単にRegistできないように、ユーザー名・パスワードを強化し、攻撃者の総当りに対抗することになります。これでひとまずは安心なのですが、asterisk -vvvr をみていてあまり気持ちのいい状態ではないなと感じていると思います。

まだ、泥棒が毎日玄関のドアを叩いて「開かねえなあ」と言われ続けているのに等しい状況 なのです。認証情報が強化なほどドアをぶち破られる可能性は低いですが、1000回も10000回も叩かれるのは、ドアにとっても負担になる。

そこで、IPアドレスフィルタリングによる接続制限 へと進むわけです。

だったら最初からやってくれよ!!ヽ(`Д´#)ノ というご意見もあるかと思いますが、SIP通信のリアルな側面を見ていただくこと、それと、フリーソフト や iPhoneのアプリ を使って簡単にIPフォンを模した環境を作れるためにこの手法を取っています。特に、iPhoneのアプリについては、お使いの携帯電話からどのグローバルIPアドレスを使って通信するのかが特定できないため、やむなくこの手法を取りました。IPアドレスを絞ってしまうと、IPフォンアプリから AsteriskにRegistがあげられないのです。

以降、IPアドレスフィルタリングの例を紹介しますが、この手法は、内線としてぶら下げるSIPフォンアプリ、もしくはSIP対応電話機のグローバルIPアドレスが固定されて分かっている場合のみです。多くの実用例の場合は、確定しているでしょうから、本番のSIPフォン環境構築の時にはこの手法を取り入れ、セキュリティ堅牢度を上げてください。

 

IPTABLESを用いたアクセス制限

ファイヤーウォールをお持ちの方は、そちらでやりましょう。ここでは簡単に実装できる Linux標準の iptables を使ったフィルタ例を紹介します。

Asterisk はデフォルトではSIP標準ポート 5060番で待ち受けます。これからやることは、

・Twilioからの通信を許可すること
・内線に使うIPフォンアプリ/SIP対応電話機からの通信を許可すること

の2つです。まずは、最初の Twilio側。

Twilioのアクセス条件については、→ こちら のページ、最下部の「 IP address whitelist」に公開されています。これらのIPアドレスを許可することで、PSTN→Twilio→Asterisk の通信を通すようにします。もちろん、Signalling IPs と Media IPs の両方が必要です。

iptables の場合、直接プロンプトに iptables のコマンドを打ってもいいですし、/etc/sysconfig/iptables にルール設定を書いてもいいですし、私の場合は、別にルール設定シェルを作り、これを実行して適用するようにしています。みなさんの手法でいいですので、ルールを適用します。以下はコマンドから直接叩く場合の例です。

上記Twilioドキュメントに書いてあるのですが、Twilioが使うメディア(音声)用ポートは 10000番~20000番までですが、Twilioの使うIPアドレスから悪い子が来ることはないと思うので、これらのIPを全許可で設定します。こうすれば、SIP用tcp/udp、メディア用 udp もまとめて許可できます。

 

iptables -t filter -A INPUT -s 54.172.60.0 -j ACCEPT
iptables -t filter -A INPUT -s 54.172.60.1 -j ACCEPT
iptables -t filter -A INPUT -s 54.172.60.2 -j ACCEPT
iptables -t filter -A INPUT -s 54.172.60.3 -j ACCEPT
iptables -t filter -A INPUT -s 54.171.127.192 -j ACCEPT
iptables -t filter -A INPUT -s 54.171.127.193 -j ACCEPT
iptables -t filter -A INPUT -s 54.171.127.194 -j ACCEPT
iptables -t filter -A INPUT -s 54.65.63.192 -j ACCEPT
iptables -t filter -A INPUT -s 54.65.63.193 -j ACCEPT
iptables -t filter -A INPUT -s 54.65.63.194 -j ACCEPT
iptables -t filter -A INPUT -s 54.169.127.128 -j ACCEPT
iptables -t filter -A INPUT -s 54.169.127.129 -j ACCEPT
iptables -t filter -A INPUT -s 54.169.127.130 -j ACCEPT
iptables -t filter -A INPUT -s 54.252.254.64 -j ACCEPT
iptables -t filter -A INPUT -s 54.252.254.65 -j ACCEPT
iptables -t filter -A INPUT -s 54.252.254.66 -j ACCEPT
iptables -t filter -A INPUT -s 177.71.206.192 -j ACCEPT
iptables -t filter -A INPUT -s 177.71.206.193 -j ACCEPT
iptables -t filter -A INPUT -s 177.71.206.194 -j ACCEPT

 

次に、内線としてぶら下げる電話機側のIPアドレスを同じ要領で許可します。他社や他人と同じIPアドレスを共有しているというのはあまり無いでしょうから、上と同じように

iptables -t filter -A INPUT -s (IPアドレス) -j ACCEPT

で許可します。そしてこの設定を反映してください。

反映すると、どうでしょう、iPhone のIPフォンアプリはRegistがあげられなくなるので「未登録」になったはずです。asterisk -vvvr のほうもしばらく眺めてみましょう。さっきまでポツポツ悪い子が遊びにきていたのにパッタリと来なくなったはずです。これで知らないIPアドレスからの悪い子はドアすら叩けなくなりました。

このように、実際、本番・商用でSIPフォン環境を構築する際には、セキュリティーを十分考慮し、必要な対策は打てるだけ打つようにしてくださいね。また、Asterisk の sip.conf を見てピンときた方もいると思いますが、デフォルトの 5060番ポートは変更できます。このポートを Well Knownポートじゃないものにする、というのも簡単に堅牢性を上げる手法になります。是非、みなさん、各自で Asterisk の研究を進めていただき、素敵なSIPフォン環境を作ってみてください。

そうそう、本日 2015年7月31日の 米国Twilio社のBLOG で、Origination に新しい機能をくわえたという記事が載りましたよ!! 英語ですが、→こちら です。ディザスタリカバリとして、Origination の URL、つまり IP-PBXを復数登録できるようになったということです。私もこれからジックリ読んでみます。

8回に渡りお届けした ゼロからはじめるぜ!Twilio - シーズン3、これでお開きとなります。
最後までお付き合いいただきましてありがとうございました(^^)

この記事をシェア


最新記事

すべての記事へ