当前位置:操作系统 > 玩转网络 >>

文件系统安全

答案:

1. 基础知识

文件系统是unix系统安全的核心。在unix中,所有的事物都是文件。Unix中的基本文 件类型有正规文件、目录、特殊文件、链接、Sockets等等。这些不同类型的文件以一个分层的树结构进行组织,以一个叫"root"的目录为起始位置("/")。整个就是一个文件系统。每个文件对应一个"i节点", "i节点"包括UID(文件拥有者)、GID(文件所在组)、模式(文件的权限)、文件大小、文件类型、ctime("i节点"上次修改时间)、mtime(文件上次修改时间)、atime(文件上次访问时间)、nlink(链接数)。它表示了文件的基本属性。

大家注意到,"/"下有很多的目录,那么这些目录是干什么的呢?我简要介绍一下目录结构。如下:

/bin 用户命令的可执行文件
/dev 特殊设备文件
/etc 系统执行文件、配置文件、管理文件,主要是配置文件
/home 用户起始目录
/lib 引导系统以及在root文件系统中运行命令所需的共享库文件
/lost+found 与特定文件系统断开连结的丢失文件
/mnt 临时安装的文件系统(如光驱、软驱)
/proc 一个伪文件系统,用来作为到内核数据结构或正在运行的进程的接口(用于调试)
/sbin 只有root使用的可执行文件和只需要引导或安装/usr的文件
/tmp 临时文件
/usr 为用户和系统命令使用的可执行文件、头文件、共享库、帮助文件、本地程序(在/usr/local中)
/var 用于电子邮件、打印、cron等的文件,统计文件,日志文件

文件系统有多种类型,linux内核支持如下文件系统:

ext2 固定和可移动磁盘都支持的一种高性能文件系统,用于linux
msdos 由MS-DOS和Windows使用
umsdos Linux使用的一种扩充的DOS文件系统,支持长文件名、权限设置
iso9660 遵从ISO9660标准的CD-ROM文件系统
hpfs High Performance Filesystem 高性能文件系统,OS/2使用
minix 在Minux OS中使用,最早的Linux文件系统
nfs 用来访问远程计算机中磁盘的网络文件系统
swap 用作交换的磁盘分区

2. 文件权限

文件权限是unix文件系统安全的关键。Unix中的每个用户有一个唯一的用户名和UID(用户ID号),每个用户属于一个或多个组。基本分组成员在/etc/passwd中定义,附加的分组成员在/etc/group中定义。例如,用户tiger的UID为225,分组为11(students),此外,他还是分组185(postgraduates)的成员。每个文件和目录有三组权限,一组是文件的拥有者、一组是文件所属组的成员、一组是其他所有用户。"r"表示可读,"w"表示可写,"x"表示可执行。一共9位(每组3位),合起来称为模式位(mode bits)。

模式位通常由一列10个字符来表示,每个字符表示一个模式设置,第一个指明文件类型,如(d表示目录,-表示普通文件,l表示链接文件等等)。例如,用ls -l 命令显示如下:

drwxr-xr-x 2 root root 1024 Aug 13 09:22 backup/
-rw-r--r-- 1 root root 1824 Apr 21 18:45 client.c
-rw------- 1 root root 65536 Apr 22 17:56 core
-rw-r----- 1 root root 2351 Apr 22 14:01 cry1.bak
-rwxr-xr-x 1 root root 27492 Apr 21 18:47 crypt*
-rw-r----- 1 tiger tiger 2450 Apr 22 15:16 cryption_server.c
-rw-r----- 1 tiger tiger 1544 Apr 22 15:02 myinclude.h
-rwxr-xr-x 1 root root 8280 May 3 10:35 test*

例如最后一行以"-"开始,表示test使一个普通文件,文件拥有者可以读写执行、本组其他成员可以读执行、其他用户可以读执行。我们可以用chmod和umask命令来改变权限,这很简单,察看相应的帮助就知道怎么修改权限。

3. SUID/SGID

为什么我要单独把他们从文件权限中分出来讲呢?因为,这是网络入侵者非常爱用的入 侵入口。SUID表示"设置用户ID",SGID表示"设置组ID"。当用户执行一个SUID文件时,用户ID在程序运行过程中被置为文件拥有者的用户ID。如果文件属于root,那用户就成为超级用户。同样,当一个用户执行SGID文件时,用户的组被置为文件的组。例如,PS命令以SUID root运行,他从系统内存中读取,这是一般用户不能做的。SUID程序代表了重要的安全漏洞,特别是SUID设为root的程序。

