Настройка TLS и SRTP в Asterisk 13

Настройка TLS и SRTP в Asterisk 13

В одном из проектов мы организовывали шифрование голоса. Да да да – заказчик оказался фанатиком безопасности. Рассмотрим настройку шифрования голоса с помощью SRTP в Asterisk 13 через драйвер chan_sip и драйвер chan_pjsip для SIP-клиентов, подключенных к Asterisk.

Содержание

Преамбула

Transport Layer Security (TLS) обеспечивает шифрование сигнализации, другими словами – шифрует ваш SIP трафик. Это необходимо для того, чтобы злоумышленники не смогли разобрать вашу сигнализацию и не смогли бы подключится к вашей УПАТС, используя украденные логины и пароли. Для настройки TLS между Asterisk и SIP клиентами необходимо сначала создать ключи безопасности, далее произвести необходимую настройку конфигурационных файлов Asterisk и настроить SIP клиенты для работы по протоколу TLS.
Как известно, Asterisk для сигнального протокола SIP использует UDP порт 5060 (по умолчанию), а так же передает эту информацию в открытом виде, поэтому, перехватив трафик, мы можем получить всю информацию касательно номеров и собственно, сам разговор. Помочь с данной проблемой нам сможет SIP по TLS, который уже в свою очередь будет шифровать сигнальные данные используя при этом TCP порт 5061 (по умолчанию), поэтому, даже перехватив трафик, злоумышленник получит информацию в зашифрованном виде, но это касается только SIP протокола, голос шифровать нужно отдельно, тут нам поможет SRTP. Стоит отметить, что использовать только TLS без SRTP не имеет смысла, так как медиа трафик остается без шифрования.
Стоит отметить, что использование TLS не панацея, и не защитит вас от MITM-атак (Man in the middle, человек посередине) если не используется проверка подлинности сертификатов.

Практическая часть

apt-get install libsrtp0-dev

I. Настройка во FreePBX

По умолчанию UDP-порты для FreePBX 13 – chan_sip@5061, chan_pjsip@5060. Изменим их на chan_sip@5060 и chan_pjsip@5062 перед началом настройки УАТС. Вы можете выбрать любые другие порты и сделать их по умолчанию.

В настройках SIP Asterisk «General SIP Settings» нужно выбрать какой порт назначен и для какой технологии. Выбрав Chan SIP по умолчанию, SIP будет использовать порт TLS 5061, а pjSIP будет использовать порт TLS 5161.
Настройка TLS и SRTP в Asterisk 13

Драйвер chan_sip

После того, как будут выполнены предварительные настройки, мы включим TLS/SSL/SRTP в настройках “Asterisk SIP Settings” (Далее мы рассмотрим как настроить шифрование, используя драйвер pjSIP).

Установите «Включить TLS» (“Enable TLS”) на «Да» (“Yes”)

Выберите сертификат для использования. Сертификаты устанавливаются в модуле “Certificate Manager” на вашей УАТС.
Установите «Метод SSL» (“SSL Method”) для использования «sslv2»
Установите «Не проверять сервер» (“Don’t Verify Server”) на «Нет» (“No”). (Это кажется немного противоречивым, но мы хотим проверить как это будет работать).
Настройка TLS и SRTP в Asterisk 13
Измените расширения, которые вы хотите включить TLS/SRTP, на вкладке расширений включите TLS и SRTP, как показано в примере ниже.
Настройка TLS и SRTP в Asterisk 13

Драйвер chan_pjsip

Выберите сертификат для использования. Сертификаты устанавливаются в модуле “Certificate Manager” на вашей УАТС.
Установите «Метод SSL» (“SSL Method”) для использования «sslv2»
Установите «Проверять клиента» (“Verify Client”) и “Проверять сервер” (“Verify Server”) на «Да» (“Yes”).
Настройка TLS и SRTP в Asterisk 13
Измените “Транспорт” (“Transport”), “Шифрование мультимедиа” (“Media Encryption”) и “Требовать шифрование RTP (Media)” (“Require RTP (Media) Encryption”) как показано на рисунке ниже.
Настройка TLS и SRTP в Asterisk 13
Если телефон уже настроен в EPM, переустановите конфигурацию для SIP-аккаунта, на котором вы будете использовать SRTP или TLS, на основе настроек, которые вы произвели, и перезагрузите телефоны. После перезагрузки телефоны будут использовать SRTP и TLS.

