dmcrypt: Что происходит, когда отсутствует пользовательская криптооболочка?
Я пытаюсь настроить зашифрованный том для безопасного хранения файлов. Это делается с помощью карманного чипа NextThingCo, но ОС основана на Debian, поэтому я догадался, что сначала попробую, так как мой вопрос больше связан с dmcrypt, чем с самой платформой (или я так думаю).
Рецепт, который я создал до сих пор, следующий (может быть неправильным или слишком сложным):
- Создать файл
- Установите это как устройство петли.
- Сделайте crypsetup для форматирования и откройте. "abc" - это пароль, передаваемый через стандартный ввод (верно ли это предположение?).
- Сделать файловую систему
- гора
Так это выглядит так:
sudo dd if=/dev/urandom of=./encrypted.volume bs=512K count=200
sudo losetup /dev/loop0 ./encrypted.volume
echo "abc" | sudo cryptsetup luksFormat /dev/loop0
echo "abc" | sudo cryptsetup open /dev/loop0 vault
sudo mkfs /dev/mapper/vault
sudo mount /dev/mapper/vault /mnt/vault
Теперь все это работает нормально, пока я не использовал параметр --debug (я хотел попробовать и другие параметры, например, размер ключа). И я понял следующие сообщения:
# cryptsetup 1.7.0 processing "cryptsetup -v --debug --cipher aes-xts-plain64 --key-size
512 --hash sha512 --iter-time 5000 --timeout 10 --use-random luksFormat /dev/loop0"
# Running command luksFormat.
...
# Userspace crypto wrapper cannot use aes-xts-plain64 (-95).
...
device-mapper: remove ioctl on temporary-cryptsetup-6661 failed: Device or resource busy <------ appears when I change the --key-size to 512 i.s.o. default 256
...
device-mapper: remove ioctl on temporary-cryptsetup-6698 failed: Device or resource busy
Я тоже попробовал запустить тест:
chip@chip:~/data/run$ sudo cryptsetup --debug benchmark
[sudo] password for chip:
# cryptsetup 1.7.0 processing "cryptsetup --debug benchmark"
# Running command benchmark.
# Installing SIGINT/SIGTERM handler.
# Unblocking interruption on signal.
# Tests are approximate using memory only (no storage IO).
# Crypto backend (gcrypt 1.6.4) initialized in cryptsetup library version 1.7.0.
# Detected kernel Linux 4.4.13-ntc-mlc armv7l.
# KDF pbkdf2, hash sha1: 59041 iterations per second (256-bits key).
PBKDF2-sha1 59041 iterations per second for 256-bit key
# KDF pbkdf2, hash sha256: 79437 iterations per second (256-bits key).
PBKDF2-sha256 79437 iterations per second for 256-bit key
# KDF pbkdf2, hash sha512: 40705 iterations per second (256-bits key).
PBKDF2-sha512 40705 iterations per second for 256-bit key
# KDF pbkdf2, hash ripemd160: 50412 iterations per second (256-bits key).
PBKDF2-ripemd160 50412 iterations per second for 256-bit key
# KDF pbkdf2, hash whirlpool: 7481 iterations per second (256-bits key).
PBKDF2-whirlpool 7481 iterations per second for 256-bit key
# Cannot initialise cipher aes, mode cbc.
Required kernel crypto interface not available.
Command failed with code 95: Operation not supported
Вот дополнительная информация о платформе и ОС:
chip@chip:~/data/run$ uname -r
4.4.13-ntc-mlc
chip@chip:~/data/run$ cat /boot/config-4.4.13-ntc-mlc | grep CRYPTO_USER_API_SKCIPHER
# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
Я понимаю, что мне нужно будет перекомпилировать ядро после установки CONFIG_CRYPTO_USER_API_SKCIPHER, чтобы крипто API пользовательского пространства стал доступен. Я не думаю, что есть способ обойти это, не так ли?
Я LuksDump информацию о файле хранения:
chip@chip:~/data/run$ sudo cryptsetup luksDump ./encrypted.volume
LUKS header information for ./encrypted.volume
Version: 1
Cipher name: aes <------- ???
Cipher mode: xts-plain64 <------- ???
Hash spec: sha256
Payload offset: 4096
MK bits: 256
MK digest: ee f8 8d ad 9b 67 d9 7d cb 20 fe a9 25 a3 8b a5 c2 65 56 dd
MK salt: 38 74 e8 9d 77 6a 93 b5 03 41 cb 3e ce 79 b4 00
55 f3 98 8f c5 a7 14 05 25 9c 4e 91 68 1a 53 37
MK iterations: 18500
UUID: 36912ea4-9adb-4d1f-b9f2-f6a09a258833
Key Slot 0: ENABLED
Iterations: 150587
Salt: e8 4f f3 c1 07 1a 2b 2d d2 d9 f4 55 0f b3 13 28
2a 69 06 aa a0 94 4a 05 5d 5f e9 28 9b 91 39 94
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Однако у меня есть несколько вопросов о текущей ситуации:
- Действительно ли раздел зашифрован? Если да, то по какой схеме?
- Как проверить это в командной строке? Попытка выгрузить информацию о разделе говорит мне, что "есть заголовок LUKS", но это не говорит мне, зашифрованы ли данные или нет.
- Как решить ситуацию с 'ресурсом занятым', который позволил бы мне использовать размер ключа 512?
Спасибо, что прочитали весь путь здесь. Любые указатели будут с благодарностью.
РЕДАКТИРОВАТЬ (08/12/17):
- Последние строки crypsetup --help
:
<name> is the device to create under /dev/mapper
<device> is the encrypted device
<key slot> is the LUKS key slot number to modify
<key file> optional key file for the new key for luksAddKey action
Default compiled-in key and passphrase parameters:
Maximum keyfile size: 8192kB, Maximum interactive passphrase length 512 (characters)
Default PBKDF2 iteration time for LUKS: 2000 (ms)
Default compiled-in device cipher parameters:
loop-AES: aes, Key 256 bits
plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160
LUKS1: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha256, RNG: /dev/urandom
- вывод / proc / crypto: https://gist.github.com/anonymous/1dc9fd345e631fd9fc59c88120c6f8a5
1 ответ
Похоже, ваше ядро не поддерживает 512-битные ключи с aes-xts-plain64 и вообще не поддерживает режим aes cbc:
# Cannot initialise cipher aes, mode cbc.
Required kernel crypto interface not available.
Command failed with code 95: Operation not supported
но это просто останавливает тест, в любом случае xts предпочтительнее, чем cbc. Я думаю, что вы могли бы получить больше режимов, перестраивая / получая новое ядро (или, возможно, modprobeing, я не уверен на 100%).
Есть немного противоречивой информации об aes с 512-битными ключами, этот вопрос на crypto.SE говорит, почему мы не можем реализовать размер ключа AES 512? и приходит к выводу, что это просто не определено / поддерживается, но с использованием --cipher aes-xts-plain64 --key-size 512
отлично работает для моего cryptsetup (v1.7.3), и в моем /proc/crypto есть запись xts(aes), поддерживающая размеры ключей 32-64 байта.
- Во всяком случае, из luksDump
./encrypted.volume
Файл выглядит зашифрованным с помощью aes в режиме xts-plain64 (aes-xts-plain64). По крайней мере, все, что записано в него, будет зашифровано, оно не будет затронуто, если вы не сделали luksOpen-ed и не записали в него. ./encrypted.volume
это не отдельный раздел диска, это просто файл / контейнер.Вы будете использовать много вашей энтропии, используя
dd
взять 100M (512*200?) из /dev/urandom, и это не нужно. Создание файла контейнера с использованием нулей - это нормально (или простоfallocate
). Как только он будет отформатирован, вы заполните его нулями, которые будут зашифрованы и записаны на диск.- Смотрите раздел настройки https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions
- Что последние 10 строк или около того
cryptsetup --help
? Это скажет, что по умолчанию. - Что в
/proc/crypto
? Он покажет вам доступные методы шифрования. - Кроме того, последние файлы cryptsetup обрабатывают сами циклические файлы, так что вы можете пропустить потерянный запуск и позволить cryptsetup обработать его.
- Если ваша оболочка сохраняет историю, ваша фраза-пароль ("abc") может храниться в незашифрованном виде, это не здорово. Это может быть видно из
ps
тоже, если в нем перечислены полные командные строки. Использование другого способа передачи ключевой фразы в stdin может быть более безопасным, или использование ключевого файла на защищенном носителе (внешнем USB/ устройстве) или в ramfs и т. Д. См. 2.14 в FAQ.