Для обеспечении безопасности необходимо настроить iptables, чтобы разрешить входить по SSH-протоколу только с разрешенных IP-адресов.
Пример правил для iptables, приведенный ниже, предполагает, что из локальной сети 10.0.0.0/24 соединения по SSH-протоколу разрешены, также разрешено соединяться по SSH с IP-адреса 192.168.0.100.
В данном фрагменте правил предполагается, что:
- eth0 – сетевой интерфейс с адресом 192.168.0.10, смотрит в Интернет;
- eth1 – сетевой интерфейс с адресом 10.0.0.1, смотрит во внутреную сеть.
iptables
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] # Разрешаем соединения по SSH только с IP-адреса 192.168.0.100 из Internet: -A INPUT -i eth0 -s 192.168.0.100/32 -d 192.168.0.10/32 -p tcp --dport 22 --sport 1025:65535 -j ACCEPT -A OUTPUT -o eth0 -d 192.168.0.100/32 -s 192.168.0.10/32 -p tcp --sport 22 --sport 1025:65535 -j ACCEPT # Разрешаем SSH коннекты с любого IP-адреса из внутреней сети: -A INPUT -i eth1 -s 10.0.0.0/24 -d 10.0.0.1/32 -p tcp --dport 22 --sport 1025:65535 -j ACCEPT -A OUTPUT -o eth1 -d 10.0.0.0/24 -s 10.0.0.1/32 -p tcp --sport 22 --sport 1025:65535 -j ACCEPT
hosts.allow, hosts.deny
Также необходимо настроить сети, которым разрешен доступ по SSH с помощью файлов hosts.allow
и hosts.deny
, которые находятся в каталоге /etc
.
В файл hosts.allow
добавляем:
sshd: 10.0.0.0/255.255.255.0, 192.168.0.100/255.255.255.255
В файл hosts.deny
:
sshd: ALL@ALL
Настройки SSH-сервера
Настройки SSH-сервера хранятся в файле /etc/ssh/sshd_config
.
Для приведенного выше примера он может быть следующим:
Port 22 Protocol 2 ListenAddress 0.0.0.0 SyslogFacility AUTHPRIV LogLevel INFO LoginGraceTime 60 PermitRootLogin no AllowUsers admin MaxAuthTries 3 PrintLastLog yes PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials yes UsePAM yes X11Forwarding no Subsystem sftp /usr/libexec/openssh/sftp-server
Наиболее важные опции с точки зрения безопасности:
Port 22
– Порт по умолчанию.Protocol 2,1
– Какая реализация протокола SSH будет использоваться. Рекомендую оставить только 2.ListenAddress
– По умолчанию SSH сервер прослушивает все доступные интерфейсы, что абсолютно не нужно в большинстве ситуаций. Необходимо прописать сетевой интерфейс, с которого будет осуществляться управление сервером.PermitRootLogin yes
– По умолчанию разрешает входить по SSH суперпользователю root. Необходимо указать no.AllowUsers adminsys
– Данный параметр разрешает входить по SSH только перечисленным пользователям.AllowGroups wheel
– Группа пользователей которой можно входить по SSH, опцию можно не использовать если указана опцияAllowUsers
.DenyUsers baduser
– Данная опция запрещает вход по SSH перечисленным пользователям.DenyGroups badgroup
– Данная опция запрещает вход по SSH перечисленным группам пользователей.MaxAuthTries 3
– Сколько раз переспрашивать пароль при неверном вводе. В данном случае SSH-сервер после 3 неверных попыток разорвет соединение с клиентом.LoginGraceTime 60
– Через сколько секунд разрывать соединение при отсутствии аутентификации со стороны клиента.PermitEmptyPasswords no
– Разрешать использовать пустые пароли. По вполне понятным причинам значение этого параметра no.PrintLastLog yes
– при входе пользователя в систему по SSH ему будет показано когда и откуда последний раз был произведен вход под данным пользователем.LogLevel INFO
– В качестве параметра этой опции необходимо указать уровень журналирования. Возможные значения QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG1, DEBUG2, DEBUG3. Чем выше уровень журналирования, тем больше информации появится в файле регистрации событий.SyslogFacility AUTHPRIV
– Куда будут попадать логи. Возможные значения: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.
Посмотреть в каком файле окажется логируемая информация можно посмотрев опции syslogd в файле /etc/syslog.conf.
syslog-сервер
Я настоятельно рекомендую установить в сети syslog-сервер syslog-ng, на который будет производиться журналирование важных событий с ваших серверов. Основным отличием данной системы от стандартного syslog-сервера является возможность логировать события от каждого из источников в отдельный каталог/файл.
Сохранение логов на удаленном сервере
Допустим в sshd_config
опциям LogLevel
, SyslogFacility
присвоены значения:
LogLevel INFO SyslogFacility AUTHPRIV
Тогда в /etc/syslog.conf
после:
authpriv.* /var/log/secure
добавим строку:
authpriv.* @10.0.1.2
где:
- 10.0.1.2 – IP-адрес вашего syslog-сервера в сети.
Таким образом, события от SSH-сервера логируются на локальном сервере и на syslog-сервере.
Бывают ситуации, когда администрирование сервера должно осуществляться с любого места в сети интернет. Соответственно, необходимо разрешить входить на сервер по SSH с любого IP-адреса. С данным обстоятельством связанна некоторая опасность. В сети работает множество «ботов» которые сканируют сети на предмет наличия SSH-сервера, и при нахожднении такого эти программы пытаются подобрать имя пользователя и пароль для входа на сервер.
Блокирование попыток перебора паролей
Таким образом перед системным администратором встает проблема блокирования попыток подбора пароля. Решение данной проблемы есть.
Изменение номера порта
Во первых, повесить SSH на нестандартный порт например 2022. Этот метод не очень надежен т.к. любой сканер покажет что этот порт открыт, а по банеру либо по возвращаемым ответам сервера на команды можно определить, что это SSH-сервер.
Ограничение количества подключений
Во вторых, обязательно установить опцию MaxAuthTries
. Чем меньше значение этого параметра, тем чаше наш сервер будет разрывать соединение от брутфорс-робота. Таким образом значительно замедляется скорость перебора значений имя/пароль, но и использование данного метода полностью не исключает возможность подбора пароля.
Обязательно установить опцию AllowUsers
.
PAM-модуль pam_abl
Ну и напоследок, для блокирования надоедливых ботов нам необходимо автоматически блокировать их IP-адреса. В этом нам поможет модуль pam_abl, работающий через PAM. Компилируется и настраивается данный модуль очень просто.
В файл /etc/pam.d/system-auth
необходимо внести строку:
auth required pam_abl.so config=/etc/security/pam_abl.conf
т.е. файл будет выглядеть следующим образом:
auth required pam_env.so auth required pam_abl.so config=/etc/security/pam_abl.conf auth sufficient pam_unix.so likeauth nullok auth required pam_deny.so account required pam_unix.so password required pam_cracklib.so retry=3 password sufficient pam_unix.so nullok use_authtok md5 password required pam_deny.so session required pam_limits.so session required pam_unix.so
Затем внесите изменения в файл /etc/security/pam_abl.conf
. По умолчанию файл выглядит следующим образом:
# debug # Файл в котором будет храниться "черный" список хостов. host_db=/var/lib/abl/hosts.db # Период устаревания записей о хостах. Т.е. если после неудачной попытки # входа прошло более 2-х суток, то запись удаляется из базы. host_purge=2d # Параметры блокировки хостов. Данная запись означает следующее: # блокировать любой хост с которого сделано 10 неудачных соединений в течении одного часа, # либо 30 неудачных соединений в течении суток. host_rule=*:10/1h,30/1d # Файл в котором будет храниться "черный" список пользователей. user_db=/var/lib/abl/users.db # Период устаревания записей о пользователях. user_purge=2d # Параметры блокировки пользователей. Данная запись означает: # блокировать любого пользователя кроме root, под которым сделано 10 неудачных # соединений в течении одного часа, либо 30 неудачных соединений в течении суток. user_rule=!root:10/1h,30/1d
Просмотреть информацию о неудачных попытках входа и заблокированных хостах можно набрав в консоли команду:
# pam_abl
Если вы хотите удалить хост из «черного» списка наберите в консоли:
# pam_abl -v --okhost=test.host.ru
Если вы хотите удалить пользователя из «черного» списка наберите в консоли:
# pam_abl -v --okuser=test
DenyHosts
DenyHosts – утилита, выполняющая аналогичные действия, но работающая по другому принципу.
Данная программа анализирует файл, в котором хранятся попытки входа в систему по SSH, и, в случае обнаружения в нем попыток перебора пароля, заносит «надоедливый» хост в файл hosts.deny
, отправляя администратору системы уведомление об этом по почте. Рабочие параметры программы настраиваются в конфигурационном файле /etc/denyhosts.cfg
.
Разберем некоторые параметры DenyHosts более подробно:
- SECURE_LOG – Указывает на файл, в котором хранятся записи от службы sshd. Посмотреть в какой файл пишется информация в вашем дистрибутиве можно в /etc/syslog.conf:
authpriv.* /var/log/secure
- HOSTS_DENY – Указывает на файл в который будут заноситься записи о запрещенных хостах.
- PURGE_DENY – Задает временной интервал, в течении которого будут храниться данные о запрещенных хостах.
- BLOCK_SERVICE – Указывает какие сервисы запретить для хоста. По умолчанию блокируется только SSH. Можно запретить доступ к любым (работающим через механизм tcp_wrappers) сервисам.
- DENY_THRESHOLD_INVALID – Задает максимальное количество попыток входа в систему под несуществующими логинами. Стоит выставить данное значение на 1 больше, чем значение MaxAuthTries с
/etc/ssh/sshd_config
. Сейчас на примере разберем зачем это нужно.Пример: ЗначениеMaxAuthTries
задано в 3, а значениеDENY_THRESHOLD_INVALID=2
. Тогда в случае, если вы ошиблись в наборе имени пользователя, и 3 раза ввели пароль – вы автоматически попадете в «черный» список и не сможете более зайти на свой сервер. - DENY_TRESHHOLD_VALID – Задает кол-во попыток входа в систему которое разрешено делать пользователям (не учитываются попытки входа под пользователем root). При указании этого параметра руководствуйтесь предыдущим советом и устанавливайте значение данного параметра как минимум на 1 больше чем MaxAuthTries.
- DENY_TRESHOLD_ROOT – Задает кол-во попыток входа под пользователем root. Т.к. у нас в конфигурации SSH-сервера установленно, что входить пользователю root запрещено, то выставьте значение данного параметра в 2 или даже в 1.
- DENY_TRESHOLD_RESTRICTED – Блокирует хост после количества попыток заданных этим параметром. Значения применяется для имен пользователей перечисленных только в
WORK_DIR/restricted-usernames
. - WORK_DIR – Задает каталог в котором будут записываться данные для работы DenyHosts.
- SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS – Если установленна в YES и если для вызывающей подозрение попытки входа имеется запись в allow-hosts, тогда попытка считается обоснованной, т.е. хосту будет запрещен доступ. Если значение установлено в NO, тогда подозрительные попытки входа, имеющие записи в allowed-hosts, не журналируются, и доступ запрещен не будет. Все прочие попытки входа с IP-адресов, не перечисленных в allowed-hosts, будут всегда логироваться и блокироваться.
- HOSTNAME_LOOKUP – Будут ли предприниматься попытки разрешения IP-адресов в имена.
- ADMIN_EMAIL – Имя пользователя, которому будут присылаться уведомления от DenyHosts.
- SMTP_HOSTS – Задает сервер SMTP через который будет осуществляться отправка уведомлений.
- SMTP_PORT – Задает порт SMTP-сервера.
- SMTP_FROM – Задает значение которое будет отображаться в поле From e-mail.
- SMTP_SUBJECT – Задает поле Subject e-mail.
- SYSLOG_REPORT – Логировать через syslog.
- AGE_RESET_VALID – Задает интервал времени для счетчика попыток входа.Пример: С IP адреса 10.0.0.2 была сделана неверная попытка входа. Счетчик неверных попыток для этого адреса установился в 1. Если в течении периода времени заданного параметром
AGE_RESET_VALID
с этого IP-адреса не будет других неуспешных попыток, то счетчик сбросится на 0. - AGE_RESET_ROOT – Тоже самое для пользователя root.
- AGE_RESET_INVALID – Тоже самое для несуществующих пользователей.
- RESET_ON_SUCCESS – Сбрасывать счетчик неуспешных попыток при успешном входе в систему.
- DAEMON_SLEEP – Когда DenyHosts работает в режиме демона – этот параметр задает интервал времени, через который будет перечитана информация из
SECURE_LOG
, т.е. как часто будет демон получать информацию о попытках входа в систему. Рекомендую поставить это параметр не более 1 минуты, т.к. в течении этого интервала пока еще не заблокированный атакующий может предпринять сколь угодно большое количество попыток входа в систему. - DAEMON_PURGE – указывает как часто DenyHosts будет удалять устаревшую информацию из
HOSTS_DENY
.
Ну и последнее правило. Все перечисленное не имеет смысла, если вы используете простые пароли: admin, administrator, root, 12345, qwerty, asdfg и им подобные.