Файл: Проектирование защищенной системы IP-телефонии в ОАО “НИИМЭ и Микрон”.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.03.2023

Просмотров: 334

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Актуализируем список пакетов:

apt-get update

Синхронизируем время:

ntpdate ru.pool.ntp.org

Установку можно выполнить с помощью команды apt install asterisk. Но в данной инструкции мы разберем установку путем сборки из исходников. 

Рекомендуется установить Asterisk с DAHDI (драйверы плат интерфейсов телефонии) и LibPRI (библиотека для работы с потоковыми TDM-интерфейсами). Сначала необходимо собрать DAHDI, затем LibPRI и только потом — Asterisk. Устанавливаем пакеты, необходимые для корректной сборки DAHDI и LibPRI:

apt install make gcc

Далее перейдем к настройке DAHDI.

Загружаем исходник:

Wget https://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz

Распаковываем его и переходим в распакованный каталог:

tar -xvf dahdi-linux-complete-current.tar.gz

cd dahdi-linux-complete-*

Собираем пакет и устанавливаем его:

make

make install

make config

Выходим из каталога dahdi:

cd ..

Затем переходим к настройке LibPRI. Загружаем исходник:

wget https://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz

Распаковываем:

tar -xvf libpri-current.tar.gz

cd libpri-*

Собираем и устанавливаем:

make

make install

Выходим из каталога libpri:

cd ..

Далее идет уже непосредственно установка Asterisk.Переходим по ссылке https://downloads.asterisk.org/pub/telephony/asterisk и копируем ссылку на последнюю версию asterisk. Используя ссылку, скачиваем исходник:

wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15-current.tar.gz

Распаковываем архив и переходим в папку, появившуюся после распаковки:

tar -xvf asterisk-*.tar.gz

cd asterisk-*

Устанавливаем зависимости:

./contrib/scripts/install_prereq install

./contrib/scripts/install_prereq install-unpackaged

Удаляем мусор:

make distclean

Устанавливаем библиотеки для работы с mp3:

./contrib/scripts/get_mp3_source.sh

Конфигурируем исходник:

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 --with-dahdi --with-pri --with-iconv --with-libcurl --with-speex

* где:

  • --with-dahdi — с драйверами DAHDI.
  • --with-pri — с библиотекой PRI.
  • --with-iconv — с возможностью конвертации кодировок (будет не лишним для поддержки русских символов).
  • --with-libcurl — возможность извлекать данные посредством CURL-запросов (по http).
  • --with-speex — дополнительный VBR-кодек (используется на многих софт-фонах).

** список всех доступных опций можно посмотреть командой ./configure -h.

После этих манипуляций выводится логотип Asterisk (рисунок 6):

Рисунок 6

Далее вызываем оконное меню настройки модулей:

make menuselect

Для большинства случаев, настройки можно оставить по умолчанию. В противном случае рекомендуется изучить опции и выбрать необходимые. После нажимаем Save & Exit.


Затем собираем исходник:

make

И выполняем установку:

make install

Установим примеры конфигурационных файлов и документацию:

make samples

make progdocs

Устанавливаем скрипт инициализации (для автозапуска):

make config

Устанавливаем скрипты для отсекания логов:

make install-logrotate

Создаем конфигурационный файл для указания дополнительного пути с библиотеками:

vi /etc/ld.so.conf.d/asterisk.conf

Добавляем в него одну строчку:

/usr/lib64

* это путь до каталога с библиотеками, с которым мы собирали asterisk (опция --libdir).

Применяем настройку:

ldconfig

Открываем конфигурационный файл:

vi /etc/asterisk/asterisk.conf

И редактируем следующее:

runuser = asterisk
rungroup = asterisk
defaultlanguage = ru
documentation_language = ru_RU

Создаем системную учетную запись asterisk:

useradd asterisk -m

Задаем права:

chown -R asterisk:asterisk /var/run/asterisk

chown -R asterisk:asterisk /etc/asterisk

chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk

chown -R asterisk:asterisk /usr/lib64/asterisk

chown -R asterisk:asterisk /var/log/asterisk

Проверяем конфигурацию:

asterisk -c

Следует обратить внимание на следующие предупреждения при  

запуске:

  • Unable to find a valid server address or name.
  • Process_dahdi: Ignoring any changes to ...
  • CEL pgsql config file missing global section.
  • Cel_tds module had config problems; declining load.

Отключаем следующие модули: 

noload => res_phoneprov.so
noload => app_dahdiras.so
noload => chan_dahdi.so
noload => res_pjsip_phoneprov_provider.so
noload => cel_pgsql.so
noload => cel_tds.so

Список всех загружаемых модулей можно посмотреть командой:

ls -la /usr/lib64/asterisk/modules/

Разрешаем сервис asterisk и запускаем его:

systemctl enable asterisk

systemctl start asterisk

Для первой настройки достаточно завести 2 номера с возможностью подключения по SIP.

Создаем правило обработки вызова (контекст). Открываем следующий файл:

vi /etc/asterisk/extensions.conf

И добавляем в него следующее:

[outcaling]
exten => _XXXX,1,Dial(SIP/${EXTEN},,m)

* создаем контекст с именем outcaling для четырехзначных номеров (XXXX) с вызовом по SIP по внутреннему номеру.

Открываем следующие конфигурационный файл:

vi /etc/asterisk/sip.conf

И добавляем в него два внутренних номера (extensions):

[1001]
type=friend
regexten=1001
secret=1234
context=outcaling
host=dynamic
callerid="1001" <1001>
disallow=all
allow=alaw
allow=ulaw
language=ru
callgroup=1
pickupgroup=1
qualify=yes
canreinvite=yes
call-limit=4
nat=no
 

[1002]
type=friend
regexten=1002
secret=1234
context=outcaling
host=dynamic
callerid="1002" <1002>
disallow=all
allow=alaw
allow=ulaw
language=ru
callgroup=1
pickupgroup=1
qualify=yes
canreinvite=yes
call-limit=4
nat=no

* где:

  • [1001], [1002] — имена для обозначения номеров.
  • type — типы проверки номеров. Могут быть peer, user или friend. Peer — вызовы сопоставляются с IP-адресами и номерами портов. User — проверка username. Friend — включает возможности peer и user (проверка username и IP-адреса источника) и лучше всего подходит для телефонов и телефонных программ.
  • regexten — добавочный номер. Если не задан, используется имя.
  • secret — пароль для аутентификации.
  • context — контекст или группа правил.
  • host — IP-адрес или имя клиента. Для автоматической регистрации используем dynamic.
  • callerid — идентификатор пользователя при звонке.
  • disallow — запрещает кодеки (задается перед параметром allow).
  • allow — разрешает кодеки. alaw и ulaw — алгоритмы для кодеков g711.
  • language — код используемого языка.
  • callgroup — задает группу устройства (для возможности перехвата).
  • pickupgroup — задает перечень групп, которые можно перехватывать.
  • qualify — включает или отключает периодическую проверку подключенного клиента.
  • canreinvite — включает или отключает прохождение голосового RTP трафика через Asterisk. Устанавливать, только если клиент поддерживает функцию SIP re-invites.
  • call-limit — ограничение количества одновременных вызовов.
  • nat — устанавливается в yes, если клиент находиться за NAT.

Перезапускаем asterisk:

systemctl restart asterisk

Все, что происходит в Asterisk можно посмотреть в лог-файле командой:

tail -f /var/log/asterisk/messages

Для теста настроенного сервера можно воспользоваться IP-телефоном или софт-фоном на компьютере или телефоне. Например, а качестве SIP-клиента под Windows можно установить бесплатную программу X-Lite, для Android — Zoiper. На этом настройка сервера Asterisk закончена.

Контрольный пример реализации

Безопасность Вашей АТС - один из самых главных принципов беспроблемного использования IP-телефонии. Нередко бывают случаи, когда АТС выведена на "белый" IP, а о ее защите должным образом не позаботились. И как результат этого можно в итоге получить просто огромные счета от оператора телефонии за разговоры (о совершении которых Вы и не подозревали) через Вашу АТС в какие-нибудь экзотические страны. В данной курсовой работе будет рассказано и рассмотрено самые необходимые действия по улучшению безопасности станции (рисунок 7).

Рисунок 7

