Main menu

В этой статье Я подробно расскажу о базовой настройке безопасности Elastix. В сети достаточно мануалов по установке данного дистибутива, да и к тому же там все довольно просто в процессе установки - обычный текстовый режим линукс установщика, причем есть даже русский язык на выбор, поэтому установку Elastix мы опустим и перейдем непосредственно к самой настройке. А защита Elastix это, пожалуй, как раз самое важное в настройке. Итак, предположим, что дистрибутив мы установили, он корректно завелся и приветствующе мигает курсором и просит залогинться...

Хочу заметить, что далее будет рассмотрен вариант, в котором все SIP клиенты находятся внутри локальной подсети, а сам Elastix только получает по интернету соединение с транками, и никакого доступа из другой сети, кроме нашей, ни к Asterisk'у, ни к апачу, ни к чему другому не будет! Можно настроить несколько подсетей.

Коротко о паролях

*Для начала Я рекомендую использовать очень сложные пароли и на все разные, т.е. на root доступ один пароль, mysql - другой, и на web-интерфейс третий. Желательно генерируйте пароли с разным регистром, цифрами и специальными символами, длинной 25+ знаков. Да, это немного неудобно, каждый раз вводить такие пароли, зато надежней. Старайтесь периодически менять пароли, не устанавливайте одинаковые пароли; пароли SIP клиентов не должны совпадать с их логинами, в общем не ленитесь!

*Так же нужно удалить стандартную учетную запись администратора из Elastix. Для этого в web-интерфейсе переходим в раздел пользователей Users и создаем нового пользователя с необычным логином (можно использовать беспорядочный набор букв). Наделим этого пользователя всеми правами администратора, указав для него одноименную группу. Затем заходим уже под новой учетной записью, проверяем, все ли работает и удаляем учетную запись admin(можно изменить его группу в принципе, но лучше вообще его удалить). Почему именно удаляем, а не меняем логин в MySQL? Потому что id пользователя останется, а нам этого не нужно. Вам возможно захочется включить отдельный доступ к FreePBX в настройках безопасности - не рекомендую этого делать вообще! Вполне хватит того, что есть в панели управления Elastix.

IPtables & fail2ban

*Итак, мы вошли в web-интерфейс Elastix, с чего начать? С безопасности безусловно. Переходим в пункт меню Security, включаем фаервол и (только для случая с одной или несколькими подсетями, выступающими в роли SIP клиентов) убираем все правила в фаерволле, кроме первого и двух последних. Затем добавляем новое правило со следующими значениями:

Где Source Address ваша подсеть. Но тут так же можно указать конкретный IP, так что будьте внимательны. Затем перемещаем созданное правило на вторую позицию. Убеждаемся, что третьим правилом у нас запрещен вообще весь траффик. Для начала хватит. Вообще можно установить подключение с конкретных IP, но сейчас Я этого рассматривать не буду. Таким образом, мы запретили любые обращения к серверу, будь то к апачу или к астериску отовсюду, кроме указанной подсети, что довольно надежно, не смотря на то, что просто. Ну а если у вас нет такой возможности, то можно хотя бы запретить пинги к машине, для этого добавьте правило, запрещающее все входящие icmp пакеты.

*Теперь прикрутим fail2ban к Asterisk'у. По умолчанию fail2ban у нас не установлен, поэтому выполняем:

yum install fail2ban

По умолчанию он настроен на апач, ssh и прочие стандартные сервисы, поэтому нам нужно только добавить Asterisk. Создаем файл /etc/fail2ban/filter.d/asterisk.conf, например так:

nano /etc/fail2ban/filter.d/asterisk.conf

и добавляем туда следующее:

[Definition]
#_daemon = asterisk
# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#
 
failregex = 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.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' (from <HOST>)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            VERBOSE.* logger.c: -- .*IP/<HOST>-.* Playing 'ss-noservice' (language '.*')
 
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Это позволяет защититься от брутфорса SIP аккаунтов. Можете добавить свою подсеть или IP адреса в строку ignoreregex =, чтобы к вам это правило не применялось.

