Linux 文件系统安全攻略

Linux 支持的文件系统种类繁多,他们为用户的数据存储和管理提供了良好的操作和使用界面。在文件系统中,存在着文件 / 目录访问权限管理和控制、加密文件系统等的安全机制和问题需要考虑,本文将详细介绍保证 Linux 文件系统安全的技术和方法。

李 洋, 信息安全顾问

李洋,博士,现任某大型金融公司信息安全顾问,多年来一直从事信息安全方面的研发和管理工作,具有丰富的互联网、电信网和金融行业信息安全管理、咨询和研发经验。目前关注开源系统安全、云安全、虚拟化安全等。



2012 年 1 月 31 日

Linux 文件系统安全攻略

Linux 支持的文件系统种类繁多,他们为用户的数据存储和管理提供了良好的操作和使用界面。在文件系统中,存在着文件 / 目录访问权限管理和控制、加密文件系统等的安全机制和问题需要考虑,本文将详细介绍保证 Linux 文件系统安全的技术和方法。


Linux 中的文件系统类型

随着 Linux 的不断发展,其所能支持的文件格式系统也在迅速扩充。特别是 Linux2.6 内核正式推出后,出现了大量新的文件系统,其中包括日志文件系统 Ext4、Ext3、ReiserFS、XFS、JFS 和其他文件系统。Linux 系统核心可以支持十多种文件系统类型:JFS、ReiserFS、Ext、Ext2、Ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC 等。


文件系统安全性对比

从自动修复损坏的文件系统来看,ext2、ext3 都能自动修复损坏的文件系统,也都是在开机时进行。ext2 和 ext3 文件系统在默认的情况下是“每间隔 21 次挂载文件系统或每 180 天,就要自动检测一次。通过实践来看 ext2 和 ext3 在自动检测上是存在风险,有时文件系统开机后就进入单用户模式,并且把整个系统“扔”进 lost+found 目录,如果要恢复系统,就得用 fsck 来进行修复;当然 fsck 也同样存在风险;所以对 ext2 和 ext3 文件系统的使用,对新手来说的确需要心里准备;毕竟修复已经损坏的 ext2 和 ext3 文件系统是有困难的;另外 ext2 和 ext3 文件系统对于意外关机和断电,也可能导致文件系统损坏,所以我们在使用过程中,必须是合法关机;比如执行 poweroff 指令来关掉机器。

从文件系统的反删除来看,ext2 支持反删除,对于一般使用者来说应该是安全的,但对于保密单位来说可能意味着不安全。从反删除角度来说明文件系统的安全性,也是有两方面。如果用户的工作是从事比较机密的,用 ext3 比较好,因为 ext3 一旦删除文件,是不可恢复的,因为反删除能恢复相应的绝秘资料的泄秘,所以 ext3 可能更适合从事机密工作的用户。


新型的 Ext4 文件系统

Ext4 是 Linux 内核版本 2.6.28 的重要部分。它是 Linux 文件系统的一次革命。在很多方面,Ext4 相对于 Ext3 的进步要远超过 Ext3 相对于 Ext2 的进步。Ext3 相对于 Ext2 的改进主要在于日志方面,但是 Ext4 相对于 Ext3 的的改进是更深层次的,是文件系统数据结构方面的优化。一个高效的、优秀的、可靠的和极具特点的文件系统就此诞生。目前,该文件系统并未在所有的 Linux 发行套件中完全普及使用,还处于初期的测试阶段。


安全设定文件 / 目录访问权限

Linux 系统中的每个文件和目录都有访问许可权限,通过其确定谁可以通过何种方式对文件和目录进行访问和操作。下面将对文件 / 目录访问的方法和命令进行介绍。

文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作;只写权限允许对文件进行任何的修改操作;可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。它可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中的每一位用户都能访问该用户拥有的文件或目录。

每一个文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限(如图 1 所示)。当用 ls -l 命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

 #ls -l sobsrc.tgz 
 -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc.tgz

横线代表空许可(即表示不具有该权限)。r 代表只读,w 代表写,x 代表可执行。注意:这里共有 10 个位置。第 1 个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第 1 个字符是横线,表示是一个非目录的文件。如果是 d,表示是一个目录。后面的 9 个字符每三个构成一组,依次表示文件主、组用户、其他用户对该文件的访问权限。

