Усиление безопасности SSH в OpenSSH

Beginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь основным методам повышения безопасности SSH в OpenSSH с помощью аутентификации по ключу и усиления конфигурации. Вы научитесь заменять аутентификацию по паролю на безопасную аутентификацию с использованием пар ключей, отключать доступ под учетной записью root и изменять стандартные порты, чтобы предотвратить брутфорс-атаки.

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


Skills Graph

Установка OpenSSH

На этом этапе вы установите пакет сервера OpenSSH на виртуальную машину (VM) LabEx. OpenSSH (Open Secure Shell) представляет собой бесплатную и открытый исходный код реализацию протокола SSH, которая обеспечивает безопасную зашифрованную связь между двумя недоверенными хостами по небезопасной сети. Это стандартный инструмент для удаленного администрирования серверов и безопасного передачи файлов.

Прежде чем приступить, важно понять, что SSH работает по клиент-серверной модели. Сервер (который мы сейчас устанавливаем) ожидает входящих подключений, а клиенты (например, терминал на вашем локальном компьютере) подключаются к нему. Вся связь шифруется, что обеспечивает защиту ваших учетных данных и данных.

Поскольку виртуальная машина LabEx использует контейнеры Docker, в которых команда systemctl недоступна (контейнеры Docker обычно запускают один процесс, а не полноценную операционную систему), мы будем использовать команду service для управления демоном SSH. Это более простой альтернативный вариант systemctl, который хорошо работает в контейнеризованных средах.

Следуйте этим шагам для установки OpenSSH:

  1. Сначала обновите список пакетов, чтобы убедиться, что вы получите последнюю версию. Это извлекает самую свежую информацию о пакетах из репозиториев Ubuntu:

    sudo apt update
  2. Установите пакет сервера OpenSSH. Флаг -y автоматически подтверждает все запросы во время установки:

    sudo apt install -y openssh-server
  3. После установки проверьте, запущен ли сервис SSH. Команда status показывает, активен ли сервис и ожидает ли он входящих подключений:

    service ssh status

    Вы должны увидеть вывод, указывающий, что сервис активен (запущен). Если он не запущен, мы запустим его на следующем шаге.

  4. Если сервис не запущен (что будет отображаться как "inactive" в выводе статуса), запустите его вручную:

    service ssh start
  5. Проверьте, прослушивает ли SSH на стандартном порту (22). Команда netstat показывает сетевые подключения и прослушиваемые порты, а grep фильтрует записи, связанные с SSH:

    sudo netstat -tulnp | grep sshd

    Вы должны увидеть вывод, аналогичный следующему, показывающий, что SSH прослушивает все сетевые интерфейсы (0.0.0.0) на порту 22:

    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -

Настройка аутентификации по ключу

На этом этапе вы настроите аутентификацию по ключу SSH, которая обеспечивает более высокий уровень безопасности, чем традиционная аутентификация по паролю. В отличие от паролей, которые могут быть подобраны или взломаны методом перебора, аутентификация по ключу использует пару криптографических ключей: один приватный (должен быть секретным) и один публичный (должен быть передан на серверы).

Когда вы подключаетесь к серверу SSH, он использует математические алгоритмы для проверки того, что у вас есть приватный ключ, соответствующий публичному ключу, который он имеет в файле. Этот метод более безопасен и удобен после настройки.

