Пошаговое руководство по настройке безопасной аутентификации по SSH-ключам

Настройте безопасную аутентификацию по SSH-ключам с использованием ключей ED25519, authorized_keys, ssh-agent и более безопасных параметров sshd.

Пошаговое руководство по настройке безопасной аутентификации по SSH-ключам

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

Это руководство проведет вас через генерацию ключей ED25519, установку открытого ключа, тестирование входа и более безопасные настройки демона SSH.

Понимание аутентификации по SSH-ключам

Аутентификация по SSH-ключам основана на паре криптографически связанных ключей: закрытый ключ и открытый ключ.

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

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

Шаг 1: Генерация пары SSH-ключей

Утилита ssh-keygen используется для создания новых пар SSH-ключей. Рекомендуется использовать современные, надежные алгоритмы, такие как ED25519.

Выберите тип и длину ключа

Хотя ключи RSA все еще широко используются, ED25519 обеспечивает отличную безопасность с более короткой длиной ключа и более быстрыми операциями. Для новых установок обычно предпочитают ED25519.

Сгенерируйте пару ключей

На вашем локальном компьютере (клиенте) откройте терминал и выполните следующую команду:

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519: Указывает тип ключа ED25519.
  • -C "[email protected]": Добавляет комментарий к открытому ключу, часто используемый для идентификации. Замените на ваш фактический адрес электронной почты или описательную метку.

Команда запросит у вас место для сохранения ключа и необязательную парольную фразу.

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/youruser/.ssh/id_ed25519
Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub
The key fingerprint is: SHA256:...
The key's randomart image is: ...

Установите надежную парольную фразу (настоятельно рекомендуется)

При запросе всегда устанавливайте надежную парольную фразу для вашего закрытого ключа. Эта парольная фраза шифрует ваш закрытый ключ на локальном компьютере, обеспечивая дополнительный уровень безопасности. Если ваш закрытый ключ когда-либо попадет в чужие руки, он будет бесполезен без парольной фразы. Вы можете использовать ssh-agent, чтобы избежать повторного ввода парольной фразы (см. Шаг 4).

Расположение файлов ключей

По умолчанию ssh-keygen сохраняет ваш закрытый ключ в ~/.ssh/id_ed25519, а открытый ключ в ~/.ssh/id_ed25519.pub.

Права доступа к вашему закрытому ключу

Крайне важно, чтобы файл вашего закрытого ключа имел очень строгие права доступа. Только владелец должен иметь возможность его читать. ssh-keygen обычно устанавливает это правильно, но полезно проверить:

chmod 600 ~/.ssh/id_ed25519

Шаг 2: Распространение вашего открытого ключа на сервер

После того как вы сгенерировали пару ключей, ваш открытый ключ необходимо скопировать на удаленный сервер, к которому вы хотите получить доступ. Он должен быть помещен в файл с именем authorized_keys в каталоге ~/.ssh/ вашего пользователя на удаленном сервере.

Метод 1: Использование ssh-copy-id (рекомендуется)

ssh-copy-id — это самый простой и безопасный метод. Он входит на удаленный сервер (используя ваш пароль), создает каталог ~/.ssh, если его нет, устанавливает правильные права доступа и добавляет ваш открытый ключ в ~/.ssh/authorized_keys.

ssh-copy-id user@your_server_ip

Замените user на ваше имя пользователя на удаленном сервере, а your_server_ip на IP-адрес или имя хоста сервера. Вас попросят ввести пароль на удаленном сервере.

Метод 2: Ручное копирование

Если ssh-copy-id недоступен, вы можете скопировать открытый ключ вручную.

  1. Скопируйте содержимое открытого ключа с вашего локального компьютера:

    cat ~/.ssh/id_ed25519.pub
    

    Скопируйте весь вывод в буфер обмена (он начинается с ssh-ed25519 ...).

  2. Войдите на удаленный сервер, используя ваш пароль:

    ssh user@your_server_ip
    
  3. Создайте каталог ~/.ssh, если его нет, и установите права доступа:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  4. Добавьте ваш открытый ключ в authorized_keys:

    echo "PASTE_YOUR_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
    

    Убедитесь, что вы заменили PASTE_YOUR_PUBLIC_KEY_HERE на фактическое скопированное содержимое. Использование >> (добавление) важно, чтобы не перезаписать существующие ключи, если они есть.

  5. Установите правильные права доступа для authorized_keys:

    chmod 600 ~/.ssh/authorized_keys
    
    • Предупреждение: Неправильные права доступа к ~/.ssh или ~/.ssh/authorized_keys помешают работе аутентификации по ключу.

