Защита от прослушивания SIP c помощью — TLS + SRTP + шифрованный туннель и телефона Yealink T26p

  • Tutorial
image
У вас паранойя? Вам кажется что вас постоянно хотят подслушать? Ведете важные переговоры? Тогда вам сюда!
В этой заметке я расскажу об основных сложностях при настройке телефона Yealink T26p.
Для начала мы заставим телефон поднять шифрованный туннель с сертификатами до сервера OpenVPN, а потом пустить внутри тунеля SIP с шифрованной через сертификаты сигнализацией и голосом! (TLS + SRTP).
Кому интересно прошу под кат.


Для начала предлагаю ознакомится со схемой работы.
image
Смысл работы в следующем — телефоны подключены из любой точки через интернет. Они поднимают шифрованный канал до единственного торчащего в мир порта OpenVPN сервера. А далее с этого сервера телефония идет в недра корпоративной сети, к спрятанному там серверу Asterisk. Но как вы можете заметить, канал до сервера OpenVPN у нас шифрованный, а вот внутри корпоративной сети где много обслуживающего персонала, можно перехватить трафик SIP на каком нибудь из шлюзов и в последствии расшифровать, и узнать о чем был разговор! Этот кусочек сети специально пометил красной линией. Поэтому мы настроим на астериске SRTP + TLS и будем шифровать еще и трафик внутри сети — чтобы он был защищен от недобросовестных работников компании. Таким образом, круг лиц имеющих доступ к разговорам, очень сильно сужается.

Для установки сервера OpenVPN я использовал dvd образ Centos 6.4. На установке останавливаться не буду- все стандартно.



Чиним сразу глюк локали.
export LC_CTYPE=en_US.UTF-8


Включаем форвардинг на сетевых интерфейсах.
nano /etc/sysctl.conf
#Найти и заменить
net.ipv4.ip_forward = 1


Включаем загрузку сетевого интерфейса при запуске.
nano /etc/sysconfig/network-scripts/ifcfg-eth0
#Найти и заменить.
ONBOOT=yes


Обновляем CentOS.
cd /usr/src/
yum update -y


Добавляем нужный репозиторий.
wget http://fedora.ip-connect.vn.ua/fedora-epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm


Ставим требуемые пакеты.
yum install openvpn git bridge-utils -y


EasyRSA тепер отдельно и на гитхабе — поэтому:
git clone https://github.com/OpenVPN/easy-rsa.git
cp -r /usr/src/easy-rsa/easy-rsa /etc/openvpn/


Советую для последующих добавлений и изменений скопировать оригинальный конфиг VPN и закоментировать там все строки, потом будет удобно искать нужные команды для добавления и их синтаксис.
cp /usr/share/doc/openvpn-2.3.1/sample/sample-config-files/server.conf /etc/openvpn/
nano /etc/openvpn/server.conf  
#Закоментировать все в конфиге и оставить для наглядности, потом вставляем :

port 1194
proto udp
dev tun0
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
server 172.19.7.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 172.19.7.0 255.255.255.0"
keepalive 10 120
user root
group root
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
mute 20
comp-lzo no


Меняем метод шифрования с sha256 на MD5 т.к. телефон не понимает первый метод. В сборке easy-rsa есть 3 варианта файла openssl, менять будем во всех сразу чтобы не выяснять какой будет использовать система при генерации ключей и сертификатов.
cp /etc/openvpn/easy-rsa/2.0/openssl-0.9.6.cnf /etc/openvpn/easy-rsa/2.0/openssl-0.9.6.cnf.orig && sed -e 's/default_md.*=.*sha256/default_md = md5 /g' /etc/openvpn/easy-rsa/2.0/openssl-0.9.6.cnf.orig > /etc/openvpn/easy-rsa/2.0/openssl-0.9.6.cnf

cp /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf.orig && sed -e 's/default_md.*=.*sha256/default_md = md5 /g' /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf.orig > /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf

cp /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf.orig && sed -e 's/default_md.*=.*sha256/default_md = md5 /g' /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf.orig > /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf


Далее меняем дефолтные значения
nano /etc/openvpn/easy-rsa/2.0/vars
export KEY_SIZE=1024
export KEY_COUNTRY="RU"
export KEY_PROVINCE="CA"
export KEY_CITY="Moscow"
export KEY_ORG="YOURCOMPANY"
export KEY_EMAIL="info@YOURCOMPANY.ru"
export KEY_OU="MY"


Можно приступать к генерации сертификатов:


