Требования к безопасности непрерывно растут, так как взломщики постоянно эволюционируют и все лучше умеют красть данные. Доступ к данным становится все более ценным - это могут быть живые деньги, секретная информация или доступ в инфраструктуру, интеллектуальную собственность или пользовательские данные (которые эта инфраструктура обрабатывает). А это – очень большие деньги. А иногда и вовсе вопрос жизни и смерти целой структуры.

Простой системы логин/пароль уже недостаточно, чтобы обеспечить надежную защиту, и даже система с ассиметричными ключами имеет уязвимости:

  • ключ можно выкрасть. Он будет шифрован, но пароль можно подобрать. Это медленный процесс, но взломщику может повезти, особенно, если у него есть какая-то информация об особенностях пароля. Например, он знает его точную длинну.
  • Для того, чтобы ключ можно было использовать - он должен быть расшифрован. Обычно расшифрованый ключ хранится в оперативной памяти, но при наличии доступа к памяти его можно украсть. Атака сложная, но если ключ по-настоящиему ценный - реальная.

Для того, чтобы сделать работу с шифрованием надежной и безопасной – были придуманы аппаратные носители ключей. Концепция выглядит просто – шифровальный ключ не покидает аппаратного токена (обычно это смарт-карта с чипом), и если операционной системе требуется произвести какое-то действие с шифрованием (зашифровка, расшифровка, подпись) – данные передаются в аппаратный ключ. Ключ выполняет действия (если проситель имеет право на такие действия) и выдает результат.

В этой статье я расскажу, как настроить Yubikey 4 для работы с GPG и использовать его для стандартных действий (шифрование, расшифровка, авторизация по SSH).

Yubikey - это именно такой ключ. Это простой, удобный и понятный для начинающего ключ-смарткарта в форм-факторе USB-флешки. Классический Yubikey 4 выпускается в двух форм-факторах – обычная “полноразмерная” флешка или “нано-ключ” - вставленный в комп наноключ практически не выступает из порта, что удобно, если ключ подключен постоянно и не должен изыматься. Yubikey 4 выпускается как под USB2 Type A, так и под USB3 Type C порт, что удобно для обладателей новых ноутбуков (macbook pro touch bar). Так же компания Yubiko выпускает Yubkey Neo - Yubkey с поддержкой NFC (для смартфонов), но со сниженным максимальным размером ключа (2048 бит вместо 4096 для Yubikey 4).

Кроме GPG, Yubikey может работать как стандартная smart-карта и генерировать одноразовые пароли (TOTP/HOTP). В этой статье будет описана только настройка под GPG.

Предварительные настройки

Для того, чтобы использовать gpg для Yubikey - потребуется сам gpg. Пользователи MacOS могут использовать MacGPG. Пользователям Linux ничего делать не надо - gpg входит в поставку ОС. Чтобы gpg создал нужные ему папки - запускаем gpgtool. Он предложит создать новый приватный ключ - игнорируем, просто закрываем программу.

После установки пакета надо добавить в ~/.bashrc следующие строки:

export GPG_TTY="$(tty)"
export SSH_AUTH_SOCK=$(/usr/local/MacGPG2/bin/gpgconf --list-dirs agent-ssh-socket)
if ! pgrep gpg-agent &> /dev/null; then
    echo "gpg-agent not running"
    /usr/local/MacGPG2/bin/gpg-agent --homedir /Users/YOUR_LOGIN/.gnupg --daemon
fi

Обратите внимание, что вам нужно поменять логин на свой

Также надо указать pinentry и включить поддежку ssh-agent в файле ~/.gnupg/gpg-agent.conf:

default-cache-ttl 600
max-cache-ttl 7200
pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac
enable-ssh-support

Теперь можно подключить yubikey. Проверим, что карта подключилась и определилась:

tungsten> gpg --card-edit

Reader ...........: Yubico Yubikey 4 OTP U2F CCID
Application ID ...: D2760001240102010006070171690000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07017169
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
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card>

Отлично, карта есть, можно настраивать. Первое, что нужно поменять - pin-коды карты. У карты два pin-кода:

  • User PIN - отвечает за проверку авторизации самой карты. Его нужно ввести, чтобы использовать ключ (зашифровать, расшифровать данные или авторизоваться)
  • Admin PIN - отвечает за настройку карты. Он позволяет управлять содержимым карты или ее настройками.

