Linux|【Linux】权限管理详解

往期内容:
Linux常用指令合集
Linux文本编辑器
Linux软件包管理
Linux用户管理

文章目录

    • ACL权限
      • 简介与开启
        • ACL权限简介
        • 查看分区ACL权限是否开启
      • 查看与设定
        • 查看ACL权限
        • 设定ACL权限
      • 最大有效权限与删除ACL权限
        • 最大有效权限
        • 删除ACL权限
      • 默认ACL权限和递归ACL权限
        • 递归ACL权限
        • 默认ACL权限
    • 文件特殊权限
      • SetUID
        • 功能
        • 设定SetUID的方法
      • SetGID
        • SetGID针对文件的作用(与SetUID很相似)
        • SetGID针对目录的作用
        • 设定SGID
      • Sticky BIT
        • SBIT粘着位作用(只针对目录)
        • 设置与取消粘着位
    • 文件系统属性chattr权限
      • 目录格式
    • 系统命令sudo权限
      • sudo权限
      • sudo使用
    • 笔记领取

ACL权限 简介与开启
ACL权限简介 【Linux|【Linux】权限管理详解】但创建的一个用户的权限与属主(rwx),属组(rwx),其他人(—)不同时,也就是需要创建除属主,属组,其他人外的第四种用户是,则需要ACL权限。
查看分区ACL权限是否开启 我们前面的rwx是用户操作文件的权限,ACL本身也是用户操作文件的权限,但是是否可以支持ACL权限,不是说看文件或者用户是否支持,而是看文件所在的分区是否支持ACL权限。
我使用的是CentOS7,xfs分区支持ACL权限。
查看与设定
查看ACL权限
getfacle 文件名

设定ACL权限
setfacl 选项 文件名 选项: -m#设定ACL权限 -x#删除指定的ACL权限 -b#删除所有的ACL权限 -d#设定默认ACL权限 -k#删除默认ACL权限 -R#递归设定ACL权限

现在我们来演示一下:
  1. 在根下创建目录
mkdir /project

  1. 创建两个成员
useradd Tony passwd Tony useradd Jane passwd Jane

  1. 新建一个组
groupadd tgroup

  1. 将两个用户加到组里
gpasswd -a Tony tgroup gpasswd -a Jane tgroup

  1. 将project目录的所有者改为root,所属组改为tgroup
chown root:tgroup /project/

  1. 更改权限
    属主(rwx),属组(rwx),其他人(—),即改为(770)
chmod 770 /project/

Linux|【Linux】权限管理详解
文章图片

  1. 创建第四种用户
useradd testuser passwd testuser

  1. 给第四种用户添加ACL权限
我们现在给testuser用户设定ACL权限,设定的权限为(rw-),如果是给组设定ACL权限,把u改为g即可。
setfacl -m u:testuser:rx /project/

我们再来看看project目录的权限发现多了个“+”,说明除了普通权限外还有ACL权限。
Linux|【Linux】权限管理详解
文章图片

  1. 查看具体的ACL权限
getfacl /project/

Linux|【Linux】权限管理详解
文章图片

最大有效权限与删除ACL权限
最大有效权限 上面我们查看ACL权限时,会看到有一个mask,这个就是最大有效权限。
Linux|【Linux】权限管理详解
文章图片

其实我们所赋予的ACL权限并不是用户真正的权限,还需要与mask**“相与”**之后才能得到用户的真正权限。
mask权限是可以通过下列命令进行修改的:
setfacl -m m:rx /project

当我修改为rw后,用户最大拥有的ACL权限就只能是rw了。
删除ACL权限
setfacl -x u:用户名 文件名 #删除指定用户的ACL权限 setfacl -x g:组名 文件名#删除指定组的ACL权限 setfacl -b 文件名#删除文件的所有ACL权限

默认ACL权限和递归ACL权限
递归ACL权限 递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。
setfacl -m u:用户名:权限 -R文件名

但如果我再创建一个新目录或文件,该新目录或文件仍然是不具有ACL权限的,原因很简单,这是在递归命令结束之后才创建的。
这时候我们就需要用到下面的默认权限了。
默认ACL权限 默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件/目录都会继承父目录的ACL权限。
注意!!!
该命令是针对新创建文件/目录的,对已经存在的文件/目录无效,已经存在的文件/目录要进行递归ACL权限。
setfacl -m d:u:用户名:权限 文件名

