SSH авторизация по ключам. PuTTy

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

Была цель — упросить авторизацию на сервер используя на windows машине клиент PuTTy. Но, как оказалось, не все так просто и прозрачно. Поискав в интернете инструкции я не нашел ни одной, в которой мне объяснили почему при генерации ключей через PuTTy-gen не получется подключится к linux серверу.

Есть несколько варинатов. Подключение  с linux на linux и с windows на linux (используя PuTTy). И  два метода генерации ключей — на linux машине, используя openssh и через PuTTy Key Generator.
Все необходимые программы можно скачать https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html (либо нужный архив целиком)

Немножко теории — приватные и публичные ключи RSA

Для успешной авторизации по ключам, необходимо иметь публичный ключ и приватный ключ. Все ключи на linux машине хранятся в домашнем каталоге пользователя, в папке .ssh «/home/user/.ssh/».

На сервере хранится публичный ключ. Этот ключ имеет запись одной строкой вида
«ssh-rsa AAAABG.. ..+qxQ== rsa-key-20180322»
По умолчанию ключи хранятся в файле authorized_keys. В этом файле могут хранится сразу несколько ключей, просто записываются каждый на строку.
Название файла можно поменять, но тогда нужно это явно указать в конфигурационном файле SSH сервера — /etc/ssh/sshd_config (нужна перезагрузка sshd).
«AuthorizedKeysFile         %h/.ssh/authorized_keys»

На клиенте (linux) хранится приватный ключ. Ключ имеет запись вида
——BEGIN RSA PRIVATE KEY——
MIIEoQIBAAKCAQEAjIDrQgbCcRXrGms9kHutJhU6+kopZ1IRca8WalZ/jLr6tyjs
….
….
Hp5ygfYqspTYzGIqsPvYYPMlyg7Jrx8hiEwbbz4Ohpqq6hgvVQ==
——END RSA PRIVATE KEY——

В отличии от публичного ключа, каждый приватный ключ это отдельный файл. При подключении к серверу, клиент ssh проверяет в папке .ssh наличие такого ключа. Название по умолчанию должно быть id_rsa. Если задано другое название или ключ лежит в другой директории, то это нужно указать: ssh user@example.com -i /home/user2/id_rsa2.

Важно, права на ключ id_rsa должны быть выставлены 600 (rw——-)

При использовании клиента PuTTy, приватный ключ может иметь любое название его нужно указывать при подключении к серверу. Либо использовать агент Pageant.

Вариант первый: генерируем ключи на linux.

Тут все просто, поможет нам утилита ssh-keygen. Неважно где создавать ключи. Но для примера сделаем это на сервере.

Запускаем утлиту ssh-keygen

Программа спросит куда сохранить ключи и предложит задать пароль. Смело нажимаем два раза enter и получем результат.
Теперь у нас есть два ключа, которые были сохранены в директорию .ssh: id_rsa — приватный ключ и id_rsa.pub — публичный ключ.
Ключи выглядят в виде текста. По этому их можно легко скопировать и вставить в нужный файл.

Заходим в папку .ssh.
На сервере выполняем cat id_rsa.pub > authorized_keys — так мы запишем наш ключ в нужный файл
На сторону клиента можно скопировать текст ключа id_rsa. Меняем файлу права chmod -c 0600 id_rsa. 

Теперь заходим на удаленный сервер уже без пароля.

Следующий шаг — авторизация на сервер с помощью программы PuTTy

Копируем содержимое ключа id_rsa, вставляем куда-нибудь в блокнотик и сохраняем без расширения.
Открываем программу PuTTy Key Generator и загружаем наш ключ кнопкой «Load»

Далее открываем клиент PuTTy. Как обычно в главном окне указываем куда подключаемся, а с левой стороны выбираем «Connection -> Auth», в окошке выбираем наш ключ.

Подключаемся, видим предупреждение и подтверждаем «Yes»

И мы попадаем на сервер без пароля

 

Вариант второй: генерируем ключи через программу PuTTy Key Generator

Открываем программу, ничего не меняем и не выбираем, нажимаем кнопку «Generate»

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

А вот для клиента, то есть приватный ключ мы можем сохранить двумя путями
1) Нажав на кнопку сохранить, мы сохраним ключ в формате PuTTy, и пользоваться можем только это программой.
2) Для клиента в linux мы должны экспортировать ключ в старый формат pem. Converisons -> Export OpenSSH key. Этот ключ мы должны разместить в папке .ssh с названием id_rsa, не забыв поменять права на 600.

 

В комплекте с архивом PuTTy, на который указал ссылку в самом начале, есть утилита Pageant — агент для авторизации SSH, некий менеджер приватных ключей.
С ее помощью не нужно указывать каждый раз ключ.

Теперь, когда организован доступ по ключам, можно поменять пароль пользователя на что-нибудь вида 022c1e7bd6959f2a0d8e10868976e657 и не думать о нем. Либо, для надежности можно вообще убрать авторизацию по паролю в конфиг файле /etc/ssh/sshd_config, раскомментировав строку #UseLogin no