YubiKey GPG RSA

Материал из rrv-wiki
Перейти к навигации Перейти к поиску

Кратко

Для начала установим 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 имеет три слота под ключи типа:

  1. (E) Encryption key (шифрование)
  2. (A) Authentication key (удостоверение личности)
  3. (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