ACL 概述
ACL 用于解决用户对文件身份不足的问题。它的基本思路就是把用户拿出来,不再考虑它是文件的所有者还是所属组,直接赋予权限使用
2、ACL 使用
1)、开启 ACL
dumpe2fs -h /dev/sda2
dumpe2fs
命令是查询指定分区详细文件系统信息的命令
选项:
-h
:仅显示超级快中信息,而不显示磁盘块组的详细信息
Default mount options: user_xattr acl # 看到这个表明 ACL 是开启的
==ACL 默认是开启的==
如果没有开启,手动开启分区的 ACL 权限
mount -o remount,acl /
重新挂载根分区,并挂载假如 ACL 权限
2)、ACL 基本命令
getfacl 文件名
查询文件的 acl 权限setfacl 选项 文件名
设定 acl 权限
选项:
-m
:设定 ACL 权限
-b
:删除 ACL 权限
``-x:用户` 删除单个用户的 ACL 权限setfacl -m u:用户名:权限 文件名
setfacl -m g:组名:权限 文件名
setfacl -m u:Jimmy:4 /home/hepingfly/test/ # 这个就表示给 test 目录赋予 Jimmy 这个用户读的权限
setfacl -m u:Jimmy:5 -R /home/hepingfly/test/ # 赋予递归 ACL 权限,只能赋予目录
ACL 默认权限
setfacl -m d:u:Jimmy:5 -R /home/hepingfly/test/ # 在原有命令基础上加一个 d: 表示 default
注意:
如果给目录赋予 ACL 权限,下面两条命令都要输入
# 递归与默认的区别:
setfacl -m u:Jimmy:5 -R /home/hepingfly/test/ # 这条命令只对已经存在的文件生效
setfacl -m d:u:Jimmy:5 -R /home/hepingfly/test/ # 这条命令只对以后新建的文件生效
#第一个:比如说你 test 目录下原来有一些文件,然后你执行了上面第一个命令,那么这些文件就具备的 ACL 权限,但是此时你如果新建一个文件,这个新建文件时不具备 ACL 权限的
# 第二个:比如说你 test 目录下原来有一些文件,这些文件还没有 ACL 权限,这时候你执行第二条命令,那么以后新建的文件都会具备 ACL 权限,但是之前的文件还是没有 ACL 权限
# 因此需要两个命令一起使用
删除 ACL 权限:
setfacl -x u:Jimmy /home/hepingfly/test/ # 删除指定用户的 ACL 权限
setfacl -b /home/hepingfly/test/ # 删除文件的所有 ACL 权限
3、sudo 权限
sudo 授权
给普通用户赋予部分管理员权限
sudo 有个原则:
- 赋予的权限越详细,普通用户得到的权限就越小
- 赋予的权限越简单,普通用户得到的权限越大
使用 root 身份,执行 visudo
root ALL=(ALL) ALL
# 用户名 被管理主机的地址=(可使用的身份) 授权命令(要写绝对路径)
# %wheel ALL=(ALL) ALL
# %组名 被管理主机的地址=(可使用的身份) 授权命令(要写绝对路径)
- 用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加 "%"
- 被管理主机的地址:用户可以用指定的命令管理指定 ip 地址的服务器。如果写 ALL 代表可以管理任何主机。如果写固定 IP ,代表用户可以管理指定的服务器
- 可使用的身份:就是把来源用户切换成什么用户使用,(ALL)代表可以切换成任意身份。这个字段可以省略
- 授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL ,代表任何命令,这个当然不行(这样这个用户就变成 root 用户了)。如果需要给哪个命令授权,写入命令名即可,不过需要注意,一定要写成绝对路径
visudo
Jimmy ALL=/sbin/shutdown -r now # 授权 Jimmy 用户可以使用 shutdown -r now 命令
sudo -l # 查看可用的授权
授权 Jimmy 用户可以添加其他普通用户:
Jimmy ALL=/usr/sbin/useradd # 赋予 Jimmy 添加用户权限。命令必须写入绝对路径
Jimmy ALL=/usr/bin/passwd # 赋予修改密码权限,取消对 root 的密码修改
Jimmy ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
4、SUID 权限
SetUID 是什么(简称 SUID)?
SetUID 的功能可以这么理解:
- 只有可以执行的二进制程序才能设定 SUID 权限
- 命令执行者要对该程序拥有 x(执行)权限
- 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
- SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
[root@hepingfly 桌面]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
# 你会发现上面所属用户的最后一个权限是 s ,这就代表这个文件具有 suid 权限,假如这个 s 出现在所属组的位置,就代表这个文件具有 sgid 权限,假如 t 出现在其他用户的位置,就表示这个文件具有 sbit 权限
[root@hepingfly 桌面]# ll /etc/passwd
-rw-r--r--. 1 root root 1714 4月 8 23:14 /etc/passwd
[root@hepingfly 桌面]# ll /etc/shadow
----------. 1 root root 1181 4月 8 23:14 /etc/shadow
[root@hepingfly 桌面]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
# 思考一个问题,我们说普通用户是可以修改自己的密码的,修改密码最终我们说是写到 /etc/shadow 这个文件中的,但是上面这个文件的权限是 000 ,它是怎么写进去的呢?
# 原因就在于修改密码的命令 /usr/bin/passwd 这个命令,你会发现它所有者上面有个 s 就表示它具有 suid 权限,那么为什么要给 /usr/bin/passwd 这个文件 suid 权限呢?目的就是为了可以让普通用户设置密码,普通用户在使用 /usr/bin/passwd 这个命令的时候可以去操作 /etc/shadow 文件
解释一下上面第一句话:
给文件赋 SUID 权限:
[root@hepingfly hepingfly]# touch abc
[root@hepingfly hepingfly]# ll abc
-rw-r--r--. 1 root root 0 4月 14 22:52 abc
[root@hepingfly hepingfly]# chmod u+s abc 直接使用 u+s 就可以
[root@hepingfly hepingfly]# ll abc
-rwSr--r--. 1 root root 0 4月 14 22:52 abc
# 但是我们会发现上面的是 S ,这个 S 表示报错,说明你这个文件的权限有问题,因为我们说只有可以执行的程序才能设置 suid 权限,前提就是这个文件要有执行权限,这个 abc 文件时没有执行权限的,你给它设置 suid 权限,所以是 S 是有问题的(也可以这么理解:如果一个文件有 s 权限,那么它肯定有 x 权限。s = S + x)
# 正确应该这么操作:
[root@hepingfly hepingfly]# chmod 755 abc
[root@hepingfly hepingfly]# ll abc
-rwxr-xr-x. 1 root root 0 4月 14 22:52 abc
[root@hepingfly hepingfly]# chmod u+s abc
[root@hepingfly hepingfly]# ll abc
-rwsr-xr-x. 1 root root 0 4月 14 22:52 abc
解释下上面第二句话:
[root@hepingfly hepingfly]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
[root@hepingfly hepingfly]# ll /etc/shadow
----------. 1 root root 1181 4月 8 23:14 /etc/shadow
# 你会发现 /usr/bin/passwd 这个命令的所属用户和所属组都是 root ,假如这时候我 Jimmy 用户想去改自己的密码,那么就会用到 /usr/bin/passwd 这条命令,相对于这条命令,我 Jimmy 用户就是其他人,会发现这条命令其他人也有执行权限
# 总之,你命令执行者要对这条命令有执行权限 suid 权限才会生效
解释下上面第三句话:
# 命令执行者在执行该程序时,获得该程序文件所有者身份,意思就是:
[root@hepingfly hepingfly]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
[root@hepingfly hepingfly]# ll /etc/shadow
----------. 1 root root 1181 4月 8 23:14 /etc/shadow
# 我 Jimmy 用户本来对 /etc/shadow 这个文件是没有权限操作的,但是因为 /usr/bin/passwd 这个命令是有 suid 权限的,所以当 Jimmy 用户执行 /usr/bin/passwd 这个命令的时候,它的身份会从 Jimmy 变成 /usr/bin/passwd 这个命令的所有者,也就是 root,root 用户时对 /etc/shadow 这个文件有操作权限的,因此 Jimmy 用户对这个文件也就有了操作权限
危险的 SetUID:
[root@hepingfly 桌面]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2283960 7月 24 2015 /usr/bin/vim
[root@hepingfly 桌面]# chmod u+s /usr/bin/vim
[root@hepingfly 桌面]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2283960 7月 24 2015 /usr/bin/vim
# 解释一下上面的,首先我 vim 命令是有执行权限的,这时候我给 vim 命令设置 suid 权限,那么就意味着我任何用户在执行 vim 命令的时候,身份都会变成 vim 命令的所属主用户,也就是 root 用户,那这权限就大了,比如说,/etc/shadow 文件普通用户时没有权限修改的,但是你一旦给 vim 设置 suid 权限,普通用户在执行 vim 命令的时候身份就变成了 root 用户,这时候就可以随意修改 /etc/shadow 文件了
注意:
==SUID 权限只能针对执行程序,也就是说一个文件只有有执行权限才能被赋予 SUID 权限==
5、SGID 权限
1)、针对文件的作用
SGID 既可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。如果针对文件,SGID 的含义如下:
- 只有可执行的二进制程序才能设置 SGID 权限
- 命令执行者要对该程序拥有 x (执行)权限
- 命令在执行程序的时候,组身份升级为该程序文件的所属组
- SGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@hepingfly hepingfly]# locate shp
/home/hepingfly/shp
[root@hepingfly hepingfly]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 2402222 4月 15 22:56 /var/lib/mlocate/mlocate.db
# 我们知道 locate 命令,是根据文件名去搜索文件,但是它搜索的实际上是一个数据库,根据数据库索引再去找文件,数据库文件位置是 /var/lib/mlocate/mlocate.db 但是我们发现这个文件对普通用户的权限是 0(该文件其他用户的权限是 0),但是我们发现普通用户也是可以使用 locate 命令去搜索的,那么既然可以使用 locate 命令,就必定会访问这个数据库文件去找索引,但是这个数据库文件对普通用户又没有权限,那是普通用户时怎么做到可以访问这个文件呢?
# 下面来解释下:
[root@hepingfly hepingfly]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 35840 3月 12 2015 /usr/bin/locate
# 我们发现 /usr/bin/locate 这个命令是有 sgid 权限的,那么就意味着普通用户在执行 /usr/bin/locate 这条命令的时候,所属组就会变成 「slocate」,而 /var/lib/mlocate/mlocate.db 这个文件的所属组对这个文件是具有读权限的,因此普通用户在执行 /usr/bin/locate 这条命令的时候可以对这个数据库文件进行读取
2)、针对目录的作用
如果 SGID 针对目录设置,含义如下:
- 普通用户必须对此目录拥有 r 和 x 的权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的所属组
- 若普通用户对此目录拥有 w 权限时,新建的文件的默认所属组是这个目录的所属组
[root@hepingfly hepingfly]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 4月 16 21:49 test # 有个 test 文件夹,所有者和所属组都是 root
[root@hepingfly hepingfly]# chmod 777 test/ 给 test 文件夹赋 777 权限,目的是为了让普通用户(其他人)拥有在这个文件夹下的 w 权限
[root@hepingfly hepingfly]# ll
总用量 4
drwxrwxrwx. 2 root root 4096 4月 16 21:49 test
[hepingfly@hepingfly test]$ touch aa # 我用 hepingfly 这个用户创建了一个文件 aa
[hepingfly@hepingfly test]$ ll
总用量 0
-rw-rw-r--. 1 hepingfly hepingfly 0 4月 16 22:01 aa # 发现这个文件的所有者和所属组都是 hepingfly,这是正常的,本来就是 hepingfly 这个用户创建的
[root@hepingfly hepingfly]# chmod g+s test/ 现在我用 root 用户给 test 文件夹设置 sgid 权限
[root@hepingfly hepingfly]# ll
总用量 4
drwxrwsrwx. 2 root root 4096 4月 16 22:01 test # 发现所属组这里有了 sgid 权限
[hepingfly@hepingfly test]$ touch bb # 现在再使用 hepingfly 这个用户去 test 目录下创建一个 bb 文件,发现它的所属组变成了 root,因为 test 文件夹具有 sgid 权限,那么如果普通用户对这个文件夹有 w 权限,在这个文件夹下新建的文件所属组就会变成这个文件夹的所属组(test 文件夹的所属组)
[hepingfly@hepingfly test]$ ll
总用量 0
-rw-rw-r--. 1 hepingfly hepingfly 0 4月 16 22:01 aa
-rw-rw-r--. 1 hepingfly root 0 4月 16 22:05 bb
6、Sticky BIT 权限
Sticky BIT 粘着位,也简称 SBIT。SBIT 目前仅针对目录有效,它的作用如下:
- 粘着位目前只对目录有效
- 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
- 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下的任何文件,包括其他用户建立的文件。一旦赋予粘着位,除了 root 用户可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
[root@hepingfly hepingfly]# ll -d /tmp/
drwxrwxrwt. 31 root root 4096 4月 16 22:01 /tmp/ # 我们发现 /tmp 目录就具有 sbit 权限
# 结合上面的权限,我们发现 /tmp 目录普通用户(其他人权限)具有 w 的权限,就意味着普通用户可以删除这个目录下的任何文件(按照以前的知识,删文件的前提是要对这个文件所在目录有 w 权限)
[root@hepingfly tmp]# touch abc 用 root 用户新建一个文件 abc
[root@hepingfly tmp]# ll /tmp/abc
-rw-r--r--. 1 root root 0 4月 16 22:32 /tmp/abc
[hepingfly@hepingfly tmp]$ touch bcd # 用普通用户新建一个 bcd 文件
[hepingfly@hepingfly tmp]$ ll /tmp/bcd
-rw-rw-r--. 1 hepingfly hepingfly 0 4月 16 22:37 /tmp/bcd
# 现在我想用普通用户删 abc 文件,既然我普通用户对 /tmp 目录有 w 权限,就意味着我可以删这个目录下任意文件
[hepingfly@hepingfly tmp]$ rm -rf abc
rm: 无法删除"abc": 不允许的操作
# 发现删不了,因为 /tmp 目录具有 sbit 权限,普通用户就算对这个文件夹有 w 权限,也只能删除自己建立的文件而不能删除别人建立的文件(但是 root 用户可以随意删)
设定文件特殊权限:
- 4 代表 SUID
- 2 代表 SGID
- 1 代表 SBIT
或者你可以使用 u+s
g+s
o+t
来设定特殊权限
chmod 4755 test # 赋予 SUID 权限
chmod 2755 test # 赋予 SGID 权限
mkdir test
chmod 1755 test # SBIT 只对目录有效,建立测试目录,并赋予 SBIT 权限
7、chattr 权限
chattr [+-=] [选项] 文件或目录名
选项:
+
: 增加权限
-
: 删除权限
=
: 等于某权限
i
: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件
a
: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除
e
: linux 中绝对大多文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的。
查看文件系统属性:
lsattr 选项 文件名
选项:
-a
: 显示所有文件和目录
-d :
若目标是目录,仅列出目录本身的属性,而不是子文件的
[root@hepingfly hepingfly]# touch abc
[root@hepingfly hepingfly]# chattr +i abc 给 abc 这个文件加上不可改变权限,相当于把 abc 的 insert 给锁了,那么这个文件就不给修改、删除
[root@hepingfly hepingfly]# lsattr abc 查看 abc 的权限
----i--------e- abc
[root@hepingfly hepingfly]# mkdir test
[root@hepingfly hepingfly]# chattr +i test/ 给目录添加一个不可改变权限,相当于把目录的 insert 权限给锁了,那么这个目录就不能新建和删除文件,但是对目录下的文件不影响,文件还是可以修改的(我们锁的是目录,不是目录下的子文件)
[root@hepingfly hepingfly]# lsattr -d test/ 查看目录权限
----i--------e- test/
注意:
如果你给文件设置了 a 属性,我们说只能在文件中增加数据,但是不能修改数据。增加数据的话,你不能使用 vim 去增加,因为 vim 是一个编辑器,它能增加能修改,系统无法判断你是增加了还是修改了。可以使用 echo 往文件里面追加。