Далее нужно привязать этот конфиг в fail2ban. Открываем файл /etc/fail2ban/jail.conf:

nano /etc/fail2ban/jail.conf

и добавляем в самый конец следующее:

[asterisk-iptables]
 
enabled = true
filter = asterisk
action = iptables-allports[name=ASTERISK, protocol=all]
sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@example.org]
logpath = /var/log/asterisk/full
maxretry = 3
bantime = 600

тут можно отредактировать такие параметры, как количество неправильных попыток авторизации и время в секундах, на которое будет действовать бан. И если у вас настроена почта, можно указать мыло, на который будут сыпаться отчеты.

Теперь добавляем fail2ban в автозагрузку и запускаем его:

chkconfig fail2ban on
/etc/init.d/fail2ban start

Готово! Теперь нам нужно убедиться, что все работает. Для этого выполним следующую команду:

iptables -L -v

Среди других правил должно быть что-то подобное:

Chain fail2ban-ASTERISK (1 references)
pkts bytes target prot opt in out source destination
2013K 377M RETURN all -- any any anywhere anywhere

На этом все! fail2ban прикручен к Asterisk'у можно даже опытным путем проверить: не добавляйте свой IP в строку ignoreregex и попробуйте несколько раз авторизоваться в SIP аккаунте с неправильным паролем к примеру. Вас должно "забанить" и в течении установленного времени у вас не будет вообще никакого доступа к серверу с данного IP. Если это происходит, значит - все работает.

SSH

Будем продолжать тему безопасности, так как это самая важная тема Elastix да и вообще Asterisk'a. Сейчас поговорим об SSH, а именно будем менять порт и не только.

*Для начала нужно создать пользователя, у которого не будет вообще никаких прав, кроме как подключения по SSH, а вот руту нужно вообще запретить подключаться по этому протоколу. Итак начнем. Создаем пользователя и задаем ему пароль:

useradd userssh
passwd userssh

Помните, что пароли должны быть очень сложными и меняйте логин конечно же! Далее редактируем файл /etc/ssh/sshd_config, а именно добавляем в него две следующих строки:

AllowUsers userssh
PermitRootLogin no

Что мы сделали? Добавили пользователя, задали ему пароль, потом разрешили ему подключение по SSH, а пользователю root наоборот запретили по нему подключаться. То есть при подключении по SSH мы логинимся под новым пользователем, используя его пароль, а если нам нужно зайти под рутом, то выполним такую команду:

su - root

*Далее сменим порт подключения SSH. Для этого идем в тот же файл /etc/ssh/sshd_config и находим там строку(она может быть закомментированной)

Port 22

И приводим ее к примерно такому виду:

Port 5248

Порт выбирайте сами, главное, чтобы он не пересекался с портами других сервисов.

*Далее нам обязательно нужно выполнить следующее действие! Заходим в раздел Define Ports, который находится в пункте Security в вэб интерфейсе Elastix и находим там уже присутствующий SSH порт. По умолчанию он установлен как 22, нужно отредактировать его и изменить на тот, который указали выше, в данном примере на 5248. Готово! Только убедитесь, что ы правильно выполнили оба вышеприведенных пункта по смене SSH порта, так как один без другого жить не может. В общем если вы сделаете только одно из двух или ошибетесь, то потеряете доступ по SSH.

Asterisk

*Перейдем непосредственно к самой важной части Elastix'a - астериску. Вообще часть рекомендаций по уже выполнена в эластиксе, но лучше в этом убедиться. Пробежимся по конфигам:

Открываем файл sip_general_custom.conf и убеждаемся в том, что там есть следующая строка:

allowguest=no

Затем открываем файл sip_general_additional.conf и находим там такую строку:

alwaysauthreject=yes

