Linux文件权限及管理(二)

Linux特殊权限详解

上回我们说道,针对实际生产环境中,只有以上的基本权限是很难满足我们的需求的,所以一些特殊权限应运而生。

特殊权限

sticky-----------------------粘制位

百度百科定义:粘滞位(Stickybit),或粘着位,是Unix文件系统权限的一个旗标。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。

简而言之,就是说我的目录我说了算,其他人不可以随便删除或移动,这样做也是为了保障系统的稳定性。那么有人会有疑问,我这个目录里的文件权限对其他用户只读不就行了吗?来,我们来做个实验:

[root@foundation2 tmp]# mkdir hahaha
[root@foundation2 ~]$ ls -ld /tmp/hahaha/
drwxr-xr-x. 2 root root 32 4月   2 22:08 /tmp/hahaha/
[root@foundation2 ~]# chmod 777 /tmp/hahaha/
[root@foundation2 ~]# cd /tmp/hahaha/
[root@foundation2 hahaha]# touch test1;touch test2
[root@foundation2 hahaha]# ls -l
total 0
-rw-r--r--. 1 root root 0 Apr  3 11:26 test1
-rw-r--r--. 1 root root 0 Apr  3 11:26 test2
可以看到这两个文件对其他用户都是只读权限,那么用其他用户可以删除这俩文件吗?
[kiosk@foundation2 hahaha]$ ls
test1  test2
[kiosk@foundation2 hahaha]$ rm -rf test*
[kiosk@foundation2 hahaha]$ ls
[kiosk@foundation2 hahaha]$ 
结果发现删除成功,所以风险非常大。

为了保障文件系统的稳定性,这个sticky的作用也是非常有用。那么怎么用呢?
用法: chmod o+t 就可以给其他用户设置粘制位。
看看具体示例:

[root@foundation2 ~]# chmod o+t /tmp/hahaha/
[root@foundation2 ~]# ls -ld /tmp/hahaha/
drwxrwxrwt. 2 root root 6 Apr  3 11:28 /tmp/hahaha/

我们发现/tmp/hahaha 目录的权限的other用户权限变成了rwt,也就是变成了我们所说的粘制位。那我们继续上面的操作,看看还能不能重现:

先建立两个文件
[root@foundation2 hahaha]# touch test1;touch test2
他们对其他用户也是只读权限
[[root@foundation2 hahaha]# ls -lR /tmp/hahaha/
/tmp/hahaha/:
total 0
-rw-r--r--. 1 root root 0 Apr  3 11:47 test1
-rw-r--r--. 1 root root 0 Apr  3 11:47 test2
那么我们切换到普通用户
[root@foundation2 hahaha]# logout
[kiosk@foundation2 hahaha]$ ls
test1  test2
[kiosk@foundation2 hahaha]$ rm -fr test*
rm: cannot remove ‘test1’: Operation not permitted
rm: cannot remove ‘test2’: Operation not permitted
发现无法删除,提示“操作不允许”,这样是不是目的达到了~

这个粘制位的定义是针对于目录的,那么我们试试对于文件是否生效?
做个实验:

[root@foundation2 hahaha]# touch file
[root@foundation2 hahaha]# ls -l file 
-rw-r--r--. 1 root root 0 Apr  3 22:46 file

这里数字1777就代表更改其其他用户位为粘滞位,最前面这一位1代表的是特殊权限位:

[root@foundation2 hahaha]# chmod 1777 file 
[root@foundation2 hahaha]# ls -l file 
-rwxrwxrwt. 1 root root 0 Apr  3 22:46 file
[root@foundation2 hahaha]# logout
[kiosk@foundation2 hahaha]$ ls
file  test1  test2
[kiosk@foundation2 hahaha]$ rm -rf file 
[kiosk@foundation2 hahaha]$ ls
test1  test2

发现并没有什么卵用,对于文件来说,所以粘滞位,是针对目录来说的。

我们不难发现,rwt是建立在rwx之上的,那么假如原本目录没有x权限呢?或者说在rwt基础上减去x权限呢?会发生什么?还能保持之前的作用吗?我们来做个实验!

[root@foundation2 ~]# ls -dl /tmp/hahaha/
drwxrwxrwt. 2 root root 32 Apr  3 22:48 /tmp/hahaha/
[root@foundation2 ~]# chmod o-x /tmp/hahaha/
[root@foundation2 ~]# ls -dl /tmp/hahaha/
drwxrwxrwT. 2 root root 32 Apr  3 22:48 /tmp/hahaha/
[root@foundation2 ~]# ls -l /tmp/hahaha/
total 0
-rw-r--r--. 1 root root 0 Apr  3 11:47 test1
-rw-r--r--. 1 root root 0 Apr  3 11:47 test2

我们发现已经/tmp/hahaha变成了rwT权限,那么再试一下刚刚的操作

[root@foundation2 ~]# logout
[kiosk@foundation2 tmp]$ cd hahaha/
bash: cd: hahaha/: Permission denied

发现已经都进不去了。

强制位 sgid

定义:可以让某些指令产生的东西属于某些组。

chmod g+s 目录/文件
或者chmod 2xxx 目录/文件

作用

	对文件————只针对与二进制可执行文件,当某个文件有sgid的时候,执行此文件产生
的进程属于文件所属的组;
	对目录————当目录有sgid的时候,在该目录中创建的文件都属于目录的所有组。

什么是二进制可执行文件?
通俗理解,就是linux中可以直接执行的命令文件,比如/bin目录下的一些文件,如:ls、mv、cat等

相关实验如下:

[root@foundation2 bin]# ls -l watch
-rwxr-xr-x. 1 root root 24720 Jul 26  2016 watch
[root@foundation2 bin]# chmod g+s watch
[root@foundation2 bin]# ls -l watch
-rwxr-sr-x. 1 root root 24720 Jul 26  2016 watch 
——————————————————————————————————
这里发现已经给二进制可执行文件watch修改成功强制位,接下来切换回普通用户,
看普通用户使用watch命令时产生的进程状况
——————————————————————————————————
[root@foundation2 bin]# logout
[kiosk@foundation2 tmp]$ watch -n 1 date
——————————————————————————————————
此时打开另一个终端,查看进程状态:
——————————————————————————————————
[kiosk@foundation2 ~]$ ps -a -o user,group,comm
USER     GROUP    COMMAND
kiosk    root     watch
kiosk    kiosk    ps
——————————————————————————————————
这里发现watch的所属组已经变成了root,作为对比,我们看看之间修改sgid之前,
在普通用户里开启watch
——————————————————————————————————
[kiosk@foundation2 ~]$ ps -a -o user,group,comm
USER     GROUP    COMMAND
kiosk    kiosk    watch
kiosk    kiosk    ps

这个是文件的实验,我们看看目录加了sgid会发生什么?

[root@foundation2 home]# chmod g+s westos/
[root@foundation2 home]# ls -ld westos/
drwxrwsrwx. 2 root root 6 Apr  4 09:38 westos/
——————————————————————————————————
发现westos这个目录已经加了sgid,那么我们切换会普通用户,在该目录下创建文件
——————————————————————————————————
[root@foundation2 home]# logout
[kiosk@foundation2 /]$ cd /home/westos/
[kiosk@foundation2 westos]$ touch test
[kiosk@foundation2 westos]$ ls -l test 
-rw-rw-r--. 1 kiosk root 0 4月   4 09:39 test
——————————————————————————————————
可以发现,创建的文件test的所属组为root,说明,当目录有sgid的时候,在该目录中创建
的文件都属于目录的所有组。
冒险位 suid

定义:跟sgid强制位类似的,这个只是针对与二进制可执行文件,当其执行时,产生的进程的属于这个文件的所有者。

chmod u+s file
或chmod 4xxx file

直接看实验吧:

[root@foundation2 ~]# ls /bin/watch -l
-rwxr-xr-x. 1 root root 24720 Jul 26  2016 /bin/watch
——————————————————————————————————
修改其suid
——————————————————————————————————
[root@foundation2 ~]# chmod 4755 /bin/watch
[root@foundation2 ~]# ls /bin/watch -l
-rwsr-xr-x. 1 root root 24720 Jul 26  2016 /bin/watch
[root@foundation2 ~]# logout
[kiosk@foundation2 westos]$ watch date
——————————————————————————————————
查看进程
——————————————————————————————————
[kiosk@foundation2 ~]$ ps -a -o user,group,comm
USER     GROUP    COMMAND
root     kiosk    watch
kiosk    kiosk    ps
——————————————————————————————————
发现,watch所有者是root,那么我们试一下该watch的所有者为一个普通用户,
看看情况怎么样?
——————————————————————————————————
[root@foundation2 ~]# chown tom /bin/watch
[root@foundation2 ~]# ls -l /bin/watch
-rwxr-xr-x. 1 tom root 24720 Jul 26  2016 /bin/watch
[root@foundation2 ~]# chmod 4755 /bin/watch
[root@foundation2 ~]# ls -l /bin/watch
-rwsr-xr-x. 1 tom root 24720 Jul 26  2016 /bin/watch
[root@foundation2 ~]# logout
[kiosk@foundation2 westos]$ watch date
——————————————————————————————————
查看进程
——————————————————————————————————
[kiosk@foundation2 ~]$ ps -a -o user,group,comm
USER     GROUP    COMMAND
tom      kiosk    watch
kiosk    kiosk    ps

果然,普通用户也可以,所以说,当二进制可执行文件有suid时,当其执行时,产生的进程的属于这个文件的所有者。

acl权限列表

定义:access control list

我们上面学习了特殊权限,那么问题来了,在工作中harry作为技术部成员可能要用到生产部的一个文件,怎么办?我们用之前的方法看看能不能解决?

1.直接chown 这个文件给harry,虽然可以使用了,但是以后生产的小伙伴用不了了,不行!
2.把harry加到生产部这个组,usermod -G shengchan harry,这样的话我可能看到不该看
	的文件阿!
3.修改文件other权限?不行阿,只能harry一个人看到。
4.考虑一下刚刚学的特殊权限,能不能当这个文件是二进制可执行文件时,对其chmod
	 u+s,harry执行的时候以生产部某个成员的身份运行,或这chmod g+s,执行的时候,
	 也是以生产部组的权限,但是并没有那么多二进制可执行文件阿,如果时普通文件呢?

所以,我们假如只想某个生存部的文件只让harry有一定权限呢?这个时候,就可以用ACL来精确实现文件权限的灵活管理。

作用:让特定的用户对特定文件有特定的权限

直接边看实验边理解吧:

如果一个文件的权限有acl,他的权限列表怎么表示呢?
——————————————————————————————————
[root@foundation2 ~]# ls -l /home/westos/test 
-rwxrwxr-x+ 1 kiosk root 0 Apr  4 09:39 /home/westos/test
——————————————————————————————————
这个权限列表最后的+表示acl开启,那么怎么查看list呢?
——————————————————————————————————
[root@foundation2 ~]# getfacl /home/westos/test
——————————————————————————————————
使用getfacl file就查看了,他的查看结果如下:
——————————————————————————————————
# file: home/westos/test			这个是文件名
# owner: kiosk							这个是文件所有者
# group: root							文件所属组
user::rwx									所有者的权限
user:tom:rwx								制定的用户拥有的权限
group::r-x									所有组的权限
mask::rwx									可以赋予用户的最大权限值
other::r-x									其他用户的权限
——————————————————————————————————
注意getfacl的几个参数:
——————————————————————————————————
-a , --access:显示文件或目录的访问控制列表
-d , --default:显示文件或目录的默认(缺省)的访问控制列表
-c , --omit-header:不显示默认的访问控制列表
-R , --recursive:操作递归到子目录
——————————————————————————————————
怎么设置acl呢?使用setfacl,其参数列表如下:
——————————————————————————————————
setfacl -m u:user:rwx file					使user对file文件有rwx权限
setfacl -m g:group:rwx file				使group对file文件有rwx权限
setfacl -x u:user file							使user对file文件失去之前的权限
setfacl -x g:group file						使group对file文件失去之前的权限
setfacl -b  file									关闭file文件的权限列表
——————————————————————————————————
相关实验:
——————————————————————————————————
设定特定用户和组:
[root@foundation2 ~]# setfacl -m g:tom:rwx /home/westos/test 
[root@foundation2 ~]# getfacl /home/westos/test 
getfacl: Removing leading '/' from absolute path names
# file: home/westos/test
# owner: kiosk
# group: root
user::rwx
user:tom:rwx
group::r-x
group:tom:rwx
mask::rwx
other::r-x
删除指定的用户权限:
[root@foundation2 ~]# setfacl -x u:tom /home/westos/test 
[root@foundation2 ~]# getfacl /home/westos/test 
getfacl: Removing leading '/' from absolute path names
# file: home/westos/test
# owner: kiosk
# group: root
user::rwx
group::r-x
group:tom:rwx
mask::rwx
other::r-x
关闭文件acl权限列表:
[root@foundation2 ~]# setfacl -b /home/westos/test 
[root@foundation2 ~]# getfacl /home/westos/test 
getfacl: Removing leading '/' from absolute path names
# file: home/westos/test
# owner: kiosk
# group: root
user::rwx
group::r-x
other::r-x

[root@foundation2 ~]# ls -l /home/westos/test 
-rwxr-xr-x. 1 kiosk root 0 Apr  4 09:39 /home/westos/test
注意:默认权限只针对于目录:
d:				表示设置文件默认权限列表(第归继承)————只针对新出现的文件生效
				如果已经有老文件了,不会生效,会沿用以前的权限
-k				取消默认设定

做个实验:

可以先监控一下文件和目录之前的权限列表:
——————————————————————————————————
[root@foundation2 westos]#  watch -n 1 " getfacl /home/westos/;getfacl /home/westos/mac/;
	ls -l /home/westos/"

检测其权限列表

[root@foundation2 ~]# setfacl -m d:u:kiosk:7 /home/westos/
表示设置文件默认权限列表(第归继承)

在这里插入图片描述
发现acl中目录/home/westos出现了默认权限列表,但是已经存在的目录mac权限列表没有变化!

我们在目录/home/westos里新建一个目录,看看其权限列表:
[root@foundation2 westos]# mkdir running
[root@foundation2 westos]# getfacl running/
# file: running/
# owner: root
# group: root
# flags: -s-
user::rwx
user:kiosk:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:kiosk:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

可以发现新建的目录running其权限列表就是westos目录的默认列表!

那么如何取消呢?使用 -k 这个参数

[root@foundation2 westos]# setfacl -k /home/westos/

在这里插入图片描述
发现已经取消默认。

但是发现子目录running没有取消:
————————————————————————————————
[root@foundation2 westos]# getfacl running/
# file: running/
# owner: root
# group: root
# flags: -s-
user::rwx
user:kiosk:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:kiosk:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
—————————————————————————————————
我们使用第归参数-R
—————————————————————————————————
[root@foundation2 westos]# setfacl -kR /home/westos/
[root@foundation2 westos]# getfacl running/
# file: running/
# owner: root
# group: root
# flags: -s-
user::rwx
user:kiosk:rwx
group::r-x
mask::rwx
other::r-x
—————————————————————————————————
成功取消默认!

那么今天的总结先到这吧!下次继续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值