[ZLG-ARM] 玩转Linux文件系统加密

[复制链接]
 楼主| billen 发表于 2009-6-4 16:53 | 显示全部楼层 |阅读模式
本文将详细介绍利用dm-crypt来创建加密文件系统的方法。与其它创建加密文件系统的方法相比,dm-crypt系统有着无可比拟的优越性:它的速度更快,易用性更强。除此之外,它的适用面也很广,能够运行在各种块设备上,即使这些设备使用了RAID和&nbsp;LVM也毫无障碍。dm-crypt系统之所以具有这些优点,主要得益于该技术是建立在2.6版本内核的device-mapper特性之上的。&nbsp;device-mapper是设计用来为在实际的块设备之上添加虚拟层提供一种通用灵活的方法,以方便开发人员实现镜像、快照、级联和加密等处理。此外,&nbsp;dm-crypt使用了内核密码应用编程接口实现了透明的加密,并且兼容cryptloop系统。<br /><br />  一、配置内核<br />  dm&nbsp;-crypt利用内核的密码应用编程接口来完成密码操作。一般说来,内核通常将各种加密程序以模块的形式加载。对于256-bit&nbsp;AES来说,其安全强度已经非常之高,即便用来保护绝密级的数据也足够了。因此本文中我们使用256-bit&nbsp;AES密码,为了保证您的内核已经加载AES密码模块,请利用下列命令进行检查:<br />  $&nbsp;cat&nbsp;/proc/crypto<br />  如果看到类似下面的输出的话,说明AES模块已经加载:&nbsp;<br />  name&nbsp;:&nbsp;aes<br />  module&nbsp;:&nbsp;aes<br />  type&nbsp;:&nbsp;cipher<br />  blocksize&nbsp;:&nbsp;16<br />  min&nbsp;keysize&nbsp;:&nbsp;16<br />  max&nbsp;keysize&nbsp;:&nbsp;32<br />  否则,我们可以利用modprobe来手工加载AES模块,命令如下所示:<br />  $&nbsp;sudo&nbsp;modprobe&nbsp;aes<br />  接下来安装dmsetup软件包,该软件包含有配置device-mapper所需的工具:<br />  $&nbsp;sudo&nbsp;apt-get&nbsp;install&nbsp;dmsetup&nbsp;cryptsetup<br />  为检查dmsetup软件包是否已经建立了设备映象程序,键入下列命令:&nbsp;<br />  $&nbsp;ls&nbsp;-l&nbsp;/dev/mapper/control<br />  接下来加载dm-crypt内核模块:&nbsp;<br />  $&nbsp;sudo&nbsp;modprobe&nbsp;dm-crypt<br />  dm-crypt加载后,它会用evice-mapper自动注册。如果再次检验的话,device-mapper已能识别dm-crypt,并且把crypt&nbsp;添加为可用的对象:&nbsp;<br />  $&nbsp;sudo&nbsp;dmsetup&nbsp;targets<br />  如果一切顺利,现在你应该看到crypt的下列输出:&nbsp;<br />  crypt&nbsp;v1.1.0<br />  striped&nbsp;v1.0.2<br />  linear&nbsp;v1.0.1<br />  error&nbsp;v1.0.1<br />  这说明我们的系统已经为装载加密设备做好了准备。下面,我们先来建立一个加密设备。<br />  <br /><br />  二、建立加密设备<br />  要创建作为加密设备装载的文件系统,有两种选择:一是建立一个磁盘映像,然后作为回送设备加载;二是使用物理设备。无论那种情况,除了在建立和捆绑回送设备外,其它操作过程都是相似的。<br />  1.建立回送磁盘映象<br />  如果你没有用来加密的物理设备(比如存储棒或另外的磁盘分区),作为替换,你可以利用命令dd来建立一个空磁盘映象,然后将该映象作为回送设备来装载,照样能用。下面我们以实例来加以介绍:<br />  $&nbsp;dd&nbsp;if=/dev/zero&nbsp;of=~/secret.img&nbsp;bs=1M&nbsp;count=100<br />  这里我们新建了一个大小为100&nbsp;MB的磁盘映象,该映象名字为secret.img。要想改变其大小,可以改变count的值。&nbsp;<br />  接下来,我们利用losetup命令将该映象和一个回送设备联系起来:&nbsp;<br />  $&nbsp;sudo&nbsp;losetup&nbsp;/dev/loop/0&nbsp;~/secret.img<br />  现在,我们已经得到了一个虚拟的块设备,其位于/dev/loop/0,并且我们能够如同使用其它设备那样来使用它。&nbsp;<br />  2.设置块设备<br />  准备好了物理块设备(例如/dev/sda1),或者是虚拟块设备(像前面那样建立了回送映象,并利用device-mapper将其作为加密的逻辑卷加载),我们就可以进行块设备配置了。<br />  下面我们使用cryptsetup来建立逻辑卷,并将其与块设备捆绑:<br />  $&nbsp;sudo&nbsp;cryptsetup&nbsp;-y&nbsp;create&nbsp;myEncryptedFilesystem&nbsp;<br />  /dev/DEVICENAME<br />  其中,myEncryptedFilesystem&nbsp;是新建的逻辑卷的名称。并且最后一个参数必须是将用作加密卷的块设备。所以,如果你要使用前面建立的回送映象作为虚拟块设备的话,应当运行以下命令:&nbsp;<br />  $&nbsp;sudo&nbsp;cryptsetup&nbsp;-y&nbsp;create&nbsp;myEncryptedFilesystem&nbsp;/dev/loop/0<br />  无论是使用物理块设备还是虚拟块设备,程序都会要你输入逻辑卷的口令,-y的作用在于要你输入两次口令以确保无误。这一点很重要,因为一旦口令弄错,你就会把自己的数据锁住,这时谁也帮不了您了!<br />  为了确认逻辑卷是否已经建立,可以使用下列命令进行检查一下:<br />  $&nbsp;sudo&nbsp;dmsetup&nbsp;ls<br />  只要该命令列出了逻辑卷,就说明已经成功建立了逻辑卷。不过根据机器的不同,设备号可能有所不同:&nbsp;<br />  myEncryptedFilesystem&nbsp;(221,&nbsp;0)<br />  device-mapper会把它的虚拟设备装载到/dev/mapper下面,所以,你的虚拟块设备应该是/dev/mapper/myEncryptedFilesystem&nbsp;,尽管用起来它和其它块设备没什么不同,实际上它却是经过透明加密的。<br />  如同物理设备一样,我们也可以在虚拟设备上创建文件系统:<br />  $&nbsp;sudo&nbsp;mkfs.ext3&nbsp;/dev/mapper/myEncryptedFilesystem<br />  现在为新的虚拟块设备建立一个装载点,然后将其装载。命令如下所示:&nbsp;<br />  $&nbsp;sudo&nbsp;mkdir&nbsp;/mnt/myEncryptedFilesystem&nbsp;<br />  $&nbsp;sudo&nbsp;mount&nbsp;/dev/mapper/myEncryptedFilesystem&nbsp;/mnt/myEncryptedFilesystem<br />  我们能够利用下面的命令查看其装载后的情况:&nbsp;<br />  $&nbsp;df&nbsp;-h&nbsp;/mnt/myEncryptedFilesystem&nbsp;<br />  Filesystem&nbsp;Size&nbsp;Used&nbsp;Avail&nbsp;Use%&nbsp;Mounted&nbsp;on<br />  /dev/mapper/myEncryptedFilesystem&nbsp;97M&nbsp;2.1M&nbsp;90M&nbsp;2%&nbsp;/mnt/myEncryptedFilesystem<br />  很好,我们看到装载的文件系统,尽管看起来与其它文件系统无异,但实际上写到/mnt/myEncryptedFilesystem&nbsp;/下的所有数据,在数据写入之前都是经过透明的加密处理后才写入磁盘的,因此,从该处读取的数据都是些密文。<br />  <br /><br />  要卸载加密文件系统,和平常的方法没什么两样:<br />  $&nbsp;sudo&nbsp;umount&nbsp;/mnt/myEncryptedFilesystem<br />  即便已经卸载了块设备,在dm-crypt中仍然视为一个虚拟设备。如若不信,你可以再次运行命令sudo&nbsp;dmsetup&nbsp;ls来验证一下,你会看到该设备依然会被列出。因为dm-crypt缓存了口令,所以机器上的其它用户不需要知道口令就能重新装载该设备。为了避免这种情况发生,你必须在卸载设备后从dm-crypt中显式的删除该设备。命令具体如下所示:&nbsp;<br />  $&nbsp;sudo&nbsp;cryptsetup&nbsp;remove&nbsp;myEncryptedFilesystem<br />  此后,它将彻底清除,要想再次装载的话,你必须再次输入口令。为了简化该过程,我们可以利用一个简单的脚本来完成卸载和清除工作:&nbsp;<br />  #!/bin/sh<br />  umount&nbsp;/mnt/myEncryptedFilesystem&nbsp;<br />  cryptsetup&nbsp;remove&nbsp;myEncryptedFilesystem<br />  四、重新装载<br />  在卸载加密设备后,我们很可能还需作为普通用户来装载它们。为了简化该工作,我们需要在/etc/fstab文件中添加下列内容:&nbsp;<br />  /dev/mapper/myEncryptedFilesystem&nbsp;/mnt/myEncryptedFilesystem&nbsp;ext3&nbsp;noauto,noatime&nbsp;0&nbsp;0<br />  此外,我们也可以通过建立脚本来替我们完成dm-crypt设备的创建和卷的装载工作,方法是用实际设备的名称或文件路径来替换/dev/DEVICENAME:&nbsp;<br />  #!/bin/sh<br />  cryptsetup&nbsp;create&nbsp;myEncryptedFilesystem&nbsp;/dev/DEVICENAME<br />  mount&nbsp;/dev/mapper/myEncryptedFilesystem&nbsp;/mnt/myEncryptedFilesystem<br />  如果你使用的是回送设备的话,你还能利用脚本来捆绑设备:&nbsp;<br />  #!/bin/sh&nbsp;<br />  losetup&nbsp;/dev/loop/0&nbsp;~/secret.img<br />  cryptsetup&nbsp;create&nbsp;myEncryptedFilesystem&nbsp;/dev/loop/0<br />  mount&nbsp;/dev/mapper/myEncryptedFilesystem&nbsp;/mnt/myEncryptedFilesystem<br />  如果你收到消息“ioctl:&nbsp;LOOP_SET_FD:&nbsp;Device&nbsp;or&nbsp;resource&nbsp;busy”,这说明回送设备很可能仍然装载在系统上。我们可以利用sudo&nbsp;losetup&nbsp;-d&nbsp;/dev/loop/0命令将其删除。<br />  五、加密主目录<br />  如果配置了PAM(Pluggable&nbsp;Authentication&nbsp;Modules,即可插入式鉴别模块)子系统在您登录时装载主目录的话,你甚至还能加密整个主目录。因为libpam-mount模块允许PAM在用户登录时自动装载任意设备,所以我们要连同openssl一起来安装该模块。命令如下所示:<br />  $&nbsp;sudo&nbsp;apt-get&nbsp;install&nbsp;libpam-mount&nbsp;openssl<br />  接下来,编辑文件/etc/pam.d/common-auth,在其末尾添加下列一行:&nbsp;<br />  auth&nbsp;optional&nbsp;pam_mount.so&nbsp;use_first_pass<br />  然后在文件/etc/pam.d/common-session末尾添加下列一行内容:&nbsp;<br />  session&nbsp;optional&nbsp;pam_mount.so<br />  现在,我们来设置PAM,告诉它需要装载哪些卷、以及装载位置。对本例而言,假设用户名是Ian,要用到的设备是/dev/sda1,要添加到/etc/security/pam_mount.conf文件中的内容如下所示:<br />  volume&nbsp;Ian&nbsp;crypt&nbsp;-&nbsp;/dev/sda1&nbsp;/home/Ian&nbsp;cipher=aes&nbsp;aes-256-ecb&nbsp;/home/Ian.key<br />  如果想使用磁盘映象,你需要在此规定回送设备(比如/dev/loop/0),并确保在Ian登录之前系统已经运行losetup。为此,你可以将&nbsp;losetup&nbsp;/dev/loop/0&nbsp;/home/secret.img放入/etc/rc.local文件中。因为该卷被加密,所以PAM需要密钥来装载卷。最后的参数用来告诉PAM密钥在&nbsp;/home/Ian.key文件中,为此,通过使用OpenSSL来加密你的口令来建立密钥文件:<br />  $&nbsp;sudo&nbsp;sh&nbsp;-c&nbsp;'echo&nbsp;<br />  '<br />  YOUR&nbsp;PASSPHRASE<br />  '&nbsp;<br />  |&nbsp;openssl&nbsp;aes-256-ecb&nbsp;&gt<br />  /home/Ian.key'<br />  这时,提示你输入密码。注意,这里的口令必需和想要的用户登录密码一致。原因是当你登录时,PAM需要你提供这个密码,用以加密你的密钥文件,然后根据包含在密钥文件中的口令用dm-crypt装载你的主目录。<br />  需要注意的是,这样做会把你的口令以明文的形式暴露在.history文件中,所以要及时利用命令history&nbsp;-c清楚你的历史记录。此外,要想避免把口令存放在加密的密钥文件中的话,可以让创建加密文件系统的口令和登录口令完全一致。这样,在身份认证时,PAM&nbsp;只要把你的密码传给dm-crypt就可以了,而不必从密钥文件中抽取密码。为此,你可以在/etc/security/pam_mount.conf文件中使用下面的命令行:<br />  volume&nbsp;Ian&nbsp;crypt&nbsp;-&nbsp;/dev/sda1&nbsp;/home/Ian&nbsp;cipher=aes&nbsp;-&nbsp;-<br />  最后,为了保证在退出系统时自动卸载加密主目录,请编辑/etc/login.defs文件使得CLOSE_SESSIONS项配置如下:&nbsp;<br />  CLOSE_SESSIONS&nbsp;yes<br /><br />  六、小结<br />  数据加密是一种强而有力的安全手段,它能在各种环境下很好的保护数据的机密性。而本文介绍的Ubuntu&nbsp;Linux&nbsp;下的加密文件系统就是一种非常有用的数据加密保护方式,相信它能够在保护数据机密性相方面对您有所帮助。<br />&nbsp;<br /> &nbsp;&nbsp;<br />
armpc 发表于 2009-6-4 17:11 | 显示全部楼层

Good

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部