пятница, 22 июня 2012 г.

Oracle Solaris 11: Установка сервиса Asterisk


В качестве серверного ПО 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
# pkg install gcc-43 header-math
Для поддержки режима шифрования используется внешняя библиотека srtp (Шифрование протокола RTP)

# 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

Комментариев нет:

Отправить комментарий