Linux 入门总结(九) —— 权限管理
ACL 权限
ACL 权限简介与开启
1、ACL 权限简介
ACL 权限就是专门用作解决身份(u、g、o)不足的问题。它跟 Windows 中的权限很类似,即 ACL 权限不再管以前存在的身份(u、g、o),而是针对某个用户或者组,添加相应的权限。
2、查看分区 ACL 权限是否开启1
2
3# dumpe2fs 命令是查询指定分区详细文件系统信息的命令
# -h 选项:仅显示超级块中信息,而不显示磁盘块组的详细信息
dumpe2fs -h /dev/sda3
命令:df -h
查看当前系统有哪些分区。df 命令是用来查看分区使用状况的,或者说占用空间容量的,但是它可以看到其对应的分区。/dev/shm 分区是一个假的分区。
注意:是否支持 ACL 权限,不是文件支持,也不是用户支持,而是文件所在的分区是否支持 ACL 权限。即 ACL 权限本身是用户对这个文件有没有相应的 rwx 权限,但是必须文件所在的分区支持才可以来分配。
注意查看默认挂载选项 default mount options
,可以看到支持 acl。当前的 Linux 当中,所有的分区,默认挂载的时候都已经支持 ACL。
3、临时开启分区 ACL 权限1
2# 重新挂载根分区,并挂载加入 ACL 权限
mount -o remount,acl /
4、永久开启分区 ACL 权限1
2
3
4
5# 在权限位,一般是 defaults 后面加上 acl,分隔符为逗号,即「defaults,acl」
vim /etc/fstab
# 重新挂载文件系统或重启系统,使修改生效
mount -o remount
注意:defaults 表示的是分区自动挂载时候的默认选项,Linux 中默认已经支持 ACL 选项了。如果某个分区不支持,可以直接在 defaults 后面加「,acl」然后保存重启。
ACL 权限是为了解决 u、g、o 三个身份不足的情况。ACL 权限的开启方法,了解即可,一般默认都开启了。
查看与设定 ACL 权限
1、查看 ACL 命令1
getfacl 文件名
注意:用户 shiting 和用户组 tgroup2 并不是 /project 目录的所有者和所属组,但它依然对该目录有相应的权限,这就是 ACL 权限。
2、设定 ACL 权限的命令1
2
3
4
5
6
7
8
9
10格式:
setfacl 选项 文件名
选项:
-m 设定 ACL 权限
-x 删除指定的 ACL 权限
-b 删除所有的 ACL 权限
-d 设定默认 ACL 权限
-k 删除默认 ACL 权限
-R 递归设定 ACL 权限
3、给用户设定 ACL 权限1
2
3
4
5
6
7
8
9
10
11# 示例命令
mkdir /project
useradd student1
useradd student2
useradd shiting
groupadd tgroup
gpasswd -a student1 tgroup
gpasswd -a student2 tgroup
chown root:tgroup /project
chmod 770 /project
setfacl -m u:shiting:rx /project
注意:给用户 shiting 赋予 r-x 权限,使用「u:用户名:权限」的格式。注意:权限的后面多了一个「+」号,就表示设置 ACL 权限成功了。要想看具体的 ACL 权限,就要使用前面讲的 getfacl 命令。
4、给用户组设定 ACL 权限1
2
3groupadd tgroup2
# 为组 tgroup2 分配 ACL 权限。使用「g:组名:权限」的格式
setfacl -m g:tgroup2:rwx /project
最大有效权限与删除 ACL 权限
1、最大有效权限 mask
mask 是用来指定最大有效权限的。如果我给用户赋予了 ACL 权限,是需要和 mask 的权限「相与」才能得到用户的真正权限。
注意:mask 不会影响所有者的权限,但是会影响 ACL 和所属组的权限。
2、修改最大有效权限1
2# 设定 mask 权限为 r-x,使用「m:权限」的格式
setfacl -m m:rx 文件名
3、删除 ACL 权限1
2
3
4
5
6
7
8# 删除指定用户的 ACL 权限
setfacl -x u:用户名 文件名
# 删除指定用户组的 ACL 权限
setfacl -x g:组名 文件名
# 会删除文件的所有的 ACL 权限,包括 mask
setfacl -b 文件名
默认 ACL 权限和递归 ACL 权限
1、递归 ACL 权限
递归是父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
1 | # 注意:-R 的位置不能放到 -m 那里,只能放到如下所示的位置 |
2、默认 ACL 权限
默认 ACL 权限的作用是如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。
1 | # 格式:setfacl -m d:u:用户名:权限 文件名 |
注意:递归权限针对的是目录下的子文件,如果赋予文件 ACL 权限,文件是不可能有子文件的,它会报错。默认权限指的是这个目录当中新出现的文件或者目录遵守 ACL 权限,如果给文件赋予 ACL 权限,它虽然不报错,但是没有作用,因为不能在文件中创建子文件。所以这两个权限都只能赋予目录。
文件特殊权限
SetUID
1、SetUID 的功能
(1) 只有可以执行的二进制程序才能设定 SetUID 权限
(2) 命令执行者要对该程序拥有执行权限即 x
(3) 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
(4) SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
举例:
passwd 命令拥有 SetUID 权限,所以普通用户可以修改自己的密码。
cat 命令没有 SetUID 权限,所以普通用户不能查看 /etc/shadow 文件内容。
注意:上图中出现了「s」,SetUID 指的就是在该文件的所有者权限范围内拥有「s」权限;而 SetGID 指的就是在该文件的所属组权限范围内拥有「s」权限;而 Sticky BIT 指的就是在该文件的其他人权限范围内拥有「s」权限。它们都是将对应执行权限位的 x 替换为 s。
2、设定 SetUID 的方法1
2
3# 4 代表 SetUID
方法一:chmod 4755 文件名
方法二:chmod u+s 文件名
注意:出现了大写的 S,跟 chmod 4755 设定出来的小写的 s 效果不一样。大写的 S 其实是报错了,证明这个权限不能运行,因为用户必须对这个文件拥有执行权限,SetUID 才有作用,这个文件的权限原来是 644,在 644 的基础之上加了一个 s,任何人对这个文件都没有执行权限,所以系统用大写的 S 报警,提示用户这种 SetUID 值不能正确执行。
3、取消 SetUID 的方法1
2方法一:chmod 755 文件名
方法二:chmod u-s 文件名
4、危险的 SetUID
(1)关键目录应严格控制写权限。比如「/」「/usr」等。
(2)用户的密码设置要严格遵守密码三原则。
(3)对系统中默认应该具有 SetUID 权限的文件做个列表,定时检查有没有列表之外的文件被设置了 SetUID 权限。
SetGID
1、SetGID 针对文件的作用
(1) 只有可执行的二进制程序才能设置 SetGID 权限
(2) 命令执行者要对该程序拥有执行权限即 x
(3) 命令执行在执行程序的时候,组身份升级为该程序文件的属组
(4) SetGID 权限只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
举例:
locate 文件搜索命令,它跟 find 命令相比,之所以执行速度更快,是因为 locate 命令搜索的是 /var/lib/mlocate/mlocate.db 这个数据库,该数据库中会记录当前系统中所有文件的文件名。会发现该数据的权限是 -rw-r—–,如果普通用户去搜索这个数据库文件按理应该是没有权限的,但是 locate 命令有 SetGID 权限。即普通用户虽然对数据库文件没有权限,但是普通用户是通过 locate 命令去搜索数据库文件的,而 locate 命令是拥有 SetGID 权限的,当任意一个普通用户执行 locate 命令的时候,其身份组就会切换为 locate 命令的组即 slocate,而数据库文件的所属组就是 slocate,并且所属组拥有读权限,所以普通用户利用 locate 命令的 SetGID 权限就可以读取数据库文件了。
2、SetGID 针对目录的作用
(1) 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
(2) 普通用户在此目录中的有效组会变成此目录的属组
(3) 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组
注意:只有 SetGID 可以既针对二进制文件,也可以针对目录。
举例:1
2
3
4
5
6
7
8# root 用户执行命令
mkdir /tmp/dtest
chmod 2777 /tmp/dtest
# 切换为普通用户
su - youcai
cd /tmp/dtest/
# 注意:在 /tmp/dtest 目录下新建文件的所属组是 root,即 dtest 目录的所属组,不再是当前用户的缺省组了
touch /tmp/dtest/ftest
注意:对目录设置 SetGID 实际操作意义不大,了解即可。
3、设定 SetGID1
2
32 代表 SetGID
方法一:chmod 2755 文件名
方法二:chmod g+s 文件名
4、取消 SetGID1
2方法一:chmod 755 文件名
方法二:chmod g-s 文件名
系统利用了 SetUID 和 SetGID 这些权限来完成一些必须给普通用户分配权限的工作。
Sticky BIT
1、Sticky BIT 粘着位作用
(1) 粘着位目前只对目录有效。
(2) 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限。
(3) 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
举例:
注意:/tmp/ 目录的其他人权限位中的「t」表示粘着位权限。
2、设置粘着位1
2方法一:chmod 1755 目录名
方法二:chmod o+t 目录名
3、取消粘着位1
2方法一:chmod 755 目录名
方法二:chmod o-t 目录名
注意:Stichy BIT 针对的是删除的限制,对读和修改没有限制。注意:特殊权限位虽然可以给 7,但是一般不这样做,因为操作的对象不同,有的是目录,有的是文件,所以不可能同时生效,所以这样做是没有意义的。注意:要定时检查系统中赋予 SetUID 和 SetGID 的权限的文件,如果有,要确认是否是多出来的,否则会造成非常大的隐患。
小结:SetUID 只能针对二进制文件,用 4 表示,权限为字母为 s。SetGID 既可以针对二进制文件,也可以针对目录,用 2 表示,权限为字母为 s。Stichy BIT 只能针对目录,用 1 表示,权限为字母为 t。
文件系统属性 chattr 权限
1、chattr 命令格式1
2
3
4
5
6
7
8
9
10简介:
change file attributes on a Linux file system(ch「change」 attr「attributes」)
格式:
# + 增加权限;- 删除权限;= 等于某权限
chattr [+-=] [选项] 文件或目录名
选项:
i 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
a 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除。
注意:i 属性赋予文件,表示该文件是只读的。chattr 针对 root 用户也生效。要想恢复,则先去掉 i 属性。这也是 chattr 的好处,保护数据内容,而且对 root 用户也有效。 其实 a 是 append 追加的意思。如果对文件设置了 a 属性,则不能使用 vim 的方式对文件修改,只能使用 echo [内容] >> [文件]的追加方式进行数据的写入。
2、查看文件系统属性1
2
3
4
5
6格式:
lsattr 选项 文件名
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
e 属性:代表这个文件是在 ext 文件系统中创建的,e 属性是 ext 文件系统默认的,而且也不能取消。
系统命令 sudo 权限
1、sudo 权限
root 把本来只能超级用户执行的命令赋予普通用户执行。
sudo 的操作对象是系统命令。
2、sudo 使用1
2
3# 通过编辑 /etc/sudoers 文件来给普通用户授权
# visudo 命令实际修改的是 /etc/sudoers 文件
visudo 等价于 vim /etc/sudoers
注意:上图中的授权格式中有三个 ALL,这三个 ALL 分别代表的是:
第一个 ALL:它定义的并不是允许哪一个 IP 地址或网络访问我这台本机,而是定义的是允许哪一个用户执行某一条命令在哪一台计算机上。即它定义的是执行命令的计算机的 IP 地址或网段。
第二个 ALL:表示我可以使用什么身份。可以不写,默认为 ALL,表示把用户当成什么身份来对待。
第三个 ALL:代表任意命令。
3、示例:授权 test 用户可以重启服务器1
2
3vim /etc/sudoers
# 添加如下内容,注意命令要写绝对路径,可以通过 whereis 查找命令绝对路径
test ALL = /sbin/shutdown -r now
4、示例:普通用户执行 sudo 赋予的命令1
2
3
4
5# 查看可用的 sudo 命令
sudo -l
# 普通用户执行 sudo 赋予的命令
sudo /sbin/shutdown -r now
注意:普通用户是可以使用 vim 的,但是普通用户自己用 vim 的时候是局限在自己的权限范围之内的。如果用 sudo 的方式把 root 用户的 vim 赋给普通用户,那么普通用户在执行 vim 命令的时候他的身份会自动切换成为 root,这是极其危险的。