设置分区
你的硬盘(hda)最少应该包含三个分区:
hda1:这个小没分区的分区应该要求一个口令以便加载加密的根文件系统
hda2:这个分区应该包含你的加密根文件系统;确保它足够大
hda3:这个分区就是你当前的GNU/Linux系统
在东南,hda1和hda2没有使用。hda3就是当前你安装的linux发行版;/usr和/boot不能另外分区加载。
你的分区分配也许会像下面这样:
# fdisk -l /dev/hda
磁盘 /dev/hda:255 个磁头,63 个扇区,2432 个柱面
单位 = 16065 个柱面 * 512 字节
设备引导开始结束块 ID 系统
/dev/hda1 1 1 8001 83 Linux
/dev/hda2 2 263 2104515 83 Linux p>
/dev/hda3 264 525 2104515 83 Linux
/dev/hda4 526 2047 12225465 83 Linux
安装Linux-2.4.27
有两种主要的方案可用于在内核上添加环回加密支持:cryptoloop 和loop-AES。本文基于loop-AES 方案,因为它的特点是非常快并且非常优化 Rijndael 使用语言的做法。您拥有一个 IA-32 (x86) CPU,将为您提供最大的性能。
另外,还有一些关于加密循环的安全担忧。
首先,下载和解压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
补丁-Np1 -i ../loop-AES-v2.2b/kernel -2.4.27.diff
设置键盘映射:
dumpkeys | -2.4.27.diff loadkeys -m - gt;drivers/char/defkeymap.c
下一步,配置你的内核;确定下面的选项你已经选上:
make menuconfig
块设备 ---gt;
lt;*gt; 环回设备支持
[*] AES 加密环路设备支持(新)
lt;*gt; RAM 磁盘支持
(4096) 默认 RAM 磁盘大小(新)
[*] 初始 RAM 磁盘(initrd)支持
文件系统 ---gt;
lt;*gt; Ext3 日志文件系统支持
lt;*gt; 第二个扩展 fs 支持
(重要说明:不启用/dev文件系统支持)
编译并安装内核:
make dep bzImage
makemodulesmodules_install
cp arch/i386/boot/bzImage /boot/vmlinuz
如果你的启动器是grub,更新你的/boot/grub/menu.lst或/boot/grub/grub.conf文件: p>
cat gt; /boot/grub/menu.lst lt;lt; EOF
默认 0
超时 10
颜色 绿色/黑色浅绿/黑色
标题 Linux
root (hd0,2)
kernel /boot/vmlinuz ro root=/dev/hda3
EOF
启动器是l
ilo的话就更新/etc/lilo.conf并运行lilo:
cat gt; /etc/lilo.conf lt;lt; EOF
lba32
boot=/dev/hda
提示
timeout=100
image=/boot/vmlinuz
label=Linux
只读
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";导出CFLAGS
安全可能是您主要关心的一个问题。为此,请不要使您的密码少于20个字符。数据保密性不是免费的,你必须以'支付'的形式使用长的密码。
使用root用户编译安装losetup程序:
./configure amp;amp;make lib mount
mv -f /sbin/losetup /sbin/losetup~
rm -f /usr/share/man/man8/losetup.8*
cd挂载
gzip losetup.8
cp losetup /sbin
cp losetup.8.gz /usr/share/man/man8/
创建加密的根文件系统
用随机数据填充目标分区:
shred -n 1 -v /dev/hda2
安装加密环回设备:
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
挂载 /dev/loop0 / mnt/efs
您可以比较已加密的和未加密的数据:
xxd /dev/hda2 |少
xxd /dev/loop0 |少
现在是时候安装你的加密的linux系统了。如果你使用的是GNU/Linux发行版本(例如Debian,Slackware,Gentoo,Mandrake,RedHat/Fedora,SuSE等),运行下面的命令:
cp -avx / /mnt/efs
如果你使用的是Linux From Scratch手册,照着lfs手册上所说的那样进行配置,但要做以下修改:
第 6 章 - 安装 util-linux:
在解压源代码后打上loop-AES 的补丁。
第 8 章 - 制作LFS系统可启动:
指向我们的下一章(创建启动设备)。
-------------------- ------------------------------------------------
创建启动设备
创建ramdisk
在开始时,先用chroot命令进入你的硬盘分区并创建启动设备的挂载点:
chroot /mnt/efs
mkdir /loader
然后创建初始ramdisk(initrd),它将在以后使用:
cd
dd if=/dev/零 of=initrd bs=1k count=4096
mke2fs -F initrd
mkdir ramdisk
mount -o 循环 initrd ramdisk
如果您使用 grsecurity ,您可能会收到“权限被拒绝”的提示错误信息;如果是这样,您必须在运行 mount 命令之前在 chroot 命令中。
创建文件系统的目录组织并复制所需要的文件路径:
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 p>
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:没有这样的文件或目录”,” /lib/libtermcap.so.2:没有这样的文件或目录”的信息,这是正常的。bash只要求用这两个库中的其中一个。你可以检测哪一个才是你实际需要的:
ldd /bin/bash
编译sleep程序,将会防止密码提示被内核信息所淹没(例如当usb设备注册时)。
cat gt; sleep.c lt;lt; "EOF"
#include lt;unistd.hgt;
#include lt;stdlib.hgt;
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 gt; ramdisk/sbin/init lt;lt; "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
完成
cd /mnt
/sbin/pivot_root 。加载器
exec /usr/sbin/chroot 。 /sbin/init
EOF
chmod 755 ramdisk/sbin/init
卸载环回设备并压缩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" \
gt; 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
挂载 /dev/hda1 /loader
复制内核和初始ramdisk:
cp /boot/{vmlinuz,initrd.gz} /loader
如果你使用的是grub:
mkdir /loader /boot
cp -av /boot/grub /loader/boot/
cat gt; /loader/boot/grub/menu.lst lt;lt; EOF
默认0
超时10
颜色绿色/黑色浅绿色/黑色
标题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 gt; /loader/etc/lilo.conf lt; lt; EOF
lba32
boot=/dev/hda
提示
timeout=100
image =/vmlinuz
label=Linux
initrd=/initrd.gz
只读
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 p>
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 gt; /etc/init.d/loop lt;lt; "EOF"
#!/bin/sh
if [ "`/usr/bin/md5sum /dev/hda1`" != \
"5671cebdb3bed87c3b3c345f0101d016 /dev/hda1" ]
然后
echo -n“警告!hda1 完整性验证失败 - 请按 Enter 键。”
read
fi
echo“上面选择的第一个密码”| \
/sbin/losetup -p 0 -e aes256 -S xxxxxx /dev/loop1 /dev/hda3
echo "上面选择的第二个密码" | \
/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]" gt; /dev/ tty$i
完成
EOF
chmod 700 /etc/init.d/loop
ln -s ../init .d/loop /etc/rcS.d/S00loop
vi /etc/fstab
...
/dev/loop2 /home ext3 默认为 0 2