В кодовата база OpenSSH експериментална поддръжка на двуфакторна автентикация с използване на устройства, поддържащи протокола , развиван от алианса . U2F позволява създаването на евтини хардуерни токени за потвърждаване на физическото присъствие на потребителя, взаимодействието с които се извършва чрез USB, Bluetooth или NFC. Подобни устройства се предлагат като средство за двуфакторна автентикация на сайтове, вече се поддържат от основните браузъри и се произвеждат от различни производители, включително Yubico, Feitian, Thetis и Kensington.
За взаимодействие с устройствата, потвърдващи присъствието на потребителя, в OpenSSH е добавен нов тип ключове „sk-ecdsa-sha2-nistp256@openssh.com“ („ecdsa-sk“), в който се използва алгоритъм за цифрова подпис ECDSA (Elliptic Curve Digital Signature Algorithm) с елиптична крива NIST P-256 и хеш SHA-256. Процедурите за взаимодействие с токените са изнесени в междинна библиотека, която се зарежда аналогично на библиотеката за поддръжка на PKCS#11 и представлява обвивка над библиотеката , предоставяща средства за комуникация с токените върху USB (поддържат се протоколи FIDO U2F/CTAP 1 и FIDO 2.0/CTAP 2). Подготвената от разработчиците на OpenSSH междинна библиотека libsk-libfido2 е част от libfido2, подобно на за OpenBSD.
За активиране на U2F можете да използвате свежо изрязване на кодовата база от OpenSSH и HEAD-клон на библиотеката , в който вече е включена необходимата за OpenSSH прослойка.
Libfido2 поддържа работа в OpenBSD, Linux, macOS и Windows.
За автентикация и генериране на ключ трябва да зададете променлива на средата SSH_SK_PROVIDER, посочвайки в нея пътя до libsk-libfido2.so (export SSH_SK_PROVIDER=/path/to/libsk-libfido2.so), или да определите библиотеката чрез настройка SecurityKeyProvider, след което да стартирате „ssh-keygen -t ecdsa-sk“ или, ако ключовете вече са създадени и настроени, да се свържете със сървъра с помощта на „ssh“. При стартиране на ssh-keygen, създадената двойка ключове ще бъде запазена в „~/.ssh/id_ecdsa_sk“ и може да се използва аналогично на другите ключове.
Отвореният ключ (id_ecdsa_sk.pub) трябва да бъде копиран на сървъра в файла authorized_keys. На страната на сървъра само се проверява цифровият подпис, а взаимодействието с токените се извършва на страната на клиента (не е нужно да се инсталира libsk-libfido2 на сървера, но сървърът трябва да поддържа вид ключове „ecdsa-sk“). Генерираният секретен ключ (id_ecdsa_sk) по същество е дескриптор на ключа, който образува реалния ключ само в комбинация с секретната последователност, съхранявана на страната на токена U2F.
В случай че ключът id_ecdsa_sk попадне в ръцете на атакуващ, за да премине аутентификация, той също така трябва да получи достъп до хардуерния токен, без който запазеният в файла id_ecdsa_sk секретен ключ е безполезен. Освен това, по подразбиране, при извършване на каквито и да е операции с ключовете (както при генерирането, така и при аутентификацията) се изисква локално потвърждение на физическото присъствие на потребителя, например, предлага се да се докосне сензора на токена, което затруднява провеждането на дистанционни атаки на системи с включен токен. Като още един защитен ред на етапа на стартиране, ssh-keygen също може да изисква парола за достъп до файла с ключа.
Ключът U2F може да бъде добавен в ssh-agent чрез „ssh-add ~/.ssh/id_ecdsa_sk“, но ssh-agent трябва да е компилиран с поддръжка на ключове „ecdsa-sk“, трябва да присъства прослойка libsk-libfido2 и агентът трябва да работи на системата, към която е свързан токенът.
Новият тип ключове „ecdsa-sk“ е добавен, тъй като форматът на ecdsa-ключовете OpenSSH се различава от формата U2F за цифрови подписи ECDSA, който има допълнителни полета.
Източник: opennet.ru
