Page tree

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

       Установка необходимых пакетов

$ sudo dnf install gnutls-utils openssl




        Создание ключей на токене

  1. Подготовим токен. 

    $ pkcs15-init -E
    $ pkcs15-init --create-pkcs15 --so-pin "87654321" --so-puk ""
    $ pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin "12345678" --puk "" --so-pin "87654321" --finalize

    В параметрах pin и so-pin можно указать желаемые пин-коды пользователя и администратора.

  2. Создаем ключевую пару RSA длины 2048 бит c ID "45" (id стоит запомнить, он понадобится при создании сертификата). Аутентификация на токене происходит под сущностью пользователя.

    $ pkcs11-tool --keypairgen --key-type rsa:2048 -l --id 45
    <вводим PIN пользователя>

     

  3. Проверим сгенерированный ключ:

    $ pkcs15-tool --list-keys
    Using reader with a card: Aktiv Rutoken ECP 00 00
    Private RSA Key [Private Key]
     Object Flags : [0x3], private, modifiable
     Usage : [0x4], sign
     Access Flags : [0x1D], sensitive, alwaysSensitive, neverExtract, local
     ModLength : 2048
     Key ref : 1 (0x1)
     Native : yes
     Path : 3f001000100060020001
     Auth ID : 02
     ID : 45

    Создание сертификата и импорт его на токен

  4. Определите 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


    Этот вывод будет содержать следующую информацию:

    ...
    Object 0:
        URL: pkcs11:model=PKCS%2315;manufacturer=Aktiv%20Co.;serial=0000000042545d2e;token=Rutoken%20ECP%20%28User%20PIN%29;id=%45;object=Private%20Key;type=private
        Type: Private key (RSA-2048)
        Label: Private Key
        Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; 
        ID: 45
    ...
    Нам понадобится 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 убрать ключ -x509, то на выходе получим заявку на сертификат.


    Формируем самоподписанный сертификат или заявку на сертификат:


    $ 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"


  5. Сохраняем сертификат на токен:

    $ pkcs11-tool -l -y cert -w cert.pem --id 45



  6. Создание раздела 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.

    $ sudo cryptsetup 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_URI
     

    Object 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: 45

    Object 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: 45

    Object 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. Теперь мы можем зарегистрировать его:

    $ sudo systemd-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.






  • No labels