Linux. Авторизация по SSH ключу. Приватный и публичный SSH ключ.

28.01.2020 Софт

SSH или Secure Shell - это зашифрованный протокол, который часто используется для взаимодействия и удаленного управления серверами. Если вы захотите что-либо сделать на удаленном сервере, скорее всего, вам придется воспользоваться SSH и работать через терминал.

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

Как работает протокол SSH

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

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

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

Проверка подлинности ключей

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

Как создать ключи SSH?

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

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

Сгенерим ключ через команду:

$ ssh-keygen -t rsa

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

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

В результате будет создано два файла: ~/.ssh/id_rsa и ~/.ssh/id_rsa.pub

Первый файл id_rsa (это приватный ключ) всегда нужно хранить в секрете. Второй файл id_rsa.pub (это публичный ключ) нужно добавить на удалённый компьютер, где запущен сервер SSH.

Добавление публичного ключа на удаленный сервер

На удалённой машине нам нужно создать каталог .ssh. Далее нам нужно скопировать содержимое файла публичного ключа id_rsa.pub на удалённую машину в файл ~/.ssh/authorized_keys.

Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям, иначе SSH его не примет.

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

Теперь можно выполнять подключение с помощью клиента SSH на удаленный сервер. Для это выполним команду:

ssh username@remote_host

Первый раз, когда вы заходите на сервер,SSH вас спрашивает, доверяете ли вы ключу. Если отвечаете нет, соединение закрывается. Если да — ключ сохраняется в файл ~/.ssh/known_hosts. Узнать, где какой ключ нельзя (ибо считается что это небезопасно).

Если ключ сервера поменялся (например, сервер переустановили), SSH вопит от подделке ключа. Обратите внимание, если сервер не трогали, а SSH вопит, значит вы не на тот сервер ломитесь (например, в сети появился ещё один компьютер с тем же IP, особо этим страдают всякие локальные сети с 192.168.1.1, которых в мире несколько миллионов). 

  • Ключ сервера хранится в /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_rsa_key.pub. Их можно:
    скопировать со старого сервера на новый.
  • сгенерировать с помощью ssh-keygen. Пароля при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет.

Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key.

Как получить публичный SSH-ключ из приватного

Чтобы из файла с закрытым SSH-ключем сгенерировать и вывести на экран открытый ключ, воспользуйтесь следующей командой:

$ ssh-keygen -y -f <keyfile>

В качестве примера сгенерируем открытый SSH-ключ из закрытого ключа ~/.ssh/id_rsa и сохраним его в файл ~/.ssh/id_rsa.pub:

$ ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

Как отключить проверку (требование) пароля при авторизации по SSH

Если пароль больше не будет использоваться, то для увеличения безопасности системы лучше его вовсе отключить. Но убедитесь, что ключ надежно сохранен и вы его не потеряете, потому что по паролю вы больше не войдете. Авторизуйтесь на сервере, затем откройте конфигурационный файл /etc/ssh/sshd_config и найдите там директиву PasswordAuthenticatin. Нужно установить ее значение в No:

$ sudo vi /etc/ssh/sshd_config

PasswordAuthentication no

Теперь сохраните файл и перезапустите службу ssh:

$ sudo service ssh restart

Дальше будет возможно только подключение по ключу ssh, пароль не будет приниматься.

Еще по теме

Онлайн справочник по командам linux с примерами