教你加密Root文件系统(图)
程序员文章站
2022-06-19 11:48:45
当你不能依靠物理安全来保证你文件的安全时,是时候采取额外的步骤加密文件系统了,虽然本文涉及到的是基于PowerPC的系统,但原则上来说也适用于其他架构的系统。
在另一篇文章... 08-10-08...
当你不能依靠物理安全来保证你文件的安全时,是时候采取额外的步骤加密文件系统了,虽然本文涉及到的是基于powerpc的系统,但原则上来说也适用于其他架构的系统。
在另一篇文章“实现加密的home目录”中,我描写了如何透明地加密home目录,本文叙述另一个技术实现--加密的root文件系统,我论述了gnu/linux启动过程和软件需求,并提供了一些指令,对open firmware做了一下介绍,以及其他一些有关的考虑事项。我用于教学的系统是一台基于powerpc架构的新世界苹果ibook电脑,运行fedora core 3预览版,不考虑细节,本文涉及到的概念和程序可以应用到任何设备、架构或操作系统。我提供的指令假设你有一个多余的usb闪存盘并且你系统的支持从usb设备启动。
同时,我还假设读者能轻松应用源代码补丁并编译程序,对于fedora core 3 test 3版本,mkinitrd和启动脚本软件包需要打补丁以支持加密的root文件系统,需要掌握基本的分区管理和创建文件系统的知识,执行一个基本的linux发行版安装超出了本文要求的范畴。
在呈现有关的技术步骤之前,一个高层概念必须先讨论:信任。信任与加密技术和认证总是纠缠在一起的,对任何有电子密钥的设备都可以假设它是可信任的。例如:当自动提款机(atm)与我的银行账号共用个人识别号(pin)时,我会信任atm不会将我的pin与不适当的第三方进行共享。同样,当我给我的计算机提供一个加密密钥时,我假设这个密钥不会与任何其他人进行共享,我会信任这台计算机在我们之间保守秘密。
那么,你能信任你的计算机吗?除非你无论到哪里都带着它,否则你真的不能信任它,即使磁盘已经经过加密处理也不行。设想这样一个情景:在你睡觉时,有人偷走了你的计算机,小偷将计算机中加密的内容做了一份拷贝,虽然没有加密密钥而对他来说毫无意义,但是他可以用更恶魔的内容替换笔记本电脑加密的内容,然后再将电脑放回去,当你第二天醒来时,计算机提示你输入加密密码,但是这时你提供的密钥会传输给小偷,他得到密钥后就有一份数据和密钥的拷贝了,他就可以读取你的文件了。
这个情景可能显得比较牵强,但是它说明了一点,你不能信任你的笔记本电脑,始终保持你的眼睛你离开它很重要,因此,无论如何优秀地实现你的加密系统,要建立在信任的基础前提条件下才行。
网络确保我们可以信任计算机的启动过程,我们需要将其从计算机中分隔出来,考虑这个问题:你携带你的汽车钥匙而不是携带你的汽车。你的密钥自身概念上与你的汽车钥匙一样。你可以更容易地保护你的密钥,因此你不用随时随地都携带上你的计算机,我们将用这个密钥提供启动计算机需要的软件,闪存盘将充当密钥的角色,通过保护启动系统最初的软件,除加密密钥外,我们可以有效地降低启动过程被劫持的风险。
你需要连接你的计算机是如何启动的,因为解锁一个加密的root文件系统是对整体的引导过程有影响,目前稳定的内核版本是2.6,可选择使用initramfs来帮助启动,在lwn.net上有一篇文档“initramfs来了”, initramfs是一个cipo归档,内核知道如何解压到基于ram的磁盘上,这个解压的文件系统包括一个传统的载入内核挂载root文件系统的模块的脚本,在我们的样例中,这个脚本也用于解锁加密的root文件系统,关于这个主题更多的信息可以在文件buffer-format.txt和initrd.txt中找到,这两个文件都在linux内核源代码发布包中。
对linux有若干个文件系统加密接口是可用的,jari ruusu的loop-aes就是这样一个项目,有多个cryptoloop变种提供一个加密的loopback设备,本文集中讲述最近2.6linux内核提供的dm-crypt接口,这个接口目前已经被fedora项目吸收,dm-crypt模块由fedora内核包提供,还需要一个静态链接cryptsetup,这个实用程序简化了dm-crypt设备的管理,最后,还需要parted和hfsutils来管理启动文件系统。
不幸的是,fedora core的anaconda安装程序还不支持在盒子外安装加密文件系统,网络绕过这个限制,你必须保留一个空闲分区安装fedora,格式化空闲分区为一个加密文件系统,然后拷贝原始安装数据到新的加密文件系统上,网络简化,我们假设fedora已经安装到两个分区上:/dev/hda4,挂载到/home和/dev/hda5,挂载到/,因为/home下还没有用户目录,直到fedora安装完毕,我们可以使用/dev/hda4作为我们的备用分区,/dev/hda3作为swap分区。
安装fedroa core 3,挂载/dev/hda4到/home,/dev/hda5挂载到/,不要添加非root用户,因为/home稍后将被清除干净,至此,你应该拥有一个全功能的linux系统了。
在设置加密文件系统之前,你应该随意分区,这样排除一个潜在关于磁盘内容的信息漏洞,图1示范了一个抽象的半满磁盘,它没有恰当进行随机排列,图2示范了一个恰当随机排列的磁盘,在格式化之前包含一个加密的文件系统,注意,从图1中可以获取到一些关于它的内容的知识(如它们跨越了磁盘的二分之一),图2提供了一个没有那么豪华的对手,假如这样,磁盘可以很容易被清空,分区随机排列是通过用随机数据重写它的内容实现的:dd if=/dev/urandom of=/dev/hda4,这个过程可能要花很长的时间,因为创建随机数据有些困难的。
图1
图2随机排列的分区隐藏了使用量
要在/dev/hda4上创建一个加密的ext3文件系统,使用下面的步骤:
1)确认aes,dm-mod,dm-crypt模块已经载入内核
2)卸载将要托管加密root文件系统的分区/dev/hda4
#umount /dev/hda4
3)创建一个随机256位加密密钥并存储在/etc/root-key
#dd if =/dev/urandom of=/etc/root-key bs=1c count=32
这个密钥稍后将拷贝到闪存盘。
4)创建一个dm-crypt设备,使用前面创建的密钥加密
#cryptsetup -d /etc/root-key create /dev/hda4
现在访问/dev/mapper/root在/dev/hda4上提供了一个加密层,默认情况下,cryptsetup创建一个aes加密的dm-crypt设备并任务密钥大小为256位。
5)在/dev/mapper/root上创建一个ext3文件系统
#mkfs.ext3 /dev/mapper/root
6)挂载新文件系统
#mkdir /mnt/encroot
#mount /dev/mapper/root /mnt/encroot
7)现在你已经有一个加密文件系统了,你必须用/dev/hda5(原始的root文件系统)的内容来填充它
#cp -ax / /mnt/encroot
8)最后,在/mnt/encroot/crypttab中创建一个条目以便不同的实用程序知道文件系统是如何配置的:
root /dev/hda4 /etc/root-key cipher=aes
现在我们的加密文件系统已经准备好了,需要理解更多关于目标架构的启动过程,通常,计算机有一个固件程序来掌管系统启动的全过程,保护固件程序超出了本文的范畴,因此我们假设系统固件程序是可以信任的,大多数读者可能对bios比较熟悉,它是pc平台的启动固件程序,我主要讨论的是open firmware,它用于计算机制造厂商如苹果,sun和ibm启动系统。
在另一篇文章“实现加密的home目录”中,我描写了如何透明地加密home目录,本文叙述另一个技术实现--加密的root文件系统,我论述了gnu/linux启动过程和软件需求,并提供了一些指令,对open firmware做了一下介绍,以及其他一些有关的考虑事项。我用于教学的系统是一台基于powerpc架构的新世界苹果ibook电脑,运行fedora core 3预览版,不考虑细节,本文涉及到的概念和程序可以应用到任何设备、架构或操作系统。我提供的指令假设你有一个多余的usb闪存盘并且你系统的支持从usb设备启动。
同时,我还假设读者能轻松应用源代码补丁并编译程序,对于fedora core 3 test 3版本,mkinitrd和启动脚本软件包需要打补丁以支持加密的root文件系统,需要掌握基本的分区管理和创建文件系统的知识,执行一个基本的linux发行版安装超出了本文要求的范畴。
在呈现有关的技术步骤之前,一个高层概念必须先讨论:信任。信任与加密技术和认证总是纠缠在一起的,对任何有电子密钥的设备都可以假设它是可信任的。例如:当自动提款机(atm)与我的银行账号共用个人识别号(pin)时,我会信任atm不会将我的pin与不适当的第三方进行共享。同样,当我给我的计算机提供一个加密密钥时,我假设这个密钥不会与任何其他人进行共享,我会信任这台计算机在我们之间保守秘密。
那么,你能信任你的计算机吗?除非你无论到哪里都带着它,否则你真的不能信任它,即使磁盘已经经过加密处理也不行。设想这样一个情景:在你睡觉时,有人偷走了你的计算机,小偷将计算机中加密的内容做了一份拷贝,虽然没有加密密钥而对他来说毫无意义,但是他可以用更恶魔的内容替换笔记本电脑加密的内容,然后再将电脑放回去,当你第二天醒来时,计算机提示你输入加密密码,但是这时你提供的密钥会传输给小偷,他得到密钥后就有一份数据和密钥的拷贝了,他就可以读取你的文件了。
这个情景可能显得比较牵强,但是它说明了一点,你不能信任你的笔记本电脑,始终保持你的眼睛你离开它很重要,因此,无论如何优秀地实现你的加密系统,要建立在信任的基础前提条件下才行。
网络确保我们可以信任计算机的启动过程,我们需要将其从计算机中分隔出来,考虑这个问题:你携带你的汽车钥匙而不是携带你的汽车。你的密钥自身概念上与你的汽车钥匙一样。你可以更容易地保护你的密钥,因此你不用随时随地都携带上你的计算机,我们将用这个密钥提供启动计算机需要的软件,闪存盘将充当密钥的角色,通过保护启动系统最初的软件,除加密密钥外,我们可以有效地降低启动过程被劫持的风险。
你需要连接你的计算机是如何启动的,因为解锁一个加密的root文件系统是对整体的引导过程有影响,目前稳定的内核版本是2.6,可选择使用initramfs来帮助启动,在lwn.net上有一篇文档“initramfs来了”, initramfs是一个cipo归档,内核知道如何解压到基于ram的磁盘上,这个解压的文件系统包括一个传统的载入内核挂载root文件系统的模块的脚本,在我们的样例中,这个脚本也用于解锁加密的root文件系统,关于这个主题更多的信息可以在文件buffer-format.txt和initrd.txt中找到,这两个文件都在linux内核源代码发布包中。
对linux有若干个文件系统加密接口是可用的,jari ruusu的loop-aes就是这样一个项目,有多个cryptoloop变种提供一个加密的loopback设备,本文集中讲述最近2.6linux内核提供的dm-crypt接口,这个接口目前已经被fedora项目吸收,dm-crypt模块由fedora内核包提供,还需要一个静态链接cryptsetup,这个实用程序简化了dm-crypt设备的管理,最后,还需要parted和hfsutils来管理启动文件系统。
不幸的是,fedora core的anaconda安装程序还不支持在盒子外安装加密文件系统,网络绕过这个限制,你必须保留一个空闲分区安装fedora,格式化空闲分区为一个加密文件系统,然后拷贝原始安装数据到新的加密文件系统上,网络简化,我们假设fedora已经安装到两个分区上:/dev/hda4,挂载到/home和/dev/hda5,挂载到/,因为/home下还没有用户目录,直到fedora安装完毕,我们可以使用/dev/hda4作为我们的备用分区,/dev/hda3作为swap分区。
安装fedroa core 3,挂载/dev/hda4到/home,/dev/hda5挂载到/,不要添加非root用户,因为/home稍后将被清除干净,至此,你应该拥有一个全功能的linux系统了。
在设置加密文件系统之前,你应该随意分区,这样排除一个潜在关于磁盘内容的信息漏洞,图1示范了一个抽象的半满磁盘,它没有恰当进行随机排列,图2示范了一个恰当随机排列的磁盘,在格式化之前包含一个加密的文件系统,注意,从图1中可以获取到一些关于它的内容的知识(如它们跨越了磁盘的二分之一),图2提供了一个没有那么豪华的对手,假如这样,磁盘可以很容易被清空,分区随机排列是通过用随机数据重写它的内容实现的:dd if=/dev/urandom of=/dev/hda4,这个过程可能要花很长的时间,因为创建随机数据有些困难的。
图1
图2随机排列的分区隐藏了使用量
要在/dev/hda4上创建一个加密的ext3文件系统,使用下面的步骤:
1)确认aes,dm-mod,dm-crypt模块已经载入内核
2)卸载将要托管加密root文件系统的分区/dev/hda4
#umount /dev/hda4
3)创建一个随机256位加密密钥并存储在/etc/root-key
#dd if =/dev/urandom of=/etc/root-key bs=1c count=32
这个密钥稍后将拷贝到闪存盘。
4)创建一个dm-crypt设备,使用前面创建的密钥加密
#cryptsetup -d /etc/root-key create /dev/hda4
现在访问/dev/mapper/root在/dev/hda4上提供了一个加密层,默认情况下,cryptsetup创建一个aes加密的dm-crypt设备并任务密钥大小为256位。
5)在/dev/mapper/root上创建一个ext3文件系统
#mkfs.ext3 /dev/mapper/root
6)挂载新文件系统
#mkdir /mnt/encroot
#mount /dev/mapper/root /mnt/encroot
7)现在你已经有一个加密文件系统了,你必须用/dev/hda5(原始的root文件系统)的内容来填充它
#cp -ax / /mnt/encroot
8)最后,在/mnt/encroot/crypttab中创建一个条目以便不同的实用程序知道文件系统是如何配置的:
root /dev/hda4 /etc/root-key cipher=aes
现在我们的加密文件系统已经准备好了,需要理解更多关于目标架构的启动过程,通常,计算机有一个固件程序来掌管系统启动的全过程,保护固件程序超出了本文的范畴,因此我们假设系统固件程序是可以信任的,大多数读者可能对bios比较熟悉,它是pc平台的启动固件程序,我主要讨论的是open firmware,它用于计算机制造厂商如苹果,sun和ibm启动系统。