Назад | Перейти на главную страницу

Может ли cryptsetup читать сопоставления из / etc / crypttab?

У меня есть виртуализированный сервер CentOS 7, которому необходимо смонтировать несколько зашифрованных томов, защищенных паролем. Я не могу автоматически сопоставить устройства при загрузке, потому что у меня нет доступа к консоли во время процесса загрузки для ввода пароля дешифрования. После перезагрузки системы мне нужно вручную запустить

cryptsetup luksOpen <device> <name>

для сопоставления каждого базового блочного устройства с зашифрованным устройством. Это требует записи UUID каждого базового блочного устройства и имени, которому оно сопоставляется. Есть ли простой способ автоматизировать этот процесс? Я могу добавить информацию в /etc/crypttab с noauto ключевое слово, чтобы предотвратить установку устройств при загрузке. Однако я не могу заставить cryptsetup использовать информацию из этого файла.

Было бы здорово, если бы была команда вроде cryptsetup luksOpen <name> это будет читать /etc/crypttab чтобы найти имя базового блочного устройства (аналогично тому, как вы можете mount <mountpoint> если определено в /etc/fstab).

Есть ли способ получить cryptsetup для чтения сопоставлений из /etc/crypttab?

Посмотри на cryptdisks_start и cryptdisks_stop, они делают именно это.

# cryptdisks_start <name>
# mount <mountpoint>
...stuff...
# umount <mountpoint>
# cryptdisks_stop <name>

Ты можешь использовать

sudo systemctl start systemd-cryptsetup@<name>

вместо того

cryptsetup luksOpen UUID=... <name>

когда у вас есть следующая запись в вашем / etc / crypttab:

<name> UUID=... none noauto

При необходимости он предложит вам ввести кодовую фразу.

Соответствующий файл модуля создается автоматически systemd-cryptsetup-генератор.

Вы можете перечислить все сгенерированные файлы модулей, используя

systemctl list-unit-files| grep systemd-cryptsetup

Я думаю, ты хочешь поэкспериментировать с systemd-cryptsetup-generator.

Обычно этот процесс выполняется во время загрузки initramfs, чтобы динамически генерировать блоки systemd, которые расшифровывают каждое блочное устройство перечислены в /etc/crypttab. Затем вы можете запускать эти модули, когда захотите, и вам будет предложено ввести любые необходимые парольные фразы.

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

Специально для этого случая я сделал bash-скрипт,
он анализирует crypttab получить uuid устройства для открытия / закрытия,
впоследствии он использует fstab для хранения параметров крепления.

По соглашению я монтирую зашифрованное устройство в корневой папке в каталоге, названном как узел устройства в /dev/mapper но с заглавной буквы;
например, устройство с именем xsnl в crypttab будет монтироваться на /Xsnl.

NB: вам нужно будет использовать noauto вариант в обоих fstab и crypttab.

#!/bin/bash

usage(){
  echo "usage:   ./crypt.sh [open|close] <encrypted_dev>"
}

OP=$1
TARGET=$2

# we bail out in case no first argument is passed
if [[ $OP != 'close' ]] && [[ $OP != 'open' ]]; then
  usage
  echo "Exiting: first argument must be either 'lock' or 'unlock'."
  exit
fi

# we bail out in case no second argument is passed
if [[ -z $TARGET ]]; then
  usage
  echo "Exiting: second argument must be the name of the entry in fstab."
  exit
fi

# our convention is to give same name to fstab mount point (upperfirst) and crypttab name (lower)
MAPPDEV=$(echo $TARGET | awk '{print tolower($0)}')

ENCRYPTED_DEV=$(sudo grep -w $MAPPDEV /etc/crypttab)

# we bail out if we don't match a device in crypttab
if [[ -z $ENCRYPTED_DEV ]]; then
  usage
  echo "Exiting: no device named $MAPPDEV found in crypttab."
  exit
fi

SEC_FIELD=$( echo $ENCRYPTED_DEV | sed -r 's/\s+/ /g' | cut -d' ' -f2)

# now we have all the info,
# depending on $OP (operation mode) we decide what to do
if [[ $OP == 'close' ]]; then
  sudo umount /$TARGET
  sudo cryptsetup luksClose $MAPPDEV
  exit
fi

# if we get here we need to open and mount
sudo cryptsetup luksOpen $SEC_FIELD $MAPPDEV
sudo mount /$TARGET

суть