例如:

 -rw-r--r--    sobsrc.tgz

表示文件 sobsrc.tgz 的访问权限,说明 sobsrc.tgz 是一个普通文件;sobsrc.tgz 的属主有读写权限;与 sobsrc.tgz 属主同组的用户只有读权限;其他用户也只有读权限。

确定了一个文件的访问权限后,用户可以利用 Linux 系统提供的 chmod 命令来重新设定不同的访问权限。也可以利用 chown 命令来更改某个文件或目录的所有者。

图 1. 文件 / 目录访问权限示意图
图 1. 文件 / 目录访问权限示意图

改变文件 / 目录的访问权限

chmod 命令用于改变文件或目录的访问权限,它是一条非常重要的系统命令。用户可用其控制文件或目录的访问权限。

该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

文字设定法

文字设定法的一般使用形式为:chmod [who] [+ | - | =] [mode] 文件名。其中,操作对像 who 可以是下述字母中的任一个或者为各字母的组合:

 u 表示“用户(user)”,即文件或目录的所有者。

 g 表示“同组(group)用户”,即与文件属主有相同组 ID 的所有用户。

 o 表示“其他(others)用户”。

 a 表示“所有(all)用户”。其为系统默认值。

操作符号可以是:

 + 添加某个权限。

  取消某个权限。

 = 赋予给定权限并取消其他所有权限(如果有的话)。

设置 mode 所表示的权限可用下述字母的任意组合:

 r:可读。

 w:可写。

 x:可执行。只有目标文件对某些用户是可执行的或该目标文件是目录时才追加 x 属性。

 s:在文件执行时把进程的属主或组 ID 置为该文件的文件属主。方式“u+s”设置文件的用户 ID 位,“g + s”设置组 ID 位。

 t:将程序的文本保存到交换设备上。

 u:与文件属主拥有一样的权限。

 g:与和文件属主同组的用户拥有一样的权限。

o:与其他用户拥有一样的权限。

如果在一个命令行中可给出多个权限方式,其间用逗号隔开。图 2 给出了使用该设定法的例子:

图 2. chmod 命令文字设定法使用示例
图 2. chmod 命令文字设定法使用示例

首先,设定文件 test1 的属性为:文件属主(u)增加执行权限 ; 与文件属主同组用户(g)增加执行权限;其他用户(o)增加执行权限,其命令为:

 #chmod a+x test1

接着,设定文件 test2 的属性为:文件属主(u)增加写权限 ; 与文件属主同组用户(g)增加写权限;其他用户(o)删除执行权限,其命令为:

 #chmod ug+w,o-x test2

最后,对可执行文件 test3 添加 s 权限,使得执行该文件的用户暂时具有该文件拥有者的权限:

 #chmod u+s test3

在上述例子中,当其他用户执行 test3 这个程序时,他的身份将由于这个程序而暂时变成该 test3 程序的拥有者(由于 chmod 命令中使用了 s 选项),所以他就能够读取 test3.c 文件(虽然这个文件被设定为其他人不具备任何权限),这就是 s 的功能。在整个系统中特别是 root 本身,最好不要过多地设置这种类型的文件(除非必要),这样可以保障系统的安全,避免因为某些程序的 bug 而使系统遭到入侵。

数字设定法

数字设定法是与文字设定法功能等价的设定方法,只不过比文字设定法更加简便。数字表示的属性的含义为:0 表示没有权限,1 表示可执行权限,2 表示可写权限,4 表示可读权限,然后将其相加。所以数字属性的格式应为 3 个从 0 到 7 的八进制数,其顺序是(u)、(g)、(o)。其他的与文字设定法基本一致。

如果想让某个文件的属主有“读 / 写”二种权限,须要把 4(可读)+2(可写)=6(读 / 写)。

数字设定法的一般形式为:chmod [mode] 文件名。图 3 给出使用该数字设定法的例子:

图 3. chmod 命令数字设定法示意
图 3. chmod 命令数字设定法示意

可以看到,图 3 中设定文件 test1 的属性为:文件属主(u)拥有读、写权限 ; 与文件属主同组人用户(g)拥有读权限;其他人(o)拥有读权限,而设定 test2 这个文件的属性为:文件主本人(u)具有可读 / 可写 / 可执行权限;与文件主同组人(g)可读 / 可执行权;其他人(o)没有任何权限。

