пятница, 4 октября 2013 г.

Один из простых вариантов защиты VoIP

 

Про IP-телефонию очень много написано и сказано. И в частности про безопасность, при использовании VoIP. Но, тем не менее, периодически то от одного, то от другого знакомого слышу «страшные» истории, как у кого-то ломанули VoIP-сервер и они получили счет за телефон с большим количеством нулей…

Вот один из последних случаев: В небольшой организации начинающий админ решил поизучать еще плохо ему знакомые технологии VoIP и для этого завел extension с логином «test» и угадайте каким паролем? ;)

Система работала уже не один год, внешняя защита была отлажена, сервер портом 5060 светился «наружу». Но те, кто ставили и настраивали систему, защиту от слабого пароля по какой-то причине не включили. Нужно было видеть лицо директора этой организации, когда, придя утром на работу, он увидел перепуганную секретаршу и счет за телефон — около 25000$. Это только за одну ночь. А если бы оператор не выключил их SIP-аккаунт и счет, как положено, был выписан в начале следующего месяца?

 



О дальнейшей судьбе этого админа не знаю, но подозреваю – безрадостная.
Мое мнение – не стоит светить «наружу» порт 5060, если у вас нет постоянного квалифицированного админа, контролирующего ситуацию с обнаружением и залатыванием дыр в системе, а так же четко понимающего результат своих действий.

Но если не открывать «наружу» SIP-порт, как же мобильным клиентам и удаленным офисам работать с центральной IP PBX? Один из вариантов – использование VPN. Кроме обеспечения работы телефонии, этот же туннель можно использовать для объединения сетей удаленных офисов. Хотя тот вариант, который я опишу далее, имеет достаточно низкую пропускную способность – 8-9Мбит/с. Но если этого для вас вполне достаточно, то пожалуйста, пользуйтесь.
«Живую», уже работающую схему, по некоторым причинам, описывать не буду. Расскажу на примере, собранного на столе, небольшого стенда. В качестве протокола VPN используется OpenVPN.

Схема сети:


IP PBX реализована Add-On’ом Asterisk на базе D-Link DNS-325. Как Add-On устанавливается и настраивается рассказывать не буду, я об этом уже писал, например тут: http://habrahabr.ru/post/172927/ иhttp://habrahabr.ru/post/183888/
Единственное НО – в последнем посте рекомендуется Add-On с Asterisk 1.6, так в Add-On'е с 1.8 были некоторые недоработки. На сегодня проблемы у 1.8 устранены, поэтому смело можно ставить http://dlink.vtverdohleb.org.ua/Add-On/current.php?package=Asterisk18&model=DNS-325

На него же (D-Link DNS-325) устанавливаете Add-On OpenVPN.

Свичи D-Link DES-1210-28P имеют функцию PoE (IEEE 802.3af), т.е. могут подать питание IP-аппаратам D-Link DPH-150SE по витой паре. Это удобно тем, что в месте установки IP-аппарата не нужно занимать дополнительную розетку, а самое главное – как правило, все оборудование серверной «сидит» на ИБП, в том числе и свичи. Т.е. даже при пропадании питания в здании телефония будет работать.

Со стороны «филиала» применяется маршрутизатор D-Link DSR-250N. Почему именно он – вся серия D-Link DSR-XXXX поддерживает OpenVPN client/server (только прошивки _WW).

Если со стороны офиса поставить VPN-маршрутизатор, с поддержкой протокола IPSec – удобней поднять туннель между двумя маршрутизаторами на IPSec. Но в данном описании я применил OpenVPN, так как подать ETTH в офис нет возможности, а ставить 2 устройства (DSL + DFL/DSR) заказчик отказался.
Установка Add-On'a OpenVPN по образу и подобию Add-On Asterisk. Для настройки OpenVPN еще понадобится установить Add-On sshd

После установки и запуска sshd, заходим на него ssh-клиентом и первым делом меняем пароль пользователя root ! Как ssh-клиента под Windows чаще всего используют PuTTY



