Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Безопасность работы с системой Linux

20 советов по безопасному использованию сервера OpenSSH

Оригинал: "Top 20 OpenSSH Server Best Security Practices"
Автор: Vivek Gite
Дата публикации: июль 2009 г.
Перевод: Н.Ромоданов
Дата перевода: октябрь 2009 г.

OpenSSH является реализацией протокола SSH. OpenSSH рекомендуется использовать для удаленного доступа в систему, для создания резервных копий, для дистанционной передачи файлов по протоколам scp или sftp и для многого другого. SSH идеально подходит для сохранения конфиденциальности и обеспечения целостности данных при обмене данными между двумя сетями или системами. Однако основным его преимуществом является аутентификация на сервере с использованием криптографии с открытым ключом. Время от времени возникают слухи о том, что есть эксплойт zero day для OpenSSH . Ниже перечислено, что вам нужно настроить с тем, чтобы повысить безопасность сервера OpenSSH.

Конфигурационные файлы первоначальной настройки и порт SSH

  • /etc/ssh/sshd_config - конфигурационный файл сервера OpenSSH
  • /etc/ssh/ssh_config - конфигурационный файл клиентской части OpenSSH
  • ~/.ssh/ - конфигурационная директория пользователей ssh
  • ~/.ssh/authorized_keys или ~/.ssh/authorized_keys2 - список открытых ключей (RSA или DSA), которыми можно пользоваться при входе в систему по регистрационным записям пользователей
  • /etc/nologin - если этот файл существует, то демон sshd не даст никому из пользователей доступ, кроме пользователя root
  • /etc/hosts.allow (доступ разрешен) и /etc/hosts.deny(доступ запрещен): здесь находятся списки управления доступом, которые должны использоваться tcp-wrapper-ами .
  • SSH порт, используемый по умолчанию: : TCP 22

Сессия SSH в действии

№ 1: Отключите сервер OpenSSH

На рабочих станциях и ноутбуках можно работать без использования сервера OpenSSH. Если вам не нужен удаленный доступ и возможности передачи файлов через SSH, отключите и удалите сервер SSHD. В Linux системах CentOS / RHEL / Fedora пользователь может отключить и удалить сервер openssh с помощью команды yum:

# chkconfig sshd off
# yum erase openssh-server

В Linux системах Debian / Ubuntu пользователь может его отключить и одновременно удалить с помощью команды apt-get:

# apt-get remove openssh-server

Вам может потребоваться изменить свой скрипт iptables с тем, чтобы удалить из него правило исключения для ssh. В CentOS / RHEL / Fedora отредактируйте файлы /etc/sysconfig/iptables и /etc/sysconfig/ip6tables. После того, как это сделаете, перезапустите сервис iptables:

# service iptables restart
# service ip6tables restart

№ 2: Используйте только протокол SSH 2

В протоколе SSH версии 1 (SSH-1) имеются проблемы, касающиеся атак вида "man-in-the-middle" ("человек посередине", т.е. когда атакующий может читать и видоизменять сообщения, которыми обмениваются корреспонденты, причем ни один из них не знает о наличии такого посредника – прим. пер.) и уязвимости, связанные с безопасностью. SSH-1 устарел и его использование следует любой ценой избегать. Откройте файл sshd_config и убедитесь в том, чтобы там присутствовала следующая строка:

Protocol 2

№ 3: Ограничьте доступ пользователей через SSH

Во всех системах по умолчанию пользователям разрешено иметь доступ через SSH с использованием пароля или открытого ключа. Иногда Вы создаете учетную запись пользователя UNIX / Linux для доступа по протоколу ftp или использования электронной почты. Однако тот же самый пользователь может войти в систему через ssh. Он будет иметь полный доступ к системным средствам – компиляторам и таким скриптовым языкам, как Perl, Python, с помощью которых можно открывать порты и делать множество других удивительных вещей. В одной из моих клиентских программ есть устаревший php скрипт и атакующий может с помощью этого скрипта создать в системе новую учетную запись. Однако у атакующего нет возможности попасть в систему через ssh, поскольку он не указан в записи AllowUsers (пользователи, которым разрешен доступ).

Для того, чтобы доступ в систему через SSH был разрешен только пользователям root, vivek и jerry, добавьте в файл sshd_config следующую запись:

AllowUsers root vivek jerry

Вы можете, наоборот, разрешить всем пользователям использовать доступ через SSH, но для некоторых из них можете запретить его с помощью следующей записи:

DenyUsers saroj anjali foo