Asterisk — это обычное приложение, работающее в операционной системе Linux, и уровень защищённости Linux определяет общий уровень безопасности АТС. Выделяется несколько общих правил по обеспечению мер, снижающих риск несанкционированного доступа в систему.

  • Ограничение пользовательских аккаунтов. Необходимо использовать меры по ограничению несанкционированного управления управления системой.
  • Ограничение привилегий. По умолчанию Asterisk работает под учетной записью superuser, хотя на самом деле этого и не требуется, поэтому можно спокойно сжимать пользователя с правами на Asterisk. Главное не забыть заодно изменить и права на доступ к папкам, используемым Asterisk.
  • Централизованное логгирование. В случае успешной попытки захвата сервер злоумышленник может удалить следы попыток взлома для сохранения незаметного контроля над сервером. Однако, в случае использования внешнего syslog сервер, это сделать не удастся(необходимо будет также взломать и syslog сервер), и у системного администратора останутся все зафиксированные проявления аномальной активности, которые затем можно будет использовать для реконструкции процесса взлома и в качестве доказательств.
  • Контроль конфигурации. Существует специальные программные пакеты типа Tripwire, создающие «слепок» (md5 хеш) каждого файла в системе. Периодически запуская сканирование файлов и сравнение их со старыми отпечатками позволяет выявить следы замены системных утилит и встраивания rootkit'ов. В идеальном случае база данных Tripwire находится на другом сервере.
  • Регулярное обновление ОС.

Никогда не выставляйте Asterisk-систему полностью открытой извне — обязательно удостоверьтесь, что она находится за брандмауэром. Любой доступ к системным службам, таким как HTTP или SSH, должен быть сделан только через VPN или использование псевдо-VPN. Азы безопасности начинаются с того, чтобы выставить на доступ извне как можно меньше сервисов. Если будут сотрудники, работающие удаленно, которые не могут использовать VPN, и будет необходимость оставить SIP-порты открытыми, то необходимо обеспечить их безопасность.  Служба SSH (Secure SHell), используемая для удалённого входа на сервер — это парадный вход в АТС. Обязательной мерой администратора АТС является выполнение следующих мер, существенно повышающих общий уровень защиты системы. Смена порта. Порт по умолчанию SSH — 22-ой. Многие хакеры сканируют интернет в поисках серверов с открытым портом 22, чтобы затем попробовать взломать их. Придумайте другой порт, в диапазоне 1-65535, и укажите его в директиве Port. 
Явное перечисление пользователей, имеющих доступ к системе, в директиве [AllowUsers]. В том случае, если все же необходимо предоставить доступ к системе ряду доверенных лиц, перечислите их. 
Используйте только SSH протокол версии 2. 

Запретите прямой доступ пользователя root. Это существенно затруднит и скорее сделает невозможной атаку на перебор пароля, так как пользователю рут будет запрещен доступ в систему, даже если будет введен его корректный пароль. Используйте подсистему sudo для получения root доступа при необходимости и только после удаленного входа в систему под непривилегированной учетной записью. Используйте временное ограничение по вводу пароля. Установка минимально возможного времени для ввода пароля, например, 1 секунды, может хорошо сбить с толку злоумышленника.
Пример настроек /etc/ssh/sshd_config:

/etc/ssh/sshd_config
AllowUsers alexa mary admin
Port 30111
Protocol 2
LoginGraceTime 1s
PermitRootLogin no

Блокирование открытых портов оставив только необходимые службы, следует также ограничить возможность сетевых подключений к ним с использованием брандмауэра. Хорошей практикой является использование нескольких сетевых интерфейсов в сервере АТС, где SIP протокол доступен только на внутреннем сетевом адресе, а объединение офисов осуществляется по IAX2 протоколу, с явным открытием на firewall IP адресов офисов и фильтрацией для всех остальных. В такой конфигурации у злоумышленника отсутствует физическая возможность атаковать сервер Asterisk с использованием уязвимостей протоколов. Также, если существуют риски атаки типа Denial Of Service (DoS), следует установить специальное оборудование, распознающее такой тип атак и автоматические блокирующее атакующего с уведомлением системного администратора.


Многие Linux дистрибутивы по-умолчанию запускают многие ненужные АТС сервисы, такие как служба печати, FTP, NFS и другие. Чтобы увидеть, какие службы открывают сетевые соединения, необходимо выполнить команду netstat -atnup | grep LISTEN:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN 3155/rpc.statd
tcp 0 0 127.0.0.1:32769 0.0.0.0:* LISTEN 3279/xinetd
tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN 3279/xinetd
tcp 0 0 0.0.0.0:199 0.0.0.0:* LISTEN 3256/snmpd
tcp 0 0 0.0.0.0:8008 0.0.0.0:* LISTEN 4843/httpd
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 3438/smbd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3136/portmap
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 3516/X
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3265/sshd
tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN 3907/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3299/sendmail: acce
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 4843/httpd

