权限管理
ACL权限
ACL权限主要用来解决用户对文件的身份不足的问题
在centos7中,默认使用的是xfs文件系统,并且ACL权限是默认开启的。如果想要通过命令查看,ext文件系统的dumpe2fs并不适用,查看xfs文件系统的xfs_info命令也无法查看ACL信息,如果一定要查看ACL状态:
[root@localhost ~]# dmesg | grep ACL [ 0.627775] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN) [ 1.781830] SGI XFS with ACLs, security attributes, no debug enabled
如果你的系统没有默认开启ACL权限,那么你可以mount -o remount,acl/手工挂载,也可以修改*/etc/fatab/*文件设置自动挂载
ACL权限设置
[root@localhost ~]#getfacl 文件名 #查看文件的ACL权限 [root@localhost ~]# setfacl [选项] 文件名 -m:设定ACL权限,u:用户名:权限、g:组名:权限 -x:删除指定的ACL权限 -b:删除所有的ACL权限 -d:设置目录的默认ACL权限,意思是这个命令之后所有新建的文件都具有此ACL权限 -k:删除默认ACL权限 -R:递归设定ACL权限,给目录下所有的文件设定ACL权限,包括命令之前的文件
ACL权限在设置默认和递归后极其容易造成权限溢出
最大有效权限mask
在使用getfacl命令查看文件的ACL权限时,有一项mask最大有效权限,所赋予的ACL权限必须在mask之内,最终生效的权限就是你所设定的ACL权限和mask相*“与”*,所以一般mask权限都设置为“rwx”
mask也是可以修改的:
[root@localhost ~]# setfacl -m m:rx project/ #设定mask权限为r-x [root@localhost ~]# getfacl project/ # file: project/ # owner: root # group: root user::rwx group::r-x mask::r-x other::r-x
文件特殊权限-SUID权限
Set UID,简称为SUID的特殊权限。那么区别与rwx这个SUID的特殊权限的作用究竟是什么,它特殊在哪里?
- SUID仅对二进制程序有效
- 执行者对于该程序需要有x的可执行权限
- 本权限仅仅在执行该程序的过程中有效
- 执行者将对该程序拥有属主的权限
举个例子
[root@localhost ~]# ll /etc/shadow ---------- 1 root root 1139 Sep 20 19:36 /etc/shadow
对于*/etc/shadow*文件,我们可以发现这个文件的权限区别于其他,也就是说这个文件之有超级用户root才有权限进行操作,而普通用户ajin想要修改密码时:
[ajin@localhost ~]$ ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd
普通用户对于*/usr/bin/passwd文件拥有执行权限,说明它可以修改自己的密码。同时我们发现/usr/bin/passwd的有SUID特殊权限,既然普通用户可以修改自己的密码,那么它又是如何修改/etc/shadow*里的内容呢?
事实上,普通用户在执行passwd命令时,ajin会暂时获得root的权限就相当于是root在修改影子文件,这就是SUID文件的特殊之处。
文件特殊权限-SGID权限
Set GID,简称为SGID的特殊权限。
- 只有可执行二进制程序才能设置SGID权限
- 命令执行者要对该程序拥有执行(x)权限
- 命令执行者在执行程序的时候,组身份升级为该可执行程序文件的属组
- SGID权限只在该程序执行过程中有效,也就是组身份只在程序执行过程中发生改变,命令结束用户组身份恢复.
举个例子:
[root@localhost ~]# ll /usr/bin/locate 2 -rwx--s--x. 1 root slocate 35548 Sep 24 2012 /usr/bin/locate #拥有SGID权限,普通用户执行该命令时,组身份会切换到slocte
使用locate命令查找文件时,实际是在/var/lib/mlocate/mlocate.db数据库中查找
普通用户使用locate命令可以查找文件是因为执行locate命令时组身份切换到该目录所属组slocate
SGID针对目录的作用
- 普通用户必须对该目录拥有r-x权限,才能进入此目录
- 普通用户在该目录中的有效组会变成该目录的属组
- 若普通用户对此目录拥有w(可创建文件)权限时,新创建的文件的默认属组是这个目录的属组
文件特殊权限-SBIT权限
Sticky BIT,简称SBIT权限,可意为粘着位、粘滞位、防删除位等。
SBIT仅对目录有效,目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件。
举个例子,Linux 系统中,存储临时文件的 /tmp 目录就设定有 SBIT 权限:
[root@localhost ~]# ll -d /tmp drwxrwxrwt. 4 root root 4096 Apr 19 06:17 /tmp
如果一个目录设定有SBIT权限,那么属组或其他的用户只能操作自己创建的文件或目录,而无法修改甚至删除其他用户创建的文件或目录。
文件系统属性-chattr权限
[root@localhost ~]#chattr [+ - =] [选项] 文件或目录名 -i : 如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。(相当于把文件给锁住了,对root也有作用) -a : 如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除文件。
查看文件系统属性
[root@localhost ~]# lsattr 选项 文件名 -a:显示所有文件和目录 -d:若目标是目录,仅列出目录本身的属性,而不是子文件的。
系统命令-sudo权限
在一些情况下,普通用户需要执行一些超级用户才能执行的命令,而sudo权限就是把root用户的权限赋予给普通用户执行,通过sudo来调用。
我们想要给普通用户赋予权限,首先要通过visudo来设置sudo,实际上修改的就是/etc/sudoers这个文件
[root@localhost ~]# visudo ## Allow root to run any commands anywhere root ALL=(ALL) ALL ajin ALL=(ALL) ALL #赋予的权限越详细,普通用户所获得的权限就越小,所受到的限制就越多。
普通用户在使用sudo权限是要在命令前面加上sudo