更改文件 / 目录的所有权

该命令用来更改某个文件或目录的属主和属组。举个例子,root 用户把自己的一个文件拷贝给用户 xu,为了让用户 xu 能够存取这个文件,root 用户应该把这个文件的属主设为 xu,否则,用户 xu 无法存取这个文件。

该命令的使用形式为:chown [ 选项 ] 用户或组 文件。

Chown 的功能是将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户 ID。组可以是组名或组 ID。文件是以空格分开的要改变权限的文件列表,支持通配符。该命令的选项为:

 -R:递归地改变指定目录及其下面的所有子目录和文件的拥有者。

 -v:显示 chown 命令所做的工作。

图 4 给出了使用该命令的例子,笔者把文件 test1 的所有者改为 super,把目录 ./test_dir 及其下面的所有文件和子目录的属主改成 super,属组改成 super。

图 4. chown 命令使用示意
图 4. chown 命令使用示意

改变文件的执行权限

通过前面的介绍我们知道,Linux 系统中的每一个文件都有一个所有者,表示该文件是谁创建的。同时,该文件还有一个组编号,表示该文件所属的组,一般为文件所有者所属的组。并且,在一般情况下,我们也可以通过设定对文件的权限来控制对其的相关操作。

在此情况中,如果是一个可执行文件,那么在执行时,一般该文件只拥有调用该文件的用户具有的权限。而 setuid/setgid 则可以来改变这种设置:

  • setuid:设置使文件在执行阶段具有文件所有者的权限。典型的文件是 /usr/bin/passwd。如果一般用户执行该文件,则在执行过程中,该文件可以获得 root 权限,从而可以更改用户的密码
  • setgid:该权限只对目录有效。目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。
  • sticky bit:该位可以理解为防删除位。一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件但同时不能删除文件。则可以对文件使用 sticky bit 位。设置该位后,j 即便用户对目录具有写权限,也不能删除该文件。

在前面我们讨论了通过文字设定和数字设定的方法来设定文件 / 目录的访问权限问题,同样的道理,下面我们通过这两种方法来介绍如何操作这些标志。操作这些标志与操作文件权限的命令是一样的,都是使用 chmod 命令来进行:

文字设定法

chmod u+s filename:为文件 filename 加上 setuid 标志。

chmod g+s dirname:为目录 dirname 目录加上 setgid 标志。

chmod o+t filename:为文件 filename 加上 sticky 标志。

数字设定法

对一般文件通过三组八进制数字来置标志,如 444、777、644 等。如果设置这些特殊标志,则在这组数字之前外加一组八进制数字。如 4666、4777 等。这一组八进制数字三位的意义如下:

  • setuid 位:如果该位为 1,显示为“S”,则表示设置 setuid,其显示在原来的 x 标志位上;
  • setgid 位:如果该位为 1,显示为“S”,则表示设置 setgid,其显示在原来的 x 标志位上;
  • sticky 位:如果该位为 1,显示为“T”,则表示设置 sticky,其显示在原来的 x 标志位上。

设置完这些标志后,可以用 ls – l 命令来查看。如果有这些标志,则会在原来的执行标志位置上显示。如下所示:

r-srw-r--:表示有 setuid 标志;

rwxrwsrw-:表示有 setgid 标志;

rwxrw-rwt:表示有 sticky 标志。

如果本来在该位上有 x,则这些特殊标志显示为小写字母(s,s,t)。否则,显示为大写字母(S,S,T)。

另外非常值得读者注意的是,虽然 setuid/setgid 机制非常方便实用,但是由于提升了执行者的权限,因而不可避免地存在许多安全隐患和风险,所以作者并不太赞成广大读者广泛使用,并且,在实际的系统管理过程中,我们还经常需要找出设置有这些标志的文件,并对他们进行检查和清理,那么,一般我们可以使用如下命令来对系统中的具有特殊标志的文件进行寻找:

#find -perm +6000 – type f – exec ls – ld {}\; > setuid.txt&


使用额外属性保护 ext3 文件系统安全

ext3 中的额外属性

从 Linux 的 1.1 系列内核开始,ext2 文件系统就开始支持一些针对文件和目录的额外标记或者叫作属性(attribute)。在 2.2 和 2.4 系列及其高版本的内核中,ext3 文件系统支持以下属性的设置和查询(如表 1 所示):

表 1. ext3 文件系统支持的属性含义
属性名 含 义
A Atime。告诉系统不要修改对这个文件的最后访问时间
S Sync。一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
a Append Only。系统只允许在这个文件之后追加数据,不允许任何进程覆盖或者截断这个文件。如果目录具有这个属性,系统将 只允许在这个目录下建立和修改文件,而不允许删除任何文件
i Immutable。系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
d No dump。在进行文件系统备份时,dump程序将忽略这个文件
c Compress。系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后,才写入磁盘
s Secure Delete。让系统在删除这个文件时,使用0填充文件所在的区域
u Undelete。当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件

虽然文件系统能够接受并保留指示每个属性的标志,但是这些属性不一定有效,这依赖于内核和各种应用程序的版本。表 2 显示了 Linux 每个版本内核支持的属性标志的具体情况,其中:

  • OK:表示允许设置这个标志并使设置生效;
  • POK:允许设置这个标志但忽略其值;
  • ——:表示完全忽略这个标志。
表 2. Linux 各内核版本对属性的支持情况
属性名 内核版本 Kernel 1.0 Kernel 1.2 Kernel 2.0 Kernel 2.2 Kernel 2.4 Kernel 2.6
A —— —— OK OK OK OK
S OK OK OK OK OK OK
a —— OK OK OK OK OK
i —— OK OK OK OK OK
d —— OK OK OK OK OK
c POK POK POK POK POK POK
s OK OK POK POK POK POK
u OK OK OK OK OK OK

从上述表格可以看出:虽然早期的内核版本支持安全删除特征,但是从 1.3 系列的内核开始,开发者抛弃的对这个特征的实现,因为它似乎只能够提高一点点的安全性,而糟糕的是它会给不熟悉安全删除继承问题的用户造成安全的假象。在对具有 A 属性的文件进行操作时,A 属性可以提高一定的性能。而 S 属性能够最大限度的保障文件的完整性。

因此,我们将主要讨论 a 属性和 i 属性,因为这两个属性对于提高文件系统的安全性和保障文件系统的完整性有很大的好处。同样,一些开放源码的 BSD 系统(比如 FreeBSD 和 OpenBSD),在其 UFS 或者 FFS 实现中也支持类似的特征。

使用 ext3 文件系统的属性

在任何情况下,标准的 ls 命令都不会一个文件或者目录的扩展属性。ext3 文件系统工具包中有两个工具:chattr 和 lsattr。它们被专门用来设置和查询文件属性。因为 ext3 是标准的 Linux 文件系统,因此几乎所有的发布都有 e2fsprogs 工具包。如果由于某些原因,系统中没有这个工具,用户可以从以下地址下载这个工具包的源代码编译并安装:http://sourceforge.net/projects/e2fsprogs

Lsattr 命令

lsattr 命令只支持很少的选项,其选项如下:

  • -a:列出目录中的所有文件,包括以 . 开头的文件。
  • -d:以和文件相同的方式列出目录,并显示其包含的内容。
  • -R:以递归的方式列出目录的属性及其内容。
  • -v:列出文件版本(用于网络文件系统 NFS)。

Chattr 命令

chattr 命令可以通过以下三种方式执行:

  • chattr +Si filename:给文件添加同步和不可变属性。
  • chattr -ai filename:把文件的只扩展(append-only)属性和不可变属性去掉。
  • chattr =aiA filename t:使文件只有 a、i 和 A 属性。

最后,每个命令都支持 -R 选项,用于递归地对目录和其子目录进行操作。

ext3 属性和文件权限的区别

几乎所有的系统管理员都理解 Linux 风格文件系统的权限和所有者以及 ls 命令的显示,如图 5 所示:

图 5. ls 显示结果
图 5. ls 显示结果

从 ls 的输出结果看,这些文件属于用户 super,而 super 所在的用户组是 super。用户 super 本人和 super 用户组的成员对 test2 和 test3 具有对文件的修改权限,而其他的用户对 test1、test2、test3 均只有读取文件的权限。图 6 给出了与图 5 对比的 lsattr 命令的输出:

图 6. lsattr 显示结果
图 6. lsattr 显示结果