Первый заход – логин «root», пароль не спрашивает. После выполнения команды «passwd» и ввода нового пароля все последующие заходы, кроме запроса «login», будет запрашиваться «Password».
Те, кто пользуются Far Manager, для дальнейших действий видимо удобней будет пользоваться Midnight Commander'ом
Просто установить и стартануть. После, заходите по ssh и запускаете «mc».



Переходим в каталог «/mnt/HD/HD_a2/Nas_Prog/OpenVPN/genkey» и редактируем «F4» файл «vars». Если «F4» не работает, попробуйте «Alt+4».



Строка «export KEY_SIZE=384» — размер ключа шифрования. 384 – минимальный размер. Для «филиала Пентагона» можно поставить 2048 ;) Выдержка из vars: «Increase this to 2048 if you are paranoid.»
«export CA_EXPIRE=3650» и «export KEY_EXPIRE=3650» — через сколько дней «протухнет» сертификат и нужно будет генерировать новый, можете уменьшить.
Далее

export KEY_COUNTRY=«UA»
export KEY_PROVINCE=«KV»
export KEY_CITY=«Kiev»
export KEY_ORG=«D-Link»
export KEY_EMAIL=«ua@dlink.ru»
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme


впишите свои данные.
«F2» или «Alt+2» — сохранить изменения, 2 раза «Esc» — выйти.
Генерируем сертификаты и ключи. Нажимаем «Ctrl+O» и в командной строке запускаем

source ./vars
./clean-all
./build-ca


Тут начинаются вопросы. Подтверждаем Enter’ом предлагаемые данные или вводим новые.

Обязательно! Тут и далее – поле «Common Name» не должно быть пустым. В данном случае введите, к примеру, «server».


Далее

./build-key-server server


Те же вопросы, в «Common Name» тоже вводим «server». «A challenge password» игнорируем – Enter. “Sign the certificate?» проверяем, что ввели и нажимаем «Y». На «1 out of 1 certificate requests certified, commit?» так же «Y».


Далее

./build-dh



Теперь генерируем сертификаты клиентов. Каждый сертификат должен иметь уникальное имя! Несколько пользователей под одним сертификатом работать не смогут. Запускаем

./build-key client1
./build-key client2
./build-key client3


И т.д. столько, сколько предполагается клиентов. Если не хватит – в будущем можно будет нагенерировать еще. «Common Name» для «build-key client1» вводим «client1» и т.д.


Ключи готовы, лежат в папке «keys». Копируем их в «/mnt/HD/HD_a2/Nas_Prog/OpenVPN/etc/» с удалением старых.
Клиенту для работы потребуются 3 файла: ca.key, clientX.crt и clientX.key, где X – порядковый номер клиента. Создайте в шаре Volume_1 (для ssh это /mnt/HD/HD_a2/) каталог, например openvpn_keys, и скопируйте туда сертификаты с ключами. Из командной строки это так:

cp /mnt/HD/HD_a2/Nas_Prog/OpenVPN/genkey/keys/ca.key /mnt/HD/HD_a2/openvpn_key/
cp /mnt/HD/HD_a2/Nas_Prog/OpenVPN/genkey/keys/client*.crt /mnt/HD/HD_a2/openvpn_key/
cp /mnt/HD/HD_a2/Nas_Prog/OpenVPN/genkey/keys/client*.key /mnt/HD/HD_a2/openvpn_key/
chmod -R a+rw /mnt/HD/HD_a2/openvpn_key


После того, как сертификаты скопируете в доступное только для вас место (свой винт, флешка и т.п.) удалите каталог /Volume_1/openvpn_key !
Теперь переходим в папку «/mnt/HD/HD_a2/Nas_Prog/OpenVPN/etc/» и редактируем «server.conf». Можно переменные менять, но если вы с OpenVPN ранее не работали, оставьте все без изменений, кроме:
1. если вы все же изменили размер DH-ключа, поменяйте в server.conf имя файла dh384.pem на свое, например для ключа 2048 будет dh2048.pem
2. В дефолтном конфиге есть строки

push «route 10.1.1.0 255.255.255.0»
push «route 192.168.17.0 255.255.255.0»
push «route 172.17.17.0 255.255.255.0»


