Установка необходимых пакетов
|
Создание ключей на токене
Подготовим токен.
$ 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 стоит запомнить, он понадобится при создании сертификата). Аутентификация на токене происходит под сущностью пользователя.
$pkcs11-tool --keypairgen --key-type rsa:2048-l --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 ключа:p11tool --list-all ... pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=0000000042545d2e;token=Rutoken%20ECP%20%28User%20PIN%29Будем называть его
$TOKEN_URI. Я буду использовать ключ аутентификации как личный. Нам нужно будет определить URI закрытого ключа, который мы хотим использовать. Для этого используйтеp11toolеще раз:$ p11tool --login --list-all $TOKEN_URI
Этот вывод будет содержать следующую информацию:Нам понадобится
URLполе, которое будем называть$KEY_URI
Создаём конфигурационный файл engine.conf со следующим содержанием:$openssl_conf = openssl_init[openssl_init]
engines = engine_section[engine_section]
pkcs11 = pkcs11_section[pkcs11_section]
engine_id = pkcs11
dynamic_path = /usr/lib64/engines-3/pkcs11.so
MODULE_PATH = /usr/lib64/opensc-pkcs11.so
default_algorithms = ALL
Формируем самоподписанный сертификат или заявку на сертификат:$ OPENSSL_CONF=/path/to/engine.conf openssl req -engine pkcs11 -x509 -new -key 0:45 -keyform engine -out client.pem -subj"/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=testuser/emailAddress=testuser@mail.com"Сохраняем сертификат на токен:
$ pkcs11-tool -l -y cert -w cert.pem --id 45- Создание раздела 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.$ sudocryptsetup open /dev/nvme0n2 vaultdrive
Чтобы посмотреть список открытых томов, нужно вывести содержимое каталога /dev/mapper:$ ls /dev/mapper control vaultdriveСоздаём файловую систему
$ sudo mkfs.xfs -f -L luks /dev/mapper/vaultdrive
Создайте файловую систему, чтобы иметь возможность хранить свои данные на диске. В нашем примере был выбран формат XFS, но это далеко не единственный вариант: можно использовать, например, ext4 или JFS. И многие другие.
Чтобы закрыть LUKS-том vaultdrive нужно написать:$ sudo cryptsetup close vaultdrive
После этого он исчезнет из каталога /dev/mapper.
Настройка LUKS
Для корректной настройки LUKS, необходимо указать URI ключа вручную. Для начала узнаем URI сертификата:$ p11tool --login --list-all $TOKEN_URIObject 0:
URL: pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=0000000042665828;token=Rutoken%20ECP%20%28User%20PIN%29;id=%45;object=Certificate;type=private
Type: Private key (RSA-2048)
Label: Certificate
Flags: CKA_PRIVATE;
ID: 45Object 1:
URL: pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=0000000042665828;token=Rutoken%20ECP%20%28User%20PIN%29;id=%45;object=Private%20Key;type=public
Type: Public key (RSA-2048)
Label: Private Key
ID: 45Object 2:
URL: pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=0000000042665828;token=Rutoken%20ECP%20%28User%20PIN%29;id=%45;object=Certificate;type=cert
Type: X.509 Certificate (RSA-2048)
Expires: Thu Dec 28 11:12:23 2023
Label: Certificate
ID: 45
Поле «URL» закрытого ключа будем обозначать как $KEY_URI.
Поле «URL» сертификата будем обозначать как$CERT_URI. Теперь мы можем зарегистрировать его:$ sudosystemd-cryptenroll --pkcs11-token-uri="$CERT_URI" /dev/nvme0n2
Вывод будет иметь вид:
Please enter current passphrase for disk /dev/nvme0n2: *********
Please enter PIN for security token 'Rutoken ECP (User PIN)' in order to unlock volume enrollment operation: ********
Successfully logged into security token 'Rutoken ECP (User PIN)'.
New PKCS#11 token enrolled as key slot 1.
Если мы проверим выводcryptsetup luksDump /dev/nvme0n2, мы увидим, что токен зарегистрирован:$ sudo cryptsetup luksDump /dev/nvme0n2... Keyslots: 0: luks2 ... 1: luks2 ... Tokens: 0: systemd-pkcs11 Keyslot: 1 ...
Давайте укажем дляsystemd-cryptsetupправильный URI закрытого ключа в заголовке. Сначала сбросим заголовок, запустив команду:$ sudo cryptsetup token export /dev/nvme0n2 --token-id=0 > header.json
Откроемheader.jsonв своем любимом редакторе, замените значение «pkcs11-uri» на значение$KEY_URIсекретного ключа, который мы нашли ранее, импортируем его обратно и удаляем старый токен:~# sudo cryptsetup token import --json-file header.json --token-id=$NEW_TOKEN_ID /dev/nvme0n2~# sudo cryptsetup token remove --token-id=$OLD_TOKEN_ID /dev/nvme0n2
Теперь мы можем проверить, работает ли разблокировка:~# sudo /lib/systemd/systemd-cryptsetup attach luks /dev/nvme0n2 - 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.