Новость одной строкой: мы реализовали возможность установки облачного сервера с автоматическим добавлением root в authorized_keys указанного при установке публичного ssh-ключа.
Минимальный метод использования — выбрать ключ при установке/переустановке:
Для удобства мы сделали так, что ключ можно указать прямо при создании машины. В этом случае мы запомним ваш открытый ключ и позволим вам его в следующий раз выбрать в выпадающем списке.
Заметим, по-умолчанию машина ставится без ключа, но есть возможность указать, какой ключ использовать по-умолчанию.
Если у вас есть несколько ключей, то ими можно управлять. Всего управления — удалить, изменить описание и пометить ключ как «предпочтительный».
Разумеется, в любой момент «запомненный» ключ можно удалить из списка.
Простая часть на этом заканчивается. А дальше начинаются нюансы.
Во-первых, в отличие от многих сервисов мы ключ полностью валидируем. И на этапе JS, и на серверной стороне. Что во-первых спасает от распространённой ошибки — загрузки приватного ключа вместо публичного, а во-вторых гарантирует, что ключ — это ключ.
Вот так вот выглядит удачно предотвращённое разглашение приватного ssh-ключа — мы его отвергаем ещё на уровне JS, до того, как отправляем на сервер и таким образом не компрометируем его:
Во-вторых мы записываем ключ установки в свойства виртуальной машины (поле «ключ при установке», рядом с паролем при установке).
Мы показываем его «хвостик» (описание), но если по нему кликнуть, покажем сам ключ целиком.
И, главное: мы проверяем, что ключ виртуальной машины пользователю известен. Если машина поставлена с ключом, который пользователь не добавлял в «свои» (такое может быть при передаче сервера с аккаунта на аккаунт) или пользователь ключ удалил, то мы показываем предупреждение.
Более того, мы откажемся переустанавливать виртуальную машину с неизвестным ключом. Это гарантирует, что владелец машины точно знает, что делает и доверяет владельцу ключа кликнул «добавить» на соответствующей странице.
Библиотеки для работы с SSH-ключами
Наш сервер API написан на Haskell, веб-интерфейс на JS (ваш капитан). Ни в Хаскеле, ни в JS мы не нашли готовой библиотеки для валидации ключей. Наши программисты: knsd и rocco66 потратили немного времени и написали своё.
- Библиотека для Haskell: github.com/knsd/crypto-pubkey-openssh.
- Функция для coffeescript: github.com/selectel/ssh_pub_key_validation
Для чего нужны ssh-ключи?
(раздел для не-сисадминов)
SSH-ключ позволяет заходить на серверы без ввода пароля. Приватный ключ хранится у пользователя на компьютере (под паролем или без), публичный — загружается на сервер. После этого, при подключении к серверу приложение (ssh-клиент) доказывает серверу, что у него есть приватный ключ (сам приватный ключ при этом не передаётся), соответствующий загруженному публичному ключу. Если всё ок, то пользователь оказывается на сервере.
В бытовом смысле это много удобнее, не говоря уже про автоматизацию удалённого выполнения команд.
Для Linux/FreeBSD и MacOS X ключ генерируется в консоли командой ssh-keygen (открытый ключ после этого можно скопировать из ~/.ssh/id_rsa.pub). Для Windows в утилите PyTTY его так же можно сгенерировать и использовать: habrahabr.ru/post/39254/.
Практически использование ключа сводится к наличию файла ~/.ssh/id_rsa, после этого достаточно набрать root@habrahabr.ru и вы окажетесь на сервере habrahabr.ru c правами рута. При условии, что ваш публичный ключ лежит на сервере в каталоге /root/.ssh/authorized_keys, разумеется.
Автор: amarao