В данной статье я хотел бы описать процесс установки и настройки 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.
Свежие комментарии