Давайте создадим и настроим эти ключи пошагово:

  1. Сначала сгенерируем новую пару ключей SSH. Эта команда создает два файла в вашей директории ~/.ssh:

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/labex_key -N ""
    • -t rsa задает тип ключа (алгоритм RSA)
    • -b 4096 создает надежный 4096-битный ключ
    • -f задает имя файла для пары ключей
    • -N "" означает отсутствие парольной фразы (для упрощения лабораторной работы)

    Теперь у вас будут:

    • Приватный ключ: ~/.ssh/labex_key (никогда не передавайте его!)
    • Публичный ключ: ~/.ssh/labex_key.pub (этот ключ передается на серверы)
  2. Правильные права доступа к файлам являются важной частью безопасности SSH. Эти команды обеспечивают доступ к ключам только для вас:

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/labex_key
    chmod 644 ~/.ssh/labex_key.pub
  3. Теперь мы авторизуем ваш ключ, добавив публичный ключ в специальный файл authorized_keys, который проверяет SSH:

    cat ~/.ssh/labex_key.pub >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
  4. Далее настроим сам сервер SSH. Отредактируем основной файл конфигурации:

    sudo nano /etc/ssh/sshd_config

    Найдите и измените следующие важные настройки:

    PubkeyAuthentication yes
    PasswordAuthentication no

    Это сообщает SSH:

    • Разрешить аутентификацию по ключу (по умолчанию включено, но полезно проверить)
    • Отключить вход по паролю (только доступ по ключу)
  5. После изменения конфигурации всегда перезапустите службу SSH:

    service ssh restart
  6. Наконец, проверим, что все работает. Попробуйте подключиться к своему собственному компьютеру (localhost) с использованием нового ключа:

    ssh -i ~/.ssh/labex_key localhost

    Флаг -i указывает, какой приватный ключ использовать. Если все прошло успешно, вы сразу войдете в систему без запроса пароля - это подтверждает, что аутентификация по ключу работает правильно.

Отключение входа от имени root

На этом этапе мы отключим прямой вход от имени root через SSH. Это важно, так как учетная запись root имеет полные привилегии системы, что делает ее главным мишенью для хакеров. Отключив вход от имени root, мы заставляем атакующих угадать как имя пользователя, так и пароль, что значительно усложняет атаки методом перебора.

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

Давайте изменим конфигурацию SSH:

  1. Сначала откройте основной файл конфигурации SSH с помощью текстового редактора. Здесь мы будем использовать nano, но вы можете использовать любой редактор, с которым вы чувствуете себя комфортно:

    sudo nano /etc/ssh/sshd_config
  2. Найдите строку, которая содержит PermitRootLogin (обычно около строки 32). Если вы не можете найти ее, вам нужно добавить ее. Измените или добавьте следующую строку:

    PermitRootLogin no
  3. Пока мы редактируем этот файл, давайте установим дополнительные параметры безопасности, которые хорошо сочетаются с этим изменением:

    StrictModes yes
    MaxAuthTries 3
    LoginGraceTime 60
    • StrictModes проверяет права доступа к файлам для обеспечения безопасности
    • MaxAuthTries ограничивает количество неудачных попыток входа
    • LoginGraceTime устанавливает время, в течение которого можно выполнить вход
  4. Сохраните изменения в nano, нажав:

    • Ctrl+O для записи
    • Enter для подтверждения
    • Ctrl+X для выхода
  5. Чтобы изменения вступили в силу, перезапустите службу SSH:

    service ssh restart
  6. Давайте проверим, что наши изменения сработали, попробовав войти в систему по SSH от имени root (должно завершиться неудачей):

    ssh root@localhost

    Вы должны увидеть ошибку типа "Permission denied (publickey)", что означает, что наша мера безопасности работает правильно. С этого момента вам нужно будет использовать обычную учетную запись пользователя для входа.

Изменение порта по умолчанию

На этом этапе мы изменим порт SSH по умолчанию с 22 на пользовательский порт (в нашем примере это 2222). Это важная мера безопасности, так как многие автоматические боты и атакующие сканируют стандартный порт 22 на наличие SSH - серверов. Изменив на нестандартный порт, мы делаем наш сервер менее видимым для этих автоматических сканирований.

Перед внесением каких - либо изменений сначала проверим текущую конфигурацию порта SSH. Это поможет нам понять существующую настройку:

sudo grep -i port /etc/ssh/sshd_config

Обычно в выводе вы увидите #Port 22. Символ # означает, что эта строка закомментирована, поэтому SSH в настоящее время использует порт по умолчанию 22.

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

sudo nano /etc/ssh/sshd_config