Если эти параметры отсутствуют в данных файлах - следует их добавить. Если они имеют другие значения - нужно привести их именно к такому виду, который указан выше. Здесь первым параметром мы запрещаем подключения и звонки от гостей, а вторым параметром отключаем ответ о неверном пароле.

Так же для SIP аккаунтов следует установить следующие параметры:

Call-limit=1

Этот параметр ограничивает количество каналов для SIP аккаунта. Поможет если вас уже взломали и начинают звонить - сэкономит денег. Далее в настройках SIP аккаунтов желательно указать диапазон IP адресов, с которых разрешена регистрация SIP телефонов. Если у вас пользователи находятся в под сети лучше вообще задать каждому аккаунту определенный IP, а остальные запретить. Все эти параметры находятся в настройках SIP аккаунтов и называются они deny и permit. Соответственно параметр deny запрещает регистрацию с указанного диапазона IP адресов, а параметр permit разрешает. Если ваши пользователи находятся в определенной подсети, то параметр deny не трогаем, а в параметр permit добавляем эту самую подсеть, а еще лучше один IP.

*В транках так же можно указывать количество каналов, стоит уделить внимание и этому параметру. Установите значение равное вашим пользователям.

*В маршрутах вручную указывайте коды городов, а не весь диапазон восьмерки. Это так же позволит сэкономить денег, если вас взломали у уже звонят. Да это неудобно, нужно следить за когдами, их обновлениями etc, но это та простая мера предосторожности, которая вас выручит в черный день.

*Поменяйте стандартный порт 5060 на любой другой, только опять же следите за тем, чтобы этот порт не использовался системой. Для этого нужно изменить параметр Bindport=5060

*По возможности выставляйте ограничения по времени. Если вам не нужно звонить 24/7 и какое то время система простаивает лучше ограничить исходящие звонки во временных группах. Для этого нужно создать временную группу, указать там в какой период возможны исходящие звонки и сохранить. Например исходящие звонки должны работать только пять дней в неделю с 9.00 до 18.00. Указываете начало и конец рабочей недели (от понедельника по пятницу) и соответствующее время. Сохраняем данную группу и переходим в раздел исходящей маршрутизации, выбираем маршрут и в параметре временных групп выбираем нашу, созданную. Теперь во все другие часы и выходные дни исходящая маршрутизация работать не будет.

P.S. а еще надежнее выключать машину, если она нам не нужна ;)

Apache

Вообще мы уже закрылись ото всех кроме необходимой подсети с помощью IPtables, но можно перестраховаться и закрыть еще и Apache. Но прежде чем это делать убедитесь, что установлены и включены модули mod_rewrite и mod_security. Теперь открываем файл /etc/httpd/conf/httpd.conf и находим стройки отвечающие за головную директорию:

<Directory "/var/www/html">

Приводим последние строки к такому вот виду:

Order Deny,Allow
Deny from all
Allow from 1.1.1.0/24
</Directory>

В строку Allow from 1.1.1.0/24, конечно же, прописываем свою подсеть. Это ограничит доступ к апачу вообще отовсюду, кроме нашей подсети. Но на этом не стоит закругляться, так как можно настроить доступ более гибко. А именно, для отдельных директорий можно указывать доступ с определенных IP. Это удобно если у Вас кроме астериска используются CRM и т.п. Например, можно ограничить доступ к панели управления Elastix'ом, и разрешить его только с одного или нескольких IP. Для этого в папке /var/www/html/admin создаем файл .htaccess и пишем туда следующее:

Deny from all
Allow from 1.1.1.0.0

Теперь доступ к админке эластикса будет только с указанных IP, которые можно прописывать через пробел. Аналогично стоит поступать с phpmyadmin и прочими важными директориями.

Я думаю, для начала, по защите Elastix, этого хватит. Если у вас есть свои мысли по этому поводу - делитесь ими в комментариях, Я все рассмотрю. Ссылки так же приветствуются. Возможно в будущем напишу статьи по более тонкой настройке.