Вы также можете сконфигурировать Linux PAM, который будет разрешать или запрещать доступ через сервер sshd. Вы можете задать список имен групп, которым разрешен или запрещен доступ через ssh.

№ 4: Сконфигурируйте время закрытия неработающей сесси

Пользователь может заходить на сервер через ssh, а Вы для того, чтобы удалять брошенные сессии ssh, можете установить таймаут idle (время бездействия). Откройте файл sshd_config и убедитесь в том, что сконфигурированы следующие параметры:

ClientAliveInterval 300
ClientAliveCountMax 0

Вы устанавливаете таймаут idle в секундах (300 секунд = 5 минутам). После того, как указанное время истечет, бездействующий пользователь будет "выброшен" из системы (читайте – отключен от системы). Подробности о том, как автоматически отключать пользователей BASH / TCSH / SSH, смотрите по следующей ссылке - how to automatically log BASH / TCSH / SSH users out.

№ 5: Запретите использование файлов .rhosts

Не разрешайте использовать файлы ~/.rhosts и ~/.shosts, имеющиеся у пользователя. Измените в файле sshd_config следующую настройку:

IgnoreRhosts yes

Сервер SSH может эмулировать поведение устаревшей команды rsh, так что запретите небезопасный доступ через RSH.

№ 6: Запретите кросс-хостинговую аутентификацию (Host-Based Authentication)

Для того, чтобы запретить кросс-хостинговую аутентификацию, впишите в файл sshd_config следующую опцию:

HostbasedAuthentication no

№ 7: Запретите доступ пользователя root через SSH

Нет необходимости получать по сети через ssh доступ с правами root. Обычные пользователи могут использовать команду su или sudo (рекомендуется) для получения доступа с правами уровня root. Также удостоверьтесь, что Вы получаете полную информацию о том, кто в системе запускал привилегированные команды с использованием sudo. Для того, чтобы запретить доступ пользователя root через SSH, измените в файле sshd_config следующую строку:

PermitRootLogin no

№ 8: Добавьте предупреждающий баннер

Задайте предупреждающий баннер, дополнив файл sshd_config следующей строкой:

Banner /etc/issue

Пример файла /etc/issue:

----------------------------------------------------------------------------------------------
You are accessing a XYZ Government (XYZG) Information System (IS) that is provided for authorized use only.
By using this IS (which includes any device attached to this IS), you consent to the following conditions:

+ The XYZG routinely intercepts and monitors communications on this IS for purposes including, but not limited to,
penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM),
law enforcement (LE), and counterintelligence (CI) investigations. 

+ At any time, the XYZG may inspect and seize data stored on this IS.

+ Communications using, or data stored on, this IS are not private, are subject to routine monitoring,
interception, and search, and may be disclosed or used for any XYZG authorized purpose.

+ This IS includes security measures (e.g., authentication and access controls) to protect XYZG interests--not
for your personal benefit or privacy.

+ Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching
or monitoring of the content of privileged communications, or work product, related to personal representation
or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work
product are private and confidential. See User Agreement for details.
----------------------------------------------------------------------------------------------

Выше приведен стандартный образец, обратитесь к юристу вашего предприятия для уточнения деталей пользовательского соглашения / официального уведомления.

№ 8: Сконфигурируйте в брандмауэре доступ SSH к порту 22

Вам необходимо осуществлять доступ к порту 22 через брандмауэр – для этого измените конфигурацию брандмауэра iptables или pf. Обычно сервер OpenSSH должен использоваться для доступа только из вашей локальной сети или с удаленных сайтов вашей распределенной сети.

Конфигурирование netfilter (Iptables)

Измените файл /etc/sysconfig/iptables (в Redhat и аналогичных системах). Для того, чтобы разрешить доступ только с адресов 192.168.1.0/24 и 202.54.1.5/29, введите следующее:

-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 202.54.1.5/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Если у вас двухстековый sshd с IPv6, отредактируйте файл edit /etc/sysconfig/ip6tables (в Redhat и аналогичных системах): введите следующее:

-A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT

Замените ipv6network::/ipv6mask фактическим диапазоном IPv6 адресов.

Конфигурирование брандмауэра *BSD PF

Если Вы используете брандмауэр PF, то измените файл /etc/pf.conf следующим образом:

pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port ssh flags S/SA synproxy state

№ 9: Измените порт SSH и укажите конкретные IP адреса

По умолчанию SSH слушает все интерфейсы и IP адреса, имеющиеся в системе. Ограничьте адреса доступа к ssh и измените порт ssh (по умолчанию скрипты, использующие метод грубой силы brute forcing, пытаются подключиться к порту 22) . Для того, чтобы ограничиться IP адресами 192.168.1.5 и 202.54.1.5 и выбрать порт 300, добавьте или измените следующие строки:

Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5

