文件系统的隐藏权限

大部分属性在文件系统的安全管理方面起很重要的作用

一  课前预备知识:文件系统分类、文件系统显示权限及其修改方式、对于所属者、所属组、其他用户的认识及其定义

Linux 最早的文件系统是Minix,但是专门为Linux 设计的文件系统——扩展文件系统第二版或EXT2被设计出来并添加到Linux中,这对Linux产生了重大影响。EXT2文件系统功能强大、易扩充、性能上进行了全面优化,也是现在所有Linux发布和安装的标准文件系统类型。
每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS来通讯。VFS使得Linux可以支持多个不同的文件系统,每个表示一个VFS 的通用接口。由于软件将Linux 文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux 的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。
在Linux文件系统中,作为一种特殊类型/proc文件系统只存在内存当中,而不占用内存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。/proc文件系统是一个伪文件系统,用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。
在Linux文件系统中,EXT2文件系统、虚拟文件系统、/proc文件系统是三个具有代表性的文件系统,本论文试图通过对他们的分析来研究Linux文件系统机制。并且在分析这三种文件系统的基础上对Linux文件系统操作进行了解、研究(本论文选取了open和close两种操作进行研究)。在第二部分中将介绍EXT2文件系统;第三部分论述虚拟文件系统的特点;第四部分简要介绍/proc文件系统;最后,介绍两种具体文件系统操作的实现。
编辑本段
EXT2文件系统

在Linux中普通文件和目录文件保存在称为块物理设备的磁盘或者磁带上。一套Linux系统支持若干物理盘,每个物理盘可定义一个或者多个文件系统。(类比于微机磁盘分区)。每个文件系统由逻辑块的序列组成,一个逻辑盘空间一般划分为几个用途各不相同的部分,即引导块、超级块、inode区以及数据区等。
引导块:在文件系统的开头,通常为一个扇区,其中存放引导程序,用于读入并启动操作系统;超级块:用于记录文件系统的管理信息。特定的文件系统定义了特定的超级块;inode区(索引节点):一个文件或目录占据一个索引节点。第一个索引节点是该文件系统的根节点。利用根节点,可以把一个文件系统挂在另一个文件系统的非叶节点上;数据区:用于存放文件数据或者管理数据。
Linux最早引入的文件系统类型是MINIX。MINIX文件系统由MINIX操作系统定义,有一定的局限性,如文件名最长14个字符,文件最长64M字节。第一个专门为Linux设计的文件系统是EXT(Extended File System),但目前流行最广的是EXT2。
第二代扩展文件系统由Rey Card 设计,其目标是为Linux 提供一个强大的可扩展文件系统。它同时也是Linux界中设计最成功的文件系统。通过VFS的超级块(struct ext2_sb_info ext2_sb)可以访问EXT2的超级块,通过VFS的inode(struct ext2_inode_info ext2_i)可以访问EXT2的inode。
文件系统EXT2的源代码在/usr/src/linux/fs/ext2目录下,它的数据结构在文件/usr/src/linux/include/linux/ext2_fs.h以及同一目录下的文件ext2_fs_i.h和ext2_fs_sb.h中定义。
EXT2文件系统将它所占用的逻辑分区划分成块组(block group),如下图所示:
组0
组1
…………
组N


超级块
组描述符表
块位图
inode位图
inode表
数据块
编辑本段
逻辑分区


和很多文件系统一样, EXT2 建立在数据被保存在数据块中的文件内这个前提下。这些数据块长度相等且这个长度可以变化,某个EXT2 文件系统的块大小在创建(使用mke2fs)时设置。每个文件的大小和刚好大于它的块大小正数倍相等。如果块大小为1024 字节而一个1025 字节长的文件将占据两个1024 字节大小的块。这样你不得不浪费差不多一半的空间。我们通常需要在CPU 的内存利用率和磁盘空间使用上进行折中。而大多数操作系统,包括Linux 在内,为了减少CPU 的工作负载而被迫选择相对较低的磁盘空间利用率。并不是文件中每个块都包含数据,其中有些块被用来包含描叙此文件系统结构的信息。EXT2通过一个inode 结构来描叙文件系统中文件并确定此文件系统的拓扑结构。inode 结构描叙文件中数据占据哪个块以及文件的存取权限、文件修改时间及文件类型。EXT2 文件系统中的每个文件用一个inode 来表示且每个inode 有唯一的编号。文件系统中所有的inode都被保存在inode 表中。 EXT2 目录仅是一个包含指向其目录入口指针的特殊文件(也用inode表示)。
对文件系统而言文件仅是一系列可读写的数据块。文件系统并不需要了解数据块应该放置到物理介质上什么位置,这些都是设备驱动的任务。无论何时只要文件系统需要从包含它的块设备中读取信息或数据,它将请求底层的设备驱动读取一个基本块大小整数倍的数据块。EXT2 文件系统将它所使用的逻辑分区划分成数据块组。每个数据块组将那些对文件系统完整性最重要的信息复制出来, 同时将实际文件和目录看作信息与数据块。为了发生灾难性事件时文件系统的修复,这些复制非常有必要。
编辑本段
与windows比较

