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_keys – список открытых ключей (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: