标签:
引言
前面的内容中,我们讲到传统的权限仅有三种身份(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目录的权限
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权限(无任何意义)
chattr +j /mnt/gfs2/gfs2_dir/newfile
[root@roth-01 ~]# lsattr /mnt/gfs2/gfs2_dir
---------j--- /mnt/gfs2/gfs2_dir/newfilechattr -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/newfilehttp://docs.redhat.com/docs/zh-CN/Red_Hat_Enterprise_Linux/5/html/Global_File_System_2/s1-manage-data-journal.html4、更改下列文件权限,使任何人没有更改账户权限:
1.chattr [+-=] 选项 文件/目录
+增加权限
-删除权限
=赋予权限
选项:
i:对文件:不能添加修改内容,改名和删除
对目录: 可修改目录下文件数据,但是不能新建和删除文件
a: 对文件:只能新增内容,但是不能删除和修改数据,只能用追加的方式 echo "hua " >> /hua
对目录: 可修改和新增文件,但不允许删除
2.lsattr 查看文件系统属性
lsattr 选项 文件名
-a 所有文件和目录
-d 目录
标签:
原文地址:http://www.cnblogs.com/QQ1029173607/p/5383418.html