[RHEL]-11-文件权限详解

引言

这篇文章将着重介绍Linux系统中常用的文件权限管理命令,包括:普通权限,特殊权限,隐藏权限,sudo权限,单文件访问控制权限等。

文章目录

0×1.普通权限与特殊权限

普通权限和特殊权限请参考本站下面这两篇文章,在其中有详细的说明:

[Linux实用命令]-4-文件权限详解
[Linux实用命令]-13-如何设置文件特殊权限

0×2.隐藏权限设置

除了上面的两种比较常见的权限外,Linux还提供了一组比较不容易被察觉的隐藏权限,有时候我们对某个文件或文件夹有完全控制权,但更新或删除文件时却报错了,这时候就要考虑是否文件被设置了隐藏权限,请看下面的几个小实例:

					#首先使用普通用户创建一个a.txt普通文件,文件的所有者对文件有可读写权限
					[qing@qingsword.com:~]$ touch a.txt
					[qing@qingsword.com:~]$ ls -l a.txt
					-rw-rw-r-- 1 qing qing 0 11月 20 11:22 a.txt

					#chattr需要root权限才能够使用,所以添加上sudo,稍后会介绍sudo命令(如果已经是使用root登录就不需要sudo命令了),给文件添加一个i隐藏权限,这个权限对文件设置表示,将无法对文件进行修改,如果对目录设置表示,无法在目录中创建和删除重命名文件,但能够对文件进行内容上的修改
					[qing@qingsword.com:~]$ sudo chattr +i a.txt

					#尝试删除文件
					[qing@qingsword.com:~]$ rm -rf a.txt 
					rm: 无法删除'a.txt': 不允许的操作

					#使用lsattr查看文件的隐藏权限,发现i属性(注意,如果查看的是一个目录,需要使用lsattr -d命令,否则只能查看到目录下文件的特殊权限,而不能查看目录本身)
					[qing@qingsword.com:~]$ lsattr a.txt
					----i--------e-- a.txt

					#使用-i来删除这个属性
					[qing@qingsword.com:~]$ sudo chattr -i a.txt
					[qing@qingsword.com:~]$ lsattr a.txt
					-------------e-- a.txt

					#然后就能够对文件进行修改或删除操作了
					[qing@qingsword.com:~]$ rm -rf a.txt

					#再来看一个a属性,代表只能追加文件内容,不能删除和修改原有内容
					[qing@qingsword.com:~]$ touch a.txt
					[qing@qingsword.com:~]$ sudo chattr +a a.txt

					#可以给文件追加内容
					[qing@qingsword.com:~]$ echo "www.qingsword.com" >> a.txt

					#但不能使用覆盖操作
					[qing@qingsword.com:~]$ echo "www.qingsword.com" > a.txt
					bash: a.txt: 不允许的操作

					#不允许删除操作
					[qing@qingsword.com:~]$ rm -rf a.txt
					rm: 无法删除'a.txt': 不允许的操作

					[qing@qingsword.com:~]$ lsattr a.txt
					-----a-------e-- a.txt

					#删除文件的a权限
					[qing@qingsword.com:~]$ sudo chattr -a a.txt

					#之后就能够覆盖和删除了
					[qing@qingsword.com:~]$ echo "www.qingsword.com" > a.txt
					[qing@qingsword.com:~]$ rm -rf a.txt
					

下面是chattr支持的参数列表,仅供参考:

i 将无法对文件进行修改,若对目录设置后则仅能修改子文件而不能新建或删除;
a 仅允许补充(追加)内容.无法覆盖/删除(Append Only);
S 文件内容变更后立即同步到硬盘(sync);
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域);
A 不再修改这个文件的最后访问时间(atime);
b 不再修改文件或目录的存取时间;
D 检查压缩文件中的错误;
d 当使用dump命令备份时忽略本文件/目录;
c 默认将文件或目录进行压缩;
u 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复;
t 让文件系统支持尾部合并(tail-merging);
X 可以直接访问压缩文件的内容;

0×3.sudo权限设置

一般情况下,建议不要使用root权限去管理系统,因为root拥有系统的完全控制权,一旦执行了错误的命令,很可能带来毁灭性的后果,更加推荐的方法是使用sudo命令来临时的提升普通用户的权限(默认5分钟),而sudo命令的权限又能根据/etc/sudoers文件的设定来细分普通用户能够使用哪些命令,这样的设计能够让系统更加的安全,请看下面的实例:

首先来看一下su命令的使用,它能够让我们在不同用户间切换:

					#su命令能够让我们在不同用户间自由切换,root用户切换普通用户时不需要输入密码,但普通用户切换root用户或其他普通用户时需要输入对应用户的密码,使用exit可以退出到前一位用户
					[root@qingsword.com:~]# su - qing
					[qing@qingsword.com:~]$ su - root
					Password: 
					Last login: Thu Nov  3 21:28:31 EDT 2016 on :0
					[root@qingsword.com:~]# exit
					logout
					[qing@qingsword.com:~]$ 
					

但每次都这样切换来切换去,十分的麻烦,有时我们可能只需要使用root权限去执行一条命令,这时候就能够使用到sudo命令来临时的获取root用户的权限,在RHEL系统中,普通用户并没有被添加到sudo文件中,普通用户要想使用sudo执行命令,先需要修改/etc/sudoers文件来添加用户权限,请看下面的实例:

					#首先切换到普通用户qing
					[root@qingsword.com:~]# su qing

					#不论使用reboot或sudo reboot,都无法重启系统,因为这个命令必须使用管理员权限才能执行
					[qing@qingsword.com:~]$ reboot
					User root is logged in on seat0.
					Please retry operation after closing inhibitors and logging out other users.
					Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
					[qing@qingsword.com:~]$ sudo reboot
					[sudo] password for qing: 
					qing is not in the sudoers file.  This incident will be reported.

					#重新退出到root权限下,修改/etc/sudoers文件
					[qing@qingsword.com:~]$ exit
					exit
					[root@qingsword.com:~]# vim /etc/sudoers

					#找到下面这一行,在root命令下方,添加一条新的规则,语法格式:
					# 允许使用sudo用户名 来源主机=(以谁的身份执行命令) 可执行命令的列表,用逗号分隔
					# 如果要使用root权限执行后面的命令就写ALL=(ALL) ,如果想让这个用户能够执行所有命令,可以在最后的执行命令列表填写ALL,本例让qing用户能够用root权限执行reboot和poweroff这两个命令(必须写命令的绝对路径)
					# 这个文件的编辑保存需要使用:wq!强制保存

					## Allow root to run any commands anywhere 
					root  ALL=(ALL)  ALL
					qing  ALL=(ALL)  /usr/sbin/reboot,/usr/sbin/poweroff

					#再次切换到qing用户,现在使用sudo reboot命令就能够重启计算机了,sudo命令需要验证当前用户的登录密码,每次验证默认5分钟内再次使用sudo命令,不需要输入密码
					[root@qingsword.com:~]# su qing
					[qing@qingsword.com:~]$ sudo reboot
					[sudo] password for qing: 

					#再比如,使用more命令查看/etc/shadow,文件的内容,这个内容只有root才有权查看,将more添加到qing用户的sudo列表后,就能够使用sudo查看了
					[qing@qingsword.com:~]$ more /etc/shadow
					/etc/shadow: Permission denied
					[qing@qingsword.com:~]$ su root
					Password: 
					[root@qingsword.com:~]# whereis more
					more: /usr/bin/more /usr/share/man/man1/more.1.gz /usr/share/man/man1p/more.1p.gz

					[root@qingsword.com:~]# vim /etc/sudoers
					## Allow root to run any commands anywhere 
					root  ALL=(ALL)  ALL
					qing  ALL=(ALL)  /usr/sbin/reboot,/usr/sbin/poweroff,/usr/bin/more

					[root@qingsword.com:~]# exit
					exit
					[qing@qingsword.com:~]$ sudo more /etc/shadow

					#如果想让普通用户每次使用sudo都不输入自己的密码验证,可以将配置文件改为
					qing  ALL=NOPASSWD:  /usr/sbin/reboot,/usr/sbin/poweroff,/usr/bin/more

					#然后再使用普通用户清空安全时间
					[qing@qingsword.com:~]$ sudo -k
					

0×4.setfacl设置

在上面的权限设置中,不论是普通权限,特殊权限,都是对某一类用户设置的(比如所属用户,所属组等),而如果要单独指定某个文件对某个人的权限,就可以使用到setfacl命令。

setfacl常用参数:

-R 递归(对目录使用);
-m 设置文件的acl规则;
-b 删除添加的acl规则

请看下面的实例:

					#首先切换到普通用户qing
					[root@qingsword.com:~]# su qing

					#普通用户是无法查看和进入root家目录的
					[qing@qingsword.com:~]$ ls /root
					ls: cannot open directory /root: Permission denied
					[qing@qingsword.com:~]$ cd /root
					bash: cd: /root: Permission denied

					#重新切换到root权限,给普通用户添加一个权限,允许读写root家目录
					[qing@qingsword.com:~]$ exit
					exit
					[root@qingsword.com:~]# setfacl -Rm u:qing:r-x /root

					#再次切换到qing,现在就可以进入root家目录了
					[root@qingsword.com:~]# su qing
					[qing@qingsword.com:~]$ cd /root
					[qing@qingsword root]$ exit
					exit

					#查看下/root目录的acl权限,返回结果中多出一条(user:qing:r-x)
					[root@qingsword.com:~]# getfacl /root
					getfacl: Removing leading '/' from absolute path names
					# file: root
					# owner: root
					# group: root
					user::r-x
					user:qing:r-x
					group::r-x
					mask::r-x
					other::---
	
					#同样的,如果想将某个组对/root目录的权限添加到列表里,只需要将u改成g
					[root@qingsword.com:~]# setfacl -Rm g:qing:r-x /root
					[root@qingsword.com:~]# getfacl /root
					getfacl: Removing leading '/' from absolute path names
					# file: root
					# owner: root
					# group: root
					user::r-x
					user:qing:r-x
					group::r-x
					group:qing:r-x
					mask::r-x
					other::---

					#或者添加other权限,让其它人也能够访问这个目录
					[root@qingsword.com:~]# setfacl -Rm o::r-x /root
					[root@qingsword.com:~]# getfacl /root
					getfacl: Removing leading '/' from absolute path names
					# file: root
					# owner: root
					# group: root
					user::r-x
					user:qing:r-x
					group::r-x
					group:qing:r-x
					mask::r-x
					other::r-x

					#删除/root目录添加的所有acl
					[root@qingsword.com:~]# setfacl -b /root
					[root@qingsword.com:~]# getfacl /root
					getfacl: Removing leading '/' from absolute path names
					# file: root
					# owner: root
					# group: root
					user::r-x
					group::r-x
					other::r-x