В прошлой статье была описана процедура установки Asterisk и Freepbx 14 на CentOS 7
В первую очередь после установке нужно озаботиться безопасностью системы
Безопасность
1. Создадим администратора и установим для него пароль. Если система доступна через интернет, то желательно устанавливать как можно более сложный пароль администратора FreePBX
2. Выбор языка системы и файлы стандартных звуков. Так как мы собирали asterisk 14 с дополнительными русскими звуковыми файлами - то система уже предлагает их выбрать
Настройка firewalld
3. Сменим стандартный SIP порт
Так сканеры SIP как правило рыщат в интернете в поисках отрытых стандартного SIP-порта 5060, не лишней мерой по увеличению безопасности будет сменить его на какой-то другой
например на 5069
Сделать это можно в Settings->Asterisk SIP settings->Chan PJSIP settings:
Добавим правила в firewalld для того, чтобы разрешить доступ к портам, которые использует Asterisk SIP, IAX, RTP
4. Настройка fail2ban
fail2ban - это локальный сервис, который просматривает логи на предмет попытки подобрать пароли. Если такие попытки найдены, fail2ban блокирует ip-адрес источника используя iptables или в нашем случае firewalld
Нам защитить от попыток перебора ssh, sip, apache(веб-интерфейс)
Для этого установим fail2ban
добавим в fail2ban в автостарт
Создадим файл с настройками для всех профилей
/etc/fail2ban/jail.local
ignoreip = 127.0.0.1/8
ignorecommand =
bantime = 3600
findtime = 600
maxretry = 4
bantime - время на которое будет банится адрес
maxretry - количество неудачных попыток залогинится после которых fail2ban будет блокировать адрес
findtime - это время за которое было сделано maxretry
Создадим тюрьму для защиты sshd
/etc/fail2ban/jail.d/sshd.local
enabled = true
port = ssh
#action = firewallcmd-ipset
logpath = %(sshd_log)s
maxretry = 5
bantime = 86400
Чтобы проверить, что все работает попробуйте с сторонего адреса(не с того где вы сейчас установили ssh сессию) 4-5 раз подключиться используя неправильный пароль
|- Number of jail: 1
`- Jail list: sshd
Чтобы вытащить адрес из тюрьмы можно воспользоваться командой
Для того, чтобы freepbx писал файлы с правильной датой необходимо указать php временную зону не только в файле /etc/php.ini, но и чере веб-интерфейс FreePBX
Advanced Settings->PHP Timezone
Создадим фильтр для бана
filter.d/freepbx-auth.conf
## All Asterisk log messages begin like this:
log_prefix= \[\]\s*
failregex = ^%(log_prefix)s Authentication failure for .* from \<HOST\>
#ignoreregex =
а также тюрьму
jail.d/freepbx-gui.local
enabled = true
filter = freepbx-auth
logpath = /var/log/asterisk/freepbx_security.log
bantime = 86400
findtime = 600
maxretry = 3
Чтобы проверить, что наш самописный фильтр работает нужно сделать несколько неудачных попыток входа в веб-интерфейс и выполнить команду
После нескольких неудачных попыток(более 3 в данном случае) адрес будет заблокирован
Теперь создадим правила для попадания в тюрьму адресов различных SIP сканеров
jail.d/asterisk.local
enabled = true
filter = asterisk
logpath = /var/log/asterisk/fail2ban
findtime = 1800
bantime = 1800
maxretry = 6
Стандартный фильтр немного дополним
filter.d/asterisk.conf
before = common.conf
[Definition]
_daemon = asterisk
__pid_re = (?:\[\d+\])
iso8601 = \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+[+-]\d{4}
# All Asterisk log messages begin like this:
log_prefix= (?:NOTICE|SECURITY)%(__pid_re)s:?(?:\[C-[\da-f]*\])? \S+:\d*( in \w+:)?
failregex = ^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Registration from '[^']*' failed for '<HOST>(:\d+)?' - (Wrong password|Username/auth name mismatch|No matching peer found|Not a local domain|Device does not match ACL|Peer is not supposed to register|ACL error \(permit/deny\)|Not a local domain)$
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Call from '[^']*' \(<HOST>:\d+\) to extension '[^']*' rejected because extension not found in context
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Request from '[^']*' failed for '<HOST>:\d+' .+ No matching endpoint found$
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Host <HOST> failed to authenticate as '[^']*'$
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s No registration for peer '[^']*' \(from <HOST>\)$
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Host <HOST> failed MD5 authentication for '[^']*' \([^)]+\)$
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s Failed to authenticate (user|device) [^@]+@<HOST>\S*$
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s hacking attempt detected '<HOST>'$
^(%(__prefix_line)s|\[\]\s*)%(log_prefix)s SecurityEvent="(FailedACL|InvalidAccountID|ChallengeResponseFailed|InvalidPassword)",EventTV="([\d-]+|%(iso8601)s)",Severity="[\w]+",Service="[\w]+",EventVersion="\d+",AccountID="(\d*|<unknown>)",SessionID=".+",LocalAddress="IPV[46]/(UDP|TCP|WS)/[\da-fA-F:.]+/\d+",RemoteAddress="IPV[46]/(UDP|TCP|WS)/<HOST>/\d+"(,Challenge="[\w/]+")?(,ReceivedChallenge="\w+")?(,Response="\w+",ExpectedResponse="\w*")?(,ReceivedHash="[\da-f]+")?(,ACLName="\w+")?$
^(%(__prefix_line)s|\[\]\s*WARNING%(__pid_re)s:?(?:\[C-[\da-f]*\])? )Ext\. s: "Rejecting unknown SIP connection from <HOST>"$
^(%(__prefix_line)s|\[\]\s*WARNING%(__pid_re)s:?(?:\[C-[\da-f]*\])? )Ext\. s: Friendly Scanner from <HOST>$
NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Not a local domain
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Peer is not supposed to register
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - ACL error (permit/deny)
NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Wrong password
NOTICE.* .*: Registration from '.*' failed for '<HOST>' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Username/auth name mismatch
NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Device does not match ACL
NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Not a local domain
NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Peer is not supposed to register
NOTICE.* .*: Registration from '.*' failed for '<HOST>' - ACL error (permit/deny)
NOTICE.* .*: Registration from '".*".*' failed for '<HOST>:.*' - No matching peer found
NOTICE.* .*: Registration from '".*".*' failed for '<HOST>:.*' - Wrong password
NOTICE.* .*: Registration from '".*".*' failed for '<HOST>:.*' - Failed to authenticate
NOTICE.* .*: Registration from '".*".*' failed for '<HOST>:.*' - No matching endpoint found
^.* NOTICE\[\d+\] res_pjsip/pjsip_distributor\.c: Request from '"\d+" <sip:\d+@.*>' failed for '<HOST>.* \(callid: .*\) - No matching endpoint found$
NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
NOTICE.* <HOST> failed to authenticate as '.*'$
NOTICE.* .*: Sending fake auth rejection for device .*\<sip:.*\@<HOST>\>;tag=.*
NOTICE.* .*: <HOST> tried to authenticate with nonexistent user '.*'
^(%(__prefix_line)s|\[\]\s*WARNING%(__pid_re)s:?(?:\[C-[\da-f]*\])? )Ext\. s: "Rejecting unknown SIP connection from <HOST>"$
ignoreregex =
Далее в файле /etc/fail2ban/jail.conf в разделе [asterisk] нужно закомментировать следующую строку
Теперь нужно в настройках Asterisk настроить запись логов в нужный файл, для этого в файле /etc/asterisk/logger_logfiles_custom.conf
Для проверки, можно использовать sipsak, чтобы отправить некорректные запросы на авторизацию:
sipsak -U -s sip:s@AsteriskIP:5069
sipsak -U -s sip:s@AsteriskIP:5069
sipsak -U -s sip:s@AsteriskIP:5069
4. Настройка времени
установим ntp
в /etc/ntp/ntp.conf
server 1.ua.pool.ntp.org
server 2.ua.pool.ntp.org
server 3.ua.pool.ntp.org
Настройка FreePBX
1. Создание внутренних номеров pjsip FreePBX 14
Application->Extensions->Add new PJSIP extension
Чтобы система писала разговоры - добавим настройку в табе
Advanced->yes
2. Руссификация звуков asterisk
Admin->Sound Language->Russian (ru)->Download
Admin->Sound Language->Settings->Global Language->Russian
Для проверки можно с телефона наборать *65, если все прошло нормально - то asterisk на русском языке проиграет:
Ваш эктеншн номер 8001.
3. Установка дополнительных модулей, которые полезны при создании офисной АТС или call-центра
Доустановим следующие модули:
- Backup & Restore
- Blacklist
- Announcements
- Call Forward
- Follow Me
- IVR
- Queues
- Set CallerID
- Calendar
- Time Conditions