У меня есть виртуализированный сервер 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