文件特殊权限 SetUID
功能
  • 只有可以执行的二进制程序才可以设定SUID权限。
  • 命令执行者要对程序拥有执行(x)权限。
  • 命令执行者在执行该程序时获得该程序文件属主的身份。
  • SetUID权限只有在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。
passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码,我们看看passwd的权限,发现多了一个s,也就是说在这个文件的所有者范围内拥有SUID权限。
Linux|【Linux】权限管理详解
文章图片

设定SetUID的方法
  • 4代表SUID,有两种设定方法:
chmod 4755 文件名 #第2个数代表属主权限,在前面+4则说明赋予SUID权限 chmod u+s 文件名 #执行这个命令用户必须有x权限

  • 取消SUID权限
chmod 755 文件名 chmod u-s 文件名

SetGID
SetGID针对文件的作用(与SetUID很相似)
  • 只有可以执行的二进制程序才可以设定SGID权限。
  • 命令执行者要对程序拥有执行(x)权限。
  • 在执行该程序时,组身份获得该程序文件属组的身份。
  • SetUID权限只有在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效。
locate命令拥有SGID权限,在对应的所属组权限的x的位置改为s。
Linux|【Linux】权限管理详解
文章图片

SetGID针对目录的作用
  • 普通用户必须对此目录拥有r和x权限,才能进入目录。
  • 普通用户在此目录中的有效组会变成此目录的数组。
  • 若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组。
举个例子:
首先我创建一个目录。
mkdir /tmp/test

赋予目录SGID权限,属主、属组、其他人的权限改为777,命令下面会讲。
chmod 2777 /tmp/test

查看一下目录权限,已经出现了s。
ll -d /tmp/test

Linux|【Linux】权限管理详解
文章图片

这时候我们切换到普通用户:
su - Tony

随意创建一个文件,我们发现这个文件的属主和属组都是该用户,但如果我们进入目录test,并创建文件,这个文件的属组是root。
Linux|【Linux】权限管理详解
文章图片

也就说明了普通用户在该目录中新建文件的默认属组是这个目录的数组。
设定SGID
  • 2代表SGID
chmod 2755 文件名 chmod g+s 文件名

Sticky BIT
SBIT粘着位作用(只针对目录)
  • 粘着位目前只对目录有效。
  • 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限。
  • 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予了粘着位,除了root可以删除所有文件,普通用户即使有w权限,也只能删除自己建立的文件。
tmp目录拥有SBIT,我们可以看到在其他人的权限里有个t。
Linux|【Linux】权限管理详解
文章图片

设置与取消粘着位 设置(两种方法):
chmod 1755 目录名 chmod o+t 目录名

取消:
chmod 755 目录名 chmod o-t 目录名

文件系统属性chattr权限 目录格式
chattr [+-=][选项] 文件或目录名 +:增加权限 -:删除权限 =:等于某权限

选项:
  • i:如果对文件设置i属性,不允许对文件进行删除、改名,也不能添加和修改内容;如果对目录设置i属性,那么只能修改目录下文件的内容,但不允许创建和删除文件。
  • a:如果对文件设置a属性,只能在文件中添加内容(这里只能有echo命令追加内容,不能使用vim),但不能删除、修改内容;如果对目录设置a属性,那么只能在目录中建立和修改文件,但不能删除。
系统命令sudo权限 sudo权限
  • root把本来只能超级用户执行的命令赋予普通用户执行。
  • sudo的操作对象是系统命令。
sudo使用
命令:
visudo #实际修改的是/etc/sudoers文件

Linux|【Linux】权限管理详解
文章图片

例如现在我给用户Tony赋予shutdown -r 关机重启命令,则可以这样写:
Linux|【Linux】权限管理详解
文章图片

但我们不能像root用户一样直接敲命令shutdown -r now示例如下:
sudo -l#确定该用户为Tony sudo /sbin/shutdown -r now #输入命令要输入绝对路径

笔记领取 Linux系列文章均已打包成PDF版本的笔记,关注公众号“大拨鼠Code”回复“Linux”领取,持续更新。

    推荐阅读