Внутри файла найдите строку, содержащую #Port 22. Здесь нам нужно внести два изменения:

  1. Удалить символ #, чтобы раскомментировать строку (это активирует настройку).
  2. Изменить номер порта с 22 на 2222.

Измененная строка должна выглядеть следующим образом:

Port 2222

После внесения этого изменения сохраните файл в nano, нажав:

  1. Ctrl+O (для записи файла).
  2. Enter (для подтверждения имени файла).
  3. Ctrl+X (для выхода из редактора).

Для того чтобы изменения вступили в силу, нам нужно перезапустить службу SSH:

service ssh restart

Проверим, что SSH теперь прослушивает наш новый порт (2222), а не порт по умолчанию:

sudo netstat -tulnp | grep ssh

В выводе должно быть указано, что SSH прослушивает порт 2222. Если вы по - прежнему видите порт 22, проверьте изменения в файле конфигурации еще раз.

Наконец, протестируйте новую конфигурацию, подключившись к SSH с использованием пользовательского порта. Обратите внимание, что теперь нам нужно указать порт с помощью флага -p:

ssh -p 2222 -i ~/.ssh/labex_key localhost

После успешного подключения вы можете выйти из сеанса SSH, нажав Ctrl+D. Помните, что с этого момента вам всегда нужно будет указывать этот пользовательский порт при подключении к вашему SSH - серверу.

Тестирование усиленной настройки

На этом последнем этапе мы проверим все меры по усилению безопасности, которые вы реализовали. Тестирование является важнейшим этапом для того, чтобы убедиться, что ваш SSH - сервер правильно настроен и безопасен. Мы проверим как настройки на стороне сервера, так и попытки подключения на стороне клиента.

Начнем с проверки текущей конфигурации SSH на вашем сервере. Это подтвердит, что изменения, которые вы внесли ранее, активны:

  1. Сначала проверьте все текущие настройки SSH:

    sudo sshd -T | grep -E 'port|permitrootlogin|passwordauthentication|pubkeyauthentication'

    Команда sshd -T отображает фактическую конфигурацию во время выполнения. Мы фильтруем важные параметры безопасности. Вы должны увидеть:

    port 2222
    permitrootlogin no
    passwordauthentication no
    pubkeyauthentication yes

    Этот вывод подтверждает, что SSH работает на порту 2222, вход от имени root отключен, аутентификация по паролю отключена, а аутентификация по публичному ключу включена.

Теперь давайте протестируем подключения с точки зрения клиента:

  1. Протестируйте успешное подключение с использованием аутентификации по ключу:

    ssh -p 2222 -i ~/.ssh/labex_key localhost "echo 'Key auth successful'"

    Эта команда пытается подключиться с использованием вашего приватного ключа (флаг -i указывает на файл ключа). Если подключение успешно, на сервере выполняется простая команда echo. Вы должны увидеть:

    Key auth successful
  2. Протестируйте неудачную попытку входа от имени root:

    ssh -p 2222 root@localhost 2>&1 | grep -i "permission denied"

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

  3. Протестируйте неудачную попытку аутентификации по паролю:

    ssh -p 2222 -o PreferredAuthentications=password -o PubkeyAuthentication=no localhost 2>&1 | grep -i "permission denied"

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

Наконец, давайте проверим сетевое состояние сервера:

  1. Проверьте активные SSH - подключения:

    sudo netstat -tulnp | grep 2222

    Эта команда показывает все прослушиваемые порты, отфильтрованные по нашему пользовательскому порту SSH (2222). Вы должны увидеть, что sshd находится в списке прослушивающих на этом порту.

  2. Проверьте статус службы SSH:

    service ssh status

    Это подтверждает, что служба SSH работает корректно. В выводе должно быть указано, что служба активна.

Резюме

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

Вы также изучили важные методы усиления безопасности, такие как отключение входа от имени root и изменение порта SSH по умолчанию. Эти меры эффективно снижают уязвимость системы к атакам методом перебора паролей и автоматизированным сканированием, сохраняя при этом функциональность системы.