Задача: сделать базовую установку Asterisk на CentOS 7 Minimal (виртуальный облачный сервер Hetzner CX11)
1. Создаем нового пользователя и ограничиваем настройки входа по SSH
Для начала устанавливаем редактор nano:
yum install nano
Добавляем пользователя и назначаем ему новый пароль:
adduser -g users -d /home/astuser -s /bin/bash astuser
passwd astuser
Редактируем /etc/ssh/sshd_config. В целях безопасности, запрещаем логин из под root'а и разрешаем вход только нашему новому пользователю:
nano /etc/ssh/sshd_config
В конце файла добавляем:
PermitRootLogin no
AllowUsers astuser
После чего перезагрузим службу SSH и заходим по SSH с новым пользователем:
systemctl restart sshd
2. Устанавливаем и настраиваем сетевой экран
По умолчанию, в Hetzner сервер предоставляется пользователю без сетевого экрана. Займемся его установкой. Нам понадобятся права суперпользователя:
su -
yum install firewalld
systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld
firewall-cmd --permanent --zone=public --change-interface=eth0
firewall-cmd --zone=public --add-port=5060/udp --permanent
firewall-cmd --zone=public --add-port=5061/udp --permanent
firewall-cmd --zone=public --add-port=10000-20000/udp --permanent
firewall-cmd --zone=public --add-port=5060/tcp --permanent
firewall-cmd --zone=public --add-port=5061/tcp --permanent
systemctl restart firewalld
Мы добавили службу сетевого экрана в автозапуск. Установили зону "public" для интерфейса eth0. Последняя команда добавляет сервисы Asterisk в исключения для того, чтобы мы могли подключаться к АТС снаружи. Вывод команды "firewall-cmd --zone=public --list-all"
3. Подключим репозиторий EPEL и установим libcodec2
Для установки Asterisk нам понадобится пакет "codec2", который мы можем установить из репозитория EPEL
yum install epel-release
yum install codec2
4. Установка Asterisk
Для начала нам понадобится wget
yum install wget
Установку Asterisk будем производить из пакетов по инструкции https://tucny.com/telephony/asterisk-rpms
4.1 Подключаем репозиторий
wget https://ast.tucny.com/repo/tucny-asterisk.repo
mv tucny-asterisk.repo /etc/yum.repos.d/
rpm --import https://ast.tucny.com/repo/RPM-GPG-KEY-dtucny
Отредактируем файл /etc/yum.repos.d/tucny-asterisk.repo и установим строку "enabled=0" в разделах [asterisk-common] и [asterisk-13]. В нашем случае мы устанавливаем Asterisk версии 13. При необходимости, в этом конфигурационном файле можно отметить нужную версию:
4.2 Установка Asterisk с репозитория
yum install asterisk-core asterisk-addons-mysql asterisk-configs asterisk-odbc asterisk-sip asterisk-sounds-core-en-alaw asterisk-sounds-extra-en-alaw asterisk-sounds-core-ru-alaw asterisk-sounds-extra-ru-alaw asterisk-sounds-core-en-ulaw asterisk-sounds-extra-en-ulaw asterisk-sounds-core-ru-ulaw asterisk-sounds-extra-ru-ulaw
4.3 Добавляем Asterisk в автозапуск, запускаем и проверяем
systemctl enable asterisk
systemctl start asterisk
systemctl status asterisk
asterisk -r
sip show peers
Astrerisk 13 установлен.
5. Настройка Asterisk
В нашей тестовой конфигурации мы создадим 5 внутренних номеров от 101 до 105. И настроим внутренние звонки между ними.
Для этого в файле /etc/asterisk/sip.conf добавляем наши внутренние номера в раздел [phones]:
allowguests=no
[phones](!)
type=friend
context=internal-calls
directmedia=no
host=dynamic
dtfmmode=rfc2833
disallow=all
allow=alaw
allow=ulaw
nat=force_rport,comedia
[101](phones)
secret=dVYD24M72j
[102](phones)
secret=Dsx2S9Nxh8
[103](phones)
secret=VUS7XvbGRm
[104](phones)
secret=S3qyCYnL8S
[105](phones)
secret=r4aRThWf9W
В поле secret устанавливаем пароль для каждого внутреннего номера соответственно. Обязательно, в продакшн серверах используйте надежные пароли! Даже если сервер разворачивается как тестовый, через время вы можете решить использовать его для работы, а пароли поменять забудете.
В файле /etc/asterisk/extensions.conf определяем контекст "internal-calls". Полное содержание файла:
[general]
static=yes
writeprotect=no
[globals]
[default]
[internal-calls]
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
6. Проверка Asterisk
Подключим 2 номера для проверки. Для этого отлично подойдет Zoiper for Windows. Для подключения используем IP-адрес сервера, внутренний номер и пароль. После подключения с помощью команды "sip show peers" увидим пиры:
Протестируем звонок с одного номера на другой:
Базовая настройка выполнена.
7. Защищаем сервер Asterisk с помощью Fail2Ban
Сервер Asterisk, который находится в "открытом" интернете, постоянно подвергается попыткам примитивного взлома от "ботов", которые пытаются подобрать пароль от SSH или подлючиться к АТС. Для борьбы с ними, необходимо:
- Использовать сложные пароли. Обязательно!
- Использовать Fail2Ban, который будет временно блокировать IP-адреса, с которых осуществляется попытка взлома.
7.1 Включаем security-log в Asterisk
Руководствуемся инструкцией: https://www.fail2ban.org/wiki/index.php/Asterisk
nano /etc/asterisk/logger.conf
Включим security-лог Asterisk и настроим чтобы он записывался в отдельный файл. Кроме этого, поменяем формат даты в логах. Для этого, раскоментируем в файле "/etc/asterisk/logger.conf" 2 строки:
dateformat=%F %T ; ISO 8601 date format
security => security
Перезагрузим настройки логгера Asterisk:
asterisk -rx "logger reload"
7.2 Установка Fail2Ban
Для установки Fail2Ban в CentOS 7 должен быть подключен репозиторий EPEL. Мы это уже сделали в предыдущих пунктах. Установим Fail2Ban и активируем в качестве службы:
yum install fail2ban-firewalld
systemctl enable fail2ban
systemctl start fail2ban
7.3 Настройка Fail2Ban
Файл настроек лежит по адресу "/etc/fail2ban/jail.conf". однако, разработчики рекомендуют использовать не его копию по адресу "/etc/fail2ban/jail.conf", которая будет иметь приоритет. Итак:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
В нашем примере на сервере используются 2 службы: SSH и Asterisk. Обе они поддерживают авторизацию и подвержены бруфорсу и требуют защиты. Найдем и отредактируем в файле "jail.local" 2 секции [sshd] и [asterisk]:
[sshd]
# Активируем более агрессивный фильтр SSHD
enabled = true
filter = sshd-aggressive
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
action = %(banaction_allports)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp]
[asterisk]
enabled = true
port = 5060,5061
action = %(banaction_allports)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp]
%(banaction_allports)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp]
logpath = /var/log/asterisk/security ; Путь к журналу security Asterisk
maxretry = 10 ; Допустимое число не успешных попыток
bantime = 3600 ; Время в секундах на которое блокируется IP-адрес
В параметр ignoreip можно вписать IP-адреса, которые блокировать не требуется (свои подсети и т. д.). Добавим в файл "jail.local":
#Добавляем через пробел IP-адреса, которые блокировать не надо в любом случае (свои подсети и др.)
ignoreip = 127.0.0.1/8 1.2.3.0/24
Сохраним файл и перезапустим службу fail2ban:
systemctl restart fail2ban
7.4 Проверка Fail2Ban
Для проверки работы можно использовать команду:
fail2ban-client status asterisk
После некоторого времени, начинает появлятся первый "улов". На картинке снизу наблюдаем 3 заблокированных IP-адреса: