假设

假设

如果您的 GNU/Linux 系统上实现了任何类型的块设备加密,那么也应该加密您的交换分区,这是明智的,因为任何解密的数据都可能随时以明文形式写入交换分区。

查看“crypttab”的 debian 手册页,我看到一个在启动时创建随机密钥交换分区的示例,因此密钥在启动过程中随机设置,并且只有系统本身知道:

# Encrypted swap device
cswap /dev/sda6 /dev/urandom cipher=aes-cbc-essiv:sha256,hash=ripemd160,size=256,swap

在此示例中,交换设备由常规的 dev 路径引用,即/dev/sda6

例如,如果插入了 USB 驱动器,绝对设备路径可能会发生变化,并在启动时重新分配。如果/dev/sda6碰巧与预期的分区不同,并且随后被随机交换数据覆盖,用户会非常不高兴!

因此解决方案似乎是:使用 UUID 而不是设备路径(因为 UUID 不应该改变),替换/dev/sda6/dev/disk/by-uuid/<whatever the uuid of dev/sda6 is>

但是...问题是:每次 cryptsetup 在启动时重新创建加密交换分区时,它都会为其生成一个新的 UUID!哎呀!

因此我们需要以某种方式保存此加密文件系统的 UUID。我认为 cryptsetup 可以使用其--offset开关来做到这一点,从而允许保存 LUKS 标头,从而保存 UUID。

我找到了这个网址: https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS#Using_UUIDs_with_encrypted_swap_partitions

有人知道如何在 Debian OS 上实现针对 Arch Linux 的解决方案吗?文档中提到的 init 脚本似乎在 Debian OS 上不存在

谢谢!

编辑 可以使用加密文件系统使用以下命令实现相同目的(加密交换空间): ecryptfs-setup-swap 没有块设备加密所面临的问题。查看这个 AskUbuntu 查询

答案1

每次 cryptsetup 在启动时重新创建加密交换分区时,它都会为其生成一个新的 UUID!哎呀!

在 /etc/crypttab 中,使用/dev/磁盘/按 ID代替/dev/disk/按 UUID引用您的交换分区。例如,您的/etc/fstab交换条目可能是

#<file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/cswap none swap sw 0 0

那么 /etc/crypttab 中正确的对应条目应该是这样的

# <name> <device> <password> <options>
cswap /dev/disk/by-id/ata-SAMSUNG_SSD_830_Series_S0XYNEAC762041-part5 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256

请注意,上面的设备由 /dev/disk/by-id 引用,您可以在 CLI 中键入以下命令来找到您的驱动器:

ls -lF /dev/disk/by-id

答案2

在我的 /etc/crypttab 中,我有

# <target name>  <source device>        <key file>   <options>
swap             /dev/mapper/cswap      /dev/random  swap

此处 /dev/mapper/cswap 是由 LVM 创建的逻辑卷,它负责正确分配逻辑卷名称,而不管驱动器号名称如何。它还允许我轻松调整交换分区的大小。

答案3

在启动阶段或大多数启动阶段,使用选项通过 LVM 分区对加密文件进行交换by-uuid是不可能的。initramfssystemd

原因如下...

或者跳到“步骤”部分开始使用在正常启动阶段创建的同样安全的加密 LVM 交换空间(对于 systemd、Debian 10)。

假设

您创建了一个名为 LVM 分区,lv_swap_encrypted使用 100% 的vg_swapVG 空间,如下所示:

lvcreate -l 1000%VG -n lv_swap_encrypted vg_swap

我们的目标是得到以下逻辑图:

/dev/sda3
                            LVM Physical Volume (PV)
/dev/mapper/dm-7
                            LVM Volume Group (VG)
/dev/vg_swap
                            LVM Logical Volume (LV)
/dev/vg_swap/lv_swap_encrypted
                            cryptsetup plain
/dev/mapper/swap_unencrypted           
                            swap space

问题

查看新创建的vg_swap-lv_swap_encrypted 仅用于交换(或加密交换)的 LVM 分区:

# ./lsblk-uuid 
NAME                          UUID                                   MOUNTPOINT
sda                                                                  
├─sda1                                                               
├─sda2                        XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX   /boot
├─sda3                        XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX 
│ └─vg_swap-lv_swap_encrypted                                        
└─sda4                        XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX 
  ├─arca_v1-root              XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX   /
  └─arca_v1-spare  
...

注意到该分区没有 UUID 吗vg_swap-lv_swap_encrypted

您可以mkswap vg_swap-lv_swap_encrypted在该 LVM 上执行并获取该 UUID,但这样我们就会跳过我们想要的急需的加密部分。

警告:哦,你执行了mkswap?然后通过执行以下命令将其清除:

dd if=/dev/urandom of=/dev/mapper/vg_swap-lv_swap_encrypted 

执行后 dmsetup info /dev/dm-7会显示不同的 UUID 格式:

   LVM-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

我已经尝试过UUID=上面那个奇怪的 LVM 值的选项,但它在第二个字段中不起作用/etc/crypttab。这让我不得不重新启动电脑。

注意:在 LVM 术语中,X 代表 VG UUID,Y 代表 LV UUID。

设备链接的可用性

在 initramfs 启动阶段,没有太多符号链接可用于启动阶段。我们调查哪些设备路径可用于加密交换。

这里不需要执行update-initramfs或重建任何 initfs。

LVM 链接设备名称

在该目录中,LVM 为 (或在启动期间)激活的/dev每个 LV(逻辑卷)分区创建多个符号链接。lvcreatesystemd-lvm2

在 initramfs 启动阶段,LVM 激活会创建以下块和符号文件链接:

  • /dev/dm-X
  • /dev/mapper/vg_swap-lv_swap_encrypted
  • /dev/vg_swap/lv_swap_encrypted

在正常内核启动阶段,操作系统会处理以下其余链接。无需调查由谁或在哪里执行,因为我们的重点是启动initramfs阶段加密交换分区的链接可用性。

  • /dev/block/254:X
  • /dev/254:X
  • /dev/vg_swap-lv_swap_encrypted
  • /dev/lv_swap_encrypted
  • /dev/dm-name-vg_swap-lv_swap_encrypted
  • /dev/disk/by-id/dm-uuid-LVM-XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYY YYYYYYYYYYYYYYY
  • /dev/dm-uuid-LVM-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY YYYY

二十次重新启动进入运行级别 2 后,我了解到(在启动阶段)永远不可能initramfs使用 mount,by-uuid因为每次交换器将未加密的数据写入加密分区的前几个块时,加密数据覆盖它之前的任何 UUID 现在都早已不存在了。

对于正常的启动后阶段,可以在cryptsetup/中使用 UUID cryptdisks_*

让我们暂时远离物理和扩展分区 UUID,来看看这里的 LVM UUID:LVM 管理几乎确保每个 LVM 分区都是高度唯一的。

危险:简而言之,对您来说,唯一的危险是将同一个 LVM 分区重新用于交换以外的其他用途。如果是这样,下次重新启动时,该分区将再次转换回交换空间,并且任何新安装的数据都将消失(只需庆幸它不是旧的和宝贵的数据)。

设置

这种通过 LVM VG/LV 名称进行的安排可以避免因添加、删除和重新分区硬盘(无论是交换还是文件系统)而导致的数据丢失。

在此/etc/crypttab示例中:

swap_unencrypted /dev/mapper/vg_swap-lv_swap_encrypted /dev/random none

使用基于内存的随机密钥和使用 VG/LV 路径名的交换空间,此方法将采用您现有的交换分区并将其转换为加密的交换空间。

基本上,以下步骤将

  • 禁用休眠模式,
  • 为交换空间的加密部分创建一个 LVM 分区,
  • 创建新条目/etc/crypttab
  • 获取 dm-crypt/LUKS 来创建另一个分区,swap_unencrypted。
  • 修改交换条目/etc/fstab
  • 创建交换空间(mkswap
  • 启用交换空间 ('swapon')

现在以及每次重启后重新加密交换空间。

禁用休眠

要使用随机密钥,您应该了解休眠功能不再受支持。

在继续操作之前,您还应该禁用休眠。休眠利用交换空间和随机密钥,这实际上使之前的休眠变得完全不可用。

注意:我们希望将物理分区或扩展分区设置为 SWAP,以欺骗 systemdinitramfs生成器不禁用 SUSPEND/SLEEP 部分。

在 Debian 上,你可以执行:

systemctl mask hibernate.target hybrid-sleep.target
systemctl restart systemd-logind.service  # or reboot if using Gnome/gdm3 display manager

好消息是硬件挂起或睡眠模式仍然有效。

创建 LVM

这些步骤假设您已经有一个用于交换分区的物理分区或扩展分区(而不是 LVM)。

重新输入交换分区

假设这/dev/sda是驱动器名称。假设这是交换所在驱动器3的分区号。/dev/sda

执行fdisk并使用t选项 通过输入来Linux swap重新标记(或者您可以使用列出该命令后的所有选项)。Linux LVM31Lt

# fdisk /dev/sda

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): t
Partition number (1-4, default 4): 3
Partition type (type L to list all types): 31

Changed type of partition 'Linux swap' to 'Linux LVM'.

Command (m for help): w
The partition table has been altered.
Syncing disks.

创建 LVM 物理卷

通过执行以下命令为 LVM 创建物理卷:

pvcreate /dev/sda3

创建 LVM 卷组

通过执行以下命令为 LVM 创建卷组:

vgcreate vg_swap /dev/sda3

卷组的优点在于您以后可以使用另一个物理硬盘来扩展交换空间。

创建 LVM 逻辑卷

通过执行以下命令为 LVM 创建逻辑卷:

lvcreate -l 100%vg -n lv_swap_encrypted vg_swap

# Make the LVM create a special file under /dev/vg_swap/lv_swap_encrypted
lvchange -a y vg_swap

现在我们有一个/dev/dm-7可用的块文件。

你会发现:

  • /etc/mapper/vg_swap-lv_swap_encrypted
  • /etc/vg_swap/lv_swap_encrypted

一切都指向同一点/dev/dm-7

我提倡使用,/etc/mapper/vg_swap-lv_swap_encrypted因为它是我们大多数人可以期待的一致位置。
很少有人知道在这里寻找这个自定义 LVM 卷组名称,例如/dev/vg_swap。其他一些人(例如大多数 BOFH)创建难以找到的 /etc/mapper_other(VG 名称为mapper),使其更难寻找。

我们不会使用它,/dev/dm-7因为它可能是 dm-19或其他的,这取决于您的分区布局。

现在我们有了一条通往驱动器、逻辑驱动器的路径,但还没有指向的带有随机密钥的加密驱动器/dev/mapper/vg_swap-lv_swap_encrypted

加密交换分区

添加或修改以下条目/etc/crypttab

swap_unencrypted /dev/mapper/vg_swap-lv_swap_encrypted /dev/urandom swap,cipher=
aes-cbc-essiv:sha256,size=256

然后激活加密并在块设备下创建另一个 dm 设备/dev/mapper:选择以下两个命令之一:

# cryptsetup open /dev/mapper/vg_swap-lv_swap_encrypted  \
                swap_unencrypted

或者

# cryptdisks_start swap_unencrypted
[ ok ] Starting crypto disk...swap_unencrypted (running)...done.

已建立新的符号链接,执行lsblk

# lsblk
NAME                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                             8:0    0   3.7T  0 disk  
├─sda1                          8:1    0     1M  0 part  
├─sda2                          8:2    0   381M  0 part  /boot
├─sda3                          8:3    0  15.3G  0 part  
│ └─vg_swap-lv_swap_encrypted 254:7    0  15.3G  0 lvm   
│   └─swap_unencrypted        254:8    0  15.3G  0 crypt [SWAP]
└─sda4                          8:4    0   3.6T  0 part  
  ├─arca_v1-root              254:0    0 186.3G  0 lvm   /
...                            11:0    1  1024M  0 rom   

您可以查看该 LVM 分区的 UUID,但此时这毫无用处。

执行lsblk -o name,uuid,mountpoint

# ~/bin/lsblk -o name,uuid,mountpoint
NAME                          UUID                                   MOUNTPOINT
sda                                                                  
├─sda1                                                               
├─sda2                        XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX   /boot
├─sda3                        XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX 
│ └─vg_swap-lv_swap_encrypted                                        
│   └─swap_unencrypted
└─sda4                        XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX 
  ├─arca_v1-root              XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX   /
...

新创建的块设备到/dev/mapper/swap_unencrypted现在已存在。

/dev/mapper/swap_unencrypted 的详细信息:

# cryptsetup status swap_unencrypted
/dev/mapper/swap_unencrypted is active.
  type:    PLAIN
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  key location: dm-crypt
  device:  /dev/mapper/vg_swap-lv_swap_encrypted
  sector size:  512
  offset:  0 sectors
  size:    31997952 sectors
  mode:    read/write

创建交换空间

创建交换空间:

# mkswap /dev/mapper/swap_unencrypted 
Setting up swapspace version 1, size = 15.3 GiB (16382947328 bytes)
no label, UUID=8cd89984-9892-4d62-a9ba-ecfb6476379c

现在注意为 创建的 UUID swap_unencrypted?每次重启时它都会不同。

# ~/bin/lsblk-uuid 
NAME                          UUID                                   MOUNTPOINT
sda                                                                  
├─sda1                                                               
├─sda2                        XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX   /boot
├─sda3                        XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX 
│ └─vg_swap-lv_swap_encrypted                                        
│   └─swap_unencrypted        8cd89984-9892-4d62-a9ba-ecfb6476379c   [SWAP]
└─sda4                        XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX 
  ├─arca_v1-root              XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX   /
...

激活交换空间

在 中/etc/fstab,修改或添加 swap 条目的行:

/etc/mapper/swap_unencrypted none swap sw 0 0

然后执行:

# swapon /dev/mapper/swap_unencrypted

交换空间现在使用随机密钥进行加密。
由于 dm-crypt 使用 LVM LV 块设备提供的 UUID,因此这应该足以解决功能安全的加密交换空间问题。

结论

UUID 不能用于加密交换分区,因为加密数据的学术性质会阻止识别此类分区(swap、ext4、btfs)。

UUID 不能用于提供的未加密交换分区,cryptsetup因为我们的目标是在每次重启时刷新交换空间。

您可以使用/dev/disk/by-id

但是 LVM 通过 VG 和 LV 分区的独特命名约定提供了足够多的保护。

上述设置提供了一个唯一加密的交换空间定位器,每次重启后(或者在极少数情况下,LVM 重新挂载)它将被加密但无法恢复。

答案4

运行 ecryptfs-setup-swap 或手动:

此配置在启动时使用随机生成的密钥,不支持硬盘休眠!您应该通过相应的 DE 电源管理实用程序禁用休眠,并将其设置为“紧急关机”,以避免数据丢失!

切换到管理员/根帐户

对每个命令执行 su root 或 sudo

禁用交换

交换-a

找到现有的交换分区

lsblk

例如:sda3 8:3 0 8G 0 部分 [SWAP]

覆盖旧交换

dd if=/dev/zero bs=1024000 of=/dev/sda<#>

例如:dd if=/dev/zero bs=1024000 of=/dev/sda3

FSTAB 设置

/etc/fstab 文件

用 crypttab 映射器名称替换旧的 SWAP 设备:/dev/mapper/cswap

OLD UUID=d03f3d8e-7888-48a5-b3cc-41de8dbbcfdc 交换 交换默认值 0 0

新的

/dev/mapper/cswap 无交换优先级=1,默认值为 0 0

加密设置

ls -lF /dev/disk/by-id

例如:ata-HGST_HTS545050A7E680_TEK55D4F0BU3GV-part3 -> ../../sda3

vim /etc/crypttab

cswap /dev/disk/by-id/ata-HGST_HTS545050A7E680_TEK55D4F0BU3GV-part3 /dev/urandom swap,密码=aes-cbc-essiv:sha256,大小=256

主动加密交换

重新启动计算机

验证加密交换操作

dmsetup -C 信息

例如:cswap 253 0 L--w 2 1 0 CRYPT-PLAIN-cswap

lsblk

例如
│ └─cswap 253:0 0 8G 0 crypt [SWAP]

猫/ proc / swaps

例如:文件名类型大小使用优先级/dev/dm-0 分区 8385532 0 -1

相关内容