II. Настройка в Asterisk 13

Часть 1 – TLS

Создание ключей безопасности
Создадим директория хранения ключей безопасности

mkdir /etc/asterisk/keys
Затем, используя скрипт “ast_tls_cert” из исходного каталога “contrib/scripts” в Asterisk, создадим самоподписной центр сертификации (Certificate Authority) и сертификат для Asterisk.
./ast_tls_cert -C sip.mycompany.ru -O "MNeustroev" -d /etc/asterisk/keys
Ключ “-C” используется для определения нашего имени хоста DNS или IP адреса.
Ключ “-O” определяет имя вашей организации.
Ключ “-d” определяет директорию хранения созданных ключей.
1. Вам будет предложено ввести пароль для /etc/asterisk/keys/ca.key.
2. После чего будет создан файл /etc/asterisk/keys/ca.crt.
3. Вам снова будет предложено ввести пароль, а затем будет создан файл /etc/asterisk/keys/asterisk.key.
4. Файл /etc/asterisk/keys/asterisk.crt будет сгенерирован автоматически.
5. Вам будет предложено ввести пароль в третий раз, после чего будет создан файл /etc/asterisk/keys/asterisk.pem – это комбинация файлов asterisk.key и asterisk.crt.
Затем мы создаем клиентский сертификат для наших SIP-клиентов (устройств).
./ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C phone1.mycompany.com -O «MNeustroev» -d /etc/asterisk/keys -o maksim
Опция “-m client” сообщает скрипту, что мы хотим получить сертификат клиента, а не сертификат сервера.
Параметр “-c /etc/asterisk/keys/ca.crt” указывает, какой центр сертификации (свой) мы используем.
Опция “-k /etc/asterisk/keys/ca.key” предоставляет ключ для вышеупомянутого центра сертификации.
Опция “-C“, используется для определения имени хоста DNS или IP-адреса нашего SIP-телефона (клиента)
Опция “-O” определяет наше организационное имя.
Параметр “-d” определяет директорию, где будут находится созданные ключи.
Опция “-o” – это имя ключа, который мы выводим.
Перед тем, как получить доступ к ключу /etc/asterisk/keys/ca.key, вам будет предложено ввести пароль.
Теперь давайте проверим каталог ключей /etc/asterisk/keys/, чтобы увидеть, все ли файлы мы создали. Вы должны увидеть следующий список:
asterisk.crt 
asterisk.csr 
asterisk.key 
asterisk.pem 
maksim.crt 
maksim.csr 
maksim.key 
maksim.pem 
ca.cfg 
ca.crt 
ca.key 
tmp.cfg
Затем скопируйте файлы maksim.pem и ca.crt на компьютер, через который вы будете настраивать ваше SIP-устройство.
Если вашему SIP-клиенту требуется файл сертификата .p12, вы можете сгенерировать его с помощью openssl, например:
# openssl pkcs12 -export -out MySuperClientCert.p12 -inkey ca.key -in ca.crt -certfile asterisk.crt

Конфигурация Asterisk chan_pjsip

Теперь давайте настроим драйвер PJSIP канала Asterisk для использования TLS.
В файле конфигурации /etc/asterisk/pjsip.conf вам необходимо включить транспорт с поддержкой TLS. Примером может быть следующим:
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
method=tlsv1
Обратите внимание на protocol, cert_file, priv_key_file и method. Здесь мы используем протокол TLS, мы указываем ключи, которые мы сгенерировали ранее для cert_file и priv_key_file, и установили метод TLSv1.
Затем необходимо указать SIP-клиенту использование протокола TLS. Пример ниже:
[maksim]
type=aor
max_contacts=1
remove_existing=yes

[maksim]
type=auth
auth_type=userpass
username=maksim
password=vashpassword

