SSH – основной способ подключения к удаленному серверу Linux. Чтобы обеспечить безопасность инфраструктуры, очень важно своевременно защитить этот канал. Как правило, для аутентификации по SSH на удаленном сервере используется пара из открытого и закрытого ключа. Открытый ключ добавляется в список ключей на удаленном сервере. Хранить закрытый ключ сложнее. Это одна из основных проблем аутентификации по SSH.
Как правило, разработчики хранят свои закрытые ключи в каталоге ~/.ssh. Тем не менее, прочитать такой закрытый ключ можно с помощью простой команды cat ~/.ssh/id_rsa. Читать закрытый ключ SSH может любое приложение на компьютере, даже если ключ защищен парольной фразой.
Часто для устранения этого риска безопасности в аутентификацию добавляют второй фактор.
Читайте также: Настройка многофакторной аутентификации SSH на Ubuntu 16.04
У этого метода есть два недостатка: стоимость установки и удобство использования. На каждом сервере инфраструктуры необходимо настроить взаимодействие OpenSSH с модулем OATH-TOTP PAM и загрузить на него общий закрытый ключ. Это трудоемкий процесс, и в нем можно допустить много ошибок. Кроме того, при каждой такой аутентификации SSH вам нужно открыть приложение на смартфоне, прочитать шестизначный код и ввести его в терминал. Это может значительно замедлить рабочий процесс.
Чтобы избежать недостатков двухфакторной аутентификации, разработчики часто используют для создания и хранения пар ключей SSH аппаратные модули безопасности USB (HSM), такие как NitroKey или YubiKey. Это небольшие USB-устройства, в которых содержится пара ключей SSH. Каждый раз, когда вы хотите подключиться к серверу по SSH, вы подключаете USB-устройство к компьютеру и нажимаете кнопку на устройстве.
Но HSM-устройства дорого стоят. Совместимые с SSH устройства стоят около $50 США. Кроме того, это устройство нужно постоянно носить с собой: чтобы подключиться по SSH к серверу, вам нужно подключить USB-устройство к компьютеру и нажать на нем специальную кнопку. Также HSM обычно не имеют экрана, поэтому нет возможности просмотреть ключи и лог аутентификации.
Kryptonite – это новое средство для защиты закрытого ключа SSH. Это бесплатное приложение легко настраивается, с ним просто работать и оно имеет дополнительные встроенные средства защиты. Kryptonite не требует изменений на серверной стороне и позволяет подтверждать запросы на вход через push-уведомления со смартфона – для этого не нужно открывать само приложение. Данные всегда с вами в телефоне, независимо от того, с какой машины и к какому серверу вы хотите подключиться по SSH.
Данный мануал поможет сгенерировать SSH-ключи в Kryptonite на телефоне, настроить взаимодействие между телефоном и локальным компьютером и подключиться к удаленному серверу через Kryptonite.
Требования
- Удаленный сервер Linux.
- Смартфон (iOS 9.1+ или Android 6.0+).
- Персональный компьютер macOS 10.10+, Ubuntu, Debian, RHEL, CentOS, Fedora или Kali Linux.
1: Генерирование пары ключей в Kryptonite
Сначала нужно загрузить приложение Kryptonite, перейдя на сайт проекта со смартфона.
Как только приложение будет установлено, откройте его и нажмите Generate Key Pair, чтобы создать пару ключей SSH в Kryptonite. Введите краткое описание, если хотите идентифицировать свой открытый ключ (или пропустите этот шаг).
Затем нужно установить утилиту командной строки Kryptonite.
2: Установка kr
На локальный компьютер установите утилиту kr. Она обеспечивает SSH-аутентификацию с помощью ключа, хранящегося в Kryptonite. Вы можете установить kr с помощью стандартного менеджера пакетов системы (например, npm или brew) или просто использовать curl.
Чтобы ознакомиться с содержимым сценария перед установкой, запустите команду:
curl https://krypt.co/kr > install_kr
Больше о сценарии и альтернативных методах его установки вы найдете в документации kr.
Установите kr:
curl https://krypt.co/kr | sh
Команда предложит включить push-уведомления. С их помощью Kryptonite будет отправлять подтверждения запросов.
3: Взаимодействие Kryptonite и локального компьютера
После установки kr введите:
kr pair
В терминале появится QR-код. Если ваше окно терминала мало, вам, возможно, придется изменить размер окна или шрифта.
В приложении Kryptonite нажмите Allow Camera Access в нижней части экрана. Когда включится камера, просканируйте QR-код в терминале. Через несколько секунд приложение Kryptonite сообщит об успешном соединении, и терминал выведет открытый SSH-ключ Kryptonite.
4: Тестирование ключей Kryptonite
Чтобы убедиться, что все работает должным образом, попробуйте с локальной машины подключиться по SSH к публичному серверу me.krypt.co:
ssh me.krypt.co
В приложении Kryptonite на смартфоне появится запрос с просьбой одобрить аутентификацию SSH с тремя опциями:
- Allow Once – подтверждает текущий запрос на аутентификацию к me.krypt.co.
- Allow for 1 hour – подтверждает текущий запрос и другие SSH-запросы с связанных с приложением машин в течение следующего часа. Вы по-прежнему будете получать уведомления о появлении новых запросов на аутентификацию, но они будут подтверждаться автоматически.
- Reject – сбрасывает запрос, SSH-подключение прерывается.
Если вы заблокируете свое устройство и снова попробуете подключиться по SSH к me.krypt.co, Kryptonite отправит на ваше устройство push-уведомление, запросив подтверждение с экрана блокировки.
5: Добавление открытого ключа Kryptonite на удаленный сервер
Инструмент командной строки kr может добавить открытый ключ Kryptonite на запущенный удаленный сервер, к которому вы можете подключиться с помощью локального ключа SSH или пароля.
Для этого запустите команду:
kr add user@your_server_ip
Укажите имя пользователя и IP-адрес своего сервера.
После этого попробуйте подключиться к серверу по SSH:
ssh user@your_server_ip
При этом на смартфон должно прийти уведомление.
Заключение
Теперь закрытый ключ надежно хранится на смартфоне и никогда не покинет ваше устройство. Когда вы разрешаете подключение, закрытый ключ используется для криптографической подписи входа. Затем эта подпись отправляется обратно на компьютер для завершения проверки SSH.