Перейдем в нужную директорию, где будем генерировать ключи и сертификаты
cd  /etc/openvpn/easy-rsa/2.0
[root@test 2.0]# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys
[root@test 2.0]# ./clean-all
#Создаем самоподписной корневой сертификат и ключ, все ответы можно оставить по умолчанию, кроме Common Name
[root@test 2.0]# ./build-ca
Generating a 1024 bit RSA private key
.........++++++
.......................++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [YOURCOMPANY]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:test
Name [changeme]:
Email Address [mail@host.domain]:


Создаем сертификат и ключ для сервера
Все ответы можно оставить по умолчанию
[root@test 2.0]# ./build-key-server server
Generating a 1024 bit RSA private key
.........................++++++
.............................++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [MOSCOW]:
Locality Name (eg, city) [MOSCOW]:
Organization Name (eg, company) [YOURCOMPANY]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [server]:
Name [changeme]:
Email Address [mail@host.domain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'MOSCOW'
localityName          :PRINTABLE:'MOSCOW'
organizationName      :PRINTABLE:'YOURCOMPANY'
organizationalUnitName:PRINTABLE:'changeme'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'changeme'
emailAddress          :IA5STRING:'mail@host.domain'
Certificate is to be certified until Mar 20 06:56:48 2023 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


Генирируем ключ Диффи-Хелмана
[root@test 2.0]# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
...................................................+.................................................................+...................+..+.........................................................................................................................................+...........+.......................................................+....+..................................................................................................+......................................................................+.................................................................................................+............................+.....................................................................+.............++*++*++*


Генерируем клиентский ключ (для каждой машины или телефона он должен быть свой)
Все ответы оставляем по умолчанию
[root@test 2.0]# ./build-key client1
Generating a 1024 bit RSA private key
.++++++
......++++++
writing new private key to 'client1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [YOURCOMPANY]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [client1]:
Name [changeme]:
Email Address [mail@host.domain]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'CA'
localityName          :PRINTABLE:'Moscow'
organizationName      :PRINTABLE:'YOURCOMPANY'
organizationalUnitName:PRINTABLE:'changeme'
commonName            :PRINTABLE:'client1'
name                  :PRINTABLE:'changeme'
emailAddress          :IA5STRING:'mail@host.domain'
Certificate is to be certified until Mar 20 07:01:46 2023 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


Подготовка файла для подсоединения телефона:


Создаем папку — внутри должна лежать папка keys и файл vpn.cnf.
Пример vpn.cnf — вместо XXX естественно ваш адрес сервера:
client
dev tun
proto udp
remote XXX.XXX.XXX.XXX 1194
resolv-retry infinite
nobind
ca /yealink/config/openvpn/keys/ca.crt
cert /yealink/config/openvpn/keys/client1.crt
key /yealink/config/openvpn/keys/client1.key
verb 3
mute 20
comp-lzo no


Внутри папки keys должны лежать соответственно три файла — ca.crt, client1.crt, client1.key. Имена файлов в конфиге и в папке должны соответствовать. Файлы вытаскивать с сервера после генерации любым удобным способом.
После этого ставим 7zip и архивируем файл vpn.cnf и папку keys в tar архив без сжатия. Либо можете на линуксе из папки с файлом vpn.cnf и папкой keys запустить:
tar cvf connect.tar ./vpn.cnf ./keys


Заходим в веб интерфейс телефона. Идем на вкладку Network > Advanced > Vpn. Ставим active = enabled, импортируем файл и нажимаем внизу submit.
image

Если телефон не схавал файлик можете его перезагрузить. Увидеть что он подключился к нашему серверу — посмотрев логи:
tail -n100 -f /var/log/openvpn.log


Настройка TLS + SRTP на Asterisk.


Настройку с нуля писать не буду ибо статей море, и мои тоже есть. Расскажу как же сделать сертификаты, включить шифрование и впихнуть все это в телефон.
Итак на астере надо сделать Certificate Authority.
mkdir /etc/cert
cd /etc/cert/
root@server-sip1:/etc/cert# openssl genrsa -des3 -out ca.key 4096

Generating RSA private key, 4096 bit long modulus
.......................++
...............................++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
root@server-sip1:/etc/cert#
root@server-sip1:/etc/cert#
root@server-sip1:/etc/cert# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:MOSCOW
Locality Name (eg, city) []:MOSCOW
Organization Name (eg, company) [Internet Widgits Pty Ltd]:YOURCOMPANY
Organizational Unit Name (eg, section) []:VoIP
Common Name (eg, YOUR name) []:YUORCOMPANY CA
Email Address []:INFO@YOURCOMPANY.RU
root@server-sip1:/etc/cert#
root@server-sip1:/etc/cert#
root@server-sip1:/etc/cert# ls
ca.crt  ca.key
root@server-sip1:/etc/cert#


CA создали — далее нужно загрузить в телефон файл ca.crt чтобы он знал что данному СА можно доверять — закладка Security > Trusted Certificates.
image
Создание и подпись сертификата сервера и для телефонов — описываю для сервера, а для телефона процедуру повторить.
root@server-sip1:/etc/cert# openssl genrsa -out key-server.pem 1024
Generating RSA private key, 1024 bit long modulus
.....++++++
...++++++
e is 65537 (0x10001)
root@server-sip1:/etc/cert# openssl req -new -key key-server.pem -out req-server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:MOSCOW
Locality Name (eg, city) []:MOSCOW
Organization Name (eg, company) [Internet Widgits Pty Ltd]:YOURCOMPANY
Organizational Unit Name (eg, section) []:VoIP
Common Name (eg, YOUR name) []:server
Email Address []:info@yourcompany.ru
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
root@server-sip1:/etc/cert#
root@server-sip1:/etc/cert#
root@server-sip1:/etc/cert#
root@server-sip1:/etc/cert# openssl x509 -req -days 365 -in req-server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out cert-server.crt
Signature ok
subject=/C=RU/ST=MOSCOW/L=MOSCOW/O=Yourcompany/OU=VoIP/CN=server/emailAddress=info@yourcompany.ru
Getting CA Private Key
Enter pass phrase for ca.key:
root@server-sip1:/etc/cert#


Подготовка сертификата для Астериска.
Структура файла для астера должна выглядеть следующим образом — вначале файл сертификата следующего вида:
-----BEGIN CERTIFICATE-----
MIIDvDCCAyWgAwIBAgIJAPMabsMiJJQPMA0GCSqGSIb3DQEBBQUAMIGbMQswCQYD
[...]
CfITDxcJBZfeXIPZP52+8FSMlm5985uMvao+emlIUGk11rY61Amxr387grDvgOaI
-----END CERTIFICATE-----


Потом сразу файл ключа:
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCqRw0jpQFn+f+lnDZiZzCRca9ojgu2brO+Q56jnqorvCIlYFC0
[...]
FT65O46u6Vmp1gPbNklOEg7TtZUtfacPY2PyeP4KoHaG
-----END RSA PRIVATE KEY-----


Скомпоновать можно через cat:
root@server-sip1:/etc/asterisk/cert# cat /etc/cert/key.pem > /etc/asterisk/cert/asterisk.pem
root@server-sip1:/etc/asterisk/cert# cat /etc/cert/cert-server.crt >> /etc/asterisk/cert/asterisk.pem


Теперь прописываем в файле sip.conf (или sip_general_custom.conf если это Elastix или FreePBX)
tcpenable=yes
tcpbindaddr=0.0.0.0
tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/cert/asterisk.pem
tlscafile=/etc/cert/ca.crt


Когда все готово нужно на конкретном extension включить TLS и SRTP.

Таким же образом готовим файл для телефона и загружаем его в меню Security > Server Certificates
image

Данной статьей ни в коем случае не хочу претендовать на полноту материала. Но очень хотелось донести эти важные нюансы настройки для человека который может с этим в последствии столкнуться. У меня на выяснения всех нюансов выписки и подготовки сертификатов для телефона и астериска ушла неделя. Если у вас есть предложения как можно сделать — лучше\быстрее\правильнее, то с удовольствием почитаю в комментариях!

Update. При настройке телефона Business HD IP DECT Phone W52P выяснилась особенность заливки в него конфигов. Нужно в путях прописывать без "/yealink":
ca /config/openvpn/keys/ca.crt
cert /config/openvpn/keys/client1.crt
key /config/openvpn/keys/client1.key

В дополнение хотелось бы сказать что телефон Business HD IP DECT Phone W52P в пароле Asterisk-а на extension понимает символ "&", а телефон Yealink T26p не понимает.
Для лучшей стабильности в телефоне на закладке Accounts изменили Login expire на 600 и Subscribe period 300.
Share post

Similar posts

Comments 13

    +5
    Спасибо за статью! А не слишком много оверхеда при такой топологии?
    Если все равно SRTP+TLS, не проще ли на едже ставить сразу астериск со всем выше перечисленным?
      +1
      Зашел в пост прочитать этот комментарий.
        0
        Следует не забывать о необходимости очень внимательно выставлять * в общую сеть т.к. стоит чуть ошибиться и за ваш счёт родные кубинских мигрантов смогут быть в курсе о погоды в европе.
          0
          Это первая фаза проекта, дальше через сервер OpenVPN планируется запускать клиентов и к другим серверам, а не только к *. ( RDP например) На самом OpenVPN разруливать доступом разных клиентов к разным сервисам — поэтому сделали отдельный. Кстати если есть мысли то подскажите как разных клиентов пускать к разным сетевым адресам? Я пока придумал только через iptables. Да и SpiritOfVox прав по поводу кубы, это тоже повлияло при принятии решения.
          0
          Сорри, что не в личку, но очень уж ошибка распространённая. Паранойя, а не параноя.
            0
            Спасибо, поправил.
            +5
            По статье — вообще непонятно, какая была цель и для чего это всё. Описывается просто некая последовательность действий, без комментариев, найденных граблей и различных путей их обхода. Но главное всё же цель.

            Да, ещё про средства не сказали, про телефон, например.
              0
              Мне казалось что все понятно.
              Цель — защита голоса от прослушивания — при подключении через интернет.
              Грабли находил на каждом шагу и решил что описывать их будет намного дольше — т.к. самая большая проблема — отсутствие нормальной инструкции как готовить сертификаты для телефона и генерировать их. Поэтому я заполнил данный пробел — написав инструкцию как соединить эти технологии и подготовить к этому сервер с OpenVPN, Asterisk и сам телефон. Пути решения — пока знаю только 1 — его и описал в статье. Надеялся узнать различные пути решения в комментариях. Про телефон особо и сказать нечего. По отзывам пользователя телефон сделан очень качественно, никакого люфта, удобные кнопки, можно очень быстро набирать номер без задержек, хорошее качество передачи речи и микрофон. По поводу же его внутренних настроек лично хотелось бы выразить свое недовольство китайцам — написавшим это чудовище. Не всегда логичный веб интерфейс — к примеру кнопка перезагрузки находится в меня Upgrade. Так же в Grandstream удобнее сделана загрузка сертификатов и ключей TLS. В них просто текстовые поля в которые можно скопировать содержимое сертификата и ключа. Тут надо готовить все заранее. Очень неудобно сделана загрузка настроек OpenVPN. Вместо того чтобы прикрутить поддержку PKCS12 — они сделали неописанную (я не нашел нормального описания в мануале) процедуру подготовки архива. Так же почему то модуль openvpn-client в телефоне собран без поддержки sha256 — тоже непонятно.
                0
                С удивлением обнаружил, что у меня валяется на подоконнике выигранный на одной конференции Yealink T26P.
                А как вы решили обойтись со смартфонами? Оставить за бортом?
                  0
                  Тут все как раз нормально. Приложение на Android не поддерживает Bridge (tap) интерфейсы. Я же сделал специально с тунельным(tun), поэтому мобильные телефоны работают с тунелем нормально. Подготовка стандартная — вытащили файлики для телефона в папку, туда же положили файл *.ovpn со стандартным конфигом наподобие:
                  client
                  dev tun
                  proto udp
                  remote XXX.XXX.XXX.XXX 1194
                  resolv-retry infinite
                  persist-key
                  persist-tun
                  ca ca.crt
                  cert client1.crt
                  key client1.key
                  comp-lzo no
                  verb 3
                  Единственное пока не было возможности проверить файлы pkcs12. В easyrsa есть скрипт генерации ./build-key-pkcs12. Телефон точно работает с этим форматом, т.е. можете сгенерить под него 1 файл и загрузить в приложении.
                  По поводу подключения SIP с TLS+SRTP прокомментировать не могу т.к. не пробовал пока. И не знаю какое приложение умеет с этим работать. Подозреваю что CSIPSimple умеет.
                    0
                    Оказывается, и для айфона есть openvpn клиент без jailbreak. habrahabr.ru/post/168853/
                    Неожиданно топик дал много новых мыслей. Спасибо =)
              0
              Автору спасибо.
              А скажите пожалуйста, какое качество связи при работе через VPN?
              Пробовали ли вы подключать SIP+TLS на Android-офоны?
              Мы тоже ковыряем такое решение, но через Cisco AnyConnect качество телефонии оказалось отвратительным, как-то буферно всё что ли, задержки к тому же.
              А вот Android+TLS так и не получилось.
              Ну и к тому же мы себе ставили задачу подключаться встроенным клиентом, а не сторонним приложением. Пробовали ли вы что-то такое?
                0
                Качество связи через VPN с полным шфированием на телефонах Yealink хорошее, ничего не тормозит и не прерывается. На андроид я пробовал подключаться к телефонии через стандартное приложение play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ru. Оно не поддерживает работу с OpenVPN в режиме моста. Качество было вполне нормальное. Но единственное, я подключался не используя SRTP+TLS на SIP. Нужно подобрать клиента в котором можно удобно вставить все сертификаты, но я пока не искал. По поводу встроенного клиента SIP в Android даже честно говоря не в курсе. Использовал CSipSimple.

              Only users with full accounts can post comments. Log in, please.