Они подразумевают, что клиенту будет насильно передано маршрутизировать сети 10.1.1.0/24, 192.168.17.0/24 и 172.17.17.0/24 в туннель, а не в Интернет. Выдаваемая на интерфейсы туннеля сеть 10.8.0.0/24 так же принудительно заворачивается в туннель. В нашем примере «10.1.1.0/24, 192.168.17.0/24» — это дополнительный пример, реально нужна только 172.17.17.0/24
3. Есть еще строки

client-config-dir /etc/openvpn/ccd
route 192.168.101.0 255.255.255.0


192.168.101.0/24 – это сеть филиала. При запуске OpenVPN на сервере, маршрут на эту сеть автоматом маршрутизируется в туннель. В каталоге /etc/openvpn/ccd имеется пример файла для клиента с сертификатом client1. В этом файле описаны все сети клиента, в данном случае только 192.168.101.0/24. Если такого файла не будет, туннель поднимется, данные поедут, но сервер будет убивать все пакеты, в которых IP источника не прописан в client1. Т.е. перепутав ключи и сети вы тоже получите не работающие туннели. В логе это будет видно как «MULTI: bad source address from client [192.168.101.XXX], packet dropped»
4. Для мобильных клиентов, у которых установлен openvpn-клиент, /etc/openvpn/ccd/clientX создавать не нужно, у них будут адреса из 10.8.0.0/24, т.е. сервер их примет «как родных»
5. можно раскомментировать, если хотите весь трафик филиала завернуть в туннель

push «redirect-gateway def1 bypass-dhcp»


6. cipher разкомментируйте тот, который хотите применять. По умолчанию используется BF-CBC
7. comp-lzo можно раскомментировать, если клиенты поддерживают сжатие данных в туннеле. Но DSR-250N ее не поддерживает, поэтому в этом примере comp-lzo выключена
8. client-to-client раскомментировать, если требуется обмен между «филиалами». Тут нужно push'ем передать «правильные» сети, но это уже тема маршрутизации IP вообще, поэтому подробно останавливаться на этом не буду
Перезапускаем сервер OpenVPN:

/mnt/HD/HD_a2/Nas_Prog/OpenVPN/stop.sh
/mnt/HD/HD_a2/Nas_Prog/OpenVPN/start.sh /mnt/HD/HD_a2/Nas_Prog/OpenVPN /mnt/HD/HD_a2/Nas_Prog/OpenVPN


Log по умолчанию пишется в /var/tmp/openvpn.log. В realtime его можно смотреть из командной строки так:

tail -f /var/tmp/openvpn.log


Выход из просмотра – Ctrl+C
Настройка сервера завершена. Теперь приступим к настройке маршрутизатора, в данном случае D-Link DSL-2750.

Во-первых нужно принять запрос на поднятие туннеля и передать его на DNS-325. Настройка описана тутhttp://dlink.ru/ru/faq/246/1156.html, повторятся не буду. Т.е. нужно «внешний порт» 1194 протокол «udp/tcp» пробросить на «внутренний порт» 1194, «внутренний IP» 172.17.17.150

Во-вторых нужно в «Дополнительно/Маршрутизация» добавить сети, которые будут маршрутизироваться в туннель, в данном случае только 10.8.0.0/24 и 192.168.101.0/24

Добавляем так:
Сеть назначения 192.168.101.0
Маска сети назначения 255.255.255.0
Шлюз 172.17.17.150
Метрика 1
Через интерфейс auto



И сеть 10.8.0.0/24 аналогично.
С частью «офис» все. Теперь настраиваем клиента. DSR с прошивками «_RU» не имеют поддержки OpenVPN. Нужно перешиваться в WW. Взять ее можно на tsd.dlink.com.tw
Начиная с прошивки 1.08, вроде все DSR работают c OpenVPN вполне нормально, на 1.05 только старшие модели.
И так, передаем клиенту сертификаты и ключ или делаем сами.
Переходим в «Setup/VPN Setings/OpenVPN/Openvpn Authentication» и вливаем сгенерированные ранее сертификаты и ключ клиента.



Status = Yes – значит сертификаты и ключи приняты. Теперь переходим «Setup/VPN Setings/OpenVPN/OpenVPN Configuration» и вводим данные «офиса»



