0x00. Yubikey + ssh/git (Windows)
TableOfContents
0x00. Інтро
З деякого часу у мене в арсеналі обов’язкових пристроїв є ключі-юбіки ( https://www.yubico.com/products/yubikey-5-overview/ ). Дуже багато сервісів як-то Google, Github (web GUI) тощо підтримують їх з коробки. Крім того є можливість сгенерувати на них сертифікат, за допомогою якого авторизуватись по ssh. Але тут вже треба вийняти бубен і трохи потанцювати, бо ні Linux, ні Windows не вміють того з коробки. Тому нижче трохи про бубен у середовищі Windows.
Далі все буде стосуватися PIV та його використання через інтерфейс PKCS#11:
Про YubiKey і можливості смарт-карт
YubiKey 5 NFC, YubiKey 5 Nano, YubiKey 5C і YubiKey 5C Nano забезпечують функціональність смарт-картки на основі інтерфейсу перевірки особи (PIV), зазначеного в NIST SP 800-73, «Криптографічні алгоритми та розміри ключів для PIV». Виконує операції підписання/дешифрування RSA або ECC за допомогою закритого ключа, що зберігається на смарт-картці, через загальні інтерфейси, такі як PKCS#11 (мультиплатформенний) і мінідрайвер смарт-картки для Microsoft Windows.
0x01. Yubikey
Спершу треба налаштувати сам юбік - змінити дефолтні пін-коди (на випадок, якщо юбік потрапить не в ті руки), потім створити сертифікат, експортувати публічний ключ. Все це можна робити як у Windows, так і у Linux, як через GUI додаток, так і консольними командами. Нижче ми це зробимо в додатку Yubikey Manager для Windows.
Yubikey manager
Необхідно спочатку встановити Yubikey Manager - https://www.yubico.com/support/download/yubikey-manager/
Далі вставити юбік у USB порт, запустити Yubikey Manager, якщо все ок - то Yubikey Manager побачить ключ і його серійний номер:
Після цього заходимо у меню Applications/PIV :
де маємо меню керування PIV на юбіку :
Для налаштування пінів заходимо у Pin Management.
Далі змінюємо у такій послідовності:
- PUK: current PUK - Use default, так як новий юбік має саме дефолтний PUK. PUK змінюємо першим, бо зміна PUK скидає PIN.
- PIN: аналогічно - current PIN - Use default.
- Management key - ставлю галочку Protect with PIN і потім тицяю Generate
Все, із пінами закінчили. При цьому треба мати на увазі - якщо тричі неправильно ввести, коли просить, PIN - то почне просити PUK. Якщо тричі введете неправильно PUK - ключ (точніше його PIV функціонал) заблокується, після цього єдиний варіант - це тільки скинути налаштування PIV до дефолтних значень, всі сгенеровані сертифікати при цьому будуть втрачені. Більш детально можна прочитати тут.
Тому піни і пуки бажано не забувати. І ні в якому разі не використовувати дефолтні.
Certificates
Знову заходимо у Application -> PIV
але вибираємо вже Certificates:
Юбік має 4 слоти з номерами 9a, 9c, 9d, 9e (так, в цьому меню 9b нема %) - назви слотів та їх функціональні особливості/призначення визначаються відповідним стандартом, більше детально тут .
Для цілей ssh автентифікації мені найбільш підходить слот 9c, а не якби здавалось 9а, бо мені треба, щоб при кожному використанні приватного ключа запитувало пін-код (параноя вона така).
Далі все просто - вибираємо слот 9с (вкладка Digital Signature)
тицяємо Generate, вибираємо тип Self-signed (самопідписний сертифікат):
Далі алгоритм, на даний момент рекомендовані базовані на еліптичних кривих ( ECCP ) алгоритми:
Далі придумуємо Subject:
і ставимо бажаний строк дії сертифікату
Далі тицяємо Generate
і сертифікат сгенеровано і збережено на ключі. При великому бажанні його можна експортувати, наприклад, для імпортування на інший юбік, але краще цього не робити, бо тоді пропадає сенс використання юбіка.
Кожен сертифікат повинен бути в одному екземплярі на окремому юбіку, із своїми пін/пук кодами.
Якщо треба кілька юбіків (а бажано мати два - основний і бекапний) - то тоді кожен із своїм сертифікатом.
Тоді при втраті одного юбіка просто закриєте всюди доступ для нього без необхідності перегенерації сертифікатів на усіх юбіках.
0x02. OpenSSH
Розглянемо випадок, коли у нас велике бажання використовувати Yubikey для доступу із клієнта на Windows до віддалених ssh серверів (той же github, наприклад).
По замовчанню Windows майже ніколи не має встановленого клієнту ssh.
Тому спершу встановлюємо його, на Win10/Win11 він давно вже є у System Settings -> Optional features :
Там вибираємо OpenSSH Client і активуємо, ну або просто однією командою powershell (перша команда просто перевіряє чи встановлено фічу і яка саме її версія наявна):
PS C:\WINDOWS\system32> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Name : OpenSSH.Client~~~~0.0.1.0
State : Installed
Name : OpenSSH.Server~~~~0.0.1.0
State : NotPresent
PS C:\WINDOWS\system32> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Якщо все ок, то при виконанні команд маємо побачити:
PS C:\WINDOWS\system32> ssh -V
OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2
PS C:\WINDOWS\system32> ssh -T git@github.com
git@github.com: Permission denied (publickey).
PS C:\WINDOWS\system32>
Перша команда видає версію ssh клієнта, друга - намагається під’єднатись до github, так як ми тільки встановили ssh клієнт, і так як зараз github працює тільки через ключі (ну або токени, але то інша тема) - то маємо відлуп.
В принципі далі ми можемо сгенерувати файл-сертифікат і його публічну частину закинути у теку “%USERPROFILE%/.ssh” (тобто тека .ssh у домашній теці). Більше детально можна почитати у Connect with SSH .
Але у нас вже є сертифікат на юбіку, треба тільки підключити юбік до OpenSSH client.
0x03. PKCS#11
Ту вже є невелика різниця, під Windows чи Linux.
yubico-piv-tool
Спершу необхідно встановити драйвер PIV для юбікеїв:
https://developers.yubico.com/yubico-piv-tool/Releases/
В моєму випадку це yubico-piv-tool-2.6.1-win64.msi
Далі я у себе додав шлях, куди він поставився, до дефолтних шляхів, хоча це і не обов’язково:
Далі в домашній теці юзера в теці .ssh (вона була створена при встановленні OpenSSH client) створюємо файл config із рядком
PKCS11Provider “C:\Program Files\Yubico\Yubico PIV Tool\bin\libykcs11.dll”
(якщо файл існує, то просто додаємо такий рядок):
PS C:\> cat ~/.ssh/config
PKCS11Provider "C:\Program Files\Yubico\Yubico PIV Tool\bin\libykcs11.dll"
PS C:\>
У цьому випадку OpenSSH client при підключенні спершу буде перевіряти, чи підключений юбік і чи підходить його сертифікат для доступу для віддаленого серверу.
Якщо все ок, то при підключенні у вас спитає пін код, якщо ж юбіка нема, чи його сертифікат не підходить - то буде як звичайно.
Але, звісно, для цього необхідно додати публічний ключ сертифікату, який ми сгенерували раніше, до віддалених серверів.
Публічний ключ
Щоб отримати публічний ключ з юбікея, виконайте:
ssh-keygen -D libykcs11.dll -e
ну або якщо не додавали у дефолтні шляхи, то
ssh-keygen -D "C:\Program Files\Yubico\Yubico PIV Tool\bin\libykcs11.dll" -e
в результаті отримаєте щось на кшталт:
PS C:\> ssh-keygen -D libykcs11.dll -e
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTI.......q0= Public key for Digital Signature
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC......./hZ Public key for PIV Attestation
PS C:\>
де публічний ключ перший рядок (бо ми створювали ключ в слоті 9с - Digital Signature). Його і додаємо, увесь рядок!, на сервери, куди треба надати доступ через юбік. Тільки при бажанні (і навіть бажано) фразу “Public key for Digital Signature” змінити на більш інформативну, наприклад ім’я юзера, чий ключ.
github
Для github - відповідно
- In the upper-right corner of any page on GitHub, click your profile photo, then click Settings.
- In the “Access” section of the sidebar, click SSH and GPG keys.
- Click New SSH key or Add SSH key.
- In the “Title” field, add a descriptive label for the new key. For example, if you’re using a personal laptop, you might call this key “Personal laptop”.
- Select the type of key, either authentication or signing. For more information about commit signing, see “About commit signature verification.”
- In the “Key” field, paste your public key.
- Click Add SSH key.
- If prompted, confirm access to your account on GitHub. For more information, see “Sudo mode.”
Після цього тест повинен видати:
PS C:\> ssh -T git@github.com
Enter PIN for 'YubiKey PIV #XXXXXXXXX':
Hi YYYYYY! You've successfully authenticated, but GitHub does not provide shell access.
PS C:\>
Це означає, що тепер юбік можна використовувати із командою git.
Хто дочитав до кінця - вельми дякую за витрачений час, маю надію - недарма !
ПС: цей пост було запушено на гітхаб саме за допомогою юбікея.