Создание ключей на токене
Подготовим токен.
$ pkcs15-init -E$ pkcs15-init --create-pkcs15 --so-pin"87654321"--so-puk""$ pkcs15-init --store-pin --label"User PIN"--auth-id02 --pin"12345678"--puk""--so-pin"87654321"--finalizeВ параметрах pin и so-pin можно указать желаемые пин-коды пользователя и администратора.
Создаем ключевую пару RSA длины 2048 бит c ID "45" (id стоит запомнить, он понадобится при создании сертификата). Аутентификация на токене происходит под сущностью пользователя.
$ pkcs15-init --generate-key rsa/2048--auth-id02 --id45<вводим PIN пользователя>Проверим сгенерированный ключ:
$ pkcs15-tool --list-keysUsing reader with a card: Aktiv Rutoken ECP 00 00Private RSA Key [Private Key]Object Flags : [0x3], private, modifiableUsage : [0x4], signAccess Flags : [0x1D], sensitive, alwaysSensitive, neverExtract,localModLength : 2048Key ref : 1 (0x1)Native :yesPath : 3f001000100060020001Auth ID : 02ID : 45Создание сертификата и импорт его на токен
Определите URI RFC7512 ключа:$ pkcs15-init --generate-key rsa/2048--auth-id02 --id45<вводим PIN пользователя>В нашем случае мы будем использовать вариант без
%28sig%29, я буду называть его$TOKEN_URI. Я буду использовать ключ аутентификации как личный. Нам нужно будет определить URI закрытого ключа, который мы хотим использовать. Для этого используйтеp11toolеще раз:$ p11tool --outfile=/tmp/p11_output --login --list-all $TOKEN_URI
Этот вывод будет содержать следующую информацию:Нам понадобится
URLполе, которое я буду называть$KEY_URIТеперь у нас есть все необходимое для создания либо самозаверяющего сертификата, либо запроса на подпись сертификата (CSR), который будет отправлен в центр сертификации для подписи.
$openssl req -engine pkcs11 -new -key "$KEY_URI" -keyform engine -x509 -out cert.pem -textСохраняем сертификат на токен:
$ pkcs11-tool-l -y cert -w cert.pem --id45- Создание раздела LUKS
Для просмотра всех дисков в системе, используйте команду:
$ lsblk
Получим вывод по типу следующего
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
zram0 252:0 0 3,8G 0 disk [SWAP]
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
├─nvme0n1p2 259:2 0 1G 0 part /boot
└─nvme0n1p3 259:3 0 19G 0 part /home
/
nvme0n2 259:4 0 2G 0 diskНаходим наш диск и запоминаем его название для последующих команд (в данном случае это - nvme0n2)
Очистка диска
На этом шаге обнуляем таблицу разделов диска:$ sudo dd if=/dev/zero of=/dev/nvme0n2 count=4096
*Это не обязательноОтформатируйте диск под LUKS
Используем для этого утилиту Cryptsetup. Её подкоманда luksFormat запускает первый этап создания зашифрованного раздела LUKS.
После этого появится предупреждение об удалении всех данных (которые могли всё ещё оставаться на диске). Кроме того, вас попросят придумать и ввести парольную фразу для диска.$ sudo cryptsetup luksFormat /dev/nvme0n2 WARNING! ======== This will overwrite data on /dev/sdX irrevocably. Are you sure? (Type uppercase yes): YES Enter passphrase: Verify passphrase:Откройте LUKS-том
Процесс создания зашифрованного раздела завершён. Теперь для продолжения работы с диском нужно вводить парольную фразу. Открыть произвольный LUKS-том (то есть, подключить виртуальное блочное устройство) можно с помощью подкоманды open.$ cryptsetup open /dev/nvme0n2 vaultdrive
Я придумал фразу (а точнее, просто пароль в одно слово) «vaultdrive». У вас будет какой-то свой вариант. Чтобы посмотреть список открытых томов, нужно вывести содержимое каталога /dev/mapper:$ ls /dev/mapper control vaultdrive
Чтобы закрыть LUKS-том vaultdrive нужно написать:$ cryptsetup close vaultdrive
После этого он исчезнет из каталога /dev/mapper.Создайте файловую систему
$ sudo mkfs.xfs -f -L myvault /dev/mapper/vaultdrive
Создайте файловую систему, чтобы иметь возможность хранить свои данные на диске. Я выбрал XFS, но это далеко не единственный вариант: можно использовать, например, ext4 или JFS. И многие другие.
Настройка LUKS
Итак, мы укажем URI вручную. Для начала узнаем URI сертификата:p11tool --outfile=/tmp/p11_output --login --list-all $TOKEN_URI ... URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=ZeitControl;...User%20PIN%29;id=%03;object=Cardholder%20certificate;type=cert...
«URL» выше — это URI нашего сертификата,$CERT_URI. Теперь мы можем зарегистрировать его:$systemd-cryptenroll --pkcs11-token-uri="$CERT_URI" /dev/nvme0n2
Если мы проверим выводcryptsetup luksDump /dev/sdXn, мы увидим, что токен зарегистрирован:... Keyslots: 0: luks2 ... 1: luks2 ... Tokens: 1: systemd-pkcs11 Keyslot: 1 ...
Давайте укажем дляsystemd-cryptsetupправильный URI закрытого ключа в заголовке. Сначала сбросим заголовок, запустив команду:$cryptsetup token export -token-id 1 > header.json
Откроемheader.jsonв своем любимом редакторе, замените значение «pkcs11-uri» на значение$KEY_URIсекретного ключа, который мы нашли ранее, импортируйте его обратно и удалите старый токен:~# cryptsetup token import --json-file header.json --token-id $NEW_TOKEN_ID /dev/nvme0n2~# cryptsetup token remove --token-id $OLD_TOKEN_ID /dev/nvme0n2
Теперь мы можем проверить, работает ли разблокировка:~# /lib/systemd/systemd-cryptsetup attach luks /dev/sdXn - pkcs11-uri="auto" Set cipher aes, mode xts-plain64, key size 512 bits for device /dev/disk/by-uuid/65b6de87-2fe1-41f7-b99e-6113bbc8c905. Automatically discovered security PKCS#11 token 'pkcs11:model=PKCS%2315%20emulated;manufacturer=ZeitControl;...User%20PIN%29;id=%03;object=Authentication%20key;type=private' unlocks volume. Please enter PIN for security token 'OpenPGP card (User PIN)' in order to unlock luks: **************** Successfully logged into security token 'OpenPGP card (User PIN)'. Successfully decrypted key with security token.