Проект Kryptonite развивает систему хранения закрытых ключей SSH на смартфоне
Представлен проект Kryptonite, предлагающий новую систему для хранения закрытых ключей SSH на смартфоне, вместо размещения в файле ~/.ssh/id_rsa. Kryptonite состоит из двух частей - ssh-агента, запускаемого на стороне рабочих станций, и мобильного приложения для Android и iOS, занимающегося хранением ключей. Агент написан на языке Go и распространяется в исходных текстах, но лицензия на код пока не определена.
Kryptonite может рассматриваться как подобие двухфакторной аутентификации для SSH-ключей. Все операции с ключами выполняются на смартфоне, а размещаемый на локальной системе агент лишь получает результат операции, выполненной на стороне смартфона с закрытым ключом. На локальной системе ключи не фигурируют ни в каком виде. Каждая операция с ключом требует явного подтверждения на смартфоне и ввода кода доступа к ключу.
Так как ключи хранятся отдельно, они не привязаны к локальным системам и один ключ можно использовать с разных компьютеров. С точки зрения безопасности, с одной стороны появляется лишнее звено в виде смартфона, но с другой стороны исчезает возможность утечки ключей из локальной ФС в случае компрометации пользовательских приложений (например, эксплуатации уязвимости в браузере).
Процесс работы с Kryptonite выглядит следующим образом: На локальных системах устанавливается пакет с ssh-агентом kr, а на смартфоны специальное приложение. Далее запускается процесс сопряжения мобильного приложения и рабочих станций пользователя. Сопряжение сводится к выполнению в терминале на рабочей станции команды "rk pair", которая приводит к отображению QR-кода. Пользователь фотографирует мобильным приложением этот QR-код, после чего Kryptonite генерирует пару SSH-ключей, сессионные ключи и устанавливает канал связи с агентом. Обмен данными между агентом и смартфоном может производиться по Bluetooth, шифрованному каналу поверх TCP/IP и другим средствам связи. Далее при каждом использовании SSH на сопряженной рабочей станции на смартфоне выводится уведомление и требование подтвердить вход.
На смартфоне в iOS ключ хранится в iOS Keychain и генерируется на базе 4096-разрядных ключей RSA в реализации Apple iOS Security Framework или на базе Ed25519 в реализации libsodium. В Android ключи сохраняются в аппаратно изолированном хранилище ключей Android Keystore и генерируются в виде 3072-разрядных ключей RSA. Android Keystore выступает в роли черного ящика, из которого ключи не могут быть извлечены, в том числе самим Kryptonite. При поступлении запроса по SSH, Android Keystore генерирует цифровую подпись при помощи сохраненного ключа и возвращает результат. В случае утери или кражи смартфона достаточно удалить привязанные к нему открытые ключи из всех своих учетных записей и заменить на новые открытые ключи, сгенерированные на новом смартфоне.