Библиотека сайта rus-linux.net
Безопасность с помощью трех D: Detect - Обнаружить, Decide – Принять решение и Deny - Запретить
Оригинал: Security in Three Ds: Detect, Decide and DenyАвтор: Federico Kereki
Дата публикации: March 16, 2015
Перевод: Н.Ромоданов
Дата перевода: июнь 2015 г.
Всякий раз, когда сервер становится доступен через Интернет, то это ставка на безопасность, поскольку хакеры будут пытаться получить к нему доступ. Просто посмотрите на журналы SSH любого сервера, который вы используете, и вы наверняка найдете много строк вида "authentication failure" ("ошибка проверки подлинности") для IP-адресов, которые не имеют ничего общего с вами или с вашим бизнесом. Снова и снова с помощью метода грубой силой (например, "атаки по словарю") делаются попытки подобрать разные пароли с тем, чтобы попытаться попасть в вашу систему, и всегда есть шанс, что это, в конечном итоге, удастся. Поэтому хорошим подходом будет применить эти «три принципа D» к вашей безопасности: detect (обнаружить) попытки злоумышленника, decide (принять решение) о том, что это происходит (в прошлом это был старый и добрый способ просто сбора отпечатков), и deny (запретить) для них доступ, по крайней мере на (достаточно продолжительное!) время.
Мониторинг такого рода можно осуществить некоторыми инструментальными средствами (см. раздел Ресурсы). В этой статье я опишу установку, конфигурирование и запуск приложения DenyHosts. С его помощью у вас будет работающий в фоновом демон, который будет непрерывно проверять вашу систему на предмет попыток доступа, принимать решение, если они будут казаться небезопасными, блокировать их и информировать вас об этом. Приложение DenyHosts может быть сконфигурировано таким образом, что сможет обмениваться информацией с другими серверами, так что когда хакер будет обнаружен в одной системе, он также будет заблокирован и в других системах.
Установка и конфигурация
Текущая версия DenyHosts - 2.6 (от июня 2013 г.). Это скрипт на языке Python, и у вас, вероятно, уже установлен этот язык. Если нет, то вы в первую очередь должны будете его установить с помощью установщика пакетов вашего дистрибутива. Вам нужна версия 2.3 или выше.
Во многих дистрибутивах уже есть пакет "denyhosts" и простой способ его установки — это воспользоваться инструментальными средствами вашей системы. Например, для Ubuntu наберите sudo apt-get install denyhosts
, для Red Hat - sudo yum install denyhos
, а для OpenSUSE - sudo zypper install denyhosts
. В остальных случаях вы можете скачать файл tar.gz (см Ресурсы), а затем выполнить следующее:
$ tar zxvf DenyHosts-2.6.tar.gz $ cd DenyHosts-2.6 $ sudo python setup.py install
Независимо от того, как вы установите приложение DenyHosts, будет создан каталог /usr/share/denyhosts и внутри него файлы скриптов. Вы можете отредактировать файл denyhosts.cfg с тем, чтобы настроить DenyHosts под вашу среду. Если этого файла нет, то выполните команду cp denyhosts.cfg-dist denyhosts.cfg
с тем, чтобы получить файл с базовой конфигурацией, с которого можно будет начать. Пустые строки и строки, начинающиеся с #, игнорируются. Есть много комментариев, которые помогут вам понять конфигурировать каждый элемент, но обратите пристальное внимание на некоторых ключевые элементы (таблица 1).
Таблица 1. Ключевые конфигурационные элементы DenyHosts
Параметры | Пояснение |
SECURE_LOG | Место, где находится журнал доступа: /var/log/secure - для Red Hat, /var/log/auth.log — для Ubuntu или OpenSUSE и так далее.DenyHosts будет сканировать этот файл с тем, чтобы обнаружить возможные попытки взлома. |
HOSTS_DENY | Место, где находится файл, ограничивающий доступ с хостов, как правило, /etc/hosts.deny. Всякий раз, когда будет обнаружен злоумышленник, DenyHosts будет добавить строки в этот файл. |
LOCK_FILE | Путь к файлу и имя файла: этот файл создается, когда заускается DenyHosts, и удаляется при выходе из скрпта. Если вы попытаетесь запустить DenyHosts, и этот файл существует, то DenyHosts немедленно закроется, предотвращая запуск более одного экземпляра скрипта в одно и то же время. |
WORK_DIR | Каталог, который DenyHosts будет использовать для своих собственных данных. |
DAEMON_LOG | Место, где расположен файл журнала, который будет использоваться скриптом DenyHosts при его запуске в режиме демона. |
DAEMON_SLEEP | Время, которое DenyHosts будет ожидать перед проверкой SECURE_LOG. |
DAEMON_PURGE | Время между чистками старых записей в HOSTS_DENY (см. ниже PURGE_DENY). |
BLOCK_SERVICE | Указывает, какой сервис должен быть блокирован в HOSTS_DENY. Задайте значение "sshd" для того, чтобы отключить доступ только по SSH, или задайте значение "ALL" для того, чтобы заблокировать любые попытки доступа с удаленного хоста. |
ADMIN_EMAIL | Адрес, по которому должны отправляться электронные письма, сообщающие о блокированных хостах и подозрительных попытках входа. Если вы для этого параметра зададите непустое значение, то вы также должны будете установить значения SMTP_HOST, SMTP_PORT, SMTP_USERNAME и SMTP_PASSWORD для того, чтобы DenyHosts мог подключиться к почтовому серверу. |
DENY_THRESHOLD_INVALID, DENY_THRESHOLD_VALID и DENY_THRESHOLD_ROOT | Указывает, после какого количества неудачных попыток входа DenyHosts должен блокировать хост (возможны из-за неправильного ввода имени пользователя, правильного имени пользователей, но неправильного пароля или неудачной попытке доступа с правами пользователя root). Но, вы вообще не должны позволять получать удаленный доступ с правами root; смотрите в разделе Ресурсы некоторые предложения по этому поводу! |
RESET_ON_SUCCESS | Если установлено значение "yes", то после успешного входа в систему счетчик неудачных попыток доступа будет сброшен в ноль. |
AGE_RESET_INVALID, AGE_RESET_VALID и AGE_RESET_ROOT | Указывает, через какое время счетчик неудачных попыток доступа будет сброшен в ноль после того, как были сделаны попытки доступа с неправильной учетной записью пользователя, неправильного ввода пароля и попытки доступа в роли пользователя root. |
PURGE_DENY | Указывает время, после которого записи HOSTS_DENY будут стерты в случае, если вы запустите скрипт DenyHosts с флагом --purge. Я обычно задаю значение "1w" (one week - одна неделя), но вы можете оставить это поле пустым (никогда не стирать записи), или можете указывать минуты, часы, дни или недели. |
PURGE_THRESHOLD | Указывает сколько раз запись о хосте может стираться до тех пор, пока DenyHosts не решит, что риск подтверждается и перестанет стирать запись, таким образом, отключая хост навсегда. Установите в ноль для того, чтобы отключить эту функцию. |
В качестве дополнительной гарантии того, что не будет запрещен доступ с вашего сервера, вы должны отредактировать /etc/hosts.allow и добавить строку для каждого адреса IP, который вы используете, в следующем формате sshd: 111.222.33.44. В DenyHosts есть собственный файл хостов, в котором определяются адреса IP (по одному на строку), которые никогда не будут заблокированы.
Теперь вы готовы начать работу с DenyHosts — так что давайте это сделаем!
Запуск DenyHosts
Вы можете периодически запускать DenyHosts (например, как задание cron), но лучше всего запустить его в режиме демона. Тогда скрипт DenyHosts будет работать в фоновом режиме, проверяя журналы доступа с целью обнаружения возможных злоумышленников. Для этого вам нужно создать дополнительный конфигурационный файл, выполнив команду cp daemon-control-dist daemon-control
. Затем отредактируйте этот файл с тем, чтобы быть уверенными, что в нем будут правильно заданы следующие три параметры (Таблица 2).
Таблица 2. Запуск DenyHosts в режиме демона потребует использовать дополнительные конфигурационные параметры
Параметры | Пояснение |
DENYHOSTS_BIN | Должен указывать на скрипт denyhosts.py |
DENYHOSTS_CFG | олжен указывать на конфигурационный файл denyhosts.cfg |
DENYHOSTS_LOCK | Должен указывать на тот же самый файл, что и параметр LOCK_FILE из Таблицы 1. |
Теперь все, что вам нужно сделать, это с помощью команды /etc/init.d/denyhosts restart or service denyhosts restart
, которая зависит от вашего сервера и ваших настроек, запустить сервис. С этого момента, DenyHosts будет контролировать попытки входа в систему, и при обнаружении часто повторяющихся неудачных попыток, он примет решение отклонять все попытки доступа горе-нарушителя (рис 1). На всякий случай, вы также должны настроить DenyHosts так, чтобы он при перезагрузке запускался автоматически — это делается с помощью команды sudo chkconfig denyhosts on.
Рис.1. DenyHosts контролирует журналы доступа и, в конечном итоге, блокируется хост хакера.
После того, как DenyHosts будет запущен, он будет выполнять мониторинг журнальных файлов и после того, как будут обнаружены повторяющиеся попытки неудачного входа в систему и будут достигнуты определенные пороговые значения, он примет решение заблокировать удаленный адрес IP с тем, чтобы отказать горе-хакеру в любом виде доступа. Например, время от времени я умышленно вводил неправильные одноразовые пароли и в итоге я был заблокирован (на рис.1 также объясняется, почему скрипт DenyHosts нужно запустить с правами root; поскольку в противном случае он не сможет изменять файл hosts.deny):
> ssh fkereki@your.own.server fkereki@your.own.server's password: Permission denied, please try again. fkereki@your.own.server's password: Permission denied, please try again. fkereki@your.own.server's password: Permission denied (publickey,password). > ssh fkereki@your.own.server fkereki@your.own.server's password: Permission denied, please try again. fkereki@your.own.server's password: Permission denied, please try again. fkereki@your.own.server's password: Permission denied (publickey,password). . . . several attempts, and then... несколько попыток, а потом ... > ssh fkereki@your.own.server ssh_exchange_identification: read: Connection reset by peer
DenyHosts в конечном итоге снял ограничение (что зависит от заданной конфигурации), но если зарегистрированному пользователем каким-то образом удалось добиться того, что для него запретили доступ с корректного сервера, то вы можете без промедления решить эту проблему (смотрите раздел «Реабилитируем пользователей»).
Не заблокируйте доступ самому себе!
Само собой разумеется, вы должны протестировать DenyHosts с тем, чтобы убедиться, что скрипт работает. И, конечно, самое главное, когда вы выполняете тестирование, оставьте на сервере хотя бы открытую оболочку командной строки. В противном случае, если что-то пойдет не так, как надо, вы можете вызвать блокировку своего собственного адреса IP и у вас возникнет очень любопытная проблема!
Когда вы пытаетесь получить доступ к серверу с другого компьютера, вы можете воспользоваться командой tail -f
для мониторинга файла hosts.deny и собственного журнального файла скрипта DenyHosts (смотрите в Таблице 1 конфигурационные параметры HOSTS_DENY и DAEMON_LOG). После нескольких неудачных попыток, вы должны увидеть изменения в обоих файлах, и вы также должны получить сообщение по электронной почте, подтверждающее, что ваша конфигурация настроена замечательно.
Обмен результатами
DenyHosts предлагает еще один сервис, который позволяет обмениваться с другими серверами по всему миру о том, какие адреса IP блокированы. Идея проста. Если кто-нибудь обнаруживает, что попытки взлома приходят от определенного адреса IP, то любой сервер, который блокирует его, не дожидается пока он подвергнется нападению, становясь, тем самым, немного безопаснее. Для этого есть несколько параметров, которые необходимо настроить — смотрите таблицу 3.
Таблица 3. Совместное блокирование адресов IP
Параметры | Пояснение |
SYNC_SERVER | Сервер, к которому вы должны подключить для централизованной синхронизации. В настоящее время, доступен только сервер xmlrpc.denyhosts.net:9911, но в будущем, организации могут для внутреннего использования устанавливать свои собственные серверы синхронизации |
SYNC_INTERVAL | Указывает, как часто следует синхронизироваться с сервером. |
SYNC_UPLOAD и SYNC_DOWNLOAD | Указывает, будет ли DenyHosts получать или отсылать забанненые адреса IP-адресов; логический параметр - в обоих случаях указывается YES. |
SYNC_DOWNLOAD_THRESHOLD | Указывает, что скачиваются только те адреса IP, которые были обнаружены и блокированы по крайней мере указанным числом различных серверов DenyHosts. |
SYNC_DOWNLOAD_RESILIENCY | Указывает скачать только те адреса IP, которые были блокированы в течение указанного или большего периода времени. Чем больше это значение, тем более вероятно, что адрес IP фактически является хакерским. |
Обмен такой информацией представляет собой, как правило, хорошую идею, поскольку вы можете предотвратить потенциальную хакерскую угрозу еще до начала сниффинга вашего сервера. Сервис обмена настоящее время является бесплатны (хотя пожертвования принимаются), но, по существу, бизнес-предприятия могут за него платить так, как это описано в DenyHosts FAQ. Вы можете связаться с разработчиком DenyHosts для лицензирования компонент сервера и запуска своего собственного сервера обмена.
Реабилитируем пользователей
Независимо от того, насколько аккуратен конкретный пользователь, кто-то однажды может все испортить и повторный ввод неправильного пароля, повторившийся много раз, может быть причиной блокировки, сделанной DenyHosts. Как вы можете это исправить? После того, как вы решили, что этого пользователя следует простить, выполните следующие действия:
- Узнайте текущий адрес IP с тем, чтобы вы его снова могли включить.
- Остановите DenyHosts.
- Проверьте каждый файл в каталоге WORK_DIR (смотрите таблицу 1), и удалите все строки, в которых появляется этот адрес IP (воспользуйтесь
grep
). - Таким же самым образом отредактируйте файл /etc/hosts.deny.
- Перезапустите DenyHosts.
Теперь, если пользователь попытается снова получить доступ, доступ ему должен быть предоставлен. Не поддавайтесь соблазну пропустить шаг 3. Если вы это делаете, то сразу, как только вы перезагрузите DenyHosts, указанный адрес IP будет вновь заблокирован!
Заключение
Безопасность — это работа, выполняемая в режиме 24/7, и все инструментальные средства, которые вы можете для этого использовать, помогут пойти длинный путь к обеспечению безопасности сервера. Скрипт DenyHosts прост в установке и обеспечивает быстрое обнаружение попыток взлома, блокируя удаленных хакеров и противодействия атакам методом грубой силы. И хотя это не "серебряная пуля", решающая все возможные проблемы, связанные с защитой, это достойное инструментальное средство, который вам следует добавить в ваш инструментарий безопасности. Попробуйте его!
Ресурсы
Вы можете найти DenyHosts по ссылке http://denyhosts.sourceforge.net или скачать его с сайта проекта по ссылке http://sourceforge.net/projects/denyhosts. Ответы на несколько общих вопросов можно найти по ссылке http://denyhosts.sourceforge.net/faq.html.
Другими инструментами, предназначенными для решения аналогичных задач, являются BlockHosts на сайте http://www.aczoom.com/tools/blockhosts и Fail2ban на сайте http://www.fail2ban.org.
Я ранее для Linux Journal уже писал в других статьях о мерах безопасности: "PAM—Securing Linux Boxes Everywhere" (January 2009), "Implement Port-Knocking Security with knockd" (January 2010) и "More Secure SSH Connections" (January 2014).