Linux 文件特殊权限和ACL权限设置

本文详细介绍了Linux中的文件特殊权限suid、sgid和sticky,以及ACL(Access Control List)权限设置。suid允许执行程序时以文件属主身份运行,sgid使进程属组变为文件属组,sticky权限防止普通用户删除他人文件。此外,还展示了如何使用ACL为特定用户和组设置更精细的访问控制,并举例说明了其用法和影响。
摘要由CSDN通过智能技术生成

Linux 文件特殊权限和ACL权限设置

在linux中,除了可以对属主,属组,其他人设置权限,我们也可以通过文件特殊权限针对某一个用户,某一个组单独设置访问权限,也可以设置一些特殊的访问权限。

安全上下文

当我们使用cat命令查看一个文件时,例如/bin/cat /etc/fstab,具体执行过程如下:

  1. 查看用户是否有/bin/cat的执行权限
  2. 查看用户是否有/etc/fstab的读权限
  3. 如果有则执行该条命令

文件特殊权限

特殊权限分为三种,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  
不能删除,但可以修改  

总结

  1. 我们可以使用chmod u+s,g+s,o+t 文件 来修改文件特殊权限
  2. 我们也可以使用权限数字来修改,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 文件 取消组的访问控制权限

用户访问文件的过程如下:

  1. 用户是否为文件属主
  2. 用户是否有特定的访问控制条目
  3. 用户是否属于文件属组
  4. 用户所属的组是否有特定的访问控制条目
  5. 其他

注意:除了根目录,其他被挂载的模块默认不支持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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值