asterisk

ASTERISK c поддержкой ODBC и защитой Fail2Ban

///

В данной статье я хотел бы описать процесс установки и настройки asterisk на Debian.

Asterisk будет работать с базой данных postgresql через ODBC.

Установка asterisk:
Обновим систему до актуального состояния

apt-get update && apt-get dist-upgrade

Установим все необходимые зависимости для сборки asterisk

apt-get install gcc g++ uuid-dev libsqlite3-dev libxslt1-dev libjansson-dev libxml2-dev \
libncurses5-dev unixodbc-dev libnewt-dev libssl-dev libsqlite3-dev build-essential

Скачиваем последнюю версию asterisk. На момент написания статьи это 13 версия

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz

Распаковываем архив и переходим в папку с исходным кодом

tar -xvf asterisk-13-current.tar.gz
cd asterisk-13.6.0/

Запускаем процедуру проверки, собираем библиотеки и устанавливаем их в систему

./configure
make
make install

Установим скрипты запуска/останова

make config

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

make samples

Проверим что asterisk запускается через скрипты инициализации и подключимся к нему

service asterisk start
asterisk -R

P.S. Если после запуска asterisk в логах /var/log/asterisk/messages проскакивают ошибки вида

ERROR[27158] ari/config.c: No configured users for ARI
ERROR[27158] netsock2.c: getaddrinfo("debian-asterisk", "(null)", …): Name or service not known

то необходимо отключить поддержку ARI в файле /etc/asterisk/ari.conf

enabled = no ; When set to no, ARI support is disabled.

и перезапустить модуль res_ari

asterisk -rx 'module reload res_ari'

Итак, мы установили asterisk, однако необходимо сделать ряд первичных действий.

Во-первых, asterisk работает из-под пользователя root – настроим работу от непривилегированного пользователя:

Добавим системного пользователя и группу asterisk:

adduser --system --group --home /nonexistent --no-create-home asterisk

Изменим владельца и группу всех рабочих директорий asterisk

chown -R asterisk:asterisk /var/spool/asterisk/
chown -R asterisk:asterisk /var/run/asterisk/
chown -R asterisk:asterisk /var/log/asterisk/
chown -R asterisk:asterisk /var/lib/asterisk/
chown -R asterisk:asterisk /usr/lib/asterisk/

Укажем asterisk от имени какого пользователя пользователя и группы запускаться – эти параметры прописываются в файле /etc/asterisk/asterisk.conf

runuser = asterisk ; The user to run as.
rungroup = asterisk ; The group to run as.

Перезапустим asterisk

service asterisk restart

Во-вторых, конфигурация по умолчанию не предполагает никакой защиты от подключения нежелательных абонентов. В связи с этим, сделаем ряд настроек для улучшения безопасности:

По умолчанию, asterisk разрешает гостевые звонки сквозь себя без предварительной аутентификации вызываемой стороны. Гостевые вызовы запрещаются в /etc/asterisk/sip.conf одной строчкой

allowguest=no

Дополнительно изменим в /etc/asterisk/sip.conf контекст по умолчанию на default вместо public

context=default

и пропишем контекст default в /etc/asterisk/extensions.conf, добавив в него единственное правило запрета набора любых номеров. Вся работа по маршрутизации звонков будет происходить в других контекстах

[default]
exten => _X.,1,Hangup

Далее, отключим оповещения о неверном пароле – это необходимо чтобы asterisk “не засветил” валидных пользователей при попытках перебора паролей. При отключении данного оповещения ответ asterisk будет всегда однотипным независимо от того, валидный ли у нас пользователь или нет. В /etc/asterisk/sip.conf прописываем

alwaysauthreject=yes

После вышеприведенных изменений перезапустим перечитаем конфиги /etc/asterisk/sip.conf и /etc/asterisk/extensions.conf

asterisk -rx 'sip reload'

asterisk -rx 'dialplan reload'

Список вышеприведенных действий по обеспечению безопасности можно продолжить исходя из своих реалий/предпочтений, например, предоставлению каждому пиру уникального сложному паролю, использование директив permit/deny для явного указания сетей, из которых разрешено регистрироваться, использование нестандартного порта для SIP/IAX2 и прочее. От себя я лишь опишу процесс настройки fail2ban для блокирования “переборщиков”:

Сначала перенастроим логирование asterisk в соответствие с форматом ISO 8601. Для этого нам нужен файл /etc/asterisk/logger.conf

dateformat=%F %T

Включим логирование security events в отдельный файл security

security => security

Перезапустим модуль логирования

asterisk -rx "logger reload"

Установим fail2ban

apt-get install fail2ban

Создадим “кастомный” файл /etc/fail2ban/jail.local и активируем в нем правила для asterisk

[asterisk]
enabled = true
filter = asterisk
logpath = /var/log/asterisk/messages
/var/log/asterisk/security
port = 5060,5061
protocol = udp
maxretry = 3
bantime = 86400 ; 1 day
findtime = 3600 ; 1 hour
ignoreip = 127.0.0.1/8

Прикажем fail2ban перечитать конфигурацию

service fail2ban reload

В случае успеха в iptables должны появиться соответствующие правила, наподобие следующих

root@debian-asterisk:~# iptables -L -vn

Chain INPUT (policy ACCEPT 27 packets, 1844 bytes)

