![假设](https://linux22.com/image/561611/%E5%81%87%E8%AE%BE.png)
如果您的 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。
有人知道如何在 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
是不可能的。initramfs
systemd
原因如下...
或者跳到“步骤”部分开始使用在正常启动阶段创建的同样安全的加密 LVM 交换空间(对于 systemd、Debian 10)。
假设
您创建了一个名为 LVM 分区,lv_swap_encrypted
使用 100% 的vg_swap
VG 空间,如下所示:
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(逻辑卷)分区创建多个符号链接。lvcreate
systemd-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 LVM
31
L
t
# 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