Linux 文件权限
1、普通权限
Linux的思想是一切皆文件,所以为了保护文件的权限和隐私安全,通过给每个文件设置三组权限,既所有者权限、组权限和其他用户权限来控制不同的用户对文件的操作限制。
-
文件所有者:默认文件所有者指的是创建该文件的用户的UID或进程的UID,这个UID会被写入文件的元数据中作为文件的所有者属性。
-
文件所属组:默认文件所有者所在的主组就是文件所有组(排除sgid情况)
-
其他用户:不属于文件所有者和不在文件所属组里面的用户
例如:
当tom用户执行touch命令创建一个文件A的时候,因为touch的本质就是一个用户空间的应用程序,当在终端中输入touch命令并按下回车键时。系统会为该命令创建一个新进程,并将该进程的有效用户ID设置为tom的UID,然后,该进程创建文件A时,文件A的所有者就会被设置为该进程的有效用户ID,也就是tom的UID。因此,文件A的所有者就是tom用户。
Linux中文件的基本权限分为三类: 读取权限、写入权限和执行权限。
对于普通文件来说:
-
读取权限 (r):这意味着用户可以查看文件的内容。
-
写入权限 (w):这意味着用户可以修改或删除文件。
-
执行权限 (x):这意味着用户可以执行文件(如果它是一个可执行文件或脚本)
对于目录文件来说:
-
读取权限 (r):允许列出目录的内容。
-
写入权限 (w):允许在目录中创建、删除或重命名文件。
-
执行权限 (x):允许进入目录并访问其内容。
所以由此我们可以知道,目录的最小权限是执行权限,既对于一个目录来说,必须要保证有执行权限,因为目录是一种特殊的文件类型,用于存储其他文件和目录。对于一个目录来说,必须拥有执行权限才能进入这个目录。不然连目录都没法进入。
例如:执行 cp /etc/issue /data/dir/ 所需要的最小权限?
/bin/cp 需要x权限
/etc/ 需要x权限
/etc/issue 需要r权限
/data 需要x权限
/data/dir 需要w,x权限
Linux中权限的表示方法:
Linux中文件权限的表示方法有两种,一种是字符表示法,例如rwx:表示拥有读写执行权限。还有种就是数字表示法,数字表示法是使用一个八进制数字来表示的,一个八进制数字由三个二进制数字组成,每个二进制数字用来表示一个权限。例如二进制数字111:最右边的1表示有读权限,中间的1表示有写权限,右边的1表示有执行权限,转换为二进制就是数字7(4+2+1)
-
r(读) = 4 = 100(二进制)
-
w(写)= 2 = 010(二进制)
-
x(执行)= 1 = 001(二进制)
查看文件权限:
一般使用ls -l命令来查看一个普通文件的文件权限,使用ls -ld来查看一个目录文件的文件权限。
2、文件的默认权限
文件的默认权限是指创建这个文件的时候,文件自带的权限属性。文件的默认权限是通过 umask 这个命令的值来控制,更改umask的值可以控制文件的默认权限,但是更改umask的值是临时生效的,可以将其写入shell配置文件实现持久生效。
umask的值是一个八进制数字,所以以0作为开头,对于普通用户和root用户来说,umask的值是不同的。
-
root用户:umask 默认值通常是 022
-
普通用户: umask 默认值通常是 002
通过umask控制文件默认权限的原理:
-
普通文件:666 - umask,如果值为奇数就 + 1
-
目录文件:777 - umask
说明:
-
使用666的原因是,如果使用777,umask设置成000,那么新建的文件就会有执行权限,默认带执行权限的文件很危险
-
为什么普通文件计算出来的值是奇数要加1,因为奇数就以为着带有可执行权限,这样是很不安全的,通过+1将可执行权限去掉,保证系统的安全。
-
计算目录文件要使用777的原因是保证目录文件具备最小权限:可执行权限
-
删除一个文件的时候不是看这个文件自身的权限,而是看这个文件所在目录的权限,如果执行删除操作的用户对这个目录有些权限,就可以删除它目录中的文件
root用户umask值和普通用户umask值不同的原因:
-
对于普通用户来说:只需要考虑对自己的文件和目录具有读、写、执行的权限,默认即拒绝组和其他用户的写权限。所以默认的umask是002。所以普通用户创建的文件和目录的默认权限是 664 和 775
-
对于root用户来说:因为root用户具有系统管理的特权,需要确保文件和目录对所有用户都是可读的,但只有所有者才能修改或删除它们。所以默认的umask是022,所以root 用户创建的文件和目录的默认权限是 644 和 755
修改文件权限
修改文件权限一般使用chmod这个命令来实现,这个命令有两种使用方法,一个是字符法,另外一个是数字法。
通过chmod 的 -R 参数同时更改目录文件以及目录文件下的所有文件的权限。
- 字符法:用一个字符来表示某个权限,通过+、-、=符号来确认是增加权限还是去除权限。
例如:
# 给文件所有者增加可执行权限
chmod u+x file_name
# 给所有用户(所有者、所属组、其它用户)增加可执行权限
chmod a+x file_name
# 去除其它用户的r权限
chmod o-r file_name
# 给文件所有者重新赋予权限
chmod a=rxw file_name
- 数字法:由三个八进制数字组成,每个数字代表一个权限组,从左到右依次是文件所有者权限、文件所属组权限和其他用户权限。
# 表示给所有者、所属组和其他用户都授予读写执行权限
chmod 777 file_name
修改文件属主、组
一般可以通过chown命令来修改属主和属组,也可以通过chgrp命令来修改属组
# 修改所有者
chown user_name file_name
# 修改所属组
chown :group_name file_name 或 chown .group file_name
# 同时修改所有者和所属组
chown ower:group file_name 或 chown ower.group file_name
# 更改一个目录文件以及目录文件中所有文件的属性:
添加 -R 参数进行递归修改
# chgrp只能用来修改文件所属组
chgrp group_name file_name
3、特殊权限
文件的特殊权限分为三种,SUID、SGID和Sticky Bit
-
SUID:用于允许一个普通用户以该文件所有者的权限来执行该文件
-
SGID:让用户在运行某些程序时暂时获得程序所属组的权限。
-
Sticky Bit:该目录下的文件只能由文件的所有者、目录的所有者以及超级用户删除或移动,其他用户无法删除或移动该目录下的文件。
(1)SUID权限详解:
例如普通用户使用 passwd 命令修改自己的密码时,需要访问 /etc/shadow 文件,但是该文件只有 root 用户才有权限访问。
为了允许普通用户修改自己的密码,passwd 程序需要拥有 SUID 权限,这样普通用户在运行 passwd 程序时,就会暂时获得 root 用户的权限,可以访问 /etc/shadow 文件并修改自己的密码。
SUID权限特点:
设置了 suid 权限,则在文件所有者的可执行权限的位置上会显示一个 s 字符
设置方法:
# 方法一:字符法:u+s
chmod u+s filename
# 方法二:先写出传统权限 然后再加4
# 比如: 传统权限是755 加suid权限后: 4755 ---> rwsr-xr-x
chomod 4755 filename
(2)SGID权限详解:
例如需要多个用户共享一个目录并保持目录下文件的访问权限时非常有用。
特点:
设置了 sgid 权限,则在文件所属组的可执行权限的位置上会显示一个 s 字符。
设置方法:
# 方法一:字符法:g+s
chmod g+s filename
# 方法二:数字法: 2
# 比如:传统权限是755 加sgid权限后: 2755 ---> rwsr-xr-x
chmod 2775 filename
(3)Sticky Bit权限详解:
例如linux系统的/tmp这个临时文件目录就设置了stick bit权限,只允许文件所有者删除这个文件。
特点:
设置了 sticky bit 权限,则在其他用户的可执行权限的位置上会显示一个 t 字符.
设置方法:
# 方法一:字符法:o+t
chmod o+t filename
#方法二:数字法 1
例如:原来的权限是744,设置了Sticky Bit权限后是 1744
chmod 1744 filename
4、特殊属性
除了文件的普通权限和特殊权限以外,还有一个是文件特殊属性,因为文件的普通权限没法管控root用户,二文件特殊权限只是提供了一些独特的行为,也没法管控root用户,所以就需要设置特殊属性来限制root用户。
在Linux中,可以通过chattr这个工具来设置文件的特殊属性,也可以通过lsattr工具来查看文件的特殊属性。
# 格式
chattr [选项] [+/-][属性] 文件名
# 选项:
-R:递归处理目录下的所有文件和子目录
-v:显示文件的属性设置过程
# + -
+:表示添加这个属性
-:表示取消这个属性
# 属性
a:
# 普通文件:表示只允许追加到文件中,不允许其它修改、删除、移动等操作;
# 目录文件:表示只能在目录中建立和修改文件,但是不允许删除文件
i:
# 普通文件:设置文件为不可修改,不可删除;
# 目录文件: 只能修改目录下文件中的数据,但不允许建立和删除文件
u:文件删除后,数据内容还保存在磁盘中,可以使用恢复工具进行恢复,常用来防止意外删除文件或目录。
例如:
# 设置文件为只读模式
ehigh@ubuntu:~/test$ sudo chattr +i a.txt
ehigh@ubuntu:~/test$ sudo rm -rf a.txt
rm: cannot remove 'a.txt': Operation not permitted
# 防止文件被删除或改变
ehigh@ubuntu:~$ sudo chattr +a a.txt
ehigh@ubuntu:~$ echo 1234 >> a.txt
ehigh@ubuntu:~$ echo 1234 > a.txt
-bash: a.txt: Operation not permitted
例如:查看文件的特殊属性
root@ubuntu1804:~# lsattr test
----i---------e--- test
5、FACL
ACL(Access Control List)叫作访问控制列表,Linux中有一个叫作FACL,既文件访问控制列表。是用来给单个用户做权限管理的。
例如:一个文件的权限是644,有一个用户叫做tom,即不是文件所有者,也不在文件所属组里面,所以tom对这个文件就只有读权限,如果想单独给tom加一个写权限,就可以使用ACL方式来实现;
设置FACL权限可以通过setfacl工具实现,通过getfacl可以查看一个文件是否设置了acl,以及acl的详细信息。
setfacl使用说明:
# 设置ACL
# 格式
setfacl -m u:username:rwx filename
# 设置tom用户对A文件有读写执行的权限
root@ubuntu1804:~# setfacl -m u:tom:rwx A
# 删除ACL
# 删除某个文件所有的acl设置
setfacl -b filename
# 删除ACL中的一个特定条目
setfacl -x u:username filename
# 修改ACL
# 格式
setfacl -m u:username:rx filename
# 修改tom对A文件的权限为读和执行
root@ubuntu1804:~# setfacl -m tom:r-x A
getfacl使用说明:
# 格式
getfacl filename
# 查看A文件的acl信息
root@ubuntu1804:~# getfacl A
# file: A
# owner: root
# group: root
user::rw-
user:tom:rwx
group::r--
mask::rwx
other::r--
说明:
1、 如果给一个文件设置了facl,有一个很明显的特点就是这个文件以前统计硬链接数量那儿会变为一个加号;
未添加facl时:
添加了facl后:
2、 使用getfacl查看文件属性信息的时候,有一个叫作mask的值,这个mask用来限制除了文件所有者和所属组之外的其他用户或组的权限,因为文件所有者和所属组本来就有文件所有权和群组权限,不受 ACL 权限的限制。
权限匹配顺序
-
不设置ACL,文件权限的生效顺序(从左到右匹配,匹配到了就不匹配了);
-
设置ACL后,权限生效顺序是:文件件所有者 -> 自定义的用户(单独给文件设置的acl权限) -> 文件所属组 -> 自定义的组(acl中定义的) -> other(其它用户)
例如: 没ACL情况下,文件A的权限是rw-rw-r,如果一个用户tom需要对A文件进行写操作,会先判断tom是否是A文件的所有者,如果是就不在匹配,不是就继续匹配。
查看文件权限
我们一般查看文件权限都是通过 ls -l 或者ls -ld 来进行查看,默认列出的都是文件所有者权限、文件所属组权限和其它用户权限。
但是如果设置了ACL后,又有些不同,主要体现在原来文件所属组的位置显示的就是mask权限的值。所以有些时候不能单纯说 ls -l 列出的权限就是所有者、所属组和其它用户,还要考虑有没有设置FACL的情况。