Приведен пример не подходит для настройки АТС, так как при старте сервера запускается целая серия ненужных процессов, каждый из которых является потенциальной мишенью злоумышленника. Чтобы устранить такие риски, необходимо отключить все ненужные службы. В CentOs есть утилита ntsysv, предназначенная для управления автозагрузкой на рисунке 6 очень хорошо видно ее описание.

Рисунок 6

Можно проверить все службы системы командой chkconfig –list (см рисунок 7).

Рисунок 7

Чтобы убрать из автозапуска ненужные службы, используем команду chkconfig <имя службы> off:

chkconfig ircd off
chkconfig netfs off
chkconfig nfslock off
chkconfig openibd off
chkconfig portmap off
chkconfig restorecond off
chkconfig rpcgssd off
chkconfig rpcidmapd off
chkconfig vsftpd off


Также немедленно остановить службы без перезагрузки Asterisk:

service ircd stop
service netfs stop
service nfslock stop
service openibd stop
service portmap stop
service restorecond stop
service rpcgssd stop
service rpcidmapd stop
service vsftpd stop

Все настройки сервера Asterisk обычно хранятся в текстовых файлах, все файлы конфигурации Asterisk, располагаются в директории /etc/asterisk, при стандартной инсталляции. В стандартный дистрибутив входят файлы с примерами конфигураций, которые хорошо документируют использование почти всех параметров конфигурации. Рассмотрим безопасность контекстов, extension, настройки каналов и пользовательских аккаунтов,
Отдельного упоминания заслуживает алгоритм аутентификации IAX2 соединений. При входящем IAX2 звонке Asterisk выполняется следующие последовательности проверок.
Если присутствует поле username: 
Ищет в файле конфигурации iax.conf (и включенных из него файлов) секцию, имя которой совпадает с username, в которой type=user. Если совпадений не найдено, произойдет закрытие канала.  В найденной секции проверяется наличие параметров allow/deny, и если IP адрес звонящего совпадает с deny, или не проходит цепочку allow, звонок завешается. 
Если пароли не совпадают, звонок завершается. Если во входящем звонке указан контекст назначения, Asterisk проверяет наличие в настройках пира записи context=требуемый контекст.  Если контекст не указан, звонок направляется на обработку в первую запись context=, найденную в настройках пира. 
Если в заголовке сообщения нового звонка не содержится поле username, Asterisk выполняет следующее: выполняет поиск секции type=user, в которой нет поля secret, и есть атрибуты allow/deny. Если такой пир найден, звонок принимается, и именем username звонящего становится название совпавшей секции. 
Выполняет поиск секции type=user, где нет поля secret, и нет атрибутов allow/deny. Если такая секция найдена, звонок принимается, и именем username звонящего становится название этой секции. Если совпадений выше найдено не было, Asterisk ищет секцию type=user, с указанным паролем secret или RSA ключем одновременно с allow/deny фильтром. Если такая секция найдена, и все проверки пройдены, астериск принимает звонок, и устанавливает именем username название секции.  Выполнеяет поиск секции type=user с установленным паролем secret (или RSA ключем), но без фильтров allow/deny. Если проверка по паролю проходит, звонок принимается, и значение username устанавливается равным названию совпавшей секции. 
Asterisk отвергает звонок.  Какие возможные неожиданные последствия имеет такая схема аутентификации? Можно применять атаку типа brute force (грубой силы), перебирая пароли пользоваталей, даже не зная их username! При достаточном количестве записей пиров в iax.conf, вероятность подброра пароля к одной из них весьма высока. Риск такой атаки снижается очень просто: включить замедленную реакцию (delayreject=yes в [general] настройках iax.conf). Это позволит замедлить посылку негативного ответа сервера, снижая скорость перебора по словарю. Однако, злоумышленник может предположить о наличии данной опции, и перестроить атаку, не ожидая ответа, полагая, что положительный ответ придет быстро.  Использовать атрибуты-фильтры allow/deny.  Создать специальный гостевой аккаунт без пароля  сетевых ограничений. Таким образом, алгоритм аутентификации «сработает» до проверки пароля, и атака по словарю уже не имеет смысла, так как принимается звонок с любым паролем. Вот так выглядит гостевой акккаунт: