文件与(或)目录是文件系统的具体表现形式,在Linux系统管理部分,文件与目录管理映射了Linux文件系统管理策略的重要方面。本文主要就Linux文件系统(文件或目录)的默认权限与隐藏权限展开论述,关于文件和目录的路径、权限、权限表示(和设置)方法等基本概念以及常规操作(移动、删除、复制、查看等)是学习本文的基础。
一. 文件系统的默认权限(umask)
当我们在系统中新建一个文件或目录时,系统会自动赋予该文件或目录一个初始访问权限(Value),我们称为默认权限,默认权限与文件系统的umask值有关。可以在终端下直接输入umask来查看当前系统的umask值。例如:
[root]#umask
0022
也许你会问为什么自己系统的umask值只有三位数?这里第一位是特殊权限位,我们暂且不考虑它,先看后面三位数就可以了。那么这个值具体是怎样运用的呢?其实umask本质是一个掩码,为此我们有必要先了解Linux文件系统权限的表示方法及文件与目录的约定权限。
1. 文件系统的权限表示方法有两种。
一是直接用r、w、x来代表文件的所有者(u)、用户组(g)、其他用户(o)对某一文件或目录的读、写、执行(x)权限,称为字符表示法,例如上面的
-rw-rw-rw-。二是用一组(三位)八进制数来间接表示文件或目录的权属,称为数字表示法,例如某文件的权限为755。
注:所谓数字表示法是指将读取(r),写入 (w) 和执行(x)
分別以4、2、l来代表,沒有授予的部份就表示值为0,然后再把所授予的权限相加而成。
2.
在不考虑umask的情况下,新建一个文件或目录的权限应该都是rwxrwxrwx,但为了提高安全性,会默认去除新建文件的可执行权限(x),而对于新建的目录,可执行位x与可否被允许进入该目录有关,因此Linux约定:
新建文件的权属是-rw-rw-rw-,权限值是666。
新建目录的权属是drwxrwxrwx,权限值是777。
那么,在给定系统umask的情况下,新建文件或目录的默认权限如下赋予:
新建文件的约定权限 - UMASK表示的权限 = 文件的默认权限
新建目录的约定权限 - UMASK 表示的权限 = 目录的默认权限
这里的减号(-)更确切地说是屏蔽的意思。
例如当前系统的UMASK值为002,或者表示为--- --- -w-。那么新建一个文件或目录的默认权限为:
新建文件的约定权限 - UMASK表示的权限 = 文件的默认权限
-rw-rw-rw-
-
--- --- -w-
= -rw-rw-r-
表示在约定权限的基础上屏蔽除所有者(u)、同组用户(g)之外其他用户(o)的可写权限。此时当你在系统中新建一个文件时,该文件的默认权限就是-rw-rw-r-了,这样你就会理解为什么UMASK是一个掩码值了。我们再实际操作一下吧。
[root]#umask 002
[root]#umask
002
[root]#touch test1
[root]#ls -dl test1
-rw-rw-r-- 1 root root 0 Jun 17 21:27 test1
test1的约定权限是rw-rw-rw-,但经过umask屏蔽后,被赋予默认权限为rw-rw-r--。
同理对于新建目录的默认权限采用同样的规则。
新建目录的约定权限 - UMASK 表示的权属 = 目录的默认权限
rwxrwxrwx
-
--- ---
-w-
=
rwxrwxr-x
[root]#mkdir testdir
[root]#ls -dl testdir
drwxrwxr-x 2 root root 4096 Jun 17 21:30 testdir
以上只抛砖引玉地概述UMASK的意义即简单的设定方法,需要注意的是,umask命令用来设置进程所创建的文件的读写权限,最保险的值是0077,即关闭创建文件的进程以外的所有进程的读写权限,表示为-rw---
----。在~/.bash_profile中,加上一行命令umask 0077可以保证每次启动Shell后, 进程的
umask权限都可以被正确设定。
二. 文件系统的隐藏权限:chattr,
lsattr
除了设置文件或目录的读(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).
大部分属性在文件系统的安全管理方面起很重要的作用。关于以上属性的详细描述请兄弟们查阅chattr的在线帮助man,注意多数属性须要由root来施加。
1. 通过chattr设置档案的隐藏权限。
[root]#chattr --help
Usage: chattr [-RV] [-+=AacDdijsSu] [-v version] files...
参数或选项描述:
-R:递归处理,将指定目录下的所有文件及子目录一并处理。
-V:显示详细过程有版本编号。
-v:设定文件或目录版本(version)。
+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。
A:文件或目录的 atime (access time)不可被修改(modified),
可以有效预防例如手提电脑磁盘I/O错误的发生。
S:硬盘I/O同步选项,功能类似sync。
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文
件安全,只有root才能设定这个属性。
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d:即no dump,设定文件不能成为dump程序的备份目标。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件
系统的安全设置有很大帮助。
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback
挂
载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为
data=journal,则该参数自动失效。
s:保密性地删除文件或目录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion.
各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser
(root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。我们来举一个例子:
[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提示,使用时建议兄弟们仔细查阅。由于上述的这些属性是隐藏的,查看时需要使用lsattr命令,以下简述之。
lsattr命令格式:
[root]#lsattr [-RVadlv] [files...]
参数或选项说明:
-R:递归列示目录及文件属性。
-V:显示程序版本号。
-a:显示所有文件属性,包括隐藏文件(.)、当时目录(./)及上层目录(../)。
-d:仅列示目录属性。
-l:(此参数目前没有任何作用)。
-v:显示文件或目录版本。
例:
[root]#chattr +aij
lsattr_test
[root]#lsattr
----ia---j--- ./lsattr_test
关于lsattr的用法,详情请参阅在线帮助man
三.档案的特殊权限:SUID/SGID/Sticky Bit
接下来将概要性地介绍SUID/SGID/Sticky
Bit等特殊权限及它们的设置方法,学习前需要掌握用户(组)ID、程序(process)、(文件系统权限的表示和设置方法)等知识。
前面提到的r(读)、w(写)、x(执行)是Linux文件系统的基本权限,三者规定了特定文件或目录的所有者(user)、所有者所属用户组(group)、其他(others)对文件系统的存取权限。例如:
[root]#ll apple
-rw-r--r-- 1 root 8083 0 Apr 1 20:46 apple
然而结合前面介绍的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.Set UID
Linux为了提高本地用户账号信息的安全性,特别指定了/etc/shadow
(影子文件)以加密密码的方式来存储用户的账户信息,同时这个文件的默认权限是-r--------,限定只有superuser才能“强制”储存,其他
用户没有任何权限。可是你会发现,为什么我们可以以普通用户的身份修改我们自己的用户密码呢,毕竟更新密码就必然会写入/etc/shadow文件的?
参照前面的例子(/usr/bin/passwd),我们认为当文件系统的“所有者权限组合”的可执行位(x)被s(即rws------)取代时,构成特殊权限规定Set
UID,简称SUID。
SUID表示当请求执行包含SUID特殊权限的程序时,能够暂时拥有该程序所有者(对程序)的存取权限。假设普通用户A通过passwd命令更新自己的密码,而/usr/bin/passwd的所有者是root
(root,root),也就是说,当A请求执行passwd命令时,实际上是暂时获得root(对/usr/bin/passwd)的执行权限,并进一步更新/etc/shadow的内容。
需要注意的是,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一般仅针对目录有意义)
以下再举一个特例:
[root]#chmod 7666 banana ; ll banana
-rwSrwSrwT 1 root 8083 0 Jun 16 18:16 banana
呵,特殊权限位变成大写的了,注意例子中我们把banana文件的基本权限设为666,说明banana没有任何可执行权限,这里特殊权限位为大写,我们认为是“空”,毕竟文件的所有者都没有定义执行权限,(程序的)请求执行者当然不能获得执行权限。
以上介绍了特殊权限SUID/SGID/Sticky
Bit的基本概念及设定方法,个人认为如果有条件,应该重点把握SUID这一特殊权限,因为就程序而言,一个可以改变UID的程序是SUID程序。我们知
道在各种操作系统中都普遍存在缓冲区溢出的可能,这是严重威胁系统安全的漏洞,而具有SUID特殊权限的程序就经常被入侵者所利用,他们编写一些特殊代
码,迫使系统在执行SUID程序时发生缓冲区溢出,进而获得superuser的执行权限。当然系统中默认允许SUID的程序,例如passwd、
ping、su等,在系统运作均衡、提高管理效率及系统诊断方面也是必要的,只是我们应当根据实际需要,尽量减少这些安全隐患的存在。
四.文件类型:file
前面介绍了Linux文件系统权限的相关概念。我们知道Linux文件系统是Linux内核支持的基本功能之一,并由根 /
开始往下形成倒立树状的级连式结构。文件与目录是Linux文件系统的两个基本元素,(广义的)文件分为普通文件、目录文件、连接文件和特殊文件。可以通过file命令来识别各种不同的文件类型。
应用举例:
[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)
转自:http://blog.sina.com.cn/s/blog_4a4af89c01000a3o.html