Unix实际上有两种类型的用户ID。"real user ID"是在登录过程中建立的用户ID。 "effective user ID"是在登录后的会话过程中通过SUID和SGID位来修改。当一个用户运行一条命令时,进程继承了用户登录Shell的权限,这时"real user ID"和"effective user ID"是相同的。当SUID位被设置时,进程继承了命令拥有者的权限。例如普通用户运行passwd命令时,他能够修改/etc/passwd文件,尽管文件是属于root的。这成为可能是因为passwd命令以root的SUID权限运行。那么如何识别SUID程序呢?我们检查文件的权限模式,在它的第四位如果不是"x",而是"s",就是一个SUID程序。例如,ls -l /bin/su命令显示:

-rwsr-xr-x 1 root root 14888 Aug 15 1999 /bin/su*

表明su是一个SUID程序。

Unix系统安全的一种典型攻击就是创建一个SUID是root的shell拷贝,然后把他隐藏。通过调用后门,攻击者就获得了root的权利。例如,某个系统管理员忘了关闭某个root的 Shell,一个坏人经过运行如下命令:

cp /bin/bash /home/badman/.bash; chmod 4777 /home/badman/.bash

badman现在就有了一个bash的SUID root拷贝任其处理。他就有完整的root权限了。因此,系统管理员应该定期察看系统中有哪些SUID和SGID文件。用下面的命令可以实现:find / -type f ( -perm -4000 -o -perm -2000 ) -ls

当然,攻击者可以通过修改find命令来逃避检测,所以要运行专门的检测软件(如Tripwire)来进行检查。

4. 加密与验证

Tripwire工具提出了使用密码校验和来确定文件是否经过了未认证的修改,加密技术可 以用来保护机密文件甚至整个文件系统。加密是通过密钥将明文转化为一堆乱码的密文,从而起到保护文件内容的作用。Unix常用的加密算法有crypt(最早的加密工具)、DES(目前最常用的)、IDEA(国际数据加密算法)、RC4、Blowfish(简单高效的DES)、RSA等等。 具体的加密算法这里不再阐明,需要了解请阅读Bruce Schneier的《应用密码学》一书。注意单向hash函数,他处理任意长度的信息并返回一个固定长度的hash值(128位)。常用的有MD5、SHA、HAVAL、Snefru等等。单向hash函数经常和公开密钥算法一起来创建数字签名,提供身份证明。与传统的签名相比,数字签名还可以指出文件是否被修改过。

PGP是unix下用来保护信息特别是电子邮件的工具。他使用IDEA算法为数据加密,使用RSA算法来进行密钥管理和数字签名,使用MD5来作为一个单向hash函数。其特点在于安全:不仅内容被伪装,连发送者的签名也加密。PGP还可以用来加密本地文件。现在常用的Linux下的PGP工具为:pgpe(加密)、pgps(签名)、pgpv(确认/解密)、pgpk(管理密钥)。请参考相应的帮助来使用。

"特洛伊木马"的故事不知道大家听说过没有。古希腊人久攻特洛伊城不下,于是假装 求和,送了一个巨大的木马作为礼物,向城主Minerva表示和解。特洛伊人将木马拉入城内,到了夜晚,藏在木马中的希腊士兵钻出来,里应外合,攻破特洛伊城。在计算机安全领域,这种欺骗技巧成为攻击计算机安全的一种标准方式。他藏在你的计算机里,随时可能爆发,如果攻击者需要的话。因此,一旦一个系统被装了特洛伊木马,他就不能在信任了,必须从新安装。怎么避免呢,要养成良好的习惯,例如:限制下载,只从有声望的站点下载东西; 检验下载的文件;避免运行已编译好的二进制代码,从源代码开始编译;不执行不信任的电子邮件发送的程序;不执行从非信任的Web站点得到的Java applets和Java Script。

MD5校验和有时与软件一起发行,用户可以用他来检验一个软件包。用户可以运行Red Hat Linux中包含的md5sum工具,例如:
md5sum cops.1.04.tar.gz

结果:lfa416872934e5bee99068f9989cb8b0 cops.1.04.tar.gz

和软件包自带的校验和文件比较,如果不符,则说明文件在传输过程中出了问题,最好从新下载,本文件不可靠。md5sum还可以用来检验系统文件,在第一次安装系统之后对重要的lilo系统二进制文件进行一下校验:md5sum lilo,其结果应该一直保持不变,除非升级。