Нажимаем Save Settings. Буквально через пару сек. комп 192.168.101.3 начнет пинговать 172.17.17.254
Если посмотреть openvpn-status.log, увидите кто на данный момент подключен и кто из пользователей проявляет активность. Из командной строки это

cat /var/tmp/openvpn-status.log
OpenVPN CLIENT LIST
Updated,Thu Oct 3 13:14:22 2013
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,192.168.50.254:1194,11521,8119,Thu Oct 3 13:11:37 2013
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.6,client1, 192.168.50.254:1194,Thu Oct 3 13:14:19 2013
192.168.101.0/24,client1, 192.168.50.254:1194,Thu Oct 3 13:11:38 2013
192.168.101.100C,client1, 192.168.50.254:1194,Thu Oct 3 13:13:40 2013
GLOBAL STATS
Max bcast/mcast queue length,0
END


Телефоны D-Link DPH-150SE настраиваются достаточно просто, имеется инструкция на русском языке
Правда это на предыдущую версию аппарата, но настройка идентична:
Registrar Server Domain в данном случае указываем IP-адрес DNS-325 – 172.17.17.150
Outbound Proxy Domain не используем, оставляем пустым.



Display Name — Имя, отображаемое на дисплее вызываемого абонента
SIP User Name — Номер телефона SIP (SIP ID, логин)
Authentication User Name — Имя пользователя для регистрации на SIP-сервере
Authentication Password — Пароль для регистрации на SIP-сервере
Пример настройки VoIP-шлюза, где Proxy Server (он же SIP-сервер) – 172.17.17.150, User Name & Authorization Name – номер внутреннего абонента, Password – соответственно пароль абонента.

Я, для примера, завел 3 номера и зарегистрировал один из «офиса», второй с «филиала»



Из командной строки запускаем

asterisk -r



Команда sip show peers показывает, какие внутренние номера зарегистрировались и с каких IP-адресов.

«Офисные» аппараты и шлюзы лучше регистрировать на IP 172.17.17.150, а «филиала» на 10.8.0.1 (тот же DNS-325 – IP-адрес туннельного интерфейса).
На этом будем считать настройку телефонии «офиса» и «филиала» завершенной.
Пример мобильного пользователя приведу на своем телефоне с Андроидом.
Первым этапом устанавливаем с Маркета «OpenVPN для Android»
Заливаем на телефон ca.crt, clien2.crt и client2.key. Запускаем «OpenVPN для Android». Нажимаем «+» в левом нижнем углу. Создаем конфигурацию. Заходим в раздел «Основные»


Адрес сервера: 192.168.20.254 (согласно приведенной в начале схемы – это WAN_IP)
Порт сервера: 1194
Протокол: UDP
Сжатие LZO: отключено
Тип: Логин/пароль + Сертификаты
CA сертификат: ca.crt
Сертификат клиента: client2.crt
Ключ сертификата клиента: client2.key
Имя пользователя/пароль: (не важны, вводите что угодно)


В разделе Авторизация/шифрование «Алгоритм шифрования» можно оставить пустым, можно четко указать «BF-CBC»

Возвращаемся на первую страничку, нажимаем на созданную конфигурацию и видим логи подключения OpenVPN.



Теперь установим SIP-клиента. Я использую Zoiper IAX SIP VOIP Softphone (маленький, ничего лишнего, глюков не замечал)

Host: 10.8.0.1 (интерфейсный адрес другой стороны туннеля, на нем же Asterisk)
Username: 6000 (Номер телефона SIP)
Password: 6000 (Пароль для регистрации на SIP-сервере)
Authentication User: 6000 (Имя пользователя для регистрации на SIP-сервере)


Нажимаем Save. Если регистрация прошла успешно – светится зеленая метка, если нет – красный «!».


Конечно этого не достаточно, нужно, к примеру, включить правила ограничения на свичах, позволяющее обращаться к DNS-325 по порту udp/5060 только телефонам и шлюзам. Исключением могут быть только мобильные пользователи. Скрипты отслеживания атак по логам и блокирования IP злоумышленника (на подобии fail2ban) и т.п. Ну это уже тема глубокой безопасности, об этом как-нибудь в следующей статье.

Источник: habrahabr