Шаг 3: Проверьте вашу аутентификацию по SSH-ключу

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

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

ssh user@your_server_ip
  • Если вы установили парольную фразу для вашего закрытого ключа, вас попросят ее ввести.
  • Если подключение прошло успешно без запроса пароля (после парольной фразы, если применимо), ваша аутентификация по ключу работает. Вы должны увидеть приглашение удаленного сервера.

НЕ переходите к Шагу 4, если вы не можете войти, используя ваш SSH-ключ. Устраните любые проблемы перед отключением аутентификации по паролю, иначе вы рискуете заблокировать себя на сервере.

Шаг 4: Повышение безопасности — отключение аутентификации по паролю

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

  1. Войдите на ваш удаленный сервер, используя ваш SSH-ключ.

    ssh user@your_server_ip
    
  2. Отредактируйте файл конфигурации демона SSH. Этот файл обычно находится по адресу /etc/ssh/sshd_config.

    sudo nano /etc/ssh/sshd_config
    

    (Вы можете использовать vi или ваш предпочитаемый текстовый редактор вместо nano.)

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

    • Найдите PasswordAuthentication и измените его значение на no.

      #PasswordAuthentication yes
      PasswordAuthentication no
      

      (Раскомментируйте строку, если она закомментирована с помощью #)

    • Найдите KbdInteractiveAuthentication и измените его значение на no. В более старых версиях OpenSSH эквивалентной директивой может быть ChallengeResponseAuthentication.

      KbdInteractiveAuthentication no
      
    • (Необязательно, но рекомендуется) Рассмотрите возможность отключения прямого входа root через SSH, если вы планируете использовать sudo после входа в систему как обычный пользователь.

      PermitRootLogin no
      
    • (Необязательно) Рассмотрите возможность изменения порта SSH по умолчанию с 22 на нестандартный высокий порт (например, 2222). Это не добавляет безопасности против целевых атак, но может уменьшить шум от автоматических сканеров портов.

      #Port 22
      Port 2222
      

      Если вы измените порт, не забудьте указать его с флагом -p при подключении (например, ssh -p 2222 user@your_server_ip).

  4. Сохраните изменения и выйдите из текстового редактора.

  5. Перезапустите службу SSH, чтобы применить новую конфигурацию. Команда немного отличается в зависимости от вашей операционной системы (например, Ubuntu/Debian против CentOS/RHEL).

    • Системы на основе Systemd (большинство современных дистрибутивов Linux):

      sudo sshd -t
      sudo systemctl restart sshd
      
    • Старые системы на основе SysVinit:

      sudo service ssh restart
      
  6. Крайне важно: откройте новое окно терминала (не закрывайте текущую активную SSH-сессию!) и попробуйте войти, используя ваш ключ. Это проверяет новую конфигурацию без риска заблокировать себя, если что-то пошло не так.

    ssh user@your_server_ip
    

    Если вы изменили порт:

    ssh -p 2222 user@your_server_ip
    

    Если подключение прошло успешно, теперь вы можете безопасно закрыть вашу исходную SSH-сессию.

    Если новый вход не удался, немедленно отмените изменения в sshd_config в вашей исходной, все еще активной SSH-сессии и снова перезапустите службу SSH, затем перепроверьте.

Лучшие практики и советы

  • Всегда используйте надежную парольную фразу для вашего закрытого ключа. Это ваша последняя линия защиты, если ваш закрытый ключ будет скомпрометирован.
  • Защищайте ваш закрытый ключ. Никогда не передавайте его и убедитесь, что он хранится в безопасности со строгими правами доступа к файлам (chmod 600 ~/.ssh/id_ed25519). Рассмотрите возможность использования аппаратных модулей безопасности (HSM) или YubiKey для максимальной защиты.
  • Используйте ssh-agent для удобства. ssh-agent позволяет загрузить ваш(и) закрытый(е) ключ(и) в память и вводить парольную фразу только один раз за сессию, даже при нескольких SSH-подключениях. Добавьте ваш ключ в агент с помощью ssh-add ~/.ssh/id_ed25519.
  • Регулярно меняйте ваши SSH-ключи. Периодически генерируйте новые пары ключей и удаляйте старые открытые ключи с ваших серверов, особенно если член команды уходит или есть подозрения, что безопасность ключа скомпрометирована.
  • Ограничьте PermitRootLogin до no или prohibit-password. Обычно лучше входить как обычный пользователь и использовать sudo для административных задач.
  • Настройте брандмауэр. Убедитесь, что только необходимые порты (например, ваш SSH-порт) открыты в интернет. Такие инструменты, как ufw или firewalld, могут помочь.

Заключительный вывод

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