Linux 文件特殊权限和ACL权限设置
在linux中,除了可以对属主,属组,其他人设置权限,我们也可以通过文件特殊权限针对某一个用户,某一个组单独设置访问权限,也可以设置一些特殊的访问权限。
安全上下文
当我们使用cat命令查看一个文件时,例如/bin/cat /etc/fstab
,具体执行过程如下:
- 查看用户是否有
/bin/cat
的执行权限 - 查看用户是否有
/etc/fstab
的读权限 - 如果有则执行该条命令
文件特殊权限
特殊权限分为三种,suid,sgid,sticky
suid: 任何其他用户执行程序时,进程不是以执行者身份进行,而是以文件的属主身份。
sgid:任何其他用户执行程序时,进程的属组不是以执行者的属组,而是以文件的属组身份。
sticky:设置该属性的文件夹中,文件只能由文件的属主删除,用户可以删除属于自己创建的文件,只能修改其他人的文件,不能删除其他人创建的文件。
注意: sgid suid sticky 权限只能自己设置,不能使用umask默认设置
suid
set uid,任何其他用户执行此程序时,进程不是以执行者身份进行,而是以文件的属主身份。
修改权限
chmod u+s 文件
chmod u-s 文件
chmod 4644 文件
suid是针对属主设置的权限,原有属主执行权限s,无执行权限S
示例:
[root@node1 tmp]# cp /bin/cat /tmp/mycat
创建一个文件,移除other的读权限
[root@node1 tmp]# echo "Hello world" > Hello.txt
[root@node1 tmp]# chmod o-r Hello.txt
[root@node1 tmp]# ls -al Hello.txt
-rw-r----x 1 root root 12 7月 31 12:00 Hello.txt
因为hadoop属于other,没有Hello.txt的读权限,故无法读取该文件
[root@node1 tmp]# su hadoop
[hadoop@node1 tmp]$ /tmp/mycat Hello.txt
/tmp/mycat: Hello.txt: 权限不够
设置suid权限,让其他人都能以root的身份运行/tmp/mycat
[hadoop@node1 tmp]$ exit
exit
[root@node1 tmp]# chmod u+s /tmp/mycat
[root@node1 tmp]# ls -al /tmp/mycat
-rwsr-xr-x 1 root root 54080 7月 31 11:47 /tmp/mycat
mycat的属主执行权限变为s
再次切换为hadoop,发现可以查看该文件
[root@node1 tmp]# su hadoop
[hadoop@node1 tmp]$ /tmp/mycat Hello.txt
Hello world
因为设置该权限后,所有人执行/tmp/mycat都会以root的身份执行,读取文件时,以root的权限读取Hello.txt,root是Hello.txt属主,故可以读取文件
sgid
set gid 意味着任何其他用户在执行此程序时,进程的属组不再是运行着本人属组,而是文件的属组
修改权限
chmod g+s 文件
chmod g-s 文件
chmod 2644 文件
原有属组执行权限s,无执行权限S
作用:可以在某个文件夹下创建的属组为目录的属组,而不是创建者属组
将目录设置为sgid,所有有权限的用户创建的文件,属组都是目录的属组
示例:
使用hadoop用户创建一个文件夹,并给他设置sgid
[hadoop@node1 tmp]$ mkdir mytest
[hadoop@node1 tmp]$ chmod g+s mytest/
[hadoop@node1 tmp]$ ls -ld mytest/
drwxrwsr-x 2 hadoop hadoop 6 7月 31 13:56 mytest/
切换到root用户,在mytest目录下创建一个文件夹
[hadoop@node1 tmp]$ exit
exit
[root@node1 tmp]# cd mytest/
[root@node1 mytest]# touch rootFile
[root@node1 mytest]# ls -al /tmp/mytest/
总用量 4
drwxrwsr-x 2 hadoop hadoop 22 7月 31 13:57 .
drwxrwxrwt. 22 root root 4096 7月 31 13:58 ..
-rw-r--r-- 1 root hadoop 0 7月 31 13:57 rootFile
发现root用户在该文件夹下创建的文件,属组为hadoop
在该文件夹下,用户可以修改、删除自己的文件夹,也可以对其他属主用户的文件夹进行修改、删除。
sticky
sticky 粘贴位,附件other权限上,表现为t(t:other有x权限;T: other无x权限)
修改权限
chmod o+t 文件
chmod o-t 文件
chmod 1644 文件
在设置该权限的文件夹下,每个用户只能删除属于自己创建的文件。
示例:
使用root用户创建一个mygrp组,并将其加入hadoop额外组中,将hive也加入这个组
[root@node1 mytest]# groupadd mygrp
[root@node1 mytest]# usermod -G mygrp hadoop
[root@node1 mytest]# id hadoop
uid=4024(hadoop) gid=4024(hadoop) 组=4024(hadoop),4026(mygrp)
[root@node1 ~]# usermod -G mygrp hive
创建mytest2,将属组设置为mygrp,并给sgid,t权限
[root@node1 ~]# su hadoop
[hadoop@node1 tmp]$ mkdir /tmp/mytest2
[hadoop@node1 tmp]$ chgrp mygrp /tmp/mytest2
[hadoop@node1 root]$ chmod g+s,o+t /tmp/mytest2
[hadoop@node1 root]$ ls -ld /tmp/mytest2
drwxrwsr-t 2 hadoop mygrp 62 7月 31 14:21 /tmp/mytest21111
使用hadoop用户创建两个文件hadoop1和hadoop2
[hadoop@node1 mytest2]$ touch hadoop1 hadoop2
[hadoop@node1 mytest2]$ ls -al
总用量 4
drwxrwsr-t 2 hadoop mygrp 36 7月 31 14:30 .
drwxrwxrwt. 23 root root 4096 7月 31 14:29 ..
-rw-rw-r-- 1 hadoop mygrp 0 7月 31 14:30 hadoop1
-rw-rw-r-- 1 hadoop mygrp 0 7月 31 14:30 hadoop2
发现属组均为mygrp
切换到hive用户尝试创建文件
[root@node1 ~]# su hive
[hive@node1 root]$ cd /tmp/mytest2
[hive@node1 mytest2]$ touch hive1 hive2
[hive@node1 mytest2]$ ls -al
总用量 4
drwxrwsr-t 2 hadoop mygrp 62 7月 31 14:31 .
drwxrwxrwt. 23 root root 4096 7月 31 14:31 ..
-rw-rw-r-- 1 hadoop mygrp 0 7月 31 14:30 hadoop1
-rw-rw-r-- 1 hadoop mygrp 0 7月 31 14:30 hadoop2
-rw-rw-r-- 1 hive mygrp 0 7月 31 14:31 hive1
-rw-rw-r-- 1 hive mygrp 0 7月 31 14:31 hive2
使用hive删除hadoop1
[hive@node1 mytest2]$ rm hadoop1
rm: 无法删除"hadoop1": 不允许的操作
[hive@node1 mytest2]$ echo "Hello" > hadoop1
[hive@node1 mytest2]$ cat hadoop1
Hello
不能删除,但可以修改
总结
- 我们可以使用chmod u+s,g+s,o+t 文件 来修改文件特殊权限
- 我们也可以使用权限数字来修改,4代表suid,2代表sgid,1代表sticky
chmod 4644 文件; chmod 2644 文件; chmod 1644 文件;
ACL
在原有的访问控制机制之外的一种文件访问控制机制
getfacl test.txt 获取文件或目录的访问控制列表
setfacl -m u:username:mode 文件 设定访问控制列表
setfacl -m g:groupname:mode 文件 设定组权限
setfacl -x u:username 文件 取消用户的访问控制权限
setfacl -x g:groupname 文件 取消组的访问控制权限
用户访问文件的过程如下:
- 用户是否为文件属主
- 用户是否有特定的访问控制条目
- 用户是否属于文件属组
- 用户所属的组是否有特定的访问控制条目
- 其他
注意:除了根目录,其他被挂载的模块默认不支持ACL
必须重新挂载,使用mount -o acl DEVICE MOUNT_POINT
示例:
查看文件的ACL权限
[hive@node1 tmp]$ getfacl mytest2
# file: mytest2
# owner: hadoop
# group: mygrp
# flags: -st
user::rwx
group::rwx
other::r-x
使用root用户设置hive用户对这个文件夹没有任何权限
[hive@node1 tmp]$ exit
exit
[root@node1 ~]# setfacl -m u:hive:--- /tmp/mytest2
[root@node1 ~]# getfacl /tmp/mytest2
getfacl: Removing leading '/' from absolute path names
# file: tmp/mytest2
# owner: hadoop
# group: mygrp
# flags: -st
user::rwx
user:hive:---
group::rwx
mask::rwx
other::r-x
切换到hive用户,查看有没有权限
[root@node1 ~]# su hive
[hive@node1 root]$ ls -ld /tmp/mytest2
drwxrwsr-t+ 2 hadoop mygrp 62 7月 31 14:31 /tmp/mytest2
[hive@node1 root]$ cd /tmp/mytest2
bash: cd: /tmp/mytest2: 权限不够
发现cd都无法使用
设置ACL分区
当分区不支持ACL时,我们需要重新挂载分区
方法一: mount -o acl DEVICE MOUNT_POINT
例如:下面重新挂载mydata分区
umount /mydata
mount -o acl /dev/sda3 /mydate
mount
同时,我们也可以开机默认挂载这个分区
vim /etc/fstab
[root@node1 ~]# vim /tmp/fstab
#
# /etc/fstab
# Created by anaconda on Tue Dec 17 13:24:37 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=8699212e-cfd4-4f43-ab30-12c8864d4d5d /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/sda3 /mydata ext4 defaults,acl 0 0
方法二:设定分区默认挂载选项
tune2fs -o acl /dev/sda3
tune2fs -l /dev/sda3
取消分区默认挂载选项
tune2fs -o ^acl /dev/sda3