cryptsetup 可以从 /etc/crypttab 读取映射吗?

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

答案1

您可以使用

sudo systemctl start systemd-cryptsetup@<name>

代替

cryptsetup luksOpen UUID=... <name>

当你的 /etc/crypttab 中有如下条目时:

<name> UUID=... none noauto

如果需要,它会提示您输入密码。

相应的单元文件由systemd-cryptsetup-generator

您可以使用列出所有生成的单元文件

systemctl list-unit-files| grep systemd-cryptsetup

答案2

看一下cryptdisks_startcryptdisks_stop,他们确实这么做了。

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

答案3

我想你想尝试一下systemd-cryptsetup-generator

通常,此进程在 initramfs 启动期间运行,以动态生成解密每个块设备的 systemd 单元列在 中/etc/crypttab。然后您可以随时启动这些单元,并且系统会提示您输入任何必要的密码。

由于这是虚拟机,您可以应该可以访问虚拟控制台,这意味着您可以正常加密文件系统并在启动时提供密码。当然,加密文件系统的安全性无论如何都会受到损害,只需在虚拟机中使用即可,无论何时输入密码。

答案4

我专门为这种情况编写了一个 bash 脚本,
它会解析crypttab以检索要打开/关闭的设备的 uuid,
然后用于fstab存储挂载选项。

按照惯例,我将加密设备安装在根文件夹中名为 的设备节点/dev/mapper但大写的目录中;
例如,名为xsnlcrypttab 的设备将安装在 上/Xsnl

注意:您需要在和中使用noauto选项。fstabcrypttab

#!/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

要旨

相关内容