Re: RuToken и luks (Linux)

Здравствуйте! Есть интерес использовать ruToken для разблокировки на этапе загрузки LVM, защищённых dm-crypt & LUKS. «Astra Linux Special Edition» пока что не интересует, т. к. на сегодня поставок ещё не было, поэтому для начала прошу подсказать, как все довести до рабочего состояния для варианта с Debian (stable).

Итак, текущий вариант: для универсальности рассматриваем компьютер с Debian 9.4 Stretch, где СЗИ от НСД не установлена, есть под рукой ruToken ECP и ruToken S (в пределах территориального органа их очень много, желание повысить защищенность информации), SSD разбит на тома 1) /boot и 2) CryptLVM, в последнем в свою очередь тома swap, /, /tmp и /home. Дополнительно, хотя для поставленной цели это неважно, реализована двухфакторная аутентификация пользователя по инструкции отсюда — https://dev.rutoken.ru/pages/viewpage.a … Id=3440665 с имеющимся сертификатом.

В реализации работы с LUKS для простоты и отдельных своих соображений опять-таки первоначально пробую реализовать вариант с ruToken ECP, обращаться к librtpkcs11ecp.so, но не к pkcs15, а также заведомо не прибегаю к ассиметричному шифрованию.

Мои действия:
1) создаю симметричный ключ шифрования, который в случае чего можно будет использовать просто, как пароль, записываю его в ruToken ECP и в один из слотов LUKS:

LUKS_KEY=`openssl rand -base64 99` && echo "$LUKS_KEY" >> ~/LVM_LUKS.tmp
dd if=~/LVM_LUKS.tmp of=~/LVM_LUKS.key bs=1 skip=0 count=64
shred ~/LVM_LUKS.tmp
rm ~/LVM_LUKS.tmp
sudo cryptsetup luksAddKey /dev/sda2 ~/LVM_LUKS.key
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --login --write-object ~/LVM_LUKS.key --type data --label LVM_LUKS.key --application-label cryptsetup --private
shred ~/LVM_LUKS.key
rm ~/LVM_LUKS.key

2) создаю папку /crypto, а в ней файл «luks_unlock.sh» с атрибутами 0755 (при этом рабочий файл luks_unlock.sh делаю без комментариев и пустых строк):

#!/bin/bash -i
PATH=$PATH:/usr/bin

# Use RAM-disk for temporary storage
# Unlike tmpfs, ramfs does not use swap, making it
# somewhat more suitable for keeping data off persistent storage.
RAMDISK="/crypto/ram"
mkdir -p $RAMDISK
mount -t ramfs -o size=1m ramfs $RAMDISK
chmod -R u=rwx,g=,o= $RAMDISK

# Plaintext written to RAM at this location
DESTINATION=$RAMDISK/luks_output

# Ensure PCSC daemon is running
pcscd -d

echo "Decrypting LUKS volume with card from $CRYPTTAB_KEY (also $1)" >> /tmp/luks_status

# Run pkcs15-crypt on a different terminal
openvt -fsw -c 2 -- pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --login --read-object --type data --label LVM_LUKS.key --output-file $DESTINATION 2> /tmp/luks_errors

# This is used to unlock the disk
cat $DESTINATION

# Overwrite and remove copy on ramdisk
shred $DESTINATION
rm $DESTINATION

3) файл /etc/crypttab привожу к виду:

# <target> <device> <key file> <options> 
sda2_crypt UUID=56fe86c5-a589-4b52-a296-03c1eac5c54f none luks,keyscript=/crypto/unlock.sh 
# sda2_crypt UUID=56fe86c5-a589-4b52-a296-03c1eac5c54f none luks

4) выполняю команды ниже и перезагружаюсь

update-initramfs -u
update-grub

На этапе загрузки получаю ошибку: «openvt: can't execute pkcs11-tool no such file or directory»

Как это все исправить и довести до рабочего состояния? По возможности я хочу избежать работы с pkcs15 и асимметричного шифрования.

Re: RuToken и luks (Linux)

Добрый день, AgentOwl.

Попробуем у себя воспроизвести.

Re: RuToken и luks (Linux)

Скорее всего в initrd не упакован /usr/bin/pkcs11-tool.

P.S. У shred есть ключ -u. ☺
А почему после чтения ключа не размонтируется /crypto/ram?
И вообще, pkcs11-tool пишет (т.е. должен, судя по коду) в stdout, если не указан output-file.

(2018-04-12 09:11:58 отредактировано AgentOwl)

Re: RuToken и luks (Linux)

ettavolt пишет:

Скорее всего в initrd не упакован /usr/bin/pkcs11-tool...

Спасибо за подсказки :-)

Да, скорее всего, так оно и есть, вопрос, как бы его туда добавить тогда? Или это надо на форуме Debian спрашивать?

Оказывается, что в основной консоли (скрипт открывает дополнительную) также пишутся ошибки:

…sh: line 7: pcscd: not found
…sh: line: shred: not found

Что касается основных дополнений (не по части initrd) - это все найдено в сети и позаимствовано. Мне бы пока добиться для начала, чтобы на этапе загрузки ключ вообще прочитался из ruToken-а, потом, конечно, разберусь с остальным тщательно.

Re: RuToken и luks (Linux)

Добрый день, AgentOwl

Чтобы добавить что-то в initrd в Debian используется initramfs-tools (смотрите https://manpages.debian.org/stretch/ini … .8.en.html)

Re: RuToken и luks (Linux)

В общем пока я для себя лично пошел более простым путем и стал к тому же обладателем Yubikey 4.
Нужную информацию по реализации двухфакторной аутентификации с помощью Yubikey при монтировании зашифрованного раздела LUKS легко найти.
Я стараюсь Вас заинтересовать предложить аналогичную схему для ruToken ECP, и как показывает практика для очень распространенных ruToken S.

Re: RuToken и luks (Linux)

Добрый день, AgentOwl.

Рады, что Вам удалось решить свою задачу, хоть и с помощью Yubikey.
На самом деле аутентификация с помощью Yubikey не является двухфакторной. Здесь есть только один фактор -владения ключем. Любой, у кого есть ключ, сможет осуществить вход. В токенах для этого и есть дополнительный фактор - знания PIN кода, который и защищает от подобного сценария.

Реализовать аутентификацию в LUKS с помощью Рутокен S безопасно невозможно, так как он не является криптографическим токеном. Такой сценарий действительно можно реализовать с помощью Рутокен ЭЦП, а настройку сделать проще. Но пока Вы первый, кто обратился с таким сценарием. Как только этот сценарий станет распространенным, мы сделаем более удобные средства для настройки.