Asteriskは導入当初はいろいろとトラブルがありましたが、ここ数年とても安定していて、仕事の上でも重要なインフラとして役立っています。安定版をインストールして運用していれば、ほぼほぼ問題は出ないと思います。
※ただし、ブルートフォース攻撃は日常茶飯事ですので、fail2ban のインストールは必須です。

Asterisk のデフォルト設定では、IP電話で使う2つのプロトコル、SIP と RTP、どちらも暗号化されていません。特に SIP が暗号化されていないと、ID とパスワードが簡単に漏洩し、外部から好き放題通話されてしまうので、これは対策が必要です。

また、スマートフォンに、IP電話のアプリをインストールして使う事も多いので、フリー WiFi とかに接続した場合には簡単に通信内容が見えてしまう事から、今回は IP電話を使う際の暗号化について書いてみます。

 サーバ証明書の準備

ここではサーバ証明書の取得方法は割愛します。一般的なApache2 & OpenSSL のパターンで取得してください。
/etc/asterisk/key を作成して、そこにサーバ証明書、秘密鍵、その他必要なファイルを置きます。
ここでは例として、以下のファイルを用意します。

pbx.key       秘密鍵
pbx.csr       サーバ証明書
pbx.pem       ※後述
server-ca.crt 中間証明書

実は、このサーバ証明書の設定で、はまりました。最近は経験値があがってきて、証明書関連のファイルの作り方はわかってきたのですが、当時は全く手がかりがなく、適当に設定してもエラーとなり、ちょっと涙目になってしまいました。

sip.conf の general で、このサーバ証明書関連の設定するのですが、いくら文法を調べても、tlscertfile と tlscafile しかファイルの指定する所はありません。tlscafile で中間証明書を設定するのは、すぐにわかるのですが、何故か秘密鍵を設定する所が見つからず、随分調べ回って、全く別のサービスで一つのファイルに秘密鍵とサーバ証明書を同梱するやり方を見つけて、これだ!…と設定したらうまくいきました。

cat pbx.key > pbx.pem
cat pbx.csr >> 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電話を再起動する必要があります。