В этой статье Я подробно расскажу о базовой настройке безопасности Elastix. В сети достаточно мануалов по установке данного дистибутива, да и к тому же там все довольно просто в процессе установки - обычный текстовый режим линукс установщика, причем есть даже русский язык на выбор, поэтому установку Elastix мы опустим и перейдем непосредственно к самой настройке. А защита Elastix это, пожалуй, как раз самое важное в настройке. Итак, предположим, что дистрибутив мы установили, он корректно завелся и приветствующе мигает курсором и просит залогинться...
Хочу заметить, что далее будет рассмотрен вариант, в котором все SIP клиенты находятся внутри локальной подсети, а сам Elastix только получает по интернету соединение с транками, и никакого доступа из другой сети, кроме нашей, ни к Asterisk'у, ни к апачу, ни к чему другому не будет! Можно настроить несколько подсетей.
*Для начала Я рекомендую использовать очень сложные пароли и на все разные, т.е. на root доступ один пароль, mysql - другой, и на web-интерфейс третий. Желательно генерируйте пароли с разным регистром, цифрами и специальными символами, длинной 25+ знаков. Да, это немного неудобно, каждый раз вводить такие пароли, зато надежней. Старайтесь периодически менять пароли, не устанавливайте одинаковые пароли; пароли SIP клиентов не должны совпадать с их логинами, в общем не ленитесь!
*Так же нужно удалить стандартную учетную запись администратора из Elastix. Для этого в web-интерфейсе переходим в раздел пользователей Users и создаем нового пользователя с необычным логином (можно использовать беспорядочный набор букв). Наделим этого пользователя всеми правами администратора, указав для него одноименную группу. Затем заходим уже под новой учетной записью, проверяем, все ли работает и удаляем учетную запись admin(можно изменить его группу в принципе, но лучше вообще его удалить). Почему именно удаляем, а не меняем логин в MySQL? Потому что id пользователя останется, а нам этого не нужно. Вам возможно захочется включить отдельный доступ к FreePBX в настройках безопасности - не рекомендую этого делать вообще! Вполне хватит того, что есть в панели управления Elastix.
*Итак, мы вошли в 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. Если это происходит, значит - все работает.
Будем продолжать тему безопасности, так как это самая важная тема 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.
*Перейдем непосредственно к самой важной части 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. а еще надежнее выключать машину, если она нам не нужна ;)
Вообще мы уже закрылись ото всех кроме необходимой подсети с помощью 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, этого хватит. Если у вас есть свои мысли по этому поводу - делитесь ими в комментариях, Я все рассмотрю. Ссылки так же приветствуются. Возможно в будущем напишу статьи по более тонкой настройке.