четверг, 17 декабря 2015 г.

Разворачивание Asterisk на Debain 8 с поддержкой ODBC и защитой Fail2Ban

В данной статье я хотел бы описать процесс установки и настройки asterisk на Debian (Jessie). 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.

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

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