Не смотря на названия, PIN-коды - это полноценные пароли длинной до 127 символов включительно. Пароли имеют ограничения - там нельзя использовать символы национальных алфавитов и спецсимволы. То есть – можно только английские буквы и цифры. Кроме того, Admin PIN должен быть не менее 8 символов длинной. Yubikey никак не предупредит об этом, но pin короче 8 символов просто не запишется. При смене PIN-кода спросят старый PIN. PIN-коды по умолчанию:

  • User PIN: 123456
  • Admin PIN: 12345678

Переключимся в админ-режим и поменяем пины:

gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. D2760001240102010006070171690000 detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 1
PIN changed.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 3
PIN changed.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q

Небольшая ремарка про PIN-ы. Карта считает все неуспешные попытки использования PIN-кода. Если ввести PIN-код неправильно несколько раз подряд – он блокируется. User PIN можно разблокировать с помощью Admin PIN. Заблокированный Admin PIN разблокировать нельзя никак. Карту можно полностью сбросить командой factory-reset - при этом все ее содержимое будет безвозвратно уничтожено. Для factory-reset никакие пин-коды не нужны. Счетчик неуспешных попыток сбрасывается, если ввести PIN правильно.

Теперь рекомендуется персонализировать карту - внести в нее информацию о себе. Это мало на что влияет, но имя будет отображаться в диалоге ввода PIN (что облегчает идентификацию карты). Кроме того, общую информацию о карте можно прочитать без кода – это может помочь, если вы потеряете карту. Важный параметр - url, это адрес, с которого можно будет скачать ваш публичный ключ:

gpg/card> name
Cardholder's surname: Rudnitskiy
Cardholder's given name: Paul

gpg/card> sex
Sex ((M)ale, (F)emale or space): M

gpg/card> lang
Language preferences: en

gpg/card> login
Login data (account name): logan

gpg/card> url
URL to retrieve public key: https://prudnitskiy.pro/gpg.pub

Карта готова и теперь можно экспортировать ключ на нее или создать ключ прямо на ней. Если у вас нет ключа - я рекомендую прямо на карте его и создавать. Если ключ уже есть – ниже есть раздел о том, как перенести ключ на карту

Генерация ключа на Yubikey

Перед тем, как создавать ключ - я рекомендую поменять его размер. По умолчанию Yubikey создает один мастер-ключ и два сабключа:

  • Master + Certify
  • SUB1 - Encryption
  • SUB2 – Authentication

Все три ключа по умолчанию - RSA2048. RSA4096 выглядит намного интереснее. Поменяем:

gpg/card> key-attr
Changing card key attribute for: Signature key
Please select what kind of key you want:
(1) RSA
(2) ECC
Your selection? 1
What keysize do you want? (2048) 4096
The card will now be re-configured to generate a key of 4096 bits
Changing card key attribute for: Encryption key
Please select what kind of key you want:
(1) RSA
(2) ECC
Your selection? 1
What keysize do you want? (2048) 4096
The card will now be re-configured to generate a key of 4096 bits
Changing card key attribute for: Authentication key
Please select what kind of key you want:
(1) RSA
(2) ECC
Your selection? 1
What keysize do you want? (2048) 4096
The card will now be re-configured to generate a key of 4096 bits
gpg: error changing key attribute for key 3: Bad PIN
Changing card key attribute for: Authentication key
Please select what kind of key you want:
(1) RSA
(2) ECC
Your selection? 1
What keysize do you want? (2048) 4096
The card will now be re-configured to generate a key of 4096 bits

Внимание! Если у вас Yubikey Neo - вы не можете использовать 4096-битные ключи.

Теперь (наконец-то!) приступим к созданию ключей. Вопрос политики устаревания ключей в целом довольно дискуссионный, и тут я не могу ничего порекомендовать. В данном примере я создам мастер-ключ с бесконечным сроком жизни, а саб-ключи мы потом отредактируем и они будут жить по 5 лет. В процессе создания ключа GPG спросит пароль для шифрования off-card резервной копии. Она вам потребуется, если вы потеряете физический ключ. Off-card экспортируется только subkey для шифрования (capability - E). Остальные sub-ключи и мастер-ключ останутся на карте и вынуть оттуда их нельзя. Процесс генерации ключа зависит от выбранного размера ключа (4096 бит будет генерироваться дольше, чем 2048):

gpg/card> generate
Make off-card backup of encryption key? (Y/n) y
Please specify how long the key should be valid.
        0 = key does not expire
    <n>  = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Paul Rudnitskiy
Email address: [email protected]
Comment: YBKey
You selected this USER-ID:
    "Paul Rudnitskiy (YBKey) <[email protected]>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
