Работа с ssh-ключами
Что такое ssh-ключ
Как следует из названия — это ключ для ssh, т.е. используется программой ssh (или другим ssh-клиентом, в дальнейшем так и будем говорить:
ssh-клиент) для авторизации на удаленном сервере через демон/сервис sshd (будем называть этот сервер
ssh-сервером)
Если вы попали на эту страницу, значит в дальнейшем Вы таким способом будете (или от Вас требуют) авторизоваться (т.е. доказать, что это именно Вы) на каком-то unix-подобном сервере.
Это может быть нужно:
Важно то, что для всего этого достаточно
одного ключа,
не требуется каждый раз создавать новый ключ.
Еще одним важным свойством является то, что ключ состоит из двух частей:
- публичная часть ключа (или публичный ключ)
- приватная/закрытая часть ключа (или закрытый ключ)
Устройство их аналогично устройству замка (что надо открыть) и железного ключа (то, чем открывают).
Публичная часть — это замок, а приватная часть — это Ваш личный ключ. Именно публичная часть используется сервером для Вашей авторизации (сможете ли Вы открыть ключом шкатулку или нет).
Не компрометируйте свою закрытую часть ключа, что может произойти при:
- передаче другому лицу (по аналогии: с железного ключа можно снять восковой отпечаток и отдать ключ обратно, копий ключа уже будет сколько угодно), примеры:
- хранение на флешке ключа и передача флешки (даже на время) других людям (чтобы они на нее сохранили что-нибудь, например)
- подключение флешки в сторонний компьютер
- хранение ключа на компьютере в классе (администратор класса может получить к нему доступ)
- хранение ключа в почте (аналогично: может получить доступ администратор почтового сервера)
- посылке по открытым каналам (аналогично, копию снять ничего не стоит), пример:
- посылка по электронной почте (даже себе)
- и других обстоятельствах, когда доступ к закрытому ключу могут получить третие лица.
Более подробно о защите ssh-ключа
Чем это лучше использования пароля
Если Вы привыкли использовать системы с паролем, у Вас может возникнуть вопрос, почему администраторы сервера рекомендуют/заставляют Вас пользоваться ssh-ключами.
Мало кто может придумать сложный пароль и поэтому всегда есть опасности:
- простой пароль могут подобрать;
- сложный пароль пользователь может забыть;
- пароль пользователя может перехватить программа-шпион;
- пользователь может раскрыть свой сложный пароль путем записывания пароля в записной книжке, на столе и т.д.
В отличие от этого, для авторизации по ключу требуется некоторая подготовка:
- Пользователь создает (если ключей еще нет) открытый и закрытый ключи
- Открытый/публичный ключ копируется на удаленный ssh-сервер и кладется в специальный файл в директории того пользователя, в кого и надо залогиниться. Скорее всего будет использоваться файл ~/.ssh/authorized_keys.
И в дальнейшем при авторизации:
- ssh-клиент отправляет ssh-серверу свой публичный ключ (поэтому публичный ключ у Вас тоже должен быть).
- Сервер проверяет файл ~/.ssh/authorized_keys на наличие присланного ключа, если он в файле найден, ssh-сервер отправляет клиенту сообщение, зашифрованное публичным ключом (шкатулку закрытую на замок)
- Клиент должен расшифровать сообщение с помощью своего приватного ключа (открыть шкатулку), если приватный ключ защищен паролем, ssh-клиент попросит пользователя ввести пароль, чтобы сначала расшифровать сам ключ.
- Если сообщение расшифровано (обратно прислана открытая шкатулка), то правильность закрытого и открытого ключей считается подтвержденной и пользователю предоставляется доступ на сервер.
Как видно, преимущество ключей в том, что:
- для подбора надо не только подобрать очень большой открытый ключ (скажем при длине ключа в 2048 бит он сложнее пароля из 8 символов примерно в 10^500 раз), но и подобрать закрытую пару к подобранному открытому ключу (тоже очень сложная и дорогая задача)
- несколько пользователей могут логиниться под одним логином на удаленном сервере не обмениваясь общими секретами, иными словами:
- если требуется для работы групповой логин, то имея пользователей с разными ключами всегда можно определить тот набор из пользователей, которые смогут логиниться в данный момент времени под этим групповым логином
Как установить ssh-клиент
Если у Вас:
- *BSD (FreeBSD /NetBSD/OpenBSD):
- ssh-клиент уже есть в системе
- Mac OS X:
- ssh-клиент уже есть в системе
- дистрибутив GNU/Linux
- в современных дистрибутивах должен быть, проверьте что есть команда ssh, если не работает:
- Ubuntu/Debian: sudo apt-get install openssh-client в терминале. Или через центр приложений Ubuntu (как следует из названия, лишь в Ubuntu)
- в остальных дистрибутивах: читайте документацию по своей системе
- Windows:
- Если у вас Windows 10, можно воспользоваться прослойкой Windows Subsystem for Linux и получить Linux-подобное окружение. В нём справедливы инструкции для GNU/Linux выше, и команда ssh, скорее всего, уже будет присутствовать
- Либо оконный клиент PuTTY:
- Либо получить внутри Windows Unix-подобную систему с помощью Cygwin и поставить уже cygwin-пакет openssh-клиента (можно сразу при установке)
Кстати PuTTY есть и под Unix-системы.
Как создать ssh-ключ
- Установить ssh-клиент (если еще не установили). По поводу установки смотри предыдущий раздел.
- Далее — в зависимости от предпочтений:
Использование различных ключей в одном клиенте
Иногда пользователь хочет использовать несколько ключей, что может быть вызвано:
- разграничением ключей по серверам (скажем, на особо секретные сервера можно заходить по ключу с паролем, а на менее секретные — безпарольным ключом)
- тем, что уже имеющийся ключ не подходит серверу (например BlueGene не принимает в данный момент ключи ECDSA) и надо создать другой ключ.
- так сложилось
Ничего страшного!
Если используете программу ssh:
Если использовать программу putty:
Зачем нужен отпечаток (fingerprint) ключа
Для безопасности. Скорее всего Вы передаете свой открытый ssh-ключ (а закрытый ключ, как Вы помните, никому
передавать нельзя) по незащищенному каналу, т.е.:
- посылаете письмо с открытым ssh-ключом
- вводите текст открытого ssh-ключа через форму на сайте (через браузер)
Во всех этих случаях теоретически можно подменить присланную информацию и в результате злоумышленник сможет выдать себя за Вас и с правами выданными для Вас войти в систему.
Для предотвращения подобной ситуации и используется передача отпечатка по защищенному каналу:
- например через бумагу с подписью:
- Вы распечатываете отпечаток на бумаге,
- заверяете его своей подписью,
- преподаватель заверяет Вашу подпись и все это передает нам
- администратор проверяет подпись преподавателя (поскольку преподавателей сильно меньше студентов и меняются они реже, это довольно простая операция)
- администратор берет отпечаток от присланного другим способом публичного ключа и сверяет с тем, что принесли на бумаге
- если все совпало, то помещает открытый ключ в Вашего пользователя
Проблема с передачей по защищенному каналу обычно в том, что большой объем данных передать довольно тяжело (скажем распечатать открытый ключ и потом набирать его с бумажного листа), поэтому в таких случаях и используется fingerprint.
Для получения отпечатка:
- Если используете программу ssh для соединения, то:
- для создания используйте программу ssh-keygen:
- ssh-keygen -l -f путь_к_публичному_ssh-ключу
- для нашего примера (RSA-ключ) можно использовать путь к закрытому ключу
- в результате будет что-то вида:
2048 4c:d1:96:6f:dd:e5:67:ce:55:8b:fb:38:b2:a2:63:c5 user@host (RSA)
- более подробно — на странице про создание и использование ключей в openssh
- Если используете программу putty для соединения, то: