Установка требуемого ПО и зависимостей:
apt-get install -y build-essential linux-headers-`uname -r` openssh-server apache2 mysql-server
mysql-client bison flex php5 php5-curl php5-cli php5-mysql php-pear php5-gd curl sox
libncurses5-dev libssl-dev libmysqlclient-dev mpg123 libxml2-dev libnewt-dev sqlite3
libsqlite3-dev pkg-config automake libtool autoconf git unixodbc-dev uuid uuid-dev
libasound2-dev libogg-dev libvorbis-dev libcurl4-openssl-dev libical-dev libneon27-dev libsrtp0-dev
libspandsp-dev sudo libmyodbc subversion vim mc autotools-dev libtool-bin python-pyrex
Не забудьте установленный вами пароль для mysql
Доставляем нужные зависимости:
pear install Console_Getopt
Устанавливаем нужные зависимости из исходников:
Компиляция iksmel (необходим для google voice, yandex speech)
cd /usr/src
git clone https://github.com/meduketto/iksemel.git
cd iksemel
./autogen.sh
./configure
make
make install
ldconfig
Скачиваем исходники Asterisk
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
wget -O jansson.tar.gz https://github.com/akheron/jansson/archive/v2.7.tar.gz
wget http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
Компиляции DAHDI (собирать если необходима работа с картами E1)
cd /usr/src
tar xvfz dahdi-linux-complete-current.tar.gz
cd dahdi-linux-complete-*
make all
make install
make config
cd /usr/src
tar xvfz libpri-current.tar.gz
cd libpri-*
make
make install
Компиляция pjproject
cd /usr/src
tar -xjvf pjproject-2.4.tar.bz2
cd pjproject-2.4 CFLAGS='-DPJ_HAS_IPV6=1'
./configure --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr
make dep
make
make install
Компиляция jansson
cd /usr/src
tar vxfz jansson.tar.gz
cd jansson-*
autoreconf -i
./configure
make
make install
Компиляция Asterisk
cd /usr/src
tar xvfz asterisk-13-current.tar.gz
cd asterisk-*
contrib/scripts/get_mp3_source.sh
contrib/scripts/install_prereq install
./configure
make menuselect
Выбираем нужные модули.
make
make install
make config
ldconfig
update-rc.d -f asterisk remove
Установка Freepbx
useradd -m asterisk
chown asterisk. /var/run/asterisk
chown -R asterisk. /etc/asterisk
chown -R asterisk. /var/{lib,log,spool}/asterisk
chown -R asterisk. /usr/lib/asterisk
rm -rf /var/www/html
Настройка Apache
sed -i 's/(^upload_max_filesize = ).*/120M/' /etc/php5/apache2/php.ini
cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig
sed -i 's/^(User|Group).*/1 asterisk/' /etc/apache2/apache2.conf
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
a2enmod rewrite.load
service apache2 restart
Configure ODBC
cat >> /etc/odbcinst.ini
<< EOF
[MySQL] Description = ODBC for MySQL Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1
EOF
cat >> /etc/odbc.ini
<< EOF
[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asteriskcdrdb'
database driver=MySQL
server=localhost
database=asteriskcdrdb
Port=3306
Socket=/var/run/mysqld/mysqld.sock option=3
EOF
cd /usr/src
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-13.0-latest.tgz
tar vxfz freepbx-13.0-latest.tgz
cd freepbx
./start_asterisk start
./install
Настройка fail2ban
apt install fail2ban
Добавить в файл /etc/fail2ban/filter.d/asterisk.conf строку
^(%(__prefix_line)s|[]s*)%(log_prefix)s Request from '.*' failed for '<HOST>(:[0-9]{1,5})?' (.*) - (No matching endpoint found)$
Добавить в файл /etc/fail2ban/jail.conf строки
[asterisk]
enabled = true
filter = asterisk
action = iptables-multiport[name=asterisk-tcp, port="5060,5160", protocol=tcp] iptables-multiport[name=asterisk-udp, port="5060,5160", protocol=udp] sendmail-whois[name=Asterisk, dest=root@localhost, sender=fail2ban@localhost]
logpath = /var/log/asterisk/messages
maxretry = 3
bantime = 259200
Добавить в файл /etc/asterisk/logger_logfiles_custom.conf следующие строки:
messages => notice,warning,error
выполнить команду:
asterisk -rx "logger rotate" /etc/init.d/fail2ban restart
Проверяем, что все правило исполнились
fail2ban-client status asterisk
будет примерно так:
rtp-proxy# fail2ban-client
status asterisk Status for the jail: asterisk |- filter | |- File list: /var/log/asterisk/messages | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0
Проверка fail2ban (ВАЖНО МОЖЕТЕ ЗАБЛОКИРОВАТЬ СЕБЯ):
apt install sipsak
sipsak -U -s sip:s@ip_sip_server:5060 or sipsak -U -s sip:s@ip_sip_server:5160
в ответ получите:
rtp-proxy# sipsak -U -s sip:s@voip.planeta.tc:5060
warning: ignoring -i option when in usrloc mode received: SIP/2.0 403 Forbidden (Bad auth) Via: SIP/2.0/UDP 127.0.0.1:40283;branch=z9hG4bK.27316dcd;alias;received=172.16.175.2;rport=40283 From: sip:s@voip.planeta.tc:5060;tag=4e5661 To: sip:s@voip.planeta.tc:5060;tag=as7c5607f6 Call-ID: 5133921@127.0.0.1 CSeq: 2 REGISTER Server: ITMH Softswitch Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH Supported: replaces, timer Content-Length: 0 error: didn't received '200 OK' on register (see above). aborting
Дополнительная защита Astreisk. (Защита от «горе» хакеров )
Блокировка по названию сканера:
iptables -I INPUT -p udp -m multiport --dport 5060,5160 -m string --string "friendly-scanner" --algo bm -j DROP
iptables -I INPUT -p udp -m multiport --dport 5060,5160 -m string --string "sip-scan" --algo bm -j DROP
iptables -I INPUT -p udp -m multiport --dport 5060,5160 -m string --string "sundayddr" --algo bm -j DROP
iptables -I INPUT -p udp -m multiport --dport 5060,5160 -m string --string "iWar" --algo bm -j DROP
iptables -I INPUT -p udp -m multiport --dport 5060,5160 -m string --string "sipsak" --algo bm -j DROP
iptables -I INPUT -p udp -m multiport --dport 5060,5160 -m string --string "sipvicious" --algo bm -j DROP
Правило iptables которое банит ip-адресс, если с него пришло более 10 пакетов в 1 секунду
iptables -N BLACKLIST
iptables -A BLACKLIST -m recent --set --name blacklist
iptables -A BLACKLIST -j DROP
iptables -N SIP
iptables -A SIP -m recent --rcheck --name blacklist --seconds 3600 --hitcount 1 -j DROP
iptables -A SIP -m recent --set --name sip iptables -A SIP -m recent --update --seconds 1 --hitcount 10 --name sip -m limit --limit 10 -j LOG --log-prefix=SIP_BRUTEFORCE_
iptables -A SIP -m recent --update --seconds 1 --hitcount 10 --name sip -j BLACKLIST
iptables -A SIP -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p udp --dport 5060 -j SIP
режем весь ipv6 трафик, если он НАМ не нужен.
ip6tables -P INPUT DROP
Общие правила защиты:
Защита динамическими правилами фаэрвола
Fail2Ban рааботает довольно эффективно, однако существует проблема. Asterisk не поддерживает таймаут между попытками регистрации и по-этому злоумышленник за очень короткий период времени (несколько секунд), пока реагирует fail2ban, может успеть провести гораздо больше попыток подбора, чем мы указываем в настройках.
Отключаем guest-звонки
Если у вас нет необходимости принимать звонки без регистрации, обязательно выключите следующую опцию в sip.conf:
allowguest=yes => allowguest=no; Allow or reject guest calls (default is yes)
Отключаем оповещение о неверном пароле
Практически у всех существуют аккаунты asterisk вида 100, 200, 700 и т.п. По умолчанию астериск выдает одну ошибку о неверном пароле для существующего аккаунта и другую для несуществующего аккаунта. С помощью спец. софта для подбора паролей, злоумышленник может быстро перебрать все короткие номера и подбирать пароли только к существующим аккаунтам, которые ответили «неверный пароль». Чтобы препятствовать этому, меняем опцию в sip.conf:
alwaysauthreject = no => alwaysauthreject = yes
После такой настройки, астериск будет давать одинаковый отбой для любых неверных авторизаций.
Используем сложные пароли для аккаунтов
Любой пароль можно подобрать, вопрос только во времени. Поскольку настройка sip-устройств производится один раз и надолго, не скупитесь на сложные пароли. Для себя я использую длинные пароли с комбинациями больших и маленьких букв + цифр такого вида:
secret=f64GCD74ssdZ42
ОБЯЗАТЕЛЬНО уберите все пароли совпадающие с логинами. Это – первые пароли, используемые для паролей.
Используем deny/permit для аккаунтов
Обязательный момент! Указываем для всех аккаунтов, которые не подразумевают подключение из интернета следующие строки:
[100]
…
deny=0.0.0.0/0.0.0.0
permit=10.1.1.1/24
permit=10.1.2.1/24
Где 10.1.1.1,10.1.2.1 – диапазоны локальных адресов, с которых будет производится подключение. Подключения с других адресов asterisk принимать не будет.
Устанавливаем лимит звонков
В случае взлома, для уменьшения затрат, рекомендую установить лимит одновременных звонков для аккаунтов в 1, чтобы злоумышленник не мог одновременно звонить на много направлений и, тем самым, быстрее расходовать ваши деньги.
[100]
call-limit=1
…
Не делаем одно универсальное правило для всех звонков
Скажем нет правилам вида:
exten => _X.,1,Dial(SIP/${EXTEN}@operator)
Прописываем четко все необходимые комбинации номеров, передаваемых оператору. Если нет необходимости использовать международную связь – не описывайте правила для нее вообще. Практически все случаи взломов используются для звонков заграницу.
;Экстренные службы
exten => _0X,1, Dial(SIP/${EXTEN}@operator)
exten => _0X,n, Hangup
;Межгород Россия/Мобильные
exten => _8XXXXXXXXXX,1, Dial(SIP/${EXTEN}@operator)
exten => _8XXXXXXXXXX,n, Hangup
Автор: Возле ректора