YubiKey GPG RSA
Кратко
Для начала установим scdaemon для возможности работы с картами
# apt install scdaemon
Теперь скачаем наш публичный ключ и импортируем его:
$ gpg --import public_key.gpg
Список ключей на YubiKey
После добавления открытого ключа, можно выполнить
gpg --card-status | grep key
Почитать
Можно почитать следующие статьи:
YubiKey-Guide (очень подробно)
Yubikey + GPG – быстрый старт и GPG. ШИФРОВАНИЕ В ЛИНУКСЕ. ЛУЧШЕЕ ИЗ OPEN SOURCE. Видео
YubiKey 5.2.3 Enhancements to OpenPGP 3.4 Support
Использование USB-брелоков Yubikey для ключей GPG и SSH
Переписывать не буду, так наброски для себя
Краткая шпаргалка по созданию ключей
Настраивать будем на Debian
Для начала установим scdaemon для возможности работы с картами
# apt install scdaemon
Создание ключей
Ключи будем создавать на чистой системе с шифрованным диском, включив паранойю на полную и отключив интернет. После всех манипуляций перезапишем диск случайными данными.
$ gpg --full-generate-key
- (1) RSA и RSA
- 4096
- 0 = неограничен
- заполняем имя (в одно слово это и будет именем ключа, я напишу testkey), почту и примечание(любое или пустое)
- O принять
- вводим сложный master пароль
Просмотр существующих ключей
Просмотр публичных ключей:
$ gpg -k
или с большем количеством информации:
$ gpg --list-keys --keyid-format LONG
Просмотр приватных ключей:
$ gpg -K
или с большем количеством информации:
$ gpg --list-secret-keys --keyid-format LONG
Создадим дополнительные SUB ключи
$ gpg --expert --edit-key testkey gpg> addkey
- (8)
- Теперь нажимая 1 (подпись), 2 (шифрование), 3 (удостоверение личности) можно выбирать набор возможностей ключа (добавлять или убирать)
- (0) После настройки завершим выбор
- 4096
- Зададим срок действия (в будущем имея PRIMARY KEY можно будет продлить)
- подтвердим master паролем
- пошевелим мышкой
ключ создан, можно посмотреть ключи командой
gpg> list
Сохраняем изменения:
gpg> save
Создадим необходимое количество ключей с требуемыми правами и сроками действия.
Резервная копия ключей
Можно выполнить резервную копию ключей на шифрованную флешку или еще куда нибудь и спрятать ее до лучших времен (пока не понадобится восстановить или продлить ключи)
Делаем резервную копию секретных ключей:
$ gpg -a --export-secret-key testkey > secret_key
Делаем резервную копию публичного ключа:
$ gpg -a --export testkey > public_key.gpg
Теперь для удобного доступа к публичному ключу,можно разместить его на каком нибудь своем сайте.
Создаем сертификат отзыва ключа:
$ gpg -a --gen-revoke testkey > revocation_cert.gpg
Настройка карты YubiKey
$ gpg --card-edit
Если карта определилась мы увидим нечто подобное:
Reader ...........: Yubico Yubikey 4 OTP U2F CCID Application ID ...: D2760001240103040006060151670000 Version ..........: 3.4 Manufacturer .....: Yubico Serial number ....: 12010165 Name of cardholder: [not set] Language prefs ...: [not set] Sex ..............: unspecified URL of public key : [not set] Login data .......: [not set] Signature PIN ....: not forced Key attributes ...: rsa2048 rsa2048 rsa2048 Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 KDF setting.......: on Signature key ....: [none] Encryption key....: [none] Authentication key: [none] General key info..: [none]
Заполним требуемые поля перейдя в административный раздел:
gpg/card> admin
Для начала поменяем pin-коды (секции 1 и 3):
По умолчанию, PIN: 123456, Admin PIN (PUK): 12345678 !!!ВНИМАНИЕ!!! Если не пордойдет, найдите в документации иначе заблокируете. Есть только три попытки!
gpg/card> passwd 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit
Теперь при желании сменим имя карты и задать сведения, но я не буду:
gpg/card> name gpg/card> sex gpg/card> lang gpg/card> login
Важный параметр упрощающий жизнь это url где будет лежать наш публичный ключ public_key.gpg (смотри выше):
gpg/card> url
Так же по умолчанию мы видим, что размер ключей 2048 бит
Key attributes ...: rsa2048 rsa2048 rsa2048
нас это не устраивает, меняем на 4096:
gpg/card> key-attr
Проходим мастер и выбираем тип RSA и размер 4096 три раза т.к. у нас три ключа и вводим пароль Admin PIN (можно конечно воспользоваться эллиптическими кривыми ECC, но это в другой раз).
Сохраняем настройки:
gpg/card> save
Перенос ключей на YubiKey
Внимание! Это именно перенос, а не копирование ключей! Убедитесь что сделали резервную копию!!!!!
YubiKey 5 имеет три слота под ключи типа:
- (E) Encryption key (шифрование)
- (A) Authentication key (удостоверение личности)
- (S) Sign key (подпись)
Входим в консоль gpg для редактирования ключа:
$ gpg --expert --edit-key testkey
В целом в gpg консоли всегда можно посмотреть интерактивную справку набрав:
gpg> help
Предположим, что мы создали все три SUB ключа, теперь для переноса проделаем последовательность действий:
Выберем ключ для переноса:
gpg> key 1
Теперь выбранный ключ помечен звездочкой ("*")
Перенесем его:
gpg> keytocard
нам напишут его тип и предложат выбрать подходящий слот на YubiKey (у нас могут быть ключи с комбинацией типов "E" "A" "S"), например так:
Please select where to store the key: (2) Encryption key Your selection? 2
Выбираем требуемый.
Тут потребуют пароли. В начале от мастер ключа, а потом Admin PIN (PUK) Yubikey
Снимем выделение с ключа:
gpg> key 1
Все ключ мы перенесли, теперь сделаем это с остальными двумя ключами.
!!!ВНИМАНИЕ!!! Если мы сейчас сохраним изменения, то ключи будут перемещены на карту, и удалятся с компьютера. Убедитесть, что вы сделали резервную копию ключей, иначе НЕ СОХРАНЯЙТЕ!!!!
Затем сохраняем изменения:
gpg/card> save
Удаление секретных ключей с ПК
Так как резервные копии ключей у нас уже на зашифрованной флешке в сейфе в бункере, а копии SUB ключей у нас на YubiKey, мы можем наконец удалить ключи с компьютера. Я конечно это делать не буду, т.к. я специально делал это на изолированном компьютере с шифрованным диском. Я просто удалю все данные, несколько раз записав случайные данные на диск через dd. Но на всякий случай: Удалим секретные ключи:
$ gpg --delete-secret-keys testkey
Можно удалить и публичные ключи:
$ gpg --delete-keys testkey
Продление срока действия ключа
Прошел год, или какой мы там задали срок действия, SUB ключи устарели.
В этот раз можно воспользоваться LiveCD образом linux (хотя опять можно установить новую систему на шифрованном диске), что бы не оставлять следов.
После приготовлений, отключаем сеть и импортируем ключи с нашей секретной флешки с резервными копиями ключей которую мы прятали в сейфе.
$ gpg --import secret_key $ gpg --import public_key.gpg
Теперь начинаем редактировать сроки действия SUB ключей.
$ gpg --expert --edit-key testkey
Выбираем просроченный SUB ключ (например это второй ключ)
gpg> key 2
Изменяем срок действия (например на 14 месяцев):
gpg> expire 14m
Вводим пароль от ключа.
Снимаем выделение с ключа:
gpg> key 2
Сохраним изменения:
gpg> save
Секретные ключи не изменяются, изменяются только бубличные ключи? Делаем делаем резервную копию секретных и открытого ключей как уже описано в этой инструкции и снова прячем флешку. Заливаем продленный ключ на YubiKey.
ОБЯЗАТЕЛЬНО!!! Заливаем измененный публичный ключ на сайт. т.к. на YubiKey нет открытого ключа.
Импортируем публичные ключи там где будем их использовать. Меняем публичные ключи ~/.ssh/authorized_keys2 на управляемых хостах не уверен в необходимости. Полностью очищаем систему на которой мы выполняли операции с мастер ключом дабы избежать утечки.
В общем делаем все как будто мы создали абсолютно новый ключ по этой инструкции.
Использование
Теперь как же нам их использовать, ну посмотрите на статьи указанные в начале. А тут мы рассмотрим только часть с настройкой ssh подключений.
Настройка ПК (debian) для работы с GPG ключами и YubiKey
Для начала установим scdaemon для возможности работы с картами
# apt install scdaemon
Теперь скачаем наш публичный ключ и импортируем его:
$ gpg --import public_key.gpg
Можно задать уровень доверия ключу, например абсолютный:
$ gpg --edit-key testkey gpg> trust Please decide how far you trust this user to correctly verify other users' keys (by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menu Your decision? 5 Do you really want to set this key to ultimate trust? (y/N) y
Несколько YubiKeys (Переключение между ключами Yubikey)
При использовании операций ключа GPG с ключом GPG, который вы поместили на Yubikeys, GPG запросит конкретный Yubikey с просьбой вставить Yubikey с заданным серийным номером. GPG не распознает другой Yubikey с другим серийным номером без ручного вмешательства. Вставьте требуемый Yubikey (с другим серийным номером) и выполните следующую команду:
$ gpg-connect-agent "scd serialno" "learn --force" /bye
Можно добавить alias на эту команду, например ychkey.
Для этого в файл ~/.bashrc добавим строку:
alias ychkey='gpg-connect-agent "scd serialno" "learn --force" /bye'
И перезапустим терминал.
Теперь при смене карты достаточно будет выполнить:
$ ychkey
Шифрование
Что бы зашифровать файл, открытый ключ должен быть добавлен в систему (см. выше gpg --import public_key.gpg).
Затем мы можем посмотреть его id командой:
$ gpg -k /home/rrv/.gnupg/pubring.kbx ---------------------------- pub rsa4096 2022-09-11 [SC] 09FA564F0A2D57404CE3CFABEAED142A2F2B276C uid [ абсолютно ] rrv <rrv@test.ru> sub rsa4096 2022-09-11 [E]
тут rrv - id ключа (KEYID)
Например мы хотим зашифровать файл secret.txt используем:
$ gpg -r KEYID --armor --encrypt secret.txt
Например:
$ gpg -r rrv --armor --encrypt secret.txt
После этого в текущей директории появится файл:
secret.txt.asc
Теперь можно удалять secret.txt
Расшифровка
Расшифруем файл из предыдущего примера. Выполним:
$ gpg -d secret.txt.asc
Нас попросят вставить ключ, а затем ввести пинкод. После чего файл вывится в консоль.
Если требуется расшифровать в файл, то используем ключ "-o":
$ gpg -o secret.txt -d secret.txt.asc
Переключим OpenSSH ssh-agent на GnuPG ssh-agent
Добавим в ~/.gnupg/gpg-agent.conf
enable-ssh-support
Добавим в ~/.bashrc следующие строчки:
# GPG-agent export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) gpgconf --launch gpg-agent
выполняем эти же строки в консоли или открываем новую консоль, что бы изменения применились.
Перезапускаем агенты:
$ killall ssh-agent $ killall gpg-agent
Теперь, если все правильно сделали вставляем YubiKey и выполняем в консоли:
$ ssh-add -L
Должны увидеть подобное:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC9JiawdI5x9UngFe0aw7W3I05zkKNfzfwvn2a2PuWFAbXeDCyRKo MiK0wy+H49cCdxCX+y3GHgqefil1sq+a9uIGNRLOpZWe0+XZfFRxkSqR0FqN2dnmckDN3j/qU3mrelDNAX+cWZZzdG B242wgPATmQq4TnfdTdw+F+MUH2Kbne4H6TydGoMxRxNyknPSCFQFoEfFKvkhL/of1jm40MocG3WimmV0L+Mr2N5gh dIvR5pbvK7umn9h4yKZz4vCDVWJFvYCT5rjLEiRapy4w1vey9/BE6FuTnVznRV5zkZWvQBBzYMIgPuY202BlItCYtU b3oALjvzwhwyaMTp/5ESOdYSzQTOvgUo65FHiqSvZEjH1bvXts54CvOlnKboEJaCbMQo2/ckw6xtua9hAubfQYXYd2 D1SBzNtuYIoed/LXy7X4xcLFJau7LAue4CHNxkRP1diHd74S6neJ6P+vq9HswhBtPQRWUn0zT1PrrgI8Grun8HUyHi mud/uDPE8aKyoexHDpWzXHOBE62OdvjTrM5VuffstuZ6NcROQ3S5JjQfnbz/W3iVE2fKFtZN1ukmvZ8z6BARF2GU1x IxAkLCQe1wgHDIVjtxYNWzjEAbCTBpGn/g883VIb792z5ytQUzfhjOj2N1pdZeGmiCCtBzyVLtGm9QbYkhU0lrhHVXZw== cardno:000610634736
Все это открытый ключ, его надо вставить на хост которым мы хотим управлять в файл ~/.ssh/authorized_keys2
Не забудьте забрать лишние права с файла:
$ chmod 400 ~/.ssh/authorized_keys2
Файл authorized_keys2 можно дополнять различными опциями, почитайте самостоятельно, начать можно здесь Ssh_через_ключи_DSA.
Теперь для подключения на удаленный хост вставляем ключ YubiKey и подключаемся по ssh как обычно, вводим pin-код от ключа и вот мы подключились.
SSH с Android
Для подключения с Android можно попробовать TermBot