[...]
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: Note: backup of card key saved to '/Users/logan/.gnupg/sk_8E0418955A55C1A8.gpg'
gpg: key 9ECF9961A551A45B marked as ultimately trusted
gpg: revocation certificate stored as '/Users/logan/.gnupg/openpgp-revocs.d/707C3210B50A430B555DD6AC9ECF9961A551A45B.rev'
public and secret key created and signed.

Ключ готов. Резервную копию забираем из /Users/logan/.gnupg/sk_8E0418955A55C1A8.gpg (у вас место будет другим) и прячем в надежное место. Пароль резервной копии тоже прячем в надежное место, но другое. Обязательно удалите резервную копию с той машины, где вы работаете с ключом.

Проверим, что ключ сгенерировался:

gpg/card> list

Reader ...........: Yubico Yubikey 4 OTP U2F CCID
Application ID ...: D2760001240102010006070171690000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07017169
Name of cardholder: Paul Rudnitskiy
Language prefs ...: en
Sex ..............: male
URL of public key : [not set]
Login data .......: logan
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 4
Signature key ....: 707C 3210 B50A 430B 555D  D6AC 9ECF 9961 A551 A45B
    created ....: 2018-08-07 07:58:18
Encryption key....: 062A ABF7 6FB0 8EF4 0E97  4B47 8E04 1895 5A55 C1A8
    created ....: 2018-08-07 07:58:18
Authentication key: 6A41 D75C 2B56 41FC A7F4  8DBE CC02 AF33 8EE7 E338
    created ....: 2018-08-07 07:58:18
General key info..: pub  rsa4096/9ECF9961A551A45B 2018-08-07 Paul Rudnitskiy (YBKey) <[email protected]>
sec>  rsa4096/9ECF9961A551A45B  created: 2018-08-07  expires: never
                                card-no: 0006 07017169
ssb>  rsa4096/CC02AF338EE7E338  created: 2018-08-07  expires: never
                                card-no: 0006 07017169
ssb>  rsa4096/8E0418955A55C1A8  created: 2018-08-07  expires: never
                                card-no: 0006 07017169

Все в порядке, уходим:

gpg/card> quit

Теперь зададим срок жизни сабключей. Он нужен для того, чтобы если по какой-то причине вы потеряли доступ к копии ключа – им нельзя было пользовать после истечения срока жизни ключа. Для этого надо выйти из режима редактирования карты и отредактировать ключ. Редактивровать мы будем SEC-ключ, в этом примере это 9ECF9961A551A45B:

tungsten> gpg --edit-key 9ECF9961A551A45B
gpg (GnuPG/MacGPG2) 2.2.8; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   5  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 5u
gpg: next trustdb check due at 2024-05-30
sec  rsa4096/9ECF9961A551A45B
    created: 2018-08-07  expires: never       usage: SC
    card-no: 0006 07017169
    trust: ultimate      validity: ultimate
ssb  rsa4096/CC02AF338EE7E338
    created: 2018-08-07  expires: never       usage: A
    card-no: 0006 07017169
ssb  rsa4096/8E0418955A55C1A8
    created: 2018-08-07  expires: never       usage: E
    card-no: 0006 07017169
[ultimate] (1). Paul Rudnitskiy (YBKey) <[email protected]>

Команда key NUM выберет ключ для редактирования. Чтобы снять выбор - нужно ввести ее повторно:

gpg> key 1

sec  rsa4096/9ECF9961A551A45B
    created: 2018-08-07  expires: never       usage: SC
    card-no: 0006 07017169
    trust: ultimate      validity: ultimate
ssb* rsa4096/CC02AF338EE7E338
    created: 2018-08-07  expires: never       usage: A
    card-no: 0006 07017169
ssb  rsa4096/8E0418955A55C1A8
    created: 2018-08-07  expires: never       usage: E
    card-no: 0006 07017169
[ultimate] (1). Paul Rudnitskiy (YBKey) <[email protected]>

Меняем срок жизни:

gpg> expire
Changing expiration time for a subkey.
Please specify how long the key should be valid.
        0 = key does not expire
    <n>  = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
Key is valid for? (0) 5y
Key expires at Sun Aug  6 11:01:18 2023 MSK
Is this correct? (y/N) y

sec  rsa4096/9ECF9961A551A45B
    created: 2018-08-07  expires: never       usage: SC
    card-no: 0006 07017169
    trust: ultimate      validity: ultimate
