База знаний по Open Source
Yandex поиск по всему сайту
Авторизация

OpenSSH – советы по безопасности

OpenSSH – это свободная реализация протокола SSH с открытым исходным кодом. OpenSSH рекомендуется для удаленного входа в систему, создания резервных копий, удаленной передачи файлов через scp или sftp и многого другого.

SSH идеально подходит для сохранения конфиденциальности и целостности данных, которыми обмениваются две сети и системы.

Тем не менее, основным преимуществом является аутентификация сервера с использованием криптографии с открытым ключом.

Время от времени ходят слухи об использовании OpenSSH нулевого дня. На этой странице показано, как обезопасить ваш сервер OpenSSH, работающий в Linux или Unix-подобной системе, для повышения безопасности sshd.

Здесь будет использовано в качестве примера имя пользователя vivek.

Умолчания OpenSSH:

  • Порт TCP – 22
  • Файл конфигурации сервера OpenSSH – sshd_config (находится в /etc/ssh /)

1. Используйте SSH логин на основе открытого ключа

Сервер OpenSSH поддерживает различные методы аутентификации. Рекомендуется использовать аутентификацию на основе открытого ключа. Сначала создайте пару ключей с помощью следующей команды ssh-keygen на локальном компьютере / ноутбуке:

DSA и RSA 1024-битные ssh-ключи считаются слабыми. Не используйте их. Ключи RSA выбираются вместо ключей ECDSA, когда обратная совместимость связана с клиентами ssh. Все ssh-ключи должны быть либо ED25519, либо RSA 4096. Не используйте любой другой тип.

$ ssh-keygen -t key_type -b bits -C "комментарий"
$ ssh-keygen -t ed25519 -C "Вход в производственный кластер в xyz corp"
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_aws _ $ (дата +% Y-% m-% d) -C "Ключ AWS для клиентов abc corp"

Затем установите открытый ключ с помощью команды ssh-copy-id:

$ ssh-copy-id -i /path/to public-key-file user@host
$ ssh-copy-id user@remote-server-ip-or-dns-name
$ ssh-copy-id vivek@server

Убедитесь, что логин на основе ssh-ключа работает:

$ ssh vivek@server

Подробнее об аутентификации на основе открытого ключа можно прочитать здесь.

2. Отключите вход пользователя root<

Прежде чем мы отключим вход в систему от имени пользователя root, убедитесь, что обычный пользователь может войти в систему как пользователь root. Например, разрешите пользователю vivek войти в систему как пользователь root с помощью команды sudo.

Добавить пользователя vivek в группу sudo:

$ sudo adduser vivek sudo

Проверьте членство в группе с помощью команды id

$ id vivek

Подробнее о добавлении пользователя в группу sudo можно прочитать здесь.

Проверьте, что пользователь vivek может войти в систему как root или выполнить команду как root:

sudo -i
$ sudo /etc/init.d/sshd status
$ sudo systemctl status sshd

После подтверждения отключите root-вход, добавив или исправив следующие строки в sshd_config:

PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

3. Отключить вход на основе пароля

Все логины на основе пароля должны быть отключены. Разрешены только логины на основе открытого ключа. Добавьте/раскомментируйте следующее в ваш файл sshd_config:

AuthenticationMethods publickey
PubkeyAuthentication yes

4. Ограничить доступ пользователей ssh

По умолчанию все пользователи системы могут войти через SSH, используя свой пароль или открытый ключ. Иногда вы создаете учетную запись пользователя UNIX / Linux для FTP или электронной почты. Однако эти пользователи могут войти в систему с помощью ssh. У них будет полный доступ к системным инструментам, включая компиляторы и языки сценариев, такие как Perl, Python, которые могут открывать сетевые порты и делать много других интересных вещей.

Разрешить только пользователю root, vivek и jerry использовать систему через SSH, добавьте следующее в sshd_config:

AllowUsers vivek jerry

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

DenyUsers root novivek nojerry

5. Отключить пустые пароли

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

PermitEmptyPasswords no

6. Используйте надежные пароли и парольную фразу для пользователей/ключей ssh

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

Вы можете заставить пользователей избегать паролей против атаки по словарю и использовать утилиту Джона Риппера для обнаружения существующих слабых паролей. Вот пример генератора случайных паролей (поместите в ваш ~/.bashrc):

genpasswd () {
местный l = $ 1
        ["$ l" == ""] && l = 20
       tr-dc A-Za-z0-9_ </ dev / urandom | head -c $ {l} | xargs
}

Запустить его:

genpasswd 16

Выход – пароль из 16 символов:

uw8CnDVMwC6vOKgW

7. Измените порт SSH и ограничьте привязку IP

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

Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5

Более эффективный подход к использованию сценариев с упреждающими подходами, таких как fail2ban или denyhosts, когда требуется принять соединение с динамического IP-адреса в глобальной сети.

8. Используйте TCP-Wrapper (необязательно)

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

sshd: 192.168.1.2 172.16.23.12

9. Настройте интервал ожидания выхода из режима ожидания

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

ClientAliveInterval 300
ClientAliveCountMax 0

Вы устанавливаете интервал простоя в секундах (300 секунд == 5 минут). После того, как этот интервал прошел,  пользователь будет автоматически “выгнан” (как вышедший из системы).

10. Отключить файлы .rhosts

Запретите пользовательские файлы ~/.rhosts и ~/.shosts. Обновите sshd_config со следующими настройками:

IgnoreRhosts yes

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

11. Отключите аутентификацию на основе хоста

Чтобы отключить аутентификацию на основе хоста, обновите sshd_config следующим параметром:

HostbasedAuthentication no

12. Постоянно обновляйте OpenSSH и операционные системы

Рекомендуется использовать такие инструменты как apt-get, чтобы устанавливать последние обновления безопасности.

13. Отключите сервер OpenSSH на клиентском компьютере

Рабочие станции и ноутбук могут работать без сервера OpenSSH. Если вы не предоставляете возможности удаленного входа в систему и передачи файлов по SSH, отключите и удалите сервер SSHD.

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

$ sudo apt-get remove openssh-server

Вольный и сокращенный перевод этой статьи(англ.)