输出结果显示,test2 只能被添加,而 test1 文件不准修改。在 Linux 系统中,如果一个用户以 root 的权限登录,文件系统的权限控制将无法对 root 用户和以 root 权限运行的进程进行任何的限制。这样对于 Linux 类的操作系统,如果攻击者通过远程或者本地攻击获得 root 权限将可能对系统造成严重的破坏。而 ext3 文件系统可以作为最后一道防线,最大限度地减小系统被破坏的程度,并保存攻击者的行踪。ext3 属性是由 sys_open() 和 sys_truncate() 等系统调用检查和赋予的,不受用户识别号和其他因素的影响,在任何情况下,对具有不可修改(immutable)属性的文件的进行任何修改都会失败,不管是否是 root 用户进行的修改。

但是,还有一个问题是 root 权限的用户可以通过删除 i 属性实现对文件的修改。这种防护只不过给获得 root 权限的攻击者加了一点小麻烦罢了,系统的安全性并没有根本性的提高。

在 2.1 之前的内核版本中,存在一个安全层(securelevel)的特征。使用安全层可以解决上述问题,因为如果系统的安全层大于 0,内核将 不允许对任何文件的 i 属性进行修改。这些版本的内核由 sysctl 命令的"kernel.securelevel"变量进行控制。如果在启动时,这个变量的值被设置为 1 或者更大的值,内核将不允许对具有 i 属性和 a 属性文件进行修改,除非国旗动到单用户状态。但是,由于引入了更为灵活的内核能力特征(kernel capabilities),以后的内核不再支持安全层。使用内核能力,也可以实现类似的 限制。工具 lcap 用来查询和调整内核能力约束集(kernel capabilities bounding set)。在启动脚本中加入以下命令,就可以实现对具有 i 属性和 a 属性文件的保护:

 lcap CAP_LINUX_IMMUTABLE 
 lcap CAP_SYS_RAWIO

第一个命令删除任何用户(包括超级用户)对 i 标志的修改能力。第二个命令删除任何用户(主要针对超级用户)对块设备的原始访问 (raw access) 能力,防止一些技术高超的攻击者直接修改文件系统索引节点的 immutable 域。BTW,在系统启动时,CAP_SYS_RAWIO 能 力应该直接删除,这个能力是一个非常大的潜在威胁。高明的攻击者获得了超级用户权限之后,通过 /dev/kmem 设备可以直接修改内核 内存。通过这种方式,可以破坏系统的内核能力约束集 (kernel capabilities bounding)。如果没有任何参数,会列出内核支持的能力和目 前生效的内核能力。一旦一个内核能力被删除,就只有在系统重新启动,进入到单用户模式才能删除能力限制。

使用 chattr

Linux 主机直接暴露在 Internet 或者位于其它危险的环境,有很多 shell 帐户或者提供 HTTP 和 FTP 等网络服务,一般应该在安装配置完成后使用如下命令:

 chattr -R +i /bin /boot /etc /lib /sbin 
 chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin 
 chattr +a /var/log/messages /var/log/secure (...)

如果很少对帐户进行添加、变更或者删除,把 /home 本身设置为 immutable 属性也不会造成什么问题。在很多情况下,整个 /usr 目录树也应该具有不可改变属性。实际上,除了对 /usr 目录使用 chattr -R +ii /usr/ 命令外,还可以在 /etc/fstab 文件中使用 ro 选项,使 /usr 目录所在的分区以只读的方式加载。另外,把系统日志文件设置为只能添加属性(append-only),将使入侵者无法擦除自己的踪迹。当然,如果使用这种安全措施,需要系统管理员修改管理方式。

由于软件管理程序需要加入和删除某些文件和目录,因此在进行软件安装和升级之前需要删除某些目录和文件的 immutable 和 append-only 属性。对于 Linux 系统,一般使用 rpm 管理软件包,用户可以使用以下命令查看要安装或者升级的软件包都有哪些文件:

 #rpm -qipl foopackage.rpm

然后去掉有关目录和文件的 immutable 和 append-only 属性。大多数软件包需要 rpm 命令对以下目录的一个或者多个进行写操作:

 /bin 
 /sbin 
 /usr/bin 
 /usr/sbin 
 /usr/man 
 /lib 
 /etc

值得注意的是:如果用户需要升级 /usr/sbin/someprogram,应该去掉 someprogram 文件以及目录 /usr/sbin 的 immutable 属性。