Лучший подход - это использовать скрипты активных сценариев, такие как fail2ban или denyhosts (смотрите ниже).

№ 10: Используйте сильные пароли

Нельзя переоценить, насколько важно использовать сильные пользовательские пароли или пароли для ваших ключей. Атака методом грубой силы работает, если Вы пользуетесь паролями, которые подбираются по словарю. Вы можете заставить пользователей не применять пароли, подбираемые по словарю. Используйте специальное средство john the ripper tool для поиска используемых слабых паролей. Ниже приведен пример генератора случайных паролей (поместите в ваш файл ~/.bashrc):

genpasswd() {
	local l=$1
       	[ "$l" == "" ] && l=20
      	tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}

Запустите генератор:

genpasswd 16

Вы получите следующий результат:

uw8CnDVMwC6vOKgW

№ 11: Используйте аутентификацию с применением открытого ключа

Используйте пару открытый / закрытый ключ с паролем, защищающим закрытый ключ. Используйте аутентификацию с использованием ключей RSA и DSA. Никогда не используйте доступ с ключом без пароля.

№ 12: Используйте аутентификацию с применением Keychain

Keychain – специальный скрипт bash, созданный для аутентификации по ключу, исключительно удобен и гибок. В нем применены различные способы обеспечения безопасности на основе ключей без пароля. Подробности настройки смотрите по ссылке keychain software.

№ 13: Разрешите пользователям доступ только к своим домашним директориям (Chroot SSHD)

По умолчанию пользователям разрешается просматривать директории сервера, такие как /etc/, /bin и другие. Вы можете защитить ssh с помощью имеющейся в ОС команды chroot, либо с помощью специального инструментария rssh. В реализациях OpenSSH 4.8p1 и 4.9p при ограничении пользовательского доступа только домашними директориями вам уже не потребуется применять такие инструменты, полученные от третьих лиц, как rssh или использовать сложную команду chroot(1). Смотрите этот пост, касающийся новой директивы ChrootDirectory, с помощью которой доступ пользователей ограничивается только их домашними директориями.

№ 14: Используйте TCP Wrapper-ы

TCP Wrapper является кросс-хостинговой сетевой системой ACL (листы контроля доступа), используемой для фильтрации доступа из сети в Интернет. OpenSSH поддерживает работу с TCP wrapper-ами. Для того, чтобы разрешить доступ через SSH только с адресов 192.168.1.2 172.16.23.12, просто измените ваш файл /etc/hosts.allow следующим образом:

sshd : 192.168.1.2 172.16.23.12 

Смотрите ссылку FAQ about setting and using TCP wrappers, в которой описывается настройка и использование TCP Wrapper-ов в Linux / Mac OS X и в UNIX-подобных операционных системах.

№ 15: Запретите доступ с "пустыми" паролями

Вы должны явно запретить удаленный доступ с использованием пустых паролей – дополните файл sshd_config следующей строкой:

PermitEmptyPasswords no

№ 16: Противодействуйте программам взлома SSH (атака методом грубой силы - Brute Force Attack)

Метод грубой силы является методом взлома криптографической схемы с помощью перебора большого количества вариантов, осуществляемого одним компьютером или распределенной сетью компьютеров. Для того, чтобы защитить SSH от атак вида brute force, используйте следующие программы:

  • DenyHosts – инструментарий на базе языка Python, обеспечивающий безопасность серверов SSH. Предназначен для предотвращения атак на сервера SSH методом brute force. Он отслеживает в регистрационных журналах неудавшиеся попытки доступа и блокирует IP адреса, с которых делались эти попытки.
  • Этот FAQ объясняет, как настроить DenyHosts в RHEL / Fedora и CentOS Linux
  • Fail2ban – аналогичная программа, которая предотвращает атаки вида brute force через SSH
  • security/sshguard-pf – защищает хосты с помощью pf от атак вида brute force через ssh и через другие сервисы.
  • security/sshguard-ipfw – защиет хосты с помощью ipfw от атак вида brute force через ssh и через другие сервисы.
  • security/sshguard-ipfilter – защищает хосты с помощью ipfilter от атак вида brute force через ssh и через другие сервисы
  • security/sshblock – блокирует атакующие попытки доступа через SSH.
  • security/sshit – выявляет атаки вида brute force на SSH/FTP и блокирует IP адреса.
  • BlockHosts автоматически блокирует адреса IP хостов, откуда делаются попытки проникновения.
  • Blacklist автоматически блокируются IP адреса тех хостов, откуда делаются попытки проникновения методом brute force.
  • Brute Force Detection модульный скрипт- оболочка для анализа журналов и проверки неудачных попыток аутентификации. Анализ делается согласно системе правил, в которых с помощью регулярных выражений записываются конкретные особенности каждого уникального формата аутентификации, используемого в прикладных программах.
  • IPQ BDB filter может рассматриваться как облегченная версия fail2ban.

