Linux Encryption HOWTO 怎样制作一个加密的文件系统

设定分区

您的硬盘(hda)最少应该包含三个分区:

hda1:这个小的没加密的分区 应该 要求 一个 口令 为了 加载 加密 的根文件系统

hda2:这个分区应该包含你的加密根文件系统;确保它足够大

hda3:这个分区就是你的当前的GNU/Linux系统

在这时,hda1和hda2没有使用。hda3就是当前你安装的linux发行版; /usr 和/boot不能另外分区装载。

你的分区分布也许会像下面这样:

# fdisk -l /dev/hda

Disk /dev/hda: 255 heads, 63 sectors, 2432 cylinders

Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System

/dev/hda1 1 1 8001 83 Linux

/dev/hda2 2 263 2104515 83 Linux

/dev/hda3 264 525 2104515 83 Linux

/dev/hda4 526 2047 12225465 83 Linux

安装 Linux-2.4.27

有两种主要的方案可用于在内核上添加 loopback加密支持:cryptoloop 和 loop-AES。本文是基于loop-AES方案的,因为因为它的特点是非常快 和非常优化实行 of Rijndael 用汇编语言。如果你有一个IA-32 (x86) CPU ,它将为您提供 最大的性能。另外,还有一些关于cryptoloop的安全关切.

首先,下载和解压 loop-AES 软件包:

wget /loop-AES/loop-AES-v2.2b.tar.bz2

tar -xvjf loop-AES-v2.2b.tar.bz2

然后再下载内核源代码和补丁并为内核源码打上补丁:

wget http://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.27.tar.bz2

tar -xvjf linux-2.4.27.tar.bz2

cd linux-2.4.27

rm include/linux/loop.h drivers/block/loop.c

patch -Np1 -i ../loop-AES-v2.2b/kernel-2.4.27.diff

设置键盘映射:

dumpkeys | loadkeys -m - > drivers/char/defkeymap.c

下一步,配置你的内核;确定下面的选项你已经选上了:

make menuconfig

Block devices --->

<*> Loopback device support

[*] AES encrypted loop device support (NEW)

<*> RAM disk support

(4096) Default RAM disk size (NEW)

[*] Initial RAM disk (initrd) support

File systems --->

<*> Ext3 journalling file system support

<*> Second extended fs support

(important note: do not enable /dev file system support)

编译并安装内核:

make dep bzImage

make modules modules_install

cp arch/i386/boot/bzImage /boot/vmlinuz

如果你的启动器是grub,更新你的 /boot/grub/menu.lst或 /boot/grub/grub.conf文件:

cat > /boot/grub/menu.lst << EOF

default 0

timeout 10

color green/black light-green/black

title Linux

root (hd0,2)

kernel /boot/vmlinuz ro root=/dev/hda3

EOF

启动器是lilo的话就更新/etc/lilo.conf并运行 lilo :

cat > /etc/lilo.conf << EOF

lba32

boot=/dev/hda

prompt

timeout=100

image=/boot/vmlinuz

label=Linux

read-only

root=/dev/hda3

EOF

lilo

现在重启你的系统。

安装Linux 2.6.8.1

像之前所说的那样进行前面的部分,所用补丁是loop-aes'kernel-2.6.8.1.diff 。要注意的是你要安装module-init-tools软件包以便你的系统支持模块。

安装util-linux-2.12b

这个losetup程序包含在util-linux-2.12b软件包中。必须打补丁并重新编译以使它支持加密。下载,解压并打为util-linux打补丁:

wget http://ftp.kernel.org/pub/linux/utils/util-linux/util-linux-2.12b.tar.bz2

tar -xvjf util-linux-2.12b.tar.bz2

cd util-linux-2.12b

patch -Np1 -i ../loop-AES-v2.2b/util-linux-2.12c.diff

使用少于20个字符的密码,键入:

CFLAGS="-O2 -DLOOP_PASSWORD_MIN_LENGTH=8"; export CFLAGS

安全可能是你主要关心的一个问题。为此,请不要使您的密码少于20个字符。数据保密性不是免费的, 你必须以‘支付’的形式使用长的密码。

使用root用户编译安装 losetup程序:

./configure && make lib mount

mv -f /sbin/losetup /sbin/losetup~

rm -f /usr/share/man/man8/losetup.8*

cd mount

gzip losetup.8

