Asteriskは導入当初はいろいろとトラブルがありましたが、ここ数年とても安定していて、仕事の上でも重要なインフラとして役立っています。安定版をインストールして運用していれば、ほぼほぼ問題は出ないと思います。
※ただし、ブルートフォース攻撃は日常茶飯事ですので、fail2ban のインストールは必須です。
※海外からの Asterisk への通信(アタック)を遮断したい場合には、こちらを…
Asterisk のデフォルト設定では、IP電話で使う2つのプロトコル、SIP と RTP、どちらも暗号化されていません。特に SIP が暗号化されていないと、ID とパスワードが漏洩する恐れがあり、その場合、外部から好き放題通話(特に海外通話による不法課金)されてしまうので、これは対策が必要です。
サーバ証明書の準備
ここではサーバ証明書の取得方法は割愛します。一般的なApache2 & OpenSSL のパターンで取得してください。
/etc/asterisk/key を作成して、そこにサーバ証明書、秘密鍵、その他必要なファイルを置きます。
ここでは例として、以下のファイルを用意します。
pbx.key 秘密鍵 pbx.crt サーバ証明書 pbx.pem ※後述 server-ca.crt 中間証明書
実は、このサーバ証明書の設定で、はまりました。最近は経験値があがってきて、証明書関連のファイルの作り方はわかってきたのですが、当時は全く手がかりがなく、適当に設定してもエラーとなり、ちょっと涙目になってしまいました。
sip.conf の general で、このサーバ証明書関連の設定するのですが、いくら文法を調べても、tlscertfile と tlscafile しかファイルの指定する所はありません。tlscafile で中間証明書を設定するのは、すぐにわかるのですが、何故か秘密鍵を設定する所が見つからず、随分調べ回って、全く別のサービスで一つのファイルに秘密鍵とサーバ証明書を同梱するやり方を見つけて、これだ!…と設定したらうまくいきました。
cat pbx.key > pbx.pem cat pbx.crt >> pbx.pem
こうすると、pbx.pem にファイルの先頭から秘密鍵、つづけてサーバ証明書というファイルが出来上がります。
# cat pbx.pem -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA18BBxFy01jQK7W/N0zaAes4mcr+783t6tesUDfQKA8lRPBu7 LZQwRMMlE1sXp9m8MmGMh6dwDDzh7Gv9mtWlWhutiBfW1gZ0UkWrt+ghcnemPHWT vvGPbeh8XrmJWq7VmuhlcrJ0/lzkLkaQkjoNEdJ76u7JWi/SnhxsZBt1Z+XShb2v --- 途中略 --- izphuwKBgGBlPfQB24MTzU2D5uyaZiK508njyZyLiPmHfWMPl0X1pEHzmfWkcMkc xHUxuRm+fX0F0az3qlo2uO3ixkWlO5bB+9G2FrhtSZ3+68A6RhgLCETgzhBbFEgl 9U/fquXDxpT3vZi+JEIm3Wkih/Ar9Z8DBU02TKz3l7xRGLmawizX -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIGVTCCBT2gAwIBAgIQGFfeYPpvCFUwPQk7utqI1jANBgkqhkiG9w0BAQsFADBC MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMS UmFwaWRTU0wgU0hBMjU2IENBMB4XDTE3MDQyNDAwMDAwMFoXDTIwMDQyMzIzNTk1 --- 途中略 --- B9hTzjqe/o5K+4gbhNk8gD401Y0Bi/f6K1UIuaptoTlku/WN9FvKR7yhr1ngk+QB adOgJgbtExVaVwXexWw/B/0nUAsg2LHpI/izU189Xa4dLqVxpD20lhN9y2wefsNl N2eqIDFUUT7Z4nOOxUHHHUwVWsPQ6qyvoUwdDEk+YInKs7dQd/FLhFM= -----END CERTIFICATE-----
…ということで、設定例としては下記を [general] に追加します。
tlsenable = yes tlsbindaddr = 0.0.0.0:5061 tlscertfile = /etc/asterisk/key/pbx.pem tlscafile = /etc/asterisk/key/server-ca.crt tlscipher = ALL tlsclientmethod = tlsv1
こんな感じになります。
内線毎の設定例 sip.conf
[208] type = friend username = 208 secret = パスワード canreinvite = no host = dynamic mailbox = 208 callgroup = 1 pickupgroup = 1 encryption = yes transport = tls
context については個別に指定しないと、[general] に書かれている context が使われます。
内線固有の設定を使いたいときには、extensions.conf に新しく設定を追加し、そのラベルをこの内線設定内で context として指定します。
encryption は、RTP の暗号化を意味します。yes と設定することで音声データのやり取りを暗号化できます。
※この暗号化には証明書は必要ありません。
transport = tls によって、SIP通信の暗号化がONになります。また、通常 SIP は UDP/5060番を使いますが、暗号化通信では TCP/5061番を使います。
IP電話側の設定
詳細についてはマニュアルを参照~となるのですが、手元にある snom305 と iPhone で動いている Bria について、暗号化の設定例です。
snom 社製のIP電話は、設定画面はほとんど同じなので、この例が参考になると思います。
snomD305-SIP Firmware version 10.1.37.11
Outboud Proxy の設定は、スクリーンショットだと全部見えないので、
pbx.it-tutor.jp:5061;transport=tls
となります。
ただし、サーバ側で使っているサーバ証明書がオレオレ証明書の場合にどうなるか?は、まだ検証していません。
次に iPhone で動いている Bria の設定例です。
設定する所は、見ての通りで、そんなに迷うところはないと思います。
暗号化の設定が正常に動作しているかは、Asterisk の CLI より、以下のコマンドで確認できます。
*CLI> sip show tcp Address Transport Type 115.179.532.xxx:61972 TLS Server 210.138.113.xxx:60059 TLS Server 202.239.224.xxx:62151 TLS Server
さいごに
Asterisk との通信がなんらかの原因で切れてしまった場合、UDP であればすぐに通信が再開しますが、TCP を使っているとセッションタイムアウトを待たないと、通信の再接続が行われません。Asterisk やサーバ本体を再起動した場合、状況によっては10分近くIP電話との接続が切れた状態が続きますので、その際には再接続するまで待つか、IP電話を再起動する必要があります。