№ 17: Ограничьте подключения к порту 22

Как в netfilter, так и в pf, имеется возможность ограничить прием запросов, поступающих на порт 22.

Пример Iptables

В следующем примере будут отвергаться запросы на подключение в случае, если в течение 60 секунд делалось более 5 попыток подключения к порту 22:

Вызывайте скрипт, описанный выше, из ваших скриптов iptables. Еще одна возможность конфигурирования:

Подробности смотрите в страницах man page для iptables.

Пример *BSD PF

В следующем скрипте максимальное число подключений от одного источника ограничивается 20-ю подключениями, а количество подключений за 5 секундный интервал времени ограничивается 15-ю подключениями. Если кто-нибудь нарушит эти правила, то будет добавлен в таблицу abusive_ips и все его дальнейшие попытки подключения будут блокированы. Благодаря тому, что указано ключевое слово flush, для хоста, который нарушил указанные ограничения, будут сброшены все ранее запомненные настройки, нарушений в которых не обнаружено.

№ 18: Используйте метод Port Knocking

Port knocking – метод открытия портов на брандмауэре извне с помощью генерации заранее заданной последовательности попыток подключения к закрытым портам. Как только будет получена правильная последовательность попыток подключения, правила работы брандмауэра динамически модифицируются, что позволит хосту, который посылал запросы на подключение, подключиться через конкретный порт (порты). Пример использования метода port Knocking для ssh с использованием iptables:

$IPT -N stage1
$IPT -A stage1 -m recent --remove --name knock
$IPT -A stage1 -p tcp --dport 3456 -m recent --set --name knock2
 
$IPT -N stage2
$IPT -A stage2 -m recent --remove --name knock2
$IPT -A stage2 -p tcp --dport 2345 -m recent --set --name heaven
 
$IPT -N door
$IPT -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2
$IPT -A door -m recent --rcheck --seconds 5 --name knock -j stage1
$IPT -A door -p tcp --dport 1234 -m recent --set --name knock
 
$IPT -A INPUT -m --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name heaven -j ACCEPT
$IPT -A INPUT -p tcp --syn -j doo

№ 19: Используйте анализатор журнала

Читайте свои журналы с помощью logwatch или logcheck. Эти инструменты облегчат вам анализ ваших журналов. С их помощью журналы будут просматриваться периодически и будут создаваться отчеты о том, что Вы пожелаете, и с той детализацией, с которой Вы пожелаете. Удостоверьтесь, что в файле sshd_config для LogLevel указано INFO или DEBUG:

LogLevel INFO

№ 20: Своевременно обновляйте OpenSSH и операционные системы

Рекомендуется, чтобы Вы использовали такие инструменты, как yum, apt-get, freebsd-update и другие, для добавления последних патчей безопасности и поддержания системы в обновленном состоянии.

Другие возможности

Для того, чтобы скрыть идентификацию версии openssh, вам нужно изменить исходный код и заново откомпилировать openssh. Убедитесь, что в sshd_config включены следующие опции:

#  Turn on privilege separation – Включите разделение привелегий
UsePrivilegeSeparation yes
# Prevent the use of insecure home directory and key file permissions 
# Запретите использование небезопасных прав доступа к домашнему директорию и к файлам
StrictModes yes
# Turn on  reverse name checking – Включите обратную проверку имени
VerifyReverseMapping yes
# Do you need port forwarding? - Вам нужно перенаправление портов?
AllowTcpForwarding no
X11Forwarding no
#  Specifies whether password authentication is allowed.  The default is yes.
# Укажите, допускается ли аутентификация по паролю. По умолчанию - допускается 
PasswordAuthentication no

Проверьте изменения, сделанные в вашем файле sshd_config перед тем, как выполнить перезапуск / перезагрузку:

Усильте безопасность использования SSH за счет двухуровневой или трехуровневой (или более) аутентификации.

Ссылки:

  1. Официальный проект OpenSSH.
  2. Форум: Неудачные попытки доступа через SSH и как избежать атак на SSH методом грубой силы.
  3. Страницы man pages с описанием sshd_config, ssh_config, tcpd, yum и apt-get.