相同点
用户和组
Linux是多用户多任务操作系统而Windows是单用户多任务操作系统。都可以由许多不同的用户来使用,为每个用户提供单独的环境和资源。基于用户身份来控制安全性。都可以以组成员的方式来控制资源的访问权限,这样在用户数目较大时可以不必为每一个帐号设置权限。
用户和组可以集中管理,让多个服务器共享相同的用户和身份验证数据。
文件系统
Linux和Windows都支持多种文件系统。文件资源可以通过NetBIOS、FTP或者其他协议与其他客户机共享。可以很灵活地对各个独立的文件系统进行组织,由管理员来决定它们在何处可以以何种方式被访问。
端口和设备
两种操作系统都支持各种物理设备端口,比如并口、串口和 USB 接口。支持各种控制器,比如 IDE 和 SCSI 控制器。Linux 还支持很多“刚刚上市”的标准硬件。
网络
Linux和Windows都支持多种网络协议,比如TCP/IP、NetBIOS和IPX。都支持多种类型的网络适配器。都具备通过网络共享资源的能力,比如共享文件和打印。都可以提供网络服务能力,比如 DHCP 和 DNS。
服务
Linux和Windows都提供服务。所谓服务,指的是那些在后台运行的应用程序,可以为系统和远程调用该服务的计算机提供一些功能。在系统引导的时候可以单独控制并自动启动这些程序。(注意:Linux 中沿用了 Unix 的习惯,称这种应用程序为 daemon)
不同点
Linux 的应用目标是网络而不是打印
Windows最初出现的时候,这个世界还是一个纸张的世界。Windows的伟大成就之一在于您的工作成果可以方便地看到并打印出来。这样一个开端影响了 Windows 的后期发展。
同样,Linux 也受到了其起源的影响。Linux 的设计定位于网络操作系统。它的设计灵感来自于 Unix 操作系统,因此它的命令的设计比较简单,或者说是比较简洁。由于纯文本可以非常好地跨网络工作,所以 Linux 配置文件和数据都以文本为基础。
对那些熟悉图形环境的人来说,Linux服务器初看可能比较原始。但是Linux开发更多关注的是它的内在功能而不是表面上的东西。即使是在纯文本的环境中,Linux同样拥有非常先进的网络、脚本和安全能力。执行一些任务所需的某些表面上看起来比较奇怪的步骤是令人费解的,除非您认识到 Linux 是期望在网络上与其他 Linux系统协同执行这些任务。Linux的自动执行能力也很强,只需要设计批处理文件就可以让系统自动完成非常详细的任务。Linux 的这种能力来自于其基于文本的本质。
可选的 GUI
Linux有图形组件。Linux支持高端的图形适配器和显示器,完全胜任图形相关的工作。现在,许多数字效果艺术家在Linux工作站上来进行他们的设计工作,而以前这些工作需要使用IRIX系统来完成。但是,图形环境并没有集成到 Linux 中,而是运行于系统之上的单独一层。这意味着您可以只运行 GUI,或者在需要时才运行 GUI。如果您的系统主要任务是提供Web应用,那么您可以停掉图形界面,而将其所用的内存和CPU资源用于您的服务。如果您需要在 GUI 环境下做一些工作,可以再打开它,工作完成后再将其关闭。
Linux 有图形化的管理工具,以及日常办公的工具,比如电子邮件、网络浏览器和文档处理工具等。不过,在 Linux 中,图形化的管理工具通常是控制台 (命令行) 工具的扩展。也就是说,用图形化工具能完成的所有工作,用控制台命令同样可以完成。同样,使用图形化工具并不妨碍您对配置文件进行手工修改。其实际意义可能并不是特别显而易见,但是,如果在图形化管理工具中所做的任何工作都可以以命令行的方式完成,这就表示那些工作也可以由一个脚本来实现。脚本化的命令可以成为自动执行的任务。Linux 同时支持这两种方式,并不要求您只用文本或者只用 GUI。您可以根据您的需要选择最好的方法。
Linux 中的配置文件是人类可读的文本文件,这与过去的 Windows 中的 INI 文件类似,但与 Windows 的注册表机制在思路上有本质的区别。每一个应用程序都有其自己的配置文件,而且通常不与其他的配置文件放在一起。不过,大部分的配置文件都存放于一个目录树 (/etc) 下的单个地方,所以看起来它们在逻辑上是在一起。文本文件的配置方式使得不通过特殊的系统工具就可以完成配置文件的备份、检查和编辑工作。
文件名扩展
Linux不使用文件名扩展来识别文件的类型。相反,Linux根据文件的头内容来识别其类型。为了提高人类可读性您仍可以使用文件名扩展,但这对 Linux 系统来说没有任何作用。不过,有一些应用程序,比如 Web 服务器,可能使用命名约定来识别文件类型,但这只是特定的应用程序的要求而不是 Linux 系统本身的要求。
Linux通过文件访问权限来判断文件是否为可执行文件。任何一个文件都可以赋予可执行权限,这样程序和脚本的创建者或管理员可以将它们识别为可执行文件。这样做有利于安全。保存到系统上的可执行的文件不能自动执行,这样就可以防止许多脚本病毒。
重新引导是最后的手段
如果您使用Windows已经很长时间了,您可能已经习惯出于各种原因(从软件安装到纠正服务故障)而重新引导系统。在Linux思想中您的这一习惯需要改变。Linux在本质上更遵循“牛顿运动定律”。一旦开始运行,它将保持运行状态,直到受到外来因素的影响,比如硬件的故障。实际上,Linux系统的设计使得应用程序不会导致内核的崩溃,因此不必经常重新引导(与Windows系统的设计相对而言)。所以除了Linux内核之外,其他软件的安装、启动、停止和重新配置都不用重新引导系统。
如果您确实重新引导了 Linux 系统,问题很可能得不到解决,而且还会使问题更加恶化。学习并掌握 Linux 服务和运行级别是成功解决问题的关键。学习 Linux 最困难的就是克服重新引导系统的习惯。
另外,您可以远程地完成Linux中的很多工作。只要有一些基本的网络服务在运行,您就可以进入到那个系统。而且,如果系统中一个特定的服务出现了问题,您可以在进行故障诊断的同时让其他服务继续运行。当您在一个系统上同时运行多个服务的时候,这种管理方式非常重要。
所有的 Linux 命令和选项都区分大小写。

