引言
前面的内容中,我们讲到传统的权限仅有三种身份(owner,group,others)搭配三种权限(r,w,x)以及三种特殊的权限(SUID,SGID,SBIT),随着应用的发展,这些权限组合已不能适应现在复杂的文件系统权限控制要求。
例如,目录data的权限为:drwxr-x—,所有者与所属组均为root,在不改变所有者和所属组的前提下,要求用户yufei对该目录有完全访问权限(rwx),但又不能让其他有用完全权限(rwx)。这个要求看似不能实现,这就看出来传统的权限管理设置有时候也会力不从心。为了解决这样的问题,Linux开发出了一套新的文件系统权限管理方法,叫文件访问控制列表ACL(Access Control Lists)。这时候,我们就可能通过ACL来实现。
什么是ACL
ACL是Access Control List的缩写,主要的目的是在提供传统的owner,group,others的read,write,execute权限之外的局部权限设定。ACL可以针对单个用户,单个文件或目录来进行r,w,x的权限设定,特别适用于需要特殊权限的使用情况。
ACL主要针对用户(user)、用户组(group)、以及掩码(mask)方面来控制权限。
简单地来说,ACL就是可以设置特定用户或用户组对于一个文件/目录的操作权限。
而在windows系统上,没有这个ACL,ACL是类Unix(Unix-like)操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行。主要包括ReiserFS, EXT2/EXT3/ext4, JFS, XFS等文件系统。
查看系统是否支持ACL
要查看你的系统是不是支持ACL,我们可以通过下面的方法来查看。
[root@yufei ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 15118728 2442140 11908588 18% /
[root@yufei ~]# dumpe2fs /dev/sda1 |grep acl
dumpe2fs 1.41.12 (17-May-2010)+`-
Default mount options: user_xattr acl
我们看到,默认的挂载选项就已经有了ACL了,如果你的系统挂载时候没有这个选项,你可以通过
mount -o remount,acl /dev/sda1
来重新挂载。你也可以把这个挂载选项加入到开机启动,也就是写入到/etc/fatab文件里面。
ACL权限的查看与设置(getfacl, setfacl)
知道了ACL的意义了,也知道了系统是否支持ACL,那么下面就是如何来设定/使用这个ACL呢?
getfacl:查看文件/目录的ACL设定内容
setfacl:设置文件/目录的ACL内容
相关参数说明
先来看看setfacl这个命令的相关参数说明
语法:setfacl [-bkRd] [{-m|-x} acl参数] 文件名
-m :设置后续的acl参数
-x :删除后续的acl参数
-b :删除所有的ACL设定参数
-R :递归设置acl参数
-d :设置预设的acl参数(只对目录有效,在该目录新建的文件也会使用此ACL默认值)
-k :删除预设的ACL参数
设置格式如下
[d[efault]:] u[ser]:uid [:perms]
[d[efault]:] g[roup]:gid [:perms]
[d[efault]:] m[ask][:] [:perms]
[d[efault]:] o[ther][:] [:perms]
以上的参数和设置格式说明,可以在MAN中查看到
针对其他人的ACL设置
下面我们就用例子来演示一下ACL的设置与查看
我们在/root目录下进行操作
先查看install.log文件的ACL设置值是什么
[root@yufei ~]# getfacl install.log
# file: install.log
# owner: root
# group: yufei
user::rwx
group::r–
other::r–
[root@yufei ~]# ls -l install.log
-rwxr–r–. 1 root yufei 31537 Jan 20 05:09 install.log
我想通过上面的对比,大家应该能看明白getfacl所显示出来的内容吧!OK,这里我就不多说了,下面我们来看看给这个文件设置ACL值后的效果。
[root@yufei ~]# setfacl -m o:rwx install.log
[root@yufei ~]# getfacl install.log
# file: install.log
# owner: root
# group: yufei
user::rwx
group::r–
other::rwx
[root@yufei ~]# ls -l install.log
-rwxr–rwx. 1 root yufei 31537 Jan 20 05:09 install.log
这时候,我对other赋予了rwx权限了,我们切换到其他用户,就可以对此文件进行写操作了。大家可能也发现了,通过setfacl设置的other权限,和通过chmod设置的效果是一样的。没错,是这样的。
针对用户的ACL设置
把install.log拷贝到根目录,
[root@yufei ~]# cp install.log /
[root@yufei ~]# ls -l /install.log
-rwxr-xr– 1 root root 31537 Feb 9 16:27 /install.log
我们通过ACL给yufei用户赋予rwx权限
[root@yufei ~]# setfacl -m u:yufei:rwx /install.log
[root@yufei ~]# getfacl /install.log
getfacl: Removing leading ‘/’ from absolute path names
# file: install.log
# owner: root
# group: root
user::rwx
user:yufei:rwx
group::r-x
mask::rwx
other::r–
[root@yufei ~]# ls -l /install.log
-rwxrwxr–+ 1 root root 31537 Feb 9 16:27 /install.log
这时候,通过ls -l查看的文件权限后面多了一个“+”号,这就表示了文件存在ACL权限。我们切换到yufei用户,来对此文件进行一下编辑操作是完全没有问题,这里面就不演示了,自己动手吧。
注:
1、上面的用户可以换成用户列表,中间用英文的“,”分隔就OK了。
2、针对用户组的ACL设置与用户的设置差不多,这里就不演示了。
删除ACL的设置
要是删除我们设置的ACL权限的话,要怎么做呢?有两种方法
1、用-x删除后面接着的ACL权限
[root@yufei ~]# setfacl -x u:yufei /install.log
[root@yufei ~]# getfacl /install.log
getfacl: Removing leading ‘/’ from absolute path names
# file: install.log
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x
other::r–
这时候发现还有个mask的权限没有去掉,
[root@yufei ~]# setfacl -x m:: /install.log
[root@yufei ~]# getfacl /install.log
getfacl: Removing leading ‘/’ from absolute path names
# file: install.log
# owner: root
# group: root
user::rwx
group::r-x
other::r–
经过了上面的操作才算把权限还原了,实在有点不方便,而且在使用-x的时候,不能单独删除某个权限。否则会出现错误提示。如setfacl -x u:yufei:rwx /install.log,这们的命令是不可以的,不知道是我哪里用错了,还是这个命令就是这样。还是用下面这种方法来提直接。
2、用-b删除所有的ACL权限
[root@yufei ~]# setfacl -m u:yufei:rwx /install.log
[root@yufei ~]# getfacl /install.log
getfacl: Removing leading ‘/’ from absolute path names
# file: install.log
# owner: root
# group: root
user::rwx
user:yufei:rwx
group::r-x
mask::rwx
other::r–
[root@yufei ~]# setfacl -b /install.log
[root@yufei ~]# getfacl /install.log
getfacl: Removing leading ‘/’ from absolute path names
# file: install.log
# owner: root
# group: root
user::rwx
group::r-x
other::r–
这个-b参数,一次性把所有的ACL权限全部清空,还原成文件的原来权限。我推荐大家用这个参数。
ACL的mask设置
关于group的设置与user的设置类似,这里也就不做演示了,下面我们来看看mask,他的作用就是让用户/组对某个文件只有某些权限。mask只对其他用户和组的权限有影响,而对owner和other的权限是没有任何影响的。我们还是以/install.log为例来实验。
[root@yufei ~]# ls -l /install.log
-rwxr-xr– 1 root root 31537 Feb 9 17:03 /install.log
[root@yufei ~]# setfacl -m u:yufei:rwx /install.log
[root@yufei ~]# getfacl /install.log
getfacl: Removing leading ‘/’ from absolute path names
# file: install.log
# owner: root
# group: root
user::rwx
user:yufei:rwx
group::r-x
mask::rwx
other::r–
这时候我们看到mask::rwx是全部的权限,所以,切换到yufei这个帐户的时候,可能对/install.log文件进行写操作的。下面我们让yufei用户对其只有读取的权限。
[root@yufei ~]# setfacl -m m::r /install.log
[root@yufei ~]# getfacl /install.log
getfacl: Removing leading ‘/’ from absolute path names
# file: install.log
# owner: root
# group: root
user::rwx
user:yufei:rwx #effective:r–
group::r-x #effective:r–
mask::r–
other::r–
我们可以看到,user:yufei:rwx的后面多了一个提示#effective:r–,也就是说,现在yufei用户只拥有r权限了。切换到yufei用户对/install.log文件进行一下写操作,会有“–INSERT —W10: Warning: Changing a readonly file ”这样的提示。
1.ACL 权限简介 与 开启
2.查看分区ACL权限是否开启
命令:dumpe2fs -h /dev/sda3
内容 default mount options: user_xattr acl
df -h 查看分区使用情况
3.临时开启分区ACL 权限
mount -o remount,acl 重新挂载根分区,并挂载加入acl权限
4.永久开启分区acl权限
vi /etc/fstab
uuid=c2 ..... / ext4 defaults,acl 1 1 #加入acl
mount -o remount / #重新挂载文件系统或重启,修改成功
5.查看acl权限
getfacl 文件名
6.设置acl权限
setfacl 选项 文件名
-m 设定acl权限
-x 删除指定acl权限
-b 删除所有的acl权限
-d 设定默认的acl权限
-k 删除默认的acl权限
-r 递归的设定acl权限
setfacl -m u:st:rx /project
setfacl -m g:group2:x /project
----------------------------
语法:setfacl [-bkRd] [{-m|-x} acl参数] 文件名
-m :设置后续的acl参数
-x :删除后续的acl参数
-b :删除所有的ACL设定参数
-R :递归设置acl参数
-d :设置预设的acl参数(只对目录有效,在该目录新建的文件也会使用此ACL默认值)
-k :删除预设的ACL参数
-------------------------------------------------------
7.设置最大有效权限mask
setfacl -m m:rw /project
8.删除acl权限
setfacl -x u:用户 filename
setfacl -x g:gname filename #删除指定用户用户组的acl权限
setfacl -b filename #删除文件的所有acl权限
9.递归acl权限
setfacl -m u:username:rx -R filename
setfacl -m d:u:用户:权限 文件名 未来新建的文件也必须遵守acl,只对未来的新建文件
1、setuid、setgid
先看个实例,查看你的/usr/bin/passwd 与/etc/passwd文件的权限
[root@MyLinux ~]# ls -l /usr/bin/passwd /etc/passwd
-rw-r--r-- 1 root root 1549 08-19 13:54 /etc/passwd
-rwsr-xr-x 1 root root 22984 2007-01-07 /usr/bin/passwd
众所周知,/etc/passwd文件存放的各个用户的账号与密码信息,/usr/bin/passwd是执行修改和查看此文件的程序,但从权限上看,/etc/passwd仅有root权限的写(w)权,可实际上每个用户都可以通过/usr/bin/passwd命令去修改这个文件,于是这里就涉及了linux里的特殊权限setuid,正如-rwsr-xr-x中的s
setuid就是:让普通用户拥有可以执行“只有root权限才能执行”的特殊权限,setgid同理指”组“
作为普通用户是没有权限修改/etc/passwd文件的,但给/usr/bin/passwd以setuid权限后,普通用户就可以通过执行passwd命令,临时的拥有root权限,去修改/etc/passwd文件了
2、stick bit (粘贴位)
再看个实例,查看你的/tmp目录的权限
drwxrwxrwt 6 root root 4096 08-22 11:37 /tmp
tmp目录是所有用户共有的临时文件夹,所有用户都拥有读写权限,这就必然出现一个问题,A用户在/tmp里创建了文件a.file,此时B用户看了不爽,在/tmp里把它给删了(因为拥有读写权限),那肯定是不行的。实际上是不会发生这种情况,因为有特殊权限stick bit(粘贴位)权限,正如drwxrwxrwt中的最后一个t
stick bit (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。
也就是说,在/tmp目录中,只有文件的拥有者和root才能对其进行修改和删除,其他用户则不行,避免了上面所说的问题产生。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。
3、如何设置以上特殊权限
setuid:chmod u+s xxx
setgid: chmod g+s xxx
stick bit : chmod o+t xxx
或者使用八进制方式,在原先的数字前加一个数字,三个权限所代表的进制数与一般权限的方式类似,如下:
suid guid stick bit
1 1 1
所以:suid的二进制串为:100,换算十进制为:4
guid的二进制串为:010,换算:2
stick bit 二进制串:001,换算:1
于是也可以这样设:setuid:chmod 4755 xxx
setgid:chmod 2755 xxx
stick bit:chmod 1755 xxx
最后,在一些文件设置了特殊权限后,字母不是小写的s或者t,而是大写的S和T,那代表此文件的特殊权限没有生效,是因为你尚未给它对应用户的x权限
10.SetUID(4)
只有二进制可执行程序才能设定SUID权限[S权限],命令执行者需对该文件有X权限
s权限是指当命令执行时给予运行文件以读写修改权限
例如:passwd 普通用户可修改/etc/shadow 文件
而cat 普通用户却不可以
设定suid : chmod 4755 filename
chmod u+s filename
11.setGID(2)
chmod 2755 filename 给组设定s权限
chomod g+s dir
11.1 针对可执行二进制文件
只有二进制可执行程序才能设定SGID权限[S权限],命令执行者需对该文件有X权限
例子:locate
whereis locate
ll /usr/bin/locate #查看文件权限
-rwx--s--x
解说上述列子:/usr/bin/locate 可执行的二进制程序 可赋予GUID,命令结束恢复自身的组权限
11.2 针对目录的作用
@ 普通用户需对该目录有rx权限
@ 由root切换成普通用户在该目录下新建文件的组默认属性应该是该目录的属性
12.sticky bit(1)
chmod 1755 dir 给其他设定s权限
chmod o+t dir
chmod o-t dir
sbit粘着位作用:
@只对有wx权限的目录起作用 :普通用户可以在此目录下拥有写入权限
@ 无粘着位,普通用户有W权限,可以删除目录下的所有文件,包括其他用户建的文件,一旦有粘着位,只有root用户可以删除所有文件,普通用户即使有W权限也无法删除文件,只能删除自己建立的文件
//chmod 7755 filename 给用户用户组其他都设定s权限(无任何意义)
Linux文件系统的隐藏权限:chattr lsattr(journal)
通过chattr设置档案的隐藏权限。
参数说明:
+-=:分别是"+"(增加)、"-"(减少)、"="(设定)属性
A:当设定了属性A,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免诸如手提电脑容易产生磁盘I/O错误的情况;
S:这个功能有点类似sync,是将数据同步写入磁盘中,可以有效避免数据流失;
a:设定a后,这个文件将只能增加数据而不能删除,只有root才能设定这个属性;
c:设定这个属性后,将会自动将此文件压缩,在读取时自动解压缩。但是在存储的时候,会现进行压缩在存储(对于大文件很有用);
d:当dump(备份)程序执行时,设定d属性将可使该文件(或目录)具有dump功效;
i:这个参数可以让一个文件”不能被删除、更名、设定链接,也无法写入数据,对于系统安全有很大的助益
j:当使用ext3文件系统格式时,设定j属性将使文件在写入时先记录在日志中,但是当filesystem设定参数为data=journalled时,由于已经设定了日志,所以这个属性无效
s:当文件设定了s参数时,它会被完全移出这个硬盘空间
u:与s相反,当使用u配置文件时,数据内容其实还可以存在于磁盘中,可以用来取消删除
示例:
chattr +i /etc/shadow //该文件无法更动了
chattr -i /etc/shadow //解除该属性
这个指令比较重要,尤其是在系统的安全方面。由于这些属性是隐藏性质,所以需要使用lsattr才能看到这些属性。
lsattr [-aR]
参数说明:
-a :将隐藏文件的属性也显示出来
-R :连同子目录的数据一并显示出来
但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效!
rm: cannot remove `chattr.man': Operation not permitted
后来才知道是chattr的搞的鬼。今天在看《Advanced Bash-ScriptingGuide》一书中又提到了chattr命令,并给出了一些之前没看到过的参数,因此man了一把chattr,参数还不少,翻译是对命令解释的精读,因此我就尝试翻译一下吧。
名字:
chattr - 在EXT2文件系统上改变文件属性(EXT3同样适应,译者注)
摘要:
chattr [ -RV ] [ -v version ] [ mode ] files...
描述:
chattr 改变EXT2文件系统上的一个文件的属性
参数符号格式是:+-=[ASacDdIijsTtu].
操作符 '+' 表示将选中的属性增加到指定的文件上; '-' 则表示删除该属性;
'=' 表示文件仅仅设置现在选择的属性(之前设置的属性全部移除,译者注)
字母 'acdijsuADST' 分别表示下面的属性:
仅追加(a), 压缩 (c), 不dump (d),不可更改 (i), 数据日志 (j), 安全删除 (s), 非尾部合并(t), 不可删除 (u), 不更新atime (A), 同步目录更新 (D),同步更新 (S), and top of directoryhierarchy (T).
选项:
-R 递归改变目录和目录的内容. 符号链接递归时不进入。
-V 冗余命令输出和打印程序版本
-v version
设置文件的版本(代)号
属性解释:
当访问一个设置了 ‘A' 属性的文件时,atime记录并不修改。这可以在笔记本上避免大量的磁盘I/O操作(特意指出笔记本,是考虑省电?译者注).
如果文件设置了 ‘a’ 属性,数据只能采用追加模式,仅仅超级用户或者拥有CAP_LINUX_IMMUTABLE能力的进程可以设置和删除该属性。
如果文件设置了 ‘c’ 属性, 那么当这个文件在进行写操作时,它将自动被压缩,并且在读的时候, 自动解压.
在存储到磁盘时先压缩数据。
如果一个目录设置了 ‘D'属性,任何改变将同步到磁盘;这等价于mount命令中的dirsync选项:同步目录
如果一个文件设置了 ‘d’ 属性,dump(8)运行时,不会备份它(不dump改文件,译者注)
‘E’ 属性目前是一个实验性质的压缩选项,用来标记压缩出现错误的文件。目前它还不能使用chattr来设置或者重置,虽然能使用lsattr命令来显示。
‘I’ 属性用在h树(htree)代码上,用来标记那些使用hash数隐藏索引的目录。目前它还不能使用chattr来设置或者重置,虽然能使用lsattr命令来显示。
如果一个文件设置了 ‘i' 属性,那么这个文件将不能被修改,不能被删除、重命名、链接该文件、写数据到文件。仅仅超级用户或者拥有CAP_LINUX_IMMUTABLE能力的进程可以设置和删除该属性。
如果一个文件设置了 ’j'属性,那么它所有的数据在写入文件本身之前,写入到ext3文件系统日志中,如果该文件系统挂载的时候使用了"data=ordered" 或"data=writeback"选项。当文件系统采用"data=journal"选项挂载时,所有文件数据已经记录日志,因此这个属性不起作用。仅仅超级用户或者拥有CAP_SYS_RESOURCE能力的进程可以设置和删除该属性。
设置了 ‘s’ 属性的文件被删除时,它所在磁盘上的块将全部被0填充,这是一个安全属性。
当一个设置了 ‘S’ 属性的文件被修改时,将同步到磁盘;它等价于mount命令的‘sync‘选项。
如果一个目录设置了 ‘T’ 属性,它将被视为目录结构的顶极目录,这是为了Orlov块的分配(kernel 2.5.46以上版本使用)
如果一个文件设置了 ‘t’ 属性,它和其他文件合并时,该文件的末尾不会有部分块碎片(为支持尾部合并的文件系统使用)。
这对某些程序是必须的,比如LILO,它直接读取文件系统,但是他并不理解尾部合并文件。
主意:写这个文档的时候,ext2,ext3还不支持尾部合并(tail-merging)
如果文件设置了 ‘u’ 属性, 那么当这个文件被删除后, 这个文件的内容还可以被恢
复。它允许用户询问恢复删除方式。(目前还不知道如何恢复删除一个文件,译者注)
‘X’ 属性是一个实验性的压缩补丁,用来标记一个能直接访问的裸内容压缩文件。目前它还不能使用chattr来设置或者重置,虽然能使用lsattr命令来显示。
‘Z’ 属性是一个实验性的压缩补丁,用来标记一个脏的压缩文件。目前它还不能使用chattr来设置或者重置,虽然能使用lsattr命令来显示。
[root@roth-01 ~]# chattr +j /mnt/gfs2/gfs2_dir/newfile
[root@roth-01 ~]# lsattr /mnt/gfs2/gfs2_dir
---------j--- /mnt/gfs2/gfs2_dir/newfile
chattr -j /mnt/gfs2/gfs2_dir/newfile
[root@roth-01 ~]#
lsattr /mnt/gfs2/gfs2_dir
------------- /mnt/gfs2/gfs2_dir/newfile
chattr -j /mnt/gfs2/gfs2_dir
[root@roth-01 ~]#
lsattr /mnt/gfs2
---------j--- /mnt/gfs2/gfs2_dir [root@roth-01 ~]#
touch /mnt/gfs2/gfs2_dir/newfile
[root@roth-01 ~]#
lsattr /mnt/gfs2/gfs2_dir
---------j--- /mnt/gfs2/gfs2_dir/newfile
http://docs.redhat.com/docs/zh-CN/Red_Hat_Enterprise_Linux/5/html/Global_File_System_2/s1-manage-data-journal.html4、更改下列文件权限,使任何人没有更改账户权限:
chattr +i /etc/passwd chattr +i /etc/shadow chattr +i /etc/group chattr +i /etc/gshadow
1.chattr [+-=] 选项 文件/目录
+增加权限
-删除权限
=赋予权限
选项:
i:对文件:不能添加修改内容,改名和删除
对目录: 可修改目录下文件数据,但是不能新建和删除文件
a: 对文件:只能新增内容,但是不能删除和修改数据,只能用追加的方式 echo "hua " >> /hua
对目录: 可修改和新增文件,但不允许删除
2.lsattr 查看文件系统属性
lsattr 选项 文件名
-a 所有文件和目录
-d 目录
2.visudo//实际上修改的是/etc/sudoers文件
root ALL=(ALL) ALL
用户名 被管理的主机地址=(可使用的身份) 授权命令(绝对地址)
#%wheel ALL =(ALL) ALL
#%组名 被管理的主机地址=(可使用的身份) 授权命令(绝对地址)
例子
sc ALL=/sbin/shutdown -r #现在/etc/sudoers文件添加这一行
# su - sc
#sudo -l //查看可用的sudo 命令
#sudo /sbin/shutdown -r