ssb* rsa4096/CC02AF338EE7E338
    created: 2018-08-07  expires: 2023-08-06  usage: A
    card-no: 0006 07017169
ssb  rsa4096/8E0418955A55C1A8
    created: 2018-08-07  expires: never       usage: E
    card-no: 0006 07017169
[ultimate] (1). Paul Rudnitskiy (YBKey) <[email protected]>

Снимаем выделение первого ключа и меняем второй по аналогии:

gpg> key 1

sec  rsa4096/9ECF9961A551A45B
    created: 2018-08-07  expires: never       usage: SC
    card-no: 0006 07017169
    trust: ultimate      validity: ultimate
ssb  rsa4096/CC02AF338EE7E338
    created: 2018-08-07  expires: 2023-08-06  usage: A
    card-no: 0006 07017169
ssb  rsa4096/8E0418955A55C1A8
    created: 2018-08-07  expires: never       usage: E
    card-no: 0006 07017169
[ultimate] (1). Paul Rudnitskiy (YBKey) <[email protected]>

gpg> key 2

sec  rsa4096/9ECF9961A551A45B
    created: 2018-08-07  expires: never       usage: SC
    card-no: 0006 07017169
    trust: ultimate      validity: ultimate
ssb  rsa4096/CC02AF338EE7E338
    created: 2018-08-07  expires: 2023-08-06  usage: A
    card-no: 0006 07017169
ssb* rsa4096/8E0418955A55C1A8
    created: 2018-08-07  expires: never       usage: E
    card-no: 0006 07017169
[ultimate] (1). Paul Rudnitskiy (YBKey) <[email protected]>

gpg> expire
Changing expiration time for a subkey.
Please specify how long the key should be valid.
        0 = key does not expire
    <n>  = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
Key is valid for? (0) 5y
Key expires at Sun Aug  6 11:01:29 2023 MSK
Is this correct? (y/N) y

sec  rsa4096/9ECF9961A551A45B
    created: 2018-08-07  expires: never       usage: SC
    card-no: 0006 07017169
    trust: ultimate      validity: ultimate
ssb  rsa4096/CC02AF338EE7E338
    created: 2018-08-07  expires: 2023-08-06  usage: A
    card-no: 0006 07017169
ssb* rsa4096/8E0418955A55C1A8
    created: 2018-08-07  expires: 2023-08-06  usage: E
    card-no: 0006 07017169
[ultimate] (1). Paul Rudnitskiy (YBKey) <[email protected]>

gpg> save

Ключ на карте готов к использованию

Перенос существующего ключа на Yubikey

Этот раздел вам нужен, если у вас уже есть gpg-ключ и вы хотите его перенести на карту. Вы не сможете экспортировать приватный ключ с карты yubikey.

После того, как карта сконфигурирована, открываем режим редактирования ключа:

tungsten> gpg --expert --edit-key 21F7B93A71CDF86D649D8D0661BEBC7784A83F16
gpg (GnuPG/MacGPG2) 2.2.8; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

Ключи переносятся командой keytocard. На Yubikey есть только три слота под три типа (capability) ключа:

  • Encryption key
  • Authentication key
  • Sign key

Если у вас больше ключей - то вы должны решить, какие ключи вы будете переносить. В примере выше - 2 sign ключа, по этому мастер мы переносить не будем - на yubikey уедут только три сабключа. Перед началом переноса ключей рекомендую сделать backup и положить его в безопасное место.

Выберем ключ для переноса:

gpg> key 1

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb* rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

Перенесем его:

gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb* rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

После переноса снимем выделение с него:

gpg> key 1

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

По аналогии перенесем 2 и 3 ключи:

gpg> key 2

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb* rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

gpg> keytocard
Please select where to store the key:
(3) Authentication key
Your selection? 3

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb* rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

gpg> key 2

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

gpg> key 3

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb* rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb* rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[ultimate] (1). Paul Rudnitskiy <[email protected]>

Все перенесено, сохраним и проверим:

gpg> save

tungsten> gpg --card-edit

Reader ...........: Yubico Yubikey 4 OTP U2F CCID
Application ID ...: D2760001240102010006070171690000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07017169
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
Signature key ....: 21F7 B93A 71CD F86D 649D  8D06 61BE BC77 84A8 3F16
    created ....: 2018-08-08 14:51:38
Encryption key....: 7A30 6771 BB74 204F 54D5  8A61 1200 D2BB 8DFB 614C
    created ....: 2018-08-08 14:51:38