使用加密文件系统(EFS)

下面将详细介绍利用 dm-crypt 来创建加密文件系统的方法。与其它创建加密文件系统的方法相比,dm-crypt 系统有着无可比拟的优越性:它的速度更快,易用性更强。除此之外,它的适用面也很广,能够运行在各种块设备上,即使这些设备使用了 RAID 和 LVM 也毫无障碍。dm-crypt 系统之所以具有这些优点,主要得益于该技术是建立在 2.6 版本内核的 device-mapper 特性之上的。device-mapper 是设计用来为在实际的块设备之上添加虚拟层提供一种通用灵活的方法,以方便开发人员实现镜像、快照、级联和加密等处理。此外,dm-crypt 使用了内核密码应用编程接口实现了透明的加密,并且兼容 cryptloop 系统。

内核准备

dm -crypt 利用内核的密码应用编程接口来完成密码操作。一般说来,内核通常将各种加密程序以模块的形式加载。对于 AES 来说,其安全强度已经非常之高,即便用来保护绝密级的数据也足够了。为了保证用户的内核已经加载 AES 密码模块,请根据图 7 所示命令进行检查:

图 7. 检查 AES 模块是否成功加载
图 7. 检查 AES 模块是否成功加载

否则,可以使用 modprobe 来手工加载 AES 模块,命令如下所示:

 #modprobe aes

接下来,用户安装 dmsetup 软件包,该软件包含有配置 device-mapper 所需的工具,如下命令所示:

 #yum install dmsetup cryptsetup

为检查 dmsetup 软件包是否已经建立了设备映象程序,键入下列命令进行:

 #ls -l /dev/mapper/control

然后,需要使用如下命令加载 dm-crypt 内核模块:

 #modprobe dm-crypt

dm-crypt 加载后,它会用 evice-mapper 自动注册。如果再次检验的话,device-mapper 已能识别 dm-crypt,并且把 crypt 添加为可用的对象。执行完上述步骤后,用户应该可以根据如下命令看到 crypt 的下列输出,如图 8 所示:

 #dmsetup targets
图 8. 成功做好装载加密设备的显示
图 8. 成功做好装载加密设备的显示

这说明系统已经为装载加密设备做好了准备。下面,我们先来建立一个加密设备。

创建加密设备

要创建作为加密设备装载的文件系统,有两种选择:一是建立一个磁盘映像,然后作为回送设备加载;二是使用物理设备。无论那种情况,除了在建立和捆绑回送设备外,其它操作过程都是相似的。

建立回送磁盘映象

如果用户没有用来加密的物理设备(比如存储棒或另外的磁盘分区),作为替换,你可以利用命令 dd 来建立一个空磁盘映象,然后将该映象作为回送设备来装载,照样能用。下面我们以实例来加以介绍:

 #dd if=/dev/zero of=/virtual.img bs=1M count=100

这里我们新建了一个大小为 100 MB 的磁盘映象,该映象名字为 virtual.img。要想改变其大小,可以改变 count 的值。

接下来,我们利用 losetup 命令将该映象和一个回送设备联系起来:

 #losetup /dev/loop0 /virtual.img

现在,我们已经得到了一个虚拟的块设备,其位于 /dev/loop0,并且我们能够如同使用其它设备那样来使用它。

设置块设备

准备好了物理块设备(例如 /dev/hda1),或者是虚拟块设备(像前面那样建立了回送映象,并利用 device-mapper 将其作为加密的逻辑卷加载),我们就可以进行块设备配置了。

下面我们使用 cryptsetup 来建立逻辑卷,并将其与块设备捆绑:

#cryptsetup -y create ly_EFS device_name

其中,ly_EFS 是新建的逻辑卷的名称。并且最后一个参数 device_name 必须是将用作加密卷的块设备。所以,如果要使用前面建立的回送映象作为虚拟块设备的话,应当运行以下命令:

#cryptsetup -y create ly_EFS /dev/loop0

无论是使用物理块设备还是虚拟块设备,程序都会要求输入逻辑卷的口令,-y 的作用在于要你输入两次口令以确保无误。这一点很重要,因为一旦口令弄错,就会把自己的数据锁住,如图 9 所示:

图 9. 为 EFS 输入密码
图 9. 为 EFS 输入密码

为了确认逻辑卷是否已经建立,可以使用下列命令进行检查一下:

 #dmsetup ls

