Поддержка ssh-ключей пользователя для «облачных серверов»

Новость одной строкой: мы реализовали возможность установки облачного сервера с автоматическим добавлением пользователю root публичного ключа в authorized_keys.

Ликбез: для чего нужны ssh-ключи?

SSH-ключ позволяет заходить на серверы без ввода пароля. Приватный ключ хранится у пользователя на компьютере (под паролем или без), публичный — загружается на сервер. После этого, при подключении к серверу приложение (ssh-клиент) доказывает серверу, что у него есть приватный ключ (сам приватный ключ при этом не передаётся). Если доказать удалось, то пользователь оказывается на сервере.

В бытовом смысле это много удобнее, не говоря уже про автоматизацию удалённого выполнения команд.

Для Linux/FreeBSD и MacOS X ключ генерируется в консоли командой ssh-keygen (открытый ключ после этого можно скопировать из ~/.ssh/id_rsa.pub), для Windows в утилите PyTTY его так же можно сгенерировать и использовать — подробнее.

Минимальный метод использования — выбрать ключ при установке/переустановке:

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

Заметим, по-умолчанию машина ставится без ключа, но есть возможность указать, какой ключ использовать по-умолчанию.

Если у вас есть несколько ключей, то ими можно управлять. Всего управления — удалить, изменить описание и пометить ключ как «предпочтительный».

Разумеется, в любой момент «запомненный» ключ можно удалить из списка.
Собственно, на этом видное на первый взгляд и заканчивается.

А дальше начинаются нюансы.

Во-первых, в отличие от многих сервисов мы ключ полностью валидируем. И на этапе JS, и на серверной стороне. Что во-первых спасает от распространённой ошибки — загрузки приватного ключа вместо публичного, а во-вторых гарантирует, что ключ — это ключ.

Вот так вот выглядит удачно предовтращённое разглашение приватного ssh-ключа — мы его отвергаем ещё на уровне JS, до того, как отправляем на сервер, таким образом, не компрометируем:

Во-вторых мы записываем ключ установки в свойства виртуальной машины (поле «ключ при установке», рядом с паролем при установке).

Мы показываем его «хвостик» (описание), но если по нему кликнуть, покажем сам ключ целиком.

И, главное: мы проверяем, что ключ виртуальной машины пользователю известен. Если машина поставлена с ключом, который пользователь не добавлял в «свои» (такое может быть при передаче сервера с аккаунта на аккаунт) или пользователь ключ удалил, то мы показываем предупреждение.

Так как наш сервер API написан на Haskell, то под это дело наш старший программист потратил свой вечер и написал библиотеку: crypto-pubkey-openssh. Традиционно, мы подобные вещи выкладываем в open source.

Что еще почитать по теме

T-Rex 30 марта 2021

Что такое SMTP-протокол и как он устроен?

SMTP (Simple Mail Transfer Protocol) — протокол передачи почты. Он был представлен еще в 1982 году, но не теряет актуальности до сих пор. В статье разбираемся, какие задачи решает протокол и как он ра…
T-Rex 30 марта 2021
Владимир Туров 1 сентября 2020

Дело совершенно секретного iPod

Это был обычный серый день в конце 2005 года. Я сидел на рабочем месте и писал код для следующей версии iPod. Вдруг без стука ворвался директор ПО для iPod, начальник моего начальника, и закрыл дверь.
Владимир Туров 1 сентября 2020
T-Rex 21 августа 2020

TrendForce: цены на SSD упадут

Эксперты DRAMeXchange предсказывают значительное падение цен на оперативную память и твердотельные накопители в ближайшее время. Причина — сокращение спроса на чипы для NAND и DRAM.
T-Rex 21 августа 2020

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Андрей Салита 26 января 2023

Что такое общедоступные персональные данные и что к ним относится

Разбираемся, что относится к общедоступным персональным данным и как они защищаются законом.
Андрей Салита 26 января 2023

Глобальный роутер Selectel: преимущества и сценарии использования

Рассказываем о решении, которое позволит организовать гибридную инфраструктуру на базе серверов — выделенных и облачных — в разных пулах и регионах.
Михаил Фомин 24 января 2023

Не все типы репликации одинаково полезны, или почему две MySQL лучше одной

В это сложно поверить, но MySQL как продукт появился еще в 1995 году. Со временем название СУБД стало таким же нарицательным, как Xerox. Сегодня под этим термином могут понимать самые разные связки: о…
Михаил Фомин 24 января 2023