二   EXT2文件系统的隐藏权限
除了设置文件或目录的读(r)、写(w)、执行(x)权限外,对于某些有特殊要求的档案(如服务器日志)还可以追加隐藏权限的设定。这些隐藏权限包括: ①Append only (a)  ② compressed (c)  ③no dump (d)④ immutable (i)  ⑤ data journalling (j)   ⑥secure deletion (s)  ⑦no tail-merging (t),     ⑧undeletable (u)   ⑨no atime updates (A),         ⑩synchronous directory updates (D)
 ⑴synchronous updates (S), 同步更新       
 ⑵ and top of directory hierarchy (T).和顶部的目录层次结构
三    隐藏权限的查看与修改
通过lsattr查看档案的隐藏权限。
   [root]#lsattr --help
 通过chattr设置档案的隐藏权限。
   [root]#chattr --help
1、Lsattr命令
lsattr命令格式:
[root]#lsattr [-RVadlv] [files...]
参数或选项说明:
       -R:递归列示目录及文件属性。
       -V:显示程序版本号。
       -a:显示所有文件属性,包括隐藏文件(.)、当时目录          (./)及上层目录(../)。
        -d:仅列示目录属性。
        -l:(此参数目前没有任何作用)。
        -v:显示文件或目录版本。
2、Chattr命令
我们来举一个例子:
 [root]#touch chattr_test
 [root]#chattr +i chattr_test
 [root]#rm chattr_test
  rm: remove write-protected regular empty file `chattr_test`? y
 rm: cannot remove `chattr_test`: Operation not permitted
  呵,此时连root本身都不能直接进行删除操作,必须先去除i设置后再删除。
 chattr命令的在线帮助详细描述了各参数选项的适用范围及bug提示,使用时建议兄弟们仔细查阅。