只要该命令列出了逻辑卷,就说明已经成功建立了逻辑卷。不过根据机器的不同,设备号可能有所不同,如图 10 所示:

图 10. 显示成功建立的逻辑卷
图 10. 显示成功建立的逻辑卷

device-mapper 会把它的虚拟设备装载到 /dev/mapper 下面,所以,你的虚拟块设备应该是 /dev/mapper/ly_EFS ,尽管用起来它和其它块设备没什么不同,实际上它却是经过透明加密的。

如同物理设备一样,用户也可以在虚拟设备上创建文件系统:

 #mkfs.ext3 /dev/mapper/ly_EFS

现在为新的虚拟块设备建立一个装载点,然后将其装载。命令如下所示:

 #mkdir /mnt/ly_EFS 
 #mount /dev/mapper/ly_EFS /mnt/ly_EFS

用户能够利用下面的命令查看其装载后的情况,如图 11 所示:

 #df -h /mnt/ly_EFS
图 11. EFS 成功装载后的显示
图 11. EFS 成功装载后的显示

通过上述的步骤后,用户看到装载的文件系统,尽管看起来与其它文件系统无异,但实际上写到 /mnt/ly_EFS/ 下的所有数据,在数据写入之前都是经过透明的加密处理后才写入磁盘的,因此,从该处读取的数据都是些密文。

卸载加密设备

要卸载加密文件系统,和平常的方法没什么两样:

 #umount /mnt/ly_EFS

即便已经卸载了块设备,在 dm-crypt 中仍然视为一个虚拟设备。如若不信,用户可以再次运行如图 10 所示的命令 dmsetup ls 来验证一下,将会看到该设备依然会被列出。因为 dm-crypt 缓存了口令,所以机器上的其它用户不需要知道口令就能重新装载该设备。为了避免这种情况发生,用户必须在卸载设备后从 dm-crypt 中显式的删除该设备。命令具体如下所示:

 #cryptsetup remove ly_EFS

此后,它将彻底清除,要想再次装载的话,用户必须再次输入口令。

重新装载加密设备

在卸载加密设备后,用户很可能还需作为普通用户来装载它们。为了简化该工作,需要在 /etc/fstab 文件中添加下列内容:

 /dev/mapper/ly_EFS /mnt/ly_EFS ext3 noauto,noatime 0 0

此外,用户也可以通过建立脚本来替我们完成 dm-crypt 设备的创建和卷的装载工作,方法是用实际设备的名称或文件路径来替换 /dev/DEVICENAME:

 #!/bin/sh 
 cryptsetup create ly_EFS /dev/DEVICENAME 
 mount /dev/mapper/ly_EFS /mnt/ly_EFS

如果用户使用的是回送设备的话,用户还可以利用脚本来捆绑设备,脚本如下所示:

 #!/bin/sh 
 losetup /dev/loop0 ~/virtual.img 
 cryptsetup create ly_EFS /dev/loop0 
 mount /dev/mapper/ly_EFS /mnt/ly_EFS

在 Linux 系统安装时使用 EFS

上面介绍了使用 dm-crypt 来创建加密文件系统的方法,对于初级用户来说,可能这个过程有些繁杂和不好理解。那么,本节将介绍一个非常简单的方法来使用 EFS 文件系统。以 Fedora 10 的安装步骤为例子,选择相关选项进行安装就可以方便地进行使用了。

用户可以在空闲空间新建分区,也可以选择某个分区进行编辑,还可以删除某些分区。在图 12 中,需要选中 [ 加密文件系统 ] 选项,并且,根据系统要求,输入访问 EFS 所需要的密码,如图 13 所示。然后,根据第 3 章的介绍接下来一步一步按照系统的提示进行系统安装即可。那么,在成功安装系统后,用户就拥有了一个安全的加密文件系统,并且,在每次登录系统的时候,系统都会要求用户输入在图 13 所示步骤中设定的密码来进行安全访问。

图 12. 安装时选中 [ 加密系统 (E)] 选项
图 12. 安装时选中 [ 加密系统 (E)] 选项
图 13. 输入 EFS 所需的密码
图 13. 输入 EFS 所需的密码

参考资料

学习

讨论

  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=790349
ArticleTitle=Linux 文件系统安全攻略
publish-date=01312012