pkts bytes target prot opt in out source destination
0 0 fail2ban-asterisk-security udp — * * 0.0.0.0/0
0.0.0.0/0 multiport dports 5060,5061
0 0 fail2ban-asterisk udp — * * 0.0.0.0/0
0.0.0.0/0 multiport dports 5060,5061
29 1948 fail2ban-ssh tcp — * * 0.0.0.0/0 0.0.0.0/0
multiport dports 22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 18 packets, 2024 bytes)
pkts bytes target prot opt in out source destination

Chain fail2ban-asterisk (1 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all — * * 0.0.0.0/0 0.0.0.0/0

Chain fail2ban-ssh (1 references)
pkts bytes target prot opt in out source destination
29 1948 RETURN all — * * 0.0.0.0/0 0.0.0.0/0

Дополнительно настроим ротацию логов /var/log/asterisk/messages и /var/log/asterisk/security, так как они могут очень быстро наполняться.
Для этого создадим в каталоге /etc/logrotate.d/ файл asterisk со следующим содержимом

/var/log/asterisk/messages /var/log/asterisk/security {
weekly
missingok
rotate 4
compress
nocreate
postrotate
/usr/sbin/asterisk -rx 'logger reload'
endscript
}

Настройка взаимодействия asterisk с postgresql через ODBC:

Установим postgresql-server

apt-get install postgresql

Создадим пользователя asterisk посредством которого мы будем подключаться и управлять базой данных. Для этого, сначала переключимся на пользователя postgres

su - postgres

Затем запустим следующую команду для создания роли asterisk в базе данных и установки для привелегий:

postgres@debian-asterisk:~$ createuser --interactive -P asterisk

Введите пароль для новой роли:

Повторите его:

Должна ли новая роль иметь полномочия суперпользователя? (y – да/n – нет) n

Новая роль должна иметь право создавать базы данных? (y – да/n – нет) y

Новая роль должна иметь право создавать другие роли? (y – да/n – нет) n

Создадим базу astersik и назначим ей в качестве владельца роль asterisk

createdb --owner=asterisk asterisk

Проверим подключение под ролью asterisk к базе данных

psql -h 127.0.0.1 -U asterisk

Пароль пользователя asterisk:

psql (9.4.5)

SSL-соединение (протокол: TLSv1.2, шифр: ECDHE-RSA-AES256-GCM-SHA384, бит: 256, сжатие: выкл.)
Введите "help", чтобы получить справку.
asterisk=>

Если unixODBC не подтянулся по зависимостям, то установим его явно

apt-get install postgresql

Установим PostgreSQL ODBC connector

apt-get install odbc-postgresql

Настроим PostgreSQL ODBC driver, прописав в файл /etc/odbcinst.ini следующие данные

[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=psqlodbca.so
Setup=libodbcpsqlS.so
FileUsage=1

Убедимся что система видит наш драйвер с помощью следующей команды. В случае успеха нам должна вернуться метка PostgreSQL

odbcinst -q -d

[PostgreSQL]

Затем настроим файл /etc/odbc.ini, который используется для создания идентификатора, на который asterisk будет ссылаться в своей конфигурации

[asterisk-connector]
Description = PostgreSQL connection to 'asterisk' database
Driver = PostgreSQL
Database = asterisk
Servername = localhost
Port = 5432
ReadOnly = No
RowVersioning = No
ShowSystemTables = No
ShowOidColumn = No
FakeOidIndex = No
ConnSettings =

Проверим наше соединение к базе, использую программу isql. Вывод echo через канал направляется в isql, которое будет подключаться используя секцию asterisk-connector, ранее настроенную в /etc/odbc.ini. Подключение будет происходить под ранее созданной ролью asterisk с указанием пароля. В случае успеха, мы получим примерно следующий вывод

echo "select 1" | isql -v asterisk-connector asterisk some_secret_password
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select 1
+------------+
| ?column? |
+------------+
| 1 |
+------------+
SQLRowCount returns 1
1 rows fetched
[PostgreSQL]

Теперь, когда мы настроили взаимодействие ODBC и postgresql, настроим asterisk к ODBC – для этого нам понадобится сконфигурировать файл /ect/asterisk/res_odbc.conf. Этот файл содержит набор параметров, которые различные модули asterisk’а используют для соединения с базой данных. Добавим в этот файл следующую секцию

[asterisk-conn]
enabled => yes
dsn => asterisk-connector
username => asterisk
password => asterisk
pooling => no
limit => 1
pre-connect => yes

Параметр dsn ссылается на соединение к базе данных, настроенное в /etc/odbc.ini. Параметр pre-connect говорит asterik’у подключиться к базе сразу же после загрузки модуля res_odbc.so.

Перезапустим модуль res_odbc

asterisk -rx 'module reload res_odbc.so'

Проверим подключение к базе дынных

asterisk -rx 'odbc show'

ODBC DSN Settings

Name: asterisk-conn
DSN: asterisk-connector
Last connection attempt: 1970-01-01 05:00:00
Pooled: No
Connected: Yes

Теперь мы можем в полный рост работать с базой данных, например, использовать Realtime.

 Взято тут

Previous Story

Заблокировать сайт в микротик

Next Story

Создать проект/репозиторий GitLab из командной строки

Latest from Blog

VMware и terraform

Те, кто еще не знаком с IaaC или Infrastructure-as-a-Code, но постоянно работают с системами виртуализации, наверняка задумывались и

Команды Asterisk

Консольные команды Asterisk можно узнать при помощи команды core show help Войти в консоль Asterisk можно

0 £0.00