SDB:加密根文件系统(已弃用)
/home加密分区。如果您使用的是Opensuse 11.2或更新版本,请忽略此页面并直接访问SDB:Encrypted_root_file_system加密根文件系统的唯一缺点是SUSE安装例程目前不支持它。网上有许多文章讨论了为其他Linux发行版加密根文件系统的各种过程[8] [8] [9]。不幸的是,这些说明并不完全适用于SUSE。进一步检查后,这并不令人惊讶,因为使用加密的根系统需要对启动过程进行一些调整,而这正是各个发行版争夺市场份额的领域[需要引用]。
因此,本HOWTO的主要目的是阐述openSUSE特定的使用加密根文件系统的说明。在这样做时,本HOWTO借鉴了其他发行版以前的工作[8] [8] [9],并试图提出对openSUSE安装和启动过程的最小更改,从而创建一个易于与主流openSUSE配合使用的过程。(虽然本指南设计用于openSUSE,但这些过程的一些变体也可能适用于其他Linux发行版,但尚未在其他系统上进行测试。)
准备工作
先决条件
- 一个 openSUSE 10.3(或更高版本)安装源介质。
- 一台满足 openSUSE 10.3(或更高版本)系统要求的计算机。
工作流程
由于 openSUSE 安装过程尚未支持加密根文件系统,因此最好的方法是使用 Linux 的 Live CD 来运行 Linux,然后在硬盘上创建加密的根分区。但是,Live CD 不包含在标准的 SUSE 发行版中[需要引用],并且创建一个比此处描述的过程更耗时。(另一种方法,比创建 Live CD 更省事,是将 SUSE 安装到 USB 闪存盘上,从那里运行 Linux,然后创建加密的磁盘分区。)最后,这里采用的实用方法是创建两个分区,将 SUSE 安装到一个分区,加密另一个分区,然后将 SUSE 从第一个分区复制到第二个分区[9]。
注意:openSUSE 10.3 已发布。不幸的是,尚未发布 x86_64 版本,因此仍然需要使用这种方法来使用这些计算机。
所提议过程的工作流程高级视图是
- 安装 openSUSE,将一个分区暂时指定为根。
- 确保我们拥有继续所需的所有工具。
- 创建加密的交换分区。
- 在剩余分区之一上创建加密分区。
- 将根文件系统复制到新的加密分区。
- 创建新的初始 RAM 磁盘 (initrd) 以启动系统
- 测试系统,查看启动过程是否适用于新分区。
- 擦除原始根分区并将其替换为另一个加密文件系统,用于保存用户文件系统。
LINUXLAPTOP:对于安装在外部 USB 磁盘上的 openSUSE 11.1,命令摘要位于本文末尾。
安装 openSUSE
由于笔记本电脑通常是单用户机器,因此可以使用相对简单的磁盘分区方案,例如一个用于交换的分区,一个挂载在“/”上的根文件系统分区,一个挂载在“/home”上的用户文件系统分区。通常,最大的分区保留给 /home;但是,由于安装过程的限制,根文件系统将首先安装到将以后用于用户文件系统(通常是最大的分区)的分区,然后在加密文件系统就位后将其复制到较小的分区。
这三个分区中的每一个都将被加密,因此,为了启动系统,我们需要一个额外的、未加密的小分区,其中包含启动文件。此分区将挂载在“/boot”。创建启动分区有两种选择:将其放在同一磁盘上,或放在外部介质(如 USB 闪存驱动器)上。(请参阅#FAQ,了解有关各种替代方案的讨论。)
为了正确分区,需要在启动安装过程时输入专家分区模式。
对于启动分区,至少保留 40 MB,或者如果需要多个内核,则保留更多。(75 MB 可能是更安全的选择,并且在大多数现代笔记本电脑上,硬盘上还有足够的空间。)此分区需要挂载点“/boot”。
对于使用 USB 闪存驱动器的用户,在用光盘驱动器中的安装 CD 启动计算机之前,请插入它。openSUSE 应该会识别 USB 闪存以及计算机的其他磁盘,并在“专家分区程序”菜单的磁盘列表中显示它。USB 闪存驱动器应使用 Linux 文件系统(ext2 就足够了)格式化,并且应挂载在“/boot”。此外,在“fstab 选项”对话框中,单击“不要在系统启动时挂载”复选框。这是必要的,因为 USB 设备是在 boot.localfs 脚本尝试挂载 fstab 中列出的条目之后创建的。(如果您需要它,可以稍后重新挂载 USB 闪存驱动器。)
为了便于讨论,假设分区表如下所示
| device | 挂载点 | 备注 |
|---|---|---|
| /dev/sda1 | /boot | |
| /dev/sda2 | swap | 这将成为加密的交换分区。 |
| /dev/sda3 | /home | 这将成为加密的根分区。 |
| /dev/sda4 | / | 这将成为加密的 home 分区。 |
(如前所述,想法是首先将根分区安装到 sda4,然后在 sda3 上创建加密文件系统,将根系统从 sda4 复制到 sda3,最后在 sda4 上创建另一个加密分区以用于用户文件系统。)
在软件包选择中,请确保安装了“cryptsetup”软件包。
完成安装并以 root 用户身份登录。(不要以普通用户身份登录,因为用户文件系统的挂载点将被更改。)
此时,需要选择加密软件。Linux 上有几个选项可用,例如:“cryptsetup”[10]、“loop-aes”[2] 和“truecrypt”[3]。本 HOWTO 讨论了 cryptsetup 的过程,因为它是一个更易于使用的软件包[1] [4] [8] [22][28]。(对于系统管理员,使用 LUKS 系统的主要优势在于能够为加密单个分区配置多个密码。这有助于在用户忘记密码时恢复加密数据。)
准备工具
在 openSUSE 10.3 中,如果更正脚本 /lib/mkinitrd/scripts/setup-luks.sh 中的一个拼写错误,mkinitrd 就可以开箱即用。
在这一行中,
luks_blockdev="$luks_blockdev $lucksbd"
我们必须将“$lucksbd”替换为“$luksbd”(注意字母“c”)。完成此操作后,一切都应该正常工作。
注意:此问题已通过 mkinitrd-2.1-36.2. 解决。因此,另一种方法是安装此软件包。
警告:截至 2008-02-02 和 mkinitrd-2.1-36.4,仍然存在一个问题,阻止将 Linux 软 RAID 分区用作驻留 LUKS 加密分区的分区,请参见https://bugzilla.novell.com/show_bug.cgi?id=358341。该问题很容易通过将附加到此 Bugzilla 报告的补丁应用于 /lib/mkinitrd/scripts/setup-luks.sh 来解决,但请注意,mkinitrd 包的更新将覆盖该更改,然后,在另一次内核更新之后,您的系统将无法启动。
ICEBERG:截至 2008-05-12 和 mkinitrd-2.1-36-5,luks 加密分区不能被 mkinitrd 自动找到。解决方法:打开 /lib/mkinitrd/scripts/setup-storage.sh 并将您的分区添加到脚本最后一行中的变量 blockdev,例如:
blockdev="$(resolve_device Root $rootdev) $(resolve_device Resume $resumedev) $(resolve_device Journal $journaldev) $(resolve_device Dump $dumpdev) /dev/mapper/home /dev/mapper/swap"
LINUXLAPTON:类似的扩展要求对加密安装在外部 USB 驱动器上的 openSUSE 11.1 笔记本电脑安装(参见[30]),
创建加密的交换分区
为了熟悉加密软件,通过加密交换分区来练习。(如果出现问题,很容易修复。)
使用 LUKS 系统[10] [28] 的一个优点是,它不直接使用提供的密码进行加密,而是生成一个随机密钥,默认大小为 128 位,并使用提供的密码(以及随机生成的盐)加密该密钥。因此,使用相同的密码来保护每个单独分区的 master 密钥是安全的,并且很方便。(另一种方法,为每个分区使用不同的密码非常不方便,并且在安全性方面几乎没有增加。)因此,在继续之前,请选择一个不易受到字典攻击和暴力攻击的良好密码。
首先,需要加载一些可能未默认加载的内核模块。(稍后这些将在 initrd 中加载。)
modprobe dm-mod modprobe dm-crypt modprobe aes modprobe sha256 modprobe sha1
[注意 - 使用库存 11.1,我不得不使用 `modprobe sha256_generic; modprobe sha1_generic`。] 第一个模块是设备映射器模块,第二个是设备映射器加密模块,第三个是默认密码,第四个是默认哈希算法,第五个是默认 LUKS 哈希规范。
关闭现有的交换分区
swapoff /dev/sda2
用随机数据填充交换分区。(这将需要几分钟。)
dd_rescue /dev/urandom /dev/sda2
使用以下命令初始化加密的交换设备
cryptsetup -v --key-size 256 luksFormat /dev/sda2
此命令将首先要求输入密码,然后使用 AES 密码,以 cbc-essiv 模式创建新的加密分区[需要引用;手册页不清楚默认设置为 ESSIV]。这些默认设置由 NIST [11] 和 NSA [12] [13](尽管必须补充说明,NSA 和 NIST 都未认可此特定软件包)以及其他专家推荐。
重要提示:如果您收到“命令失败”错误,请务必仔细阅读说明并遵循它们,有关确认。
要查看 LUKS 分区标头信息,请使用
cryptsetup -v luksDump /dev/sda2
现在打开新的加密分区
cryptsetup -v luksOpen /dev/sda2 swap
这应该会在 /dev/mapper/ 中创建一个名为 swap 的新映射设备。要将其用作交换设备,请添加一个交换文件系统并重新启用交换功能。
mkswap /dev/mapper/swap swapon /dev/mapper/swap
如果您使用“free”命令,您应该能够看到新的交换空间。
设备映射器是一个薄的软件层,负责对底层设备进行所有 I/O 操作。在这种情况下,它的作用是执行数据加密和解密。
在一个剩余的分区上创建加密文件系统
在练习了交换空间之后,现在是时候继续进行根文件系统了。
卸载 /home,以准备新的根文件系统。
umount /dev/sda3
用随机数据填充磁盘
警告:以下所有命令将删除分区上的数据,因此请谨慎使用!
有几种不同的选项可用于如何用随机数据填充分区。最终,这可以保护加密分区免受完全密码分析攻击,如果磁盘丢失、被盗或试图被攻破。有些选项比其他选项更好,并且根据使用的硬件,耗时也更多或更少。当前可用的方法有:半随机 /dev/urandom、加密 /dev/zero 或 shred/wipe 方法。
选项 1:/dev/urandom
这将用内核生成的半随机数据填充以下设备或分区。这是最简单的方法,但与下面的方法相比,在现代硬件上慢七倍,因为它使用 PRNG 收集数据而不是执行实际加密。
选项 2:加密 /dev/zero
最快的方法是首先用 /dev/urandom 填充磁盘的开头(例如 2 MB)
dd_rescue -m 2M /dev/urandom /dev/sda3
然后运行 luksFormat 和 luksOpen(见下文)。现在您可以从 /dev/zero 填充解密的逻辑磁盘(/dev/mapper/my_encrypted_partition)
dd_rescue /dev/zero /dev/mapper/my_encrypted_partition
这将用零填充解密的磁盘,这些零将被加密并保存到您的物理设备上。这在物理磁盘上与半随机数据无法区分,并且速度更快。
在 64 位 Dell M4400 上,此方法以大约 50MB/秒的速度写入,而从 /dev/urandom 读取的速度约为 7MB/秒。这是一个提高超过七倍的速度,尽管对于高资源攻击,它可能安全性略低(需要引用)。(即,对磁盘密钥进行超级计算机密码攻击,除非您计划使用至少 40 个字符的 LUKS 磁盘密码以及使用 /dev/urandom。)
选项 3:shred/wipe
最慢的选项之一,但可能更安全。名称:“shred - 覆盖文件以隐藏其内容,并可选地删除它” 描述:“重复覆盖指定的文件(FILE(s)),以便即使是价格昂贵的硬件探测也难以恢复数据。”
shred 可以根据给定的选项对磁盘进行多次写入(或通过),但仍然从 /dev/urandom 获取输入(默认选项可以更改)。我发现 shred 也有用的是 -v 选项,它可以实际显示驱动器或分区的填充进度。另一方面,使用本文 HOWTO 中提到的 dd_rescue 的默认选项比上述 shred 方法更快。
执行它
因此,现在我们将使用上面的选项 1 用随机数据填充 /dev/sda3:(根据分区的大小和 CPU 的速度,这可能需要几十分钟到几个小时。)在我的 Intel Core2Duo E8400 上,使用 SATA 3.0 HDD 写入 60 GB 数据大约需要 3 到 3.5 小时。
dd_rescue /dev/urandom /dev/sda3
dd_rescue 命令完成后,按照交换空间的相同步骤创建根分区的设备映射。(请务必使用相同的密码以启用单点登录。)
cryptsetup -v --key-size 256 luksFormat /dev/sda3
要查看加密分区的详细信息,请使用
cryptsetup luksDump /dev/sda3
现在打开加密分区
cryptsetup luksOpen /dev/sda3 root
与之前一样,这应该在 /dev/mapper/ 中创建一个条目,但这次名为 root。
同样,需要在新设备上创建一个文件系统。(ext3 是 openSUSE 10.3 的默认文件系统,但应使用系统最初安装时使用的相同文件系统 [需要引用]。)
/sbin/mkfs.ext3 -O dir_index,resize_inode /dev/mapper/root
将根文件系统复制到新的加密分区
创建新的加密系统后,必须将整个根文件系统复制到这个新的文件系统。首先,必须将其挂载到某个位置
mkdir /mnt/root mount /dev/mapper/root /mnt/root
有很多方法可以复制文件,但在最常用的方法中,只有 rsync 可以保留所有属性,包括 ACL/Xattrs、稀疏模式和进度条。请注意,不需要复制特殊文件系统,如 /dev、/proc 和 /sys,因为这些将在系统启动时重新创建。
此 rsync 调用不会遍历文件系统,但会创建各种挂载点并保留所有属性
rsync -AHSXax / /mnt/root/
cd 到 /mnt/root/etc 并用任何文本编辑器打开 fstab。将 /dev/sda3(以前的主分区)的条目更改为
/dev/mapper/root / ext3 acl,user_xattr 1 1
现在,当挂载此分区时,所有对根文件系统的 I/O 都会通过设备映射器透明地传递。
同样,在 fstab 中添加一个加密交换空间的条目,删除可能存在的任何其他交换空间条目
/dev/mapper/swap swap swap defaults 0 0
此外,/dev/sda4(以前的根分区)的条目应写为
/dev/sda4 /home ext3 acl,user_xattr 1 2
创建新的初始 RAM 磁盘 (initrd) 以启动系统
为了使用新的加密根文件系统,必须在系统启动时对其进行解密。这项工作最好由专门设计的初始 RAM 磁盘 (initrd) [15] 处理。(也可以使用初始 RAM 文件系统 (initramfs) [8] [27],但这需要重新编译内核。)通常,openSUSE 创建 initrd 以执行加载特定于被启动计算机的设备驱动程序等操作。这使他们能够发布通用内核,然后使用可加载的内核模块为特定用户需求配置内核。
虽然原则上可以手动创建 initrd [15] [16],但这是一个容易出错的过程,每当硬件配置或内核更改时都需要重新生成。而且也没有必要,因为 SUSE 提供了 mkinitrd 包 [17] 用于自动生成 initrd。这里采用的方法是修改驱动脚本 mkinitrd,以自动创建加密根文件系统所需的 initrd。
在使用它之前,最好备份位于 /boot 中的现有 initrd。最好的方法是将其复制到 /boot 中的另一个文件(例如 init-orig),以便在出现问题时将其用作备份。
要使用 mkinitrd,请键入
mkinitrd -d /dev/mapper/root -f "dm luks"
选项 "-d /dev/mapper/root" 表示新根设备的的位置,并且必须在第一次运行此版本的 mkinitrd 时提供。一旦系统使用加密的根分区,则不再需要此选项。选项 '-f "dm luks"' 告诉 mkinitrd 启用 luks 功能。
新的 mkinitrd 所做的是检查 "/dev/mapper" 中的设备,以确定哪些设备使用加密以及启动时需要加载哪些密码。然后,它会将一小段代码添加到 init 脚本中,以在初始启动阶段查询密码并解密所有文件系统。
注意:我不得不使用:“yast2 --> system --> editor for /etc/sysconfig --> system --> kernel --> initrd_modules --> add dm-mod dm-crypt aes_i586 blkcipher” 来启用正确的模块,同时启动。也许您还需要“lrw”模块,如果您想使用 aes-lrw-benbi 之类的密码。
最后一步是在 Grub 菜单中为加密分区创建一个新的条目。编辑启动菜单并创建一个新的条目,其中包含新的参数。它可能如下所示
/boot/grub/menu.lst
###Encrypted root### title openSUSE 10.3 - encrypted root (hd0,0) kernel /vmlinuz-VER-default root=/dev/mapper/root luks_root=/dev/sda3 luks_swap=/dev/sda2 luks="root swap" vga=0x317 resume=/dev/mapper/swap splash=silent showopts initrd /initrd-VER-default
建议不要删除旧条目,直到确定系统可以正确启动为止。(注意:需要修改旧条目以使用为此目的保存的旧 initrd。)
现在,关闭所有打开的文件并尝试使用加密分区启动。您必须为每个加密分区输入密码一次。
注意:如果您使用的是扩展坞,则可能需要使用笔记本电脑键盘输入解密密码。
注意:如果您使用的是 USB 闪存驱动器,则可能需要调整 BIOS 设置,以便 USB 设备在硬盘驱动器之前出现在启动顺序中。
擦除原始根分区并将其替换为另一个加密文件系统
在检查一切正常工作后,继续擦除原始根分区并将其替换为另一个加密文件系统
umount /dev/sda4 dd_rescue /dev/urandom /dev/sda4 cryptsetup -v --key-size 256 luksFormat /dev/sda4 cryptsetup luksOpen /dev/sda4 home /sbin/mkfs.ext3 -O dir_index,resize_inode /dev/mapper/home mount /dev/mapper/home /home
编辑 fstab 并添加 /home 的条目,例如
/dev/mapper/home /home ext3 acl,user_xattr 1 2
重新运行 mkinitrd 以将 /home 的信息添加到 initrd。
mkinitrd
现在编辑启动加载程序菜单以在启动时解密主目录。
/boot/grub/menu.lst
###Encrypted root### title openSUSE 10.3 - encrypted root (hd0,0) kernel /vmlinuz-VER-default root=/dev/mapper/root luks_root=/dev/sda3 luks_swap=/dev/sda2 luks_home=/dev/sda4 luks="root swap home" vga=0x317 resume=/dev/mapper/swap splash=silent showopts initrd /initrd-VER-default
添加用户帐户
重新启动,添加用户帐户并享受。注意:由于笔记本电脑通常是单用户机器,并且由于解密密码在启动时提供,因此相对安全地配置系统在系统启动后直接启动用户的会话。这可以省去输入额外的密码。
注意:用户帐户仍然应该有密码,但可以启用方便的自动登录。
在外部 USB 驱动器上安装的 openSUSE 11.1 的命令摘要
在以下内容中,给出了上述步骤的摘要,包括一些修改 ([30]) 用于在外部 USB 驱动器上安装的 openSUSE 11.1。注意:[30] 中针对 mkinitrd 2.4 所做的修改是对 [18] 中针对 mkinitrd 1.2 包含的更改的移植。
# ------------------------------------------------------------------------------
# Install OpenSUSE 11.1 from DVD
# ------------------------------------------------------------------------------
- Create Partition Setup
+ Custom Partitioning (for experts)
- Delete all existent partitions
- Create primary partition (sda1), ext3, 200 MB, mount point '/boot'
- Create primary partition (sda2), swap, 4 GB, mount point '/swap'
- Create primary partition (sda3), ext3, 20 GB, mount point '/home'
- Create primary partition (sda4), ext3, <remaining>, mount point '/'
- add package 'emacs'
# ------------------------------------------------------------------------------ # backup boot files, i.e. initial ramdisk, etc. # ------------------------------------------------------------------------------ mkdir /BACKUP cp -ax /boot/* /BACKUP mv /BACKUP /boot
# ------------------------------------------------------------------------------ # create an encrypted swap partition # ------------------------------------------------------------------------------ swapoff /dev/sda2 dd_rescue /dev/urandom /dev/sda2 cryptsetup -v --key-size 256 luksFormat /dev/sda2 cryptsetup -v luksDump /dev/sda2 cryptsetup -v luksOpen /dev/sda2 swap mkswap /dev/mapper/swap swapon /dev/mapper/swap
# ------------------------------------------------------------------------------ # create an encrypted file system for the new root partition # ------------------------------------------------------------------------------ umount /dev/sda3 dd_rescue /dev/urandom /dev/sda3 cryptsetup -v --key-size 256 luksFormat /dev/sda3 cryptsetup luksDump /dev/sda3 cryptsetup luksOpen /dev/sda3 root /sbin/mkfs.ext3 -O dir_index,resize_inode /dev/mapper/root mkdir /mnt/root mount /dev/mapper/root /mnt/root
# ------------------------------------------------------------------------------ # copy files from old to new root partition # ------------------------------------------------------------------------------ cd / find bin boot dev etc home lib* opt root sbin srv tmp usr var -depth -print0 | cpio -pmd --null /mnt/root mkdir /mnt/root/proc mkdir /mnt/root/sys mkdir /mnt/root/media mkdir /mnt/root/mnt
# ------------------------------------------------------------------------------ # update /etc/fstab # ------------------------------------------------------------------------------ cp /etc/fstab /etc/fstab.ORIG emacs /etc/fstab --- /dev/mapper/swap swap swap defaults 0 0 /dev/mapper/root / ext3 acl,user_xattr 1 1 /dev/sda1 /boot ext3 acl,user_xattr 1 2 /dev/sda4 /home ext3 acl,user_xattr 1 2 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 usbfs /proc/bus/usb usbfs noauto 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 --- cp /etc/fstab /mnt/root/etc/
# ------------------------------------------------------------------------------ # update scripts for creating a new initial ram disk # ------------------------------------------------------------------------------ # back up original files cp /lib/mkinitrd/scripts/boot-luks.sh boot-luks.sh.ORIG cp /lib/mkinitrd/scripts/setup-luks.sh setup-luks.sh.ORIG cp /lib/mkinitrd/scripts/setup-storage.sh setup-storage.sh.ORIG cp /sbin/mkinitrd mkinitrd.ORIG
# update mkinitrd scripts (phase 1 --- w/o encrypted 'home' partition) tar -xvzf mkinitrd-ut.tar.gz
cp mkinitrd-ut/mkinitrd-2.4-34.1-ut_scripts_boot-luks.sh /mnt/root/lib/mkinitrd/scripts/boot-luks.sh cp mkinitrd-ut/mkinitrd-2.4-34.1-ut_scripts_setup-luks.sh /mnt/root/lib/mkinitrd/scripts/setup-luks.sh cp mkinitrd-ut/mkinitrd-2.4-34.1-ut_scripts_setup-storage-phase1.sh /mnt/root/lib/mkinitrd/scripts/setup-storage.sh cp mkinitrd-ut/mkinitrd-2.4-34.1-ut /mnt/root/sbin/mkinitrd
cp mkinitrd-ut/mkinitrd-2.4-34.1-ut_scripts_boot-luks.sh /lib/mkinitrd/scripts/boot-luks.sh cp mkinitrd-ut/mkinitrd-2.4-34.1-ut_scripts_setup-luks.sh /lib/mkinitrd/scripts/setup-luks.sh cp mkinitrd-ut/mkinitrd-2.4-34.1-ut_scripts_setup-storage-phase1.sh /lib/mkinitrd/scripts/setup-storage.sh cp mkinitrd-ut/mkinitrd-2.4-34.1-ut /sbin/mkinitrd
# ------------------------------------------------------------------------------ # create a new initial ram disk # ------------------------------------------------------------------------------ mkinitrd -v -d /dev/mapper/root -f "dm luks"
# ------------------------------------------------------------------------------ # edit '/boot/grub/menu.lst' # ------------------------------------------------------------------------------ emacs /boot/grub/menu.lst # add new entry to '/boot/grub/menu.lst': ###Encrypted root### title openSUSE 11.1 - encrypted root (hd0,0) kernel /vmlinuz-2.6.27.7-9-pae root=/dev/mapper/root luks_root=/dev/sda3 luks_swap=/dev/sda2 luks=root,swap vga=0x317 resume=/dev/mapper/swap splash=silent showopts initrd /initrd-2.6.27.7-9-pae
# ------------------------------------------------------------------------------ # reboot # ------------------------------------------------------------------------------ # check that everything is working ... # free --> swap space # suspend-to-disk # ...
# ------------------------------------------------------------------------------ # encrypt the 'home' partition (and delete the up to now original root partition) # --> good luck, this is the point of no return ;-) # ------------------------------------------------------------------------------ umount /dev/sda4 dd_rescue /dev/urandom /dev/sda4 cryptsetup -v --key-size 256 luksFormat /dev/sda4 cryptsetup luksOpen /dev/sda4 home /sbin/mkfs.ext3 -O dir_index,resize_inode /dev/mapper/home mount /dev/mapper/home /home
# ------------------------------------------------------------------------------ # update /etc/fstab # ------------------------------------------------------------------------------ emacs /etc/fstab --- /dev/mapper/swap swap swap defaults 0 0 /dev/mapper/root / ext3 acl,user_xattr 1 1 /dev/sda1 /boot ext3 acl,user_xattr 1 2 /dev/mapper/home /home ext3 acl,user_xattr 1 2 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 usbfs /proc/bus/usb usbfs noauto 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 ---
# ------------------------------------------------------------------------------ # update scripts for creating a new initial ram disk (now for all partitions encrypted) # ------------------------------------------------------------------------------ # update mkinitrd scripts (phase 2 --- with encrypted 'home' partition) cp mkinitrd-ut/mkinitrd-2.4-34.1-ut_scripts_setup-storage-phase2.sh /lib/mkinitrd/scripts/setup-storage.sh
# ------------------------------------------------------------------------------ # create a new initial ram disk # ------------------------------------------------------------------------------ mkinitrd -v -d /dev/mapper/root -f "dm luks"
# ------------------------------------------------------------------------------ # edit '/boot/grub/menu.lst' # ------------------------------------------------------------------------------ emacs /boot/grub/menu.lst # replace entries in '/boot/grub/menu.lst' by: ###Encrypted root### title openSUSE 11.1 - encrypted root (hd0,0) kernel /vmlinuz-2.6.27.7-9-pae root=/dev/mapper/root luks_root=/dev/sda3 luks_swap=/dev/sda2 luks_home=/dev/sda4 luks=root,swap,home vga=0x317 resume=/dev/mapper/swap splash=silent showopts initrd /initrd-2.6.27.7-9-pae ###Encrypted root failsafe### title Failsafe -- openSUSE 11.1 - encrypted root (hd0,0) kernel /vmlinuz-2.6.27.7-9-pae root=/dev/mapper/root luks_root=/dev/sda3 luks_swap=/dev/sda2 luks_home=/dev/sda4 luks=root,swap,home ide=nodma apm=off noresume nosmp maxcpus=0 edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 x11failsafe vga=0x317 showopts initrd /initrd-2.6.27.7-9-pae
# ------------------------------------------------------------------------------
# reboot and have fun ;-)
# ------------------------------------------------------------------------------
# Thanks also to Mathias Grimmberger for the bug-fix in 'boot-start.sh' and the
# corresponding adjustments of the kernel parameters in '/boot/grub/menu.lst'!
# ('luks="root swap home"' --> 'luks=root,swap,home')
# ------------------------------------------------------------------------------
常见问题解答
此过程旨在防范哪些类型的攻击?
本文档中描述的过程可以保护笔记本电脑(或其他计算机)免受以下攻击。
- 笔记本电脑是随机盗窃的主体,随后是偶然的获利。通常,窃贼没有专门针对笔记本电脑,而是偷了一台被认为具有一定价值的笔记本电脑。这样的窃贼通常会将笔记本电脑卖给一个围捕者,后者可能具有搜索未受保护笔记本电脑上的有价值数据以及联系以从任何此类数据中获利的能力的专业知识。
- 第二种常见的攻击是窃贼专门针对笔记本电脑,因为他们怀疑它包含有价值的数据。在这种情况下,窃贼也知道如何找到数据以及如何处理它。
应该使用外部 USB 闪存驱动器进行启动吗?
使用外部 USB 驱动器可以防止攻击者篡改启动分区,例如,有人可以在计算机关闭时访问计算机,安装一个包含特洛伊木马的内核,该内核能够捕获主密钥并将其存储在磁盘上的某个位置,以便攻击者在计算机被盗后可以找到它。将内核移动到 USB 闪存驱动器可以防止这种类型的攻击,但它也使问题从保护计算机转移到保护闪存驱动器。这种攻击模式比上述攻击模式更复杂,因此可能性较低——除非用户恰好属于高风险类别,例如:工会组织者或其他人权工作者、政府举报人和工业间谍活动普遍存在的行业中的工人。如果一个人面临遭受这种性质的复杂攻击的高风险,那么应该考虑从 USB 闪存驱动器启动。
使用 USB 闪存驱动器进行启动的缺点是需要单独携带 USB 闪存驱动器和笔记本电脑,以及由此带来的丢失驱动器的风险。如果您在旅行时丢失了它,在返回家园之前,可能无法启动计算机,而您的备份驱动器希望能够正常工作。
此处建议的程序的已知漏洞是什么?
Fruhwith [4] [26] 讨论了与硬盘加密相关的各种密码学漏洞。特别是,他指出最严重的问题之一,即水印漏洞 [24],已通过 dm-crypt 引入 ESSIV 密码模式 得到解决。
Osvik 等人。[25],讨论了在 dm-crypt 运行时成功进行的侧信道攻击。在这种攻击中,计算机正在运行,并且专门设计的脚本能够窃取任何挂载分区的 master key。虽然这是一个严重的弱点,但此处讨论的过程旨在对抗 #FAQ.1 和 #FAQ.2 中描述的攻击,即,当系统关闭时。保护正在运行的系统需要防火墙、访问控制和软件完整性检查——这些主题超出了本 HOWTO 的范围。
参考资料
- dm-crypt:设备映射器加密目标,http://www.saout.de/misc/dm-crypt/
- J. Ruusu,“loop-AES”,http://sourceforge.net/projects/loop-aes/
- “True Crypt”,http://www.truecrypt.org/
- C. Fruhwirth,“Linux 硬盘加密设置”,http://clemens.endorphin.org/LinuxHDEncSettings
- J. Arnt 等人,“SUSE Linux 启动”,https://en.opensuse.net.cn/Distribution/SL-10.1/inst-source/docu/en/startup_en.pdf
- “EncFS 加密文件系统”,[http://encfs.sourceforge.net/
- C. Devine,“加密根文件系统 HOWTO”,https://tldp.cn/HOWTO/Encrypted-Root-Filesystem-HOWTO/
- “SECURITY 系统加密 DM-Crypt 与 LUKS”,http://gentoo-wiki.com/SECURITY_System_Encryption_DM-Crypt_with_LUKS
- M. Petullo,“加密您的根文件系统”,https://linuxjournal.cn/article/7743
- "LUKS - Linux Unified Key Setup", http://luks.endorphin.org/
- M. Dworkin, "分组密码运行模式的建议", http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
- "CNSS 政策 No. 15, 事实手册 No. 1", http://www.cnss.gov/Assets/pdf/cnssp_15_fs.pdf
- "NSA Suite B 加密事实手册", http://www.nsa.gov/ia/industry/crypto_suite_b.cfm
- W. Almesberger and H. Lermen, "使用初始 RAM 磁盘 (initrd)", file:///usr/src/linux/Documentation/initrd.txt
- "SECURITY 系统加密 DM-Crypt 与 LUKS/initrd", http://gentoo-wiki.com/SECURITY_System_Encryption_DM-Crypt_with_LUKS/initrd
- "mkinitrd", http://www.novell.com/products/linuxpackages/suselinux/mkinitrd.html
- "SUSE mkinitrd 用于加密的根文件系统", http://www.ccrl-nece.de/~greg/linux/mkinitrd-lerfs.tar.gz
- "加密算法的性能", http://www.saout.de/tikiwiki/tiki-index.php?page=UserPageChonhulio
- "dmcrypt 与 loopaes", http://deb.riseup.net/storage/encryption/benchmarks/dmcrypt-v-loopaes
- M.-J. O. Saarinen, "加密水印和 Linux 笔记本电脑安全", http://docs.indymedia.org/pub/Local/UkCrypto/wisa2004.pdf
- "IMC UK 的加密想法", http://docs.indymedia.org/view/Local/UkCrypto
- "使用 EncFS 和 Loop-AES 加密文件系统", http://security.linux.com/print.pl?sid=06/03/13/1656228
- J. Ruusu,"回复:2.6.* 内核中的 cryptoapi (或循环设备?) 错误", http://marc.theaimsgroup.com/?l=linux-kernel&m=107719798631935&w=2
- D.A. Osvik, A. Shamir and E. Tromer, "缓存攻击与对策:AES 的案例", http://www.wisdom.weizmann.ac.il/~tromer/papers/cache.pdf
- C. Fruhwirth, "硬盘加密的新方法", http://clemens.endorphin.org/nmihde/nmihde-A4-os.pdf
- J. Gustedt, "Early LUKS", http://www.loria.fr/~gustedt/early/
- C. Fruhwirth and M. Schuster, "使用 DM-Crypt、LUKS 和 cryptsetup 进行硬盘加密", http://www.linux-magazine.com/issue/61/Hard_Disk_Encryption_DM-Crypt_LUKS_cryptsetup.pdf
- Packman 为旧版 openSUSE 发行版提供的 "cryptsetup-luks" RPM 包 http://packman.links2linux.de/package/841
- "openSUSE 11.1 mkinitrd 和用于加密根文件系统的脚本", http://www.mtsports.de/linux/mkinitrd-ut.tar.gz