5. 完整性检查

完整性是安全系统的核心属性。用户需要知道昨天写的文件和今天打开的文件没有被改 动。攻击者可以用很多方法破坏文件系统,从依靠错误配置的权限获益到放置特洛伊木马和病毒。Linux中用cksum命令对一个特定文件执行16位校验和的计算,上面的md5sum也是一个检验的命令。

RPM(Red Hat Package manager)是由Red Hat Software开发并包含在其Linux产品之中的多功能软件安装管理器。他可以用来建立、安装、查询、检验、升级和卸载独立的软件包。

一个RPM包包括了一个压缩文件和包信息。当使用RPM安装软件时,RPM为每个被安装文件向数据库中添加信息,包括:MD5校验和、文件大小、文件类型、拥有者、组和权限模式。当RPM以"--verify"标志运行时,他把初始文件的值与当前安装的文件进行比较并报告差异。例如,下面检验当前的Tripwire文件:rpm -verify Tripwire-1.30-1

结果:

S.5….T /usr/local/bin/tw/siggen
S.5….T /usr/local/bin/tw/tripwire
S.5….T /usr/local/bin/tw/tw.config
……..T /var/tripwire/tw.db_TEST

说明几个Tripwire文件已经被改动。RPM签名检查命令的常见形式为:rpm -checksig +,他检查包含在软件包内的PGP签名以保证完整性和软件包的原装性。

6. 加密文件系统

加密文件系统是文件系统安全的一个更引人注目的方法。他根据一个简单的推断:如果 一个系统保存机密数据,那么就应该以加密形式保存。加密文件系统(CFS)的核心思想是: CFS为目录和文件提供一个透明的接口,并自动使用用户的密钥加密。一条单独的命令把一个密钥和一个目录关联起来,从这时起,目录的内容在写时自动加密,在打开时自动解密。Red Hat的CFS可以从下面的地址下载:
http://www.replay.com/redhat/cfs.html

一个由意大利人开发的透明加密文件系统(TCFS),用户甚至不知道他们的文件倍加密了。从下面的地址下载:http://tcfs.dia.unisa.it/

7. 备份

备份的重要性我想不需要多说了,那么备份有那些策略呢?常见的有:系统初装时的备 份、定期备份、增量式备份(只备份改动的)、特别备份(为某些文件备份)等等。Linux系统提供了以下备份工具:

a. cp:拷贝,例如把dir1中的所有内容拷贝到dir2:cp -R dir1 dir2
b. tar:可以创建、把文件添加到或从一个tar档案中解开文件。档案本身也是一个文件,它包含其他的许多文件和有关信息。Tar最初用于磁带机。
c. cpio:把文件拷贝进或拷贝出一个cpio档案或tar档案,与tar类似
d. dump:得到整个文件系统并把他拷贝到备份介质上,一个确保完整备份的正规方式是跟随定期增量备份运行一个0级或完全备份,dump支持10个级别并能把上次备份后改动的所有文件以更低的级别备份。缺省情况dump将备份到磁盘介质。例如,把一个SCSI硬盘(/dev/rsd0a)以0级备份到磁带(/dev/rst0)。dump 0f0 /dev/rst0 1500 /dev/sd0a
e. l restore:用来恢复整个文件系统或提取单个文件。与dump相对。注意,restore命令特别冒险,因为他运行SUID root,像任何SUID root程序一样,可以根据自己的风险来运行restore。

8. 其他常见系统安全工具导航

Crypt Breakers Workbench,一个集成多种工具的平台,帮助一个加密人员读取BSD4.2加密的文件。
ftp://coast.cs.purdue.edu/pub/tools/unix/cbw


Hobgoblin
ftp://coast.cs.purdue.edu/pub/tools/unix/hobgoblin/


tripwire,强烈推荐,是一个文件系统完整性检查工具
http://www.tripwiresecurity.com


Trojan,一个可以被任何用户运行来检查特洛伊木马的perl程序
ftp://coast.cs.purdue.edu/pub/tools/unix/trojan/trojan.pl


Pretty Good Privacy(PGP),流行的邮件和文件加密程序
http://rufus.w3.org/linux/RPM/pgp.html


libdes,建立一个DES加密库和一个DES加密程序的工具。包括一个crypt(3)的快速实现
ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/

上一个:防火墙分析报告
下一个:Linux架设DNS服务器之三

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,