Представлен проект Kryptonite, предлагающий хранить закрытые ключи SSH на смартфоне, вместо размещения в файле ~/.ssh/id_rsa. Kryptonite состоит из двух частей - ssh-агента, запускаемого на стороне рабочих станций, и мобильного приложения для Android и iOS, занимающегося хранением ключей. Агент написан на языке Go и распространяется в исходных текстах, но лицензия на код пока не определена.

Kryptonite может рассматриваться как подобие двухфакторной аутентификации для доступа к SSH-ключам. Все операции с ключами выполняются на смартфоне, а размещаемый на локальной системе агент лишь получает результат операции, выполненной на стороне смартфона с закрытым ключом. На локальной системе ключи не фигурируют ни в каком виде. Каждая операция с ключом требует явного подтверждения на смартфоне.

Так как ключи хранятся отдельно, они не привязаны к локальным системам и один ключ можно использовать с разных компьютеров. С точки зрения безопасности, с одной стороны появляется лишнее звено в виде смартфона, но с другой стороны исчезает возможность утечки ключей из локальной ФС рабочей станции в случае компрометации пользовательских приложений (например, эксплуатации уязвимости в браузере). Весь обмен данными между ssh-агентом и мобильным приложением передаётся в зашифрованном виде, для шифрования и аутентификации используется библиотека libsodium.

Процесс работы с Kryptonite выглядит следующим образом: На локальных системах устанавливается пакет с ssh-агентом kr, а на смартфоны специальное приложение. Далее запускается процесс сопряжения мобильного приложения и рабочих станций пользователя. Сопряжение сводится к выполнению в терминале на рабочей станции команды "kr pair", которая приводит к отображению QR-кода. Пользователь фотографирует мобильным приложением этот QR-код, после чего Kryptonite генерирует пару SSH-ключей, сессионные ключи для аутентификации рабочей станции и устанавливает канал связи с агентом. Обмен данными между агентом и смартфоном может производиться по Bluetooth или шифрованному каналу поверх TCP/IP (применяются сервисы AWS SQS и AWS SNS). Далее при каждом использовании SSH на сопряжённой рабочей станции на смартфоне выводится уведомление и требование подтвердить вход.

На смартфоне в iOS ключ хранится в iOS Keychain и генерируется на базе 4096-разрядных ключей RSA в реализации Apple iOS Security Framework или на базе Ed25519 в реализации libsodium. В Android ключи сохраняются в аппаратно изолированном хранилище ключей Android Keystore и генерируются в виде 3072-разрядных ключей RSA. Android Keystore выступает в роли чёрного ящика, из которого ключи не могут быть извлечены, в том числе самим Kryptonite. При поступлении запроса по SSH, Android Keystore генерирует цифровую подпись при помощи сохранённого ключа и возвращает результат. В случае утери или кражи смартфона достаточно удалить привязанные к нему открытые ключи из всех своих учётных записей и заменить на новые открытые ключи, сгенерированные на новом смартфоне.

Источник: http://www.opennet.ru/opennews/art.shtml?num=46496