[maksim]
type=endpoint
aors=maksim
auth=maksim
context=local
disallow=all
allow=g722
dtmfmode=rfc4733
media_encryption=sdes
Обратите внимание на параметр media_encryption для SIP-аккаунта. В этом случае мы настроили SIP-клиент, который будет использовать шифрование SDES для RTP.
Возможно, у вас может возникнуть соблазн добавить “transport=transport-tls” вашему SIP-аккаунту, но в версиях pjproject ниже версии 2.4.5, это приведет к тому, что появятся проблемы “Connection refused” в некоторых ситуациях. Пусть pjproject делает выбор транспорта самостоятельно. Если вы все еще наблюдаете проблемы, установите “rewrite_contact=yes” в конфигурации SIP-аккаунта.

Конфигурация Asterisk chan_sip

В файле конфигурации /etc/asterisk/sip.conf установите следующее:
tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/keys/asterisk.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscipher=ALL
tlsclientmethod=tlsv1
Здесь мы активируем поддержку TLS.
Мы привязываем TLS к нашему локальному IPv4 (по умолчанию для порта TLS – 5061) адресу.
Мы установили файл сертификата TLS тот, который мы создали выше.
Мы установили Центр сертификации тот, который мы создали выше.
Шифры TLS установлены на ВСЕ, поскольку это наиболее подходящий вариант.
И мы установили SIP-метод аутентификации TLS в TLSv1, так как это предпочтительнее для RFC и для большинства SIP-клиентов.
Затем вам нужно настроить SIP-аккаунт в Asterisk для использования TLS в качестве транспортного протокола. Вот пример:
[maksim]
type=peer
secret=mypassword
host=dynamic
context=local
dtmfmode=rfc2833
disallow=all
allow=g722
transport=tls
Обратите внимание на вариант transport. Драйвер канала Asterisk SIP поддерживает три типа: udp, tcp и tls. Поскольку мы настраиваем TLS, мы его и установим. Также можно указать несколько поддерживаемых типов транспорта для партнера, разделив их запятыми.

Траблшутинг с верификацией на сервере

Если хост или IP-адрес, используемые для общего имени в вашем сертификате, не совпадают с вашим сервером, тогда вы можете столкнуться с проблемами, когда ваш клиент делает вызов через Asterisk. Убедитесь, что у клиента настроено – не проверять сервер на соответствие сертификату.
При вызове из Asterisk через софтфон вы можете столкнуться с ERROR в CLI Asterisk, подобным этому:
[Jan 29 16:04:11] DEBUG[11217]: tcptls.c:248 handle_tcptls_connection:  SSL Common Name compare s1='10.24.18.124' s2='phone1.mycompany.com'
[Jan 29 16:04:11] ERROR[11217]: tcptls.c:256 handle_tcptls_connection: Certificate common name did not match (10.24.18.124)
Это противоположный сценарий, когда Asterisk действует как клиент и по умолчанию пытается проверить сервер назначения на сертификат.
Вы можете установить tlsdontverifyserver = yes в sip.conf, чтобы предотвратить попытку Asterisk проверять сервер.
;tlsdontverifyserver=[yes|no]
;        If set to yes, don't verify the servers certificate when acting as
;        a client.  If you don't have the server's CA certificate you can
;        set this and it will connect without requiring tlscafile to be set.
;        Default is no.

Часть 2 – SRTP

Теперь, когда мы включили TLS, наша сигнализация безопасна, поэтому больше никто не узнает, какие расширения используются нами на PBX. Но наши вызовы по-прежнему не защищены, поэтому кто-то может отследить наши разговоры RTP. Давайте это исправим.
Поддержка SRTP обеспечивается libsrtp. libsrtp должен быть установлен на сервере до компиляции Asterisk, иначе вы увидите что-то вроде:
[Jan 24 09:29:16] ERROR[10167]: chan_sip.c:27987 setup_srtp: No SRTP module loaded, can't setup SRTP session.
на вашем CLI Asterisk. Если вы это видите, установите libsrtp (это для тех, кто читает статью с конца), а затем переустановите Asterisk (./configure; make; make install).
Давайте вернемся к нашим pee настройкам в sip.conf. Добавляем строку шифрования:
[maksim]
type=peer
secret=mypassword
host=dynamic
context=local
dtmfmode=rfc2833
disallow=all
allow=g722
transport=tls
encryption=yes
context=local

На этом все.