一、文件访问权限
1. 文件/目录访问权限基本概念
文件或目录的访问权限,是指Linux系统中的用户对文件或目录的可读、可写及可执行权限。倘若某用户对文件只具有可读权限,则该用户只能读取该文件的内容而不能对文件进行写或者执行操作,类似的,对文件具有可写或可执行的用户也只能对文件进行写或者执行操作,任何其他操作都会被操作系统所阻止。当然,某用户并不是只能对文件具有一种权限,而是可以同时具有可读、可写或可执行权限。
在Linux中,对于用户有三种不同的定义:文件创建者(即文件的拥有者)、与文件拥有者处于同组的用户、其他用户。
当我们使用命令ls -l
查看当前目录下的文件详细信息时,如下图:
最左侧一栏代表着不同用户对该文件的访问权限,横线代表空许可,r代表可读权限,w代表可写权限,x代表可执行权限。注意该栏一共有10个占位符,第一个横线所在位置表明文件的类型。具体相关符号与对应如下:
普通文件(-):
目录文件(d,directory file)
符号链接(l,symbolic link)
块设备文件(b,block)
字符设备文件(c,char)
管道文件(p,pipe)
套接字文件(s,socket)
后面9个占位符,每三个占位符为一组,分别表明文件所有者、文件所有者同组用户、其他用户对文件的访问权限,具体如下图。
2. 文件/目录访问权限的设定
在Linux操作系统中,对文件或目录访问权限的设置主要是通过命令chmod
,该命令的格式为:
可以看到,对文件和目录的访问权限设置主要有三种方式,通过字符设置,通过8进制数设置,以及通过参考文件设置,接下来分别对三种设置方式进行介绍。
(1) 通过文字设定
通过文字进行设置的格式如上图中所示,具体格式为:
chmod 用户 操作 文件访问模式 文件
其中用户一栏选项为:
* u:用户 user, 文件所有者
* g:组 group,文件所有者同组用户
* o:其他 other,其他用户
* a:所有 all,所有用户
操作一栏选项为:
* +:添加某个权限
* -:禁止某个权限
* =:将新的权限设置为某个权限,之前权限被完全覆盖
文件访问模式为:
* r:可读权限
* w:可写权限
* x:可执行权限
* s:设置文件执行时,进程的权限。`u+s`设置文件执行时的进程拥有文件拥有者的权限,`g+s`设置文件执行时的进程具有文件组用户的权限
* t:将程序文件保存到交换设备上
* u:具有和文件拥有者相同的权限
* g:具有和文件组成员相同的权限
* o:具有和文件其他成员相同的权限
假设,我们要为某个文件的,除文件拥有者和组成员外的其他成员添加可写权限,则格式为:
chmod o+w filename
设置文件的组成员具有和文件拥有者相同的权限为:
chmod g=u filename
设置文件在执行时,进程具有文件拥有者的访问权限。该种情况并不罕见,例如我们常用的passwd
命令,不同的用户均可以使用该命令来执行修改密码这root权限行为。该权限设置后,会将原来的可执行权限的x替换为s,如果文件本来不具有可执行权限,则设置为S。
chmod u+s filename
(2) 通过八进制数设置
该方式可以理解为将文件的三种权限映射为一个八进制数的二进制格式下的三个二进制位,每一位控制一个访问权限的开启关闭。具体二进制格式的对应如下:
001: 可执行权限,对应八进制数1
010: 可写权限,对应八进制数2
100: 可读权限,对应八进制数4
设置文件访问权限时,需要通过三个八进制数,同时设置文件对不同用户的访问权限,假设需要设置文件对拥有者具有可读可写可执行权限,对拥有者同组用户具有可读可写权限,对其他用户具有可读权限,则命令格式应为:
chmod 764 filename
如果要设置文件执行时的权限,则需要使用另一个八进制数。
其具体格式为:
010: 设置文件执行时具有组用户的权限,对应八进制数2
100: 设置文件执行时具有文件拥有者的权限,对应八进制数4
例如要在上个例子的基础上设置文件执行时具有文件拥有者的权限,则命令格式为:
chmod 4764 filename
(3) 通过参考文件设置
通过该方式设置文件权限时,需要用到chmod
命令的--reference
参数。具体格式为:
chmod --reference=RFILE targetFile
使用上诉命令可以将目标文件的访问权限设置为参考文件的文件访问权限。具体例子如下:
(4) 安全的粘着位设置
部分情况下,我们会需要不同用户在同一个目录下工作(创建或修改文件),就需要所有这类用户都具有对该目录的读写执行权限,而这会导致一些安全隐患。
假设我们拥有一个目录work_dir
,其具体访问权限如下:
用户xia
创建了一个普通文件xia_file
用户 dong
查看工作目录work_dir
,发现了只具有可读权限的文件xia_file
,该用户,查看后决定删除该文件。
竟然成功了!用户dong
,在不具有对另一文件写权限的条件下,成功删除了该文件。显然,这违反了文件xia_file
的访问权限。如何防止该恶意行为呢?
这就需要介绍下文件访问模式中的T
标志了,该标志主要针对目录,倘若源目录的访问权限中,其他用户具有可执行权限,则设置后为t
,否则为T
。其设置方式为:
chmod 用户 操作 + t 文件夹
chmod 1XXX 文件夹
设置成功后,位于工作目录下的用户只能对自身创建的文件进行删除操作。
我们设置工作目录为T后,再次创建文件xia_file
,登录用户dong
后,尝试删除,失败。
二、文件额外属性
通过以上所述,相信诸位对文件访问权限已经有所了解,但是这里依旧存在问题。在黑客攻击过程中,其入侵计算机系统后,可以通过多种方式来提升自身权限。而高权限的用户显然对文件访问权限具有着很强的掌控度。
在Linux的Ext文件系统中,可以通过对文件额外属性的设置来增强文件系统的安全性。以Ext3为例,其支持的文件安全属性有:
A:Atime。告诉系统不要修改对这个文件的最后访问时间
S:Sync。一旦应用程序对这个文件执行了写操作,系统立即把修改的结果写到磁盘
a:Append Only。系统只允许在这个文件后追加数据,不允许任何进程覆盖或者截断这个文件。如果目录具有该属性,则系统只允许在这个目录下建立和修改文件,而不允许删除任何文件
i:Immutable。系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件
d:No dump。进行文件系统备份时,dump程序将忽略这个文件
c:Compress。系统以透明的方式压缩该文件。从这个文件读取时返回的是解压后的数据;而向这个文件写入数据时,数据首先被压缩后,才写入磁盘
s:Secure Delete。让系统在删除该文件时,使用0填充文件所在区域
u:Undelete。当一个应用程序请求删除该文件时,系统会保留其数据块以便以后能够恢复这个文件
另外,需要记得,虽然文件系统能够接受并保留各个属性标志,但是这些属性不一定有效,这依赖于内核和各种应用程序的版本。
1. 对文件系统属性的设置
任何情况下,标准的ls
命令都不会展示一个文件或目录的扩展属性。在Ext3系统 工具包中有两个工具:chattr
和lsattr
。他们被专门用于设置和查询文件属性。接下来对两个命令进行介绍。
(1) lsattr命令
lsattr
和命令ls
相似,不同的是lsattr
用于显示指定目录下的文件属性,其具体使用方式为:
显然lsattr
支持很少的选项,其中:
-R: 以递归方式列出目录并显示其内容
-V: 列出命令版本信息
-a: 列出文件中的所有文件,包括.开通的文件
-d: 以和文件相同的方式列出目录,并显示其包含的内容
-l: 此参数目前没有任何作用,但会改变命令的输出结果展示形式
-v: 列出文件版本(用于网络文件系统NFS)
(2) chattr命令
chattr的命令使用也比较简单,和chmod的字符设置文件访问权限方式很像,具体使用格式为:
即通过:
`chattr 选项 操作 属性 版本设置 filename`
即可设置文件的属性
其中
* -R: 递归设置文件属性
* -V: 显示指令执行过程
* -f: 无作用
* -v: 设置文件或目录版本
假设对某一文件设置了i
属性,我们可以看看会发生什么。
即便是root
用户,也不能对设置了i
属性的文件进行任何操作!
这是由于Ext3属性是由sys_open()和sys_truncat()等系统调用检查和赋予的,不受用户识别号和其他因素的影响,在任何情况下对具有不可修改属性的文件进行的修改都会失败,不管是否是root
用户。
但是,需要注意,root
用户可以通过chattr
命令来取消文件的不可修改属性来对文件进行修改,这种防护只是对修改行为增加了一点点小麻烦,系统的安全性并无根本性的提高
三、思考
对于文件访问权限和属性的设置,最重要的不是了解,而是能否灵活运用,这需要的不仅仅是对文件权限的理解,最好还能够了解Linux的文件系统,并根据实际需求结合自己的经验进行设计和思考。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。