cp losetup /sbin

cp losetup.8.gz /usr/share/man/man8/

创建加密的根文件系统

用随机数据填充目标分区:

shred -n 1 -v /dev/hda2

安装加密loopback设备:

losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2

为防止比较快的字典攻击,推荐加上-S xxxxxx 选项,"xxxxxx" 是你随机选取的种子(例如,你可能选择 "gPk4lA" )。 同样,为了防止启动时的键盘映射问题,在密码中不要使用非ASCII字符(方言,等)。Diceware站点提供了一种简单的的方法去创建强大并容易记住的密码。

现在开始创建ext3文件系统:

mke2fs -j /dev/loop0

检测你输入的密码是正确的:

losetup -d /dev/loop0

losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2

mkdir /mnt/efs

mount /dev/loop0 /mnt/efs

你可以比较已加密的和未加密的数据:

xxd /dev/hda2 | less

xxd /dev/loop0 | less

现在是时候安装你的加密的linux系统了。如果你使用的是GNU/Linux发行版(譬如Debian, Slackware, Gentoo, Mandrake, RedHat/Fedora, SuSE, etc.), 运行下面的命令:

cp -avx / /mnt/efs

如果你使用是Linux From Scratch手册,照着lfs手册上所说的那样进行配置,但要做以下修改:

Chapter 6 - Installing util-linux:

在解压源代码后打上 loop-AES 的补丁。

Chapter 8 - Making the LFS system bootable:

指向我们的下一章(创建启动设备)。

--------------------------------------------------------

创建启动设备

创建ramdisk

在开始时,先用chroot命令进入你的加密分区并创建启动设备的挂载点:

chroot /mnt/efs

mkdir /loader

然后创建 initial ramdisk (initrd),它将会在以后用到:

cd

dd if=/dev/zero of=initrd bs=1k count=4096

mke2fs -F initrd

mkdir ramdisk

mount -o loop initrd ramdisk

如果您使用 grsecurity . 您可能会收到"Permission denied"的提示错误的信息;如果是这样你将必须在chroot命令之前运行 mount命令。

创建文件系统的目录组织并复制所需要的的文件进去:

mkdir ramdisk/{bin,dev,lib,mnt,sbin}

cp /bin/{bash,mount} ramdisk/bin/

ln -s bash ramdisk/bin/sh

mknod -m 600 ramdisk/dev/console c 5 1

mknod -m 600 ramdisk/dev/hda2 b 3 2

mknod -m 600 ramdisk/dev/loop0 b 7 0

cp /lib/{ld-linux.so.2,libc.so.6,libdl.so.2} ramdisk/lib/

cp /lib/{libncurses.so.5,libtermcap.so.2} ramdisk/lib/

cp /sbin/{losetup,pivot_root} ramdisk/sbin/

如果你看到像"/lib/libncurses.so.5: No such file or directory","/lib/libtermcap.so.2: No such file or directory"的信息,这是正常的。bash 只要求用这两个库中的其中一个。 你可以检测哪一个才是你实际所需要的:

ldd /bin/bash

编译sleep程序,它将防止密码提示被内核信息所淹没(例如当usb设备注册时)。

cat > sleep.c << "EOF"

#include <unistd.h>

#include <stdlib.h>

int main( int argc, char *argv[] )

{

if( argc == 2 )

sleep( atoi( argv[1] ) );

return( 0 );

}

EOF

gcc -s sleep.c -o ramdisk/bin/sleep

rm sleep.c

创建初始化脚本(不要忘记替换掉你之前报选的种子 "xxxxxx" ):

cat > ramdisk/sbin/init << "EOF"

#!/bin/sh

/bin/sleep 3

/sbin/losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2

/bin/mount -r -n -t ext3 /dev/loop0 /mnt

while [ $? -ne 0 ]

do

/sbin/losetup -d /dev/loop0

/sbin/losetup -e aes256 -S xxxxxx /dev/loop0 /dev/hda2

/bin/mount -r -n -t ext3 /dev/loop0 /mnt

done

cd /mnt

/sbin/pivot_root . loader

exec /usr/sbin/chroot . /sbin/init

EOF

chmod 755 ramdisk/sbin/init

卸载 loopback 设备并压缩initrd:

umount -d ramdisk

rmdir ramdisk

gzip initrd

mv initrd.gz /boot/

