linux目录默认权限,Linux文件与目录的默认权限及隐藏权限

主题相关:Linux文件系统权限

主题列表:

1.默认权限:umask

2.隐藏权限:chattr, lsattr

3.特殊权限:SUID/SGID/Sticky Bit

4.文件类型:file

系统环境:Redhat Fedora Core 6

文章作者:wuzhaikof

文件与(或)目录是文件系统的具体表现形式,在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。

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

注:所谓数字表示法是指将读取(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)

关于file命令的用法可以通过file –help 或 file的在线帮助man 了解更多详情。

*******************************************************************************

参考资料:

《Redhat Linux 9 系统管理》--(李蔚泽 清华大学出版社)

《鸟哥的Linux私房菜》 --(http://linux.vbird.org/)

《UNIX 缓冲区溢出程序的机理》----- Cooltang's Box

《Linux系统安全》------ 寂寞风情's blog

《Linux档案系统管理(第三篇)》-----(fanqiang.chinaunix.net/)

你可能感兴趣的:(linux目录默认权限)