四  档案的特殊权限:SUID/SGID/Sticky Bit
结合前面介绍的UMASK值(0022),说明还存在一些特殊的权限规范,这些权限包括SUID/SGID/Sticky Bit,系统中就直接存在这样的例子:
[root]#ls -dl /tmp
drwxrwxrwt 342 root root 36864 Jun 14 22:13 /tmp
[root]$ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27768 Jul 17 2006 /usr/bin/passwd
1、SUID(Set UID)
a、Linux为了提高本地用户账号信息的安全性,特别指定了/etc/shadow (影子文件)以加密密码的方式来存储用户的账户信息,同时这个文件的默认权限是-r--------,限定只有superuser才能“强制”储存,其他用户没有任何权限。可是你会发现,为什么我们可以以普通用户的身份修改我们自己的用户密码呢,毕竟更新密码就必然会写入/etc/shadow文件的?
b、参照前面的例子(/usr/bin/passwd),我们认为当文件系统的“所有者权限组合”的可执行位(x)被s(即rws------)取代时,构成特殊权限规定Set UID,简称SUID。
c、SUID表示当请求执行包含SUID特殊权限的程序时,能够暂时拥有该程序所有者(对程序)的存取权限。假设普通用户A通过passwd命令更新自己的密码,而/usr/bin/passwd的所有者是root (root,root),也就是说,当A请求执行passwd命令时,实际上是暂时获得root(对/usr/bin/passwd)的执行权限,并进一步更新/etc/shadow的内容。
d、需要注意的是,Linux规定SUID仅对系统中的二进制可执行文件设置有效,而且不可对Shell Script施加设置,毕竟Shell 脚本只是对二进制可执行文件的调度组合,最终也是要遵从binary file的权限设置。
2、Set GID
相对于SUID,当所有者所在的用户组(group)的权限组合中可执行位(x)被s所取代时(例如---rws---),便构成Set GID的权限设置。SGID可以针对二进制文件或目录进行设置:
        a.二进制可执行文件:则当请求执行该文件(程序)时,请求执行者所在的用户组(即effective group)将暂时获得该程序(binary file)所属的用户组ID(group ID)的存取权限. 
        b.目录:假设目录A,此时在A目录下创建的文件或子目录所属的用户组ID,将自动被赋予A目录的组ID
        SGID主要用于多人组成的项目开发上,一般比较少用到。
3、 Sticky Bit
我们认为,当文件系统“其他(others)”的权限组合中可执行位(x)被t所取代时(例如------rwt),便构成Sticky Bit的权限设置。SBIT顾名思义可以起到限制访问的作用,是容易理解而好用的设置,它只对目录有效。当对一个目录A施加了SBIT设定以后,并且使用者对A目录有w和x权限时,则使用者在A目录下所创建的个人文档(含目录)只有使用者本身或root可以执行删除、更名、移动等操作(是否可读依实际权限r而定)。
由前面所举的/tmp目录,我们做一下简单的测试:
[root]#ls -dl /tmp
drwxrwxrwt 342 root root 36864 Jun 14 22:13 /tmp
[root]#cd /tmp
[root]#touch orange
[root]#chmod 777 orange     (注意这里设置orange权限全开)
[root]#logout     (退出root,并以普通用户登录)
[console]$cd /tmp
[console]$rm orange
rm: cannot remove `orange': Operation not permitted
 
注意:SBIT一般仅针对目录施加有意义。
五   特殊权限的设置

接下来再简单介绍以上几种特殊权限的设置方法。如果你已经掌握了用(八进制)数字来表示权限的规则,再结合chmod命令进行设置就很简单了。以下是SUID/SGID/Sticky Bit约定对应的八进制数值:
   *SUID  4
   *SGID  2
   *SBIT  1
设置时我们把表示特殊权限的数字放在其他三位数字权限的前面,现举例如下:
[root]#touch banana ; ll banana
-rw-r--r-- 1 root 8083 0 Jun 16 18:16 banana
[root]#chmod 4775 banana ; ll banana
-rwsrwxr-x 1 root 8083 0 Jun 16 18:16 banana  (注意SUID仅对二进制文件有效)
[root]#chmod 6775 banana ; ll banana
-rwsrwsr-x 1 root 8083 0 Jun 16 18:16 banana  (注意权限组合)
[root]#chmod 1775 banana ; ll banana
-rwxrwxr-t 1 root 8083 0 Jun 16 18:16 banana  (注意SBIT一般仅针对目录有意义)
六   file命令来识别文件类型
1、应用举例:
[root]#file ~/.bashrc
/home/b/j/console/.bashrc: ASCII text
[root]#file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
[root]#file /usr/lib/python2.4/test/185test.db
/usr/lib/python2.4/test/185test.db: Berkeley DB 1.85 (Hash, version 2, big-endian)
2、file 是检测文件类型的命令。 file 命令的简单用法就是: file 文件名,例如: file data.txt data.txt: ASCII text 就告诉我们,data.txt 是一个text (即txt) 类型的文件。 txt 文件所采用的编码是ascii编码体系。 所以 text 是文件类型;ASCII是编码体系。
3、又如: file my.pdf my.pdf: PDF document, version 1.5 “PDF document“ 告诉我们 , my.pdf 是pdf类型的文件。 版本执行的标准是:1.5 像ascii , version 1.5 这些都是与文件类型密切相关的信息。 如果需要更详细的信息,可以加参数:

如:file -i data.txt








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值