突然有人问道:drwxrwxrwx+后面的+号是干什么的,挺熟悉又想不起来,百度下后得到结果,最终总结一下Linux系统下关于文件权限的知识,在此记录下。
1、正常情况下,Linux文件系统中的文件权限为:
drwxr-xr-x 2 root root 4096 5月 24 15:12 directory -rw-r--r-- 1 root root 0 5月 24 15:12 file.txt
十位第一位为文件属性,d为目录,-为普通文件,c表示为字符设备文件,b表示为块设备文件,s表示为套接字文件,l代表连接文件
后面9位:
rwxr-xr-x
每3位是一组,代表r:可读、w:可写;x:可执行。
从做往右第一组代表文件所有者、文件所属组、其他用户对其的权限。
权限修改可用chmod进行文件权限操作。
2、文件ACL:
ACL就是可以设置特定用户或者用户组对于一个文件/文件夹的操作权限. 需要掌握的命令也只有三个: getfacl, setfacl, chacl。
ACL 是由一系列的Access Entry所组成的. 每一条Access Entry定义了特定的类别可以对文件拥有的操作权限.
Access Entry有三个组成部分: Entry tag type, qualifier (optional), 权限
Entry tag type它有以下几个类型
ACL_USER_OBJ: 相当于Linux里file_owner的权限
ACL_USER: 定义了额外的用户可以对此文件拥有的权限
ACL_GROUP_OBJ: 相当于Linux里group的权限
ACL_GROUP: 定义了额外的组可以对此文件拥有的权限
ACL_MASK: 定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 (这个我下面还会专门讨论)
ACL_OTHER: 相当于Linux里other的权限
可以通过getfacl filename获取文件相关权限,看一个没有设置任何ACL权限的文件显示如下:
# getfacl file.txt
# file: file.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
可以通过setfacl配置相关权限:
setfacl 参数
-m:设置后续acl参数
-x:删除后续acl参数
-b:删除全部的acl参数
-k:删除默认的acl参数
-R:递归设置acl,包括子目录
-d:设置默认acl
setfacl基本用法:首先存在两个用户 acluser和acluser2;
# setfacl -m acluser:rw file.txt [root@ANSIBLE file-qx]# getfacl file.txt # file: file.txt # owner: root # group: root user::rw- user:acluser:rw- group::r-- mask::rw- other::r-- # setfacl -m u:acluser:r file.txt [root@ANSIBLE file-qx]# getfacl file.txt # file: file.txt # owner: root # group: root user::rw- user:acluser:r-- group::r-- mask::r-- other::r-- # setfacl -m u:acluser2:rwx file.txt [root@ANSIBLE file-qx]# getfacl file.txt # file: file.txt # owner: root # group: root user::rw- user:acluser:r-- user:acluser2:rwx group::r-- mask::rwx other::r-- # setfacl -m g:acluser:rw file.txt [root@ANSIBLE file-qx]# getfacl file.txt # file: file.txt # owner: root # group: root user::rw- user:acluser:r-- user:acluser2:rwx group::r-- group:acluser:rw- mask::rwx other::r-- ]# getfacl file.txt # file: file.txt # owner: root # group: root user::rw- user:acluser:r-- user:acluser2:rwx group::r-- group:acluser:rw- mask::rwx other::r-- # setfacl -x u:acluser file.txt # getfacl file.txt # file: file.txt # owner: root # group: root user::rw- user:acluser2:rwx group::r-- group:acluser:rw- mask::rwx other::r--
3、SUID和SGID
转自:http://blog.csdn.net/wellmikelan/article/details/7817403
粘滞位属于特殊权限位,与粘滞位相同的还有SUID 位,SGID 位,sticky 位
给文件加 SUID 和 SUID 的命令如下:
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
chmod g+s filename 设置SGID位
chmod g-s filename 去掉SGID设置
由于 SUID 和 SGID 是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的 SUID 和 SGID 位是没有多大意义的。
首先讲普通文件的 SUID 和 SGID 的作用。
如果普通文件 file 是属于 foo 用户的,是可执行的,现在没设 SUID 位,ls 命令显示如下:
-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 file
任何用户都可以执行这个程序。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。
下面讨论一个例子:
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 位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。
4、粘滞位:
转载:http://www.2cto.com/Article/201411/353837.html
在Linux系统中比较典型的例子就是“/tmp”、“/var/tmp”目录。这两个目录作为Linux系统的临时文件夹,权限为“rwxrwxrwx”,即允许任意用户、任意程序在该目录中进行创建、删除、移动文件或子目录等操作。然而试想一下,若任意一个普通用户都能够删除系统服务运行中使用的临时文件,将造成什么结果?
粘滞位权限便是针对此种情况设置,当目录被设置了粘滞位权限以后,即便用户对该目录有写入权限,也不能删除该目录中其他用户的文件数据,而是只有该文件的所有者和root用户才有权将其删除。设置了粘滞位之后,正好可以保持一种动态的平衡:允许各用户在目录中任意写入、删除数据,但是禁止随意删除其他用户的数据。
需要注意的是,粘滞位权限只能针对目录设置,对于文件无效。
设置了粘滞位权限的目录,使用ls命令查看其属性时,其他用户权限处的“x”将变为“t”。
例如,查看/tmp、/var/tmp目录本身的权限,确认存在“t”标记。
[root@localhost ~]# ll -d /tmp
drwxrwxrwt. 16 root root 4096 12月 2 17:16 /tmp
[root@localhost ~]# ll -d /var/tmp
drwxrwxrwt. 3 root root 4096 12月 2 09:46 /var/tmp
粘滞位权限都是针对其他用户(other)设置,使用chmod命令设置目录权限时,“o+t”、“o-t”权限模式可分别用于添加、移除粘滞位权限。
例如,为/test目录设置粘滞位权限。
[root@localhost ~]# chmod o+t /test
[root@localhost ~]# ll -d /test
drwxrwxrwt. 2 root root 4096 12月 2 20:39 /test
此时普通用户natasha便无法删除/test/file1文件了。
[natasha@localhost ~]$ rm /test/file1
rm:是否删除有写保护的普通空文件 "/test/file1"?y
rm: 无法删除"/test/file1": 不允许的操作
5、文件隐藏属性
转载:http://blog.sina.com.cn/s/blog_69a976e101015u81.html
这些隐藏的属性确实对于系统有很大的帮助的~ 尤其是在系统安全 (Security) 上面,重要的紧呢!不过要先强调的是,底下的chattr指令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个指令了。
chattr (配置文件案隐藏属性)
[root@www ~]# chattr [+-=][ASacdistu] 档案或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设定一定,且仅有后面接的参数
A :当设定了 A 这个属性时,若你有存取此档案(或目录)时,他的访问时间 atime
将不会被修改,可避免I/O较慢的机器过度的存取磁盘。这对速度较慢的计算机有帮助
S :一般档案是异步写入磁盘的(原理请参考第五章sync的说明),如果加上 S 这个
属性时,当你进行任何档案的修改,该更动会『同步』写入磁盘中。
a :当设定 a 之后,这个档案将只能增加数据,而不能删除也不能修改数据,只有root
才能设定这个属性。
c :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩,
但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)
d :当 dump 程序被执行的时候,设定 d 属性将可使该档案(或目录)不会被 dump 备份
i :这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法
写入或新增资料!』对于系统安全性有相当大的帮助!只有 root 能设定此属性
s :当档案设定了 s 属性时,如果这个档案被删除,他将会被完全的移除出这个硬盘
空间,所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来配置文件案时,如果该档案被删除了,则数据内容其实还
存在磁盘中,可以使用来救援该档案喔!
注意:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定
请尝试到/tmp底下建立档案,并加入 i 的参数,尝试删除看看。
lsattr (显示档案隐藏属性)
[root@www ~]# lsattr [-adR] 档案或目录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来!
[root@www tmp]# chattr +aij attrtest
[root@www tmp]# lsattr attrtest
----ia---j--- attrtest
[root@www ~]# cd /tmp
[root@www tmp]# touch attrtest <==建立一个空档案
[root@www tmp]# chattr +i attrtest <==给予 i 的属性
[root@www tmp]# rm attrtest <==尝试删除看看
rm: remove write-protected regular empty file `attrtest‘? y
rm: cannot remove `attrtest‘: Operation not permitted <==操作不许可
# 看到了吗?呼呼!连 root 也没有办法将这个档案删除呢!赶紧解除设定!
请将该档案的 i 属性取消!
[root@www tmp]# chattr -i attrtest
本文出自 “千面” 博客,请务必保留此出处http://oslibo.blog.51cto.com/10854638/1782607
原文地址:http://oslibo.blog.51cto.com/10854638/1782607