linux文件权限

权限与文件系统安全

1,“ls -l”命令输出结果中各字段含义:
(1),文件类型,第1位(“-”普通文件、“d”目录文件、“l”符号链接文件、“b”快设备文件、“c”字符设备文件、“p”管道文件、“s”socket文件)
(2),权限,第2至10位(9个字母分成3组,3个一组,分别代表“属主权限”、“属组权限”、“其他权限”,“-”表示没有权限)
(3),i-node,硬连接数(表示占用 i-node数。i-node是文件内容的真实表达,而filename是inode上层的表示方法。因此,每个文件名只能对应一个i-node,一个i-node可以对应多个文件名)
(4),文件属主
(5),文件属组
(6),文件大小
(7),创建时间
(8),文件名

2,UNIX下关于文件权限的表示方法和解析
在linux中,使用系统资源的人分为4类:超级用户、文件属主、属主同组、其他。超级用户具有操作系统的一切权限,不需要指定权限,其他三类都需要指定权限。UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:

1 2 3 4 5 6 7 8 9 10
- r w x r - x r - x
第1位表示文件类型,可以为p、d、l、s、c、b和-:
p表示命名管道文件
d表示目录文件
-表示普通文件
s表示socket文件
c表示字符设备文件
b表示块设备文件
l表示符号连接文件

第2-4位、5-7位、8-10位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:

r:可读,文件可读其内容,目录可列出基下文件
w:可写,文件可修改内容,目录创建、删除文件
x:可执行,文件可执行,目录可进入
s:suid(第4位)或sgid(第7位)与可执行权限均被设置
S:suid(第4位)或sgid(第7位)被设置,可执行权限没有设置
t:sticky(粘着位)与可执行权限被设置
T:sticky(粘着位)被设置,可执行权限没有设置
-:没有权限

例子:ls -l myfile显示为:
-rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile

表示文件myfile是普通文件,所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限,1个硬连接,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。

如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上,设置了sticky位,会表现在其他用户的可执行位上,例如:
1、-rwsr-xr-x 表示SUID和所有者可执行被设置
2、-rwSr--r-- 表示SUID被设置,所有者可执行没有被设置
3、-rwxr-sr-x 表示SGID和同组用户可执行被设置
4、-rw-r-Sr-- 表示SGID被设置,同组用户可执行没有被设置
5、-rwxr-xr-t 表示sticky和其他用户可执行被设置
6、-rwxr--r-T 表示sticky被设置,其他用户可执行没有被设置

其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位上的值是1表示有相应的权限,值为0表示没有此权限。

11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x

第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-6为所有者位,第5-3位为所属组权限,第2-0位为其他用户权限。上面的“-rwsr-xr-x”的值为: 1 0 0 1 1 1 1 0 1 1 0 1,“-rw-r-Sr--”的值为: 0 1 0 1 1 0 1 0 0 1 0 0。

在查找文件时可以用文件权限的8进制代号来查找,将以上12位2进制数转换为8进制即可。例如,设置SUID位的文件为“100,000,000,000(2进制)=4000(8进制)”,设置SUID与SGID的文件为“110,000,000,000(2进制)=6000(8进制)
”,查找命令为“find / -perm -4000 -type f -ls”

3,使用“chmod”命令改变文件权限
文字设定法
#chmod [ugoa] [+-=] [rwxugosStT] <文件名>
u表示属主,g表示属组,o表示其他,a表示所有
+表示增加权限,-表示删除权限,=表示分配新权限的同时将原有权限删除
r表示可读,w表示可写,x表示可执行,ugo表示与该字母代表的用户有相同权限,s与S表示suid或sgid,t与T表示sticky

数字设定法
chmod [xxxx] <文件名>
其中“xxxx”是由表示文件权限的12位二进制数换算的4位八进制数

4,特殊权限的作用:
SUID是Set User ID, SGID是Set Group ID的意思。当用户运行一个应用程序时,此程序将继承运行它的用户的权限,而不是继承它所属用户的权限。设置了SETUID与SETGID的程序将继承它所属用户的权限,而不受运行它的用户权限的限制。

由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。

首先讲普通文件的SUID和SGID的作用,如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示为“-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile”,任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括 user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为 200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

SGID。UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为“cr--r----- 1 root system 2, 1 May 25 1998 kmem”,但ps等程序要读这个文件,而ps的权限设置如为“-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps”,这是一个设置了SGID的程序,而ps的属主是bin,不是root,所以不能设置SUID来访问kmem,但大家注意了,bin和root都属于 system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序。下面来说明一下SGID对目录的影响。SUID对目录没有影响。如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。

sticky权限打开后,仅允许文件属主删除及移动该文件。

5,使用umask命令设置权限掩码:
该命令可为用户帐号中新建文件设置缺省用户权限。权限掩码由4位8进制数组成,第一位为精度位(0),其他三位分别表示属主、属组、其他的权限。将现有的权限减去掩码后,即是建立文件时默认的权限。使用“umask -S”命令查看各用户的默认权限。
例:将权限掩码设置为“077”,则只有属主具有“rwx”权限,其它用户没有任何权限
# umask 077
# umask -S
u=rwx,g=,o=

6,用chgrp命令改变文件属组:
chgrp命令用来改变指定文件的属组,指定的文件名支持通配符,如果用户不是该文件的属主或root,则不能更改。
#chgrp [参数] 组名或组ID 文件名
-R 表示递归地改变其下子目录和文件的属组

7,用chown命令改变文件属主和属组:
#chown [-R] <新属主[.新属组]> <文件名>
-R 表示递归地改变基下子目录和文件的属性
-v 显示chown所做的工作


你可能感兴趣的:(linux文件权限)