В качестве серверного ПО VoIP
телефонии выбран Asterisk 1.8+ Срок поддержки
данной версии заявлен до 2015 года
Solaris имеет встроенные в ядро средства LDAP не совместимые по вызовам с библиотекой OpenLDAP. Необходимо дополнительно установить пакет library/openldap и пакет library/gmime# pkg install gmime openldap header-mathДля Solaris 11 Express необходимости установить компилятор GCC версии 4.3
# pkg set-publisher -g http://pkg.openindiana.org/legacy/ opensolaris.orgДля поддержки режима шифрования используется внешняя библиотека srtp (Шифрование протокола RTP)
# pkg install gcc-43 header-math
# wget http://sourceforge.net/projects/srtp/files/srtp/1.4.4/srtp-1.4.4.tgz/download
# tar xf srtp-1.4.4.tgz
# cd srtp/
Внести изменения в Makefile.in
# cat ../patch/srtp-Makefile.in.diff | patch -p0
- all: test
+ all: libsrtp.so test
+ libsrtp.so: $(srtpobj) $(cryptobj) $(gdoi)
+ $(CC) $(LDFLAGS) -shared -o libsrtp.so $^
install:
+ if [ -f libsrtp.so ]; then cp libsrtp.so /usr/lib/; fi
uninstall:
+ rm -rf /usr/lib/libsrtp.so
clean:
+ rm -rf libsrtp.so
# env CFLAGS="-fPIC" LDFLAGS="-L/usr/lib -lnsl" ./configure --prefix=/usr --sysconfdir=/etc
# gmake
# gmake install
Генерация библиотеки SpanDSP
Библиотека используется для эмуляции модема (модулятора-демодулятора) на линиях SIP. Модем способен автоматически детектировать сигналы T.38 на линии и переключать в режим передачи факов. Кроме того, имеется возможность перехвата факсимильных сообщений с абонентских линий при автоматическом детектировании сигналов T.38. Функциональность представлена прикладными функциями SendFAX и ReceiveFAX
# wget http://www.soft-switch.org/downloads/spandsp/spandsp-0.0.6pre18.tgz
# tar xf spandsp-0.0.6pre18.tgz
# cd spandsp-0.0.6/
# env CC=/usr/gcc/4.3/bin/gcc ./configure --prefix=/usr --sysconfdir=/etc --with-shared
# gmake
# gmake install
Используется для модуля Jabber
# wget http://iksemel.googlecode.com/files/iksemel-1.4.tar.gz
# tar xf iksemel-1.4.tar.gz
# cd iksemel-1.4
# env CC=/usr/gcc/4.3/bin/gcc ./configure --prefix=/usr --sysconfdir=/etc --enable-shared
Сборка Asterisk
http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-1.8.x.tar.gz
Подготовлены патчи для версий Asterisk 1.8.x (см файлы проекта)
# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.8.x.tar.gz
# tar xf asterisk-1.8.x.tar.gz
# cd asterisk-1.8.x/
Внести изменения в файлы проекта...
В качестве офисных SIP-телефонов мы использовали линейку продуктов Cisco Small Business SPA30x и SPA50x.
Известный Bug, ведущий к несовместимости продуктов Cisco SPA50XG и Asterisk. Asterisk неадекватно анализирует режимы шифрования при разборе параметров протокола SDP и отказывается поддерживать предложенный аппаратом режим. Аппараты способны поддерживать несколько режимов шифрования SRTP: AES_CM_128_HMAC_SHA1_80 и AES_CM_128_HMAC_SHA1_32. Однако предпочтительным с точки зрения логики программы является режим AES_CM_128_HMAC_SHA1_32, поскольку Asterisk не умеет сортировать атрибуты режимов шифрования.
В процессе изучения исходных кодов программ мы выявили ряд уязвимостей:
Уязвимость: не выполняется операция стирания ключевой информации после завершения сессии, ключевая информация доступна через журналы системы.
Ключи в текстовом виде не удаляются из памяти (утечка памяти, уязвимость).
Уязвимость: на одно соединение TLS открывается два дескриптора, при большом количестве дескрипторов или в случае атаки может не открываться второй дескриптор.
Для исправления ошибки связанной с порядком разбора режимов шифрования необходимо внести изменения в файл channels/sip/sdp_crypto.c
# cat ../patch/sdp_crypto.c.diff | patch -p0
int sdp_crypto_offer(struct sdp_crypto *p) {
- const char *crypto_suite = "AES_CM_128_HMAC_SHA1_80"; /* Crypto offer */
+ const char *crypto_suite = "AES_CM_128_HMAC_SHA1_32"; /* Crypto offer */
Однако, такое изменение является простым приближением. В проекте есть патч, который реализует выбор режима шивроания исходя из приоритетов.
На платформах отличных от Linux и FreeBSD дистрибутив не распознает системных вызовов funopen()/fopencookie(), что приводит к отключению функциональности SIP over TLS. И отключению функциональности протокола HTTP+TLS.
Исправление этой ошибки требует переработки всех модулей в которых присутствует поддержка SSL/TLS.
//Для исправления ошибки внести изменения в файл main/tcptls.c
{см tcptls.с.diff}
// Изменения в файле include/asterisk/tcptls.h
{см tcptls.h.diff}
// Изменения в файле main/http.c
{см http.с.diff}
// Изменения в файле channels/chan_sip.c
{см chan_sip.с.diff}
# cat ../patch/tcptls.h.diff | patch -p0
# cat ../patch/tcptls.c.diff | patch -p0
# cat ../patch/chan_sip.c.diff | patch -p0
# cat ../patch/http.c.diff | patch -p0
Наложить все изменения можно одной командой
# cat ../patch/*.{c,h}.diff | patch -p0
# env CC=/usr/gcc/4.3/bin/gcc CXX=/usr/gcc/4.3/bin/g++ CFLAGS="-I/usr/include/openldap/" LDFLAGS="-L/usr/lib/ -lsrtp -lcrypto -lldap-2.4 -llber-2.4" ./configure --prefix=/usr --sysconfdir=/etc --with-ldap --with-ssl --with-srtp --with-crypto --with-z --with-spandsp --with-iksemel
# gmake
# gmake install
Сборка приложения под Oracle Solaris 11/11 (64-bit):
# pkg install openldap system/header gcc-45 versioning/subversion
# export CC='/usr/gcc/4.5/bin/gcc -m64 -mssse3'
# export CXX='/usr/gcc/4.5/bin/g++ -m64'
# cd ../srtp
# env CFLAGS="-fPIC" LDFLAGS="-L/usr/lib -lnsl" ./configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib/amd64/
# cd ../spandsp
# ./configure --prefix=/usr --sysconfdir=/etc --with-shared --libdir=/usr/lib/amd64/ --enable-ssse3
# cd ../iksemel-1.4
# ./configure --prefix=/usr --sysconfdir=/etc --enable-shared --libdir=/usr/lib/amd64/
# cd ../asterisk
# env CFLAGS="-I/usr/include/openldap/" LDFLAGS="-L/usr/lib/ -lsrtp -lcrypto -lldap-2.4 -llber" ./configure --prefix=/usr --sysconfdir=/etc --with-ldap --with-ssl --with-srtp --with-crypto --with-z --with-spandsp --with-iksemel
Файл chan_sip.c превосходит все мыслимые размеры (содержит около 30 тыс строк кода) и приближается к границе, после которой компилятор GCC отказывается работать. Чтобы не ловить фатальную ошибку копилятора связанной с ограничением рессурсов системы при сборке приложения в 64 битном режиме, следует закоментировать ключ -pipe в Makefile.
Тот же набор патчей мы использовали для сборки приложений под GNU/Linux.
Сборка приложения под Debian GNU/Linux:
# apt-get install g++ libtiff4-dev libxml2-dev ncurses-dev
# ./configure --prefix=/usr --sysconfdir=/etc --with-ssl --with-srtp --with-crypto --with-z --with-spandsp
Для работы протокола IAX2 в защищенном режиме необходимо сгенерировать и установить сертификаты ключей на каждой телефонной станции. Установка сертификатов происходит в режиме preshared. Для хранения открытых ключей создается специальная папка, в которую необходимо скопировать сертификаты всех станций, с которыми происходит обмен.
Генерация мини-сертификата RSA для для установления безопасного соединения между серверами Asterisk (s2s)
# openssl req -newkey rsa:1024 -nodes -keyout key.pem -new -noout
# openssl rsa -in key.pem -pubout > pub.pem
Расширения файлов ключей должны быть .key и .pub
# mkdir /etc/asterisk/keys
# cp key.pem /etc/asterisk/keys/hostname.key
# cp pub.pem /etc/asterisk/keys/hostname.pub
Комментариев нет:
Отправить комментарий