从CD-ROM启动

我强烈建议您从只读的媒体里启动您的系统,例如可启动的光盘。

下载并解压syslinux:

wget http://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-2.10.tar.bz2

tar -xvjf syslinux-2.10.tar.bz2

配置isolinux:

mkdir bootcd

cp /boot/{vmlinuz,initrd.gz} syslinux-2.10/isolinux.bin bootcd

echo "DEFAULT /vmlinuz initrd=initrd.gz ro root=/dev/ram0" \

> bootcd/isolinux.cfg

把iso映像刻录到可启动光盘中:

mkisofs -o bootcd.iso -b isolinux.bin -c boot.cat \

-no-emul-boot -boot-load-size 4 -boot-info-table \

-J -hide-rr-moved -R bootcd/

cdrecord -dev 0,0,0 -speed 4 -v bootcd.iso

rm -rf bootcd{,.iso}

从硬盘启动

当你丢失了你的可启动光盘时,启动分区就可以派上用场了。请记住hda1是个可写分区,因而并不是很可靠的,只有当你遇到紧急的情况时才使用它!

创建并挂载ext2文件系统:

dd if=/dev/zero of=/dev/hda1 bs=8192

mke2fs /dev/hda1

mount /dev/hda1 /loader

复制内核和initial ramdisk:

cp /boot/{vmlinuz,initrd.gz} /loader

如果你使用的是grub :

mkdir /loader/boot

cp -av /boot/grub /loader/boot/

cat > /loader/boot/grub/menu.lst << EOF

default 0

timeout 10

color green/black light-green/black

title Linux

root (hd0,0)

kernel /vmlinuz ro root=/dev/ram0

initrd /initrd.gz

EOF

grub-install --root-directory=/loader /dev/hda

umount /loader

如果你使用lilo:

mkdir /loader/{boot,dev,etc}

cp /boot/boot.b /loader/boot/

mknod -m 600 /loader/dev/hda b 3 0

mknod -m 600 /loader/dev/hda1 b 3 1

mknod -m 600 /loader/dev/ram0 b 1 0

cat > /loader/etc/lilo.conf << EOF

lba32

boot=/dev/hda

prompt

timeout=100

image=/vmlinuz

label=Linux

initrd=/initrd.gz

read-only

root=/dev/ram0

EOF

lilo -r /loader

umount /loader

最后一步 仍然保持chroot的状态,修改/etc/fstab增加以下选项:

/dev/loop0 / ext3 defaults 0 1

去除 /etc/mtab 并从chroot中退出。最后 ,运行 "umount -d /mnt/efs"命令然后重启系统。 如果有某些错误发生,你仍然可以在 LILO提示中用"Linux root=/dev/hda3"来启动你未加密的分区。

如果一切都顺利,你就可以重新分区你的硬盘和继续加密你的hda3或hda4分区。在下面的脚本中,我们假设 hda3将挂载swap设备,hda4挂载/home目录;你应该先初始化这两个分区:

shred -n 1 -v /dev/hda3

shred -n 1 -v /dev/hda4

losetup -e aes256 -S xxxxxx /dev/loop1 /dev/hda3

losetup -e aes256 -S xxxxxx /dev/loop2 /dev/hda4

mkswap /dev/loop1

mke2fs -j /dev/loop2

然后在系统的启动目录里创建一个脚本并更新 /etc/fstab:

cat > /etc/init.d/loop << "EOF"

#!/bin/sh

if [ "`/usr/bin/md5sum /dev/hda1`" != \

"5671cebdb3bed87c3b3c345f0101d016 /dev/hda1" ]

then

echo -n "WARNING! hda1 integrity verification FAILED - press enter."

read

fi

echo "1st password chosen above" | \

/sbin/losetup -p 0 -e aes256 -S xxxxxx /dev/loop1 /dev/hda3

echo "2nd password chosen above" | \

/sbin/losetup -p 0 -e aes256 -S xxxxxx /dev/loop2 /dev/hda4

/sbin/swapon /dev/loop1

for i in `seq 0 63`

do

echo -n -e "\33[10;10]\33[11;10]" > /dev/tty$i

done

EOF

chmod 700 /etc/init.d/loop

ln -s ../init.d/loop /etc/rcS.d/S00loop

vi /etc/fstab

...

/dev/loop2 /home ext3 defaults 0 2