Authentication key: DDB0 62D0 1BB4 4D01 3819  E450 0BC3 AD72 9F05 D736
    created ....: 2018-08-08 14:54:07
General key info..: pub  rsa2048/61BEBC7784A83F16 2018-08-08 Paul Rudnitskiy <[email protected]>
sec#  rsa2048/61BEBC7784A83F16  created: 2018-08-08  expires: 2022-08-08
ssb>  rsa2048/1200D2BB8DFB614C  created: 2018-08-08  expires: 2022-08-08
                                card-no: 0006 07017169
ssb>  rsa2048/0BC3AD729F05D736  created: 2018-08-08  expires: 2022-08-07
                                card-no: 0006 07017169
ssb>  rsa2048/FAF7641B57B14FF2  created: 2018-08-08  expires: 2022-08-07
                                card-no: 0006 07017169

Обратите внимание, что мастер-ключ не лежит на карте – он пока еще хранится на компьютере (и внутри бэкапа). Имея доступ к мастер-ключу - можно редактировать срок жизни sub-ключа или отозвать (revoke) его. Очень важно хранить мастер в безопасности. Для этого мы вынесем его в холодное хранилище:

  • у вас должна быть резервная копия мастер-ключа
  • экспортируем публичный ключ
  • удалим все секретные ключи с компьютера
  • импортируем обратно публичный ключ, сделав его доверенным

Экспортируем публичный ключ:

gpg --export --armour 61BEBC7784A83F16 > pub.asc

Уберем из компьютера yubikey и удалим приватный ключ:

gpg --edit-key 61BEBC7784A83F16
gpg> delkey

импортируем публичный ключ обратно:

gpg --import < pub.asc

повысим ему уровень доверия

gpg --edit-key 61BEBC7784A83F16
gpg> trust

sec  rsa2048/61BEBC7784A83F16
    created: 2018-08-08  expires: 2022-08-08  usage: SC
    trust: ultimate      validity: ultimate
ssb  rsa2048/1200D2BB8DFB614C
    created: 2018-08-08  expires: 2022-08-08  usage: E
ssb  rsa2048/0BC3AD729F05D736
    created: 2018-08-08  expires: 2022-08-07  usage: A
ssb  rsa2048/FAF7641B57B14FF2
    created: 2018-08-08  expires: 2022-08-07  usage: S
[none] (1). Paul Rudnitskiy <[email protected]>

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

Теперь проверим, что ключи на карте видны:

tungsten> gpg --card-edit

Reader ...........: Yubico Yubikey 4 OTP U2F CCID
Application ID ...: D2760001240102010006070171690000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07017169
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
Signature key ....: 21F7 B93A 71CD F86D 649D  8D06 61BE BC77 84A8 3F16
    created ....: 2018-08-08 14:51:38
Encryption key....: 7A30 6771 BB74 204F 54D5  8A61 1200 D2BB 8DFB 614C
    created ....: 2018-08-08 14:51:38
Authentication key: DDB0 62D0 1BB4 4D01 3819  E450 0BC3 AD72 9F05 D736
    created ....: 2018-08-08 14:54:07
General key info..: pub  rsa2048/61BEBC7784A83F16 2018-08-08 Paul Rudnitskiy <[email protected]>
sec#  rsa2048/61BEBC7784A83F16  created: 2018-08-08  expires: 2022-08-08
ssb>  rsa2048/1200D2BB8DFB614C  created: 2018-08-08  expires: 2022-08-08
                                card-no: 0006 07017169
ssb>  rsa2048/0BC3AD729F05D736  created: 2018-08-08  expires: 2022-08-07
                                card-no: 0006 07017169
ssb>  rsa2048/FAF7641B57B14FF2  created: 2018-08-08  expires: 2022-08-07
                                card-no: 0006 07017169

Отлично, ключи видны, можно пользоваться.

Выводы

Использование gpg-ключа с карты практически ничем не отличается от использования ключа без карты. Для авторизации по ssh с использованием ключа вам потребуется RSA pubkey. Он создается от gpg subkey A (Auth capability). Если вы меняете auth-ключ – ssh-ключ поменяется тоже, имейте ввиду. Чтобы его получить - достаточно набрать команду ssh-add -L

ssh-add -L
ssh-rsa AAAAB***************************** cardno:00007017169

Комментарий cardno подскажет, что ключ был импортирован из yubikey

На каждую попытку использовать ключ yubikey будет требовать ввод User PIN. Yubikey весьма безопасен и надежен, если не делать глупых ошибок в его использовании и применении. И разумеется - нельзя забывать о бэкапах.