美文网首页
Linux系统中文件权限管理

Linux系统中文件权限管理

作者: 别把风景搬上天堂 | 来源:发表于2019-12-31 22:41 被阅读0次

前文中介绍了用户和用户组管理,因而,我们可以针对不同的用户和用户组在文件上设置不同的权限,达到控制访问文件的目的。
Linux系统中文件的权限信息记录在元数据中,使用ls -l 或者 ll命令查看一下test2.txt2.txt文件的信息

[root@localhost data]# ll test2.txt
-rw-r--r--. 1 root root 79 Dec 23 22:23 test2.txt
test2.txt文件详细信息

Linux中一切皆文件,文件的种类很多,不同的文件类型有不同的字符表示。

字符 文件类型
- 普通文件
d 目录文件
l 链接文件
p 管道文件
c 字符设备文件
b 块设备文件
s 套接字文件

要注意的是:当文件类型为链接文件时,元数据信息显示的链接数为软链接数,其余时候表示为硬链接数。
在之后的九个字符,每三个为一组,分为三组,即为该文件的权限信息;分别表示所有者,所属组,其他用户对该文件拥有的权限。

r : 对文件表示可否可读取内容,对目录表示可以使用ls命令查看目录中的文件列表
w: 对文件表示可否修改文件内容,对目录表示可以在目录中创建文件,删除文件
x: 对文件表示可否执行,对目录表示是否可以切换至目录中,访问目录内的文件

文件的普通权限

在指定文件的所有者和所属组后,可以通过chmod命令设置不同用户群的相关权限。
chmod 命令语法格式:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
设置权限有两种常见的方法:数字法和模式法。在数字法中,我们用4 2 1 三个八进制数字分别代表读(r)写(w)执行(x) 三种权限,则每种权限信息可以用三个数字的和来表示。

权限 --- --x -w- -wx r-- r-x rw- rwx
数字表示 0 1 2 3 4 5 6 7
[root@localhost data]# ll test2.txt    
-rw-r--r--. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# chmod 777 test2.txt
[root@localhost data]# ll test2.txt
-rwxrwxrwx. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# chmod 644 test2.txt
[root@localhost data]# ll test2.txt
-rw-r--r--. 1 root root 79 Dec 23 22:23 test2.txt

模式法(MODE)修改权限信息,MODE的语法格式为:
[ugoa...] [[+-=][perms...]...]
格式说明:u表示所有者,g表示所属组,o表示除了所有者和所属组以外的其他,+表示在原有基础上增加权限,-表示在原有基础上减少权限,=表示重设对应的权限,perms表示权限。

[root@localhost data]# ll test2.txt     #模式法示例
-rw-r--r--. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# chmod u+x test2.txt
[root@localhost data]# ll test2.txt
-rwxr--r--. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# chmod u-w test2.txt
[root@localhost data]# ll test2.txt
-r-xr--r--. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# chmod a+x test2.txt
[root@localhost data]# ll test2.txt
-r-xr-xr-x. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# chmod a=rx test2.txt
[root@localhost data]# ll test2.txt
-r-xr-xr-x. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# chmod u=rx,g=r,o=x test2.txt
[root@localhost data]# ll test2.txt
-r-xr----x. 1 root root 79 Dec 23 22:23 test2.txt
[root@localhost data]# ll test2.txt test2.txt.bak  #将某个文件的权限设置成和另一个文件相同的权限
-r-xr----x. 1 root root 79 Dec 23 22:23 test2.txt
-rw-r--r--. 1 root root 59 Dec 23 22:17 test2.txt.bak 
[root@localhost data]# chmod --reference=test2.txt test2.txt.bak  # =两边不能有空格
[root@localhost data]# ll test2.txt test2.txt.bak 
-r-xr----x. 1 root root 79 Dec 23 22:23 test2.txt
-r-xr----x. 1 root root 59 Dec 23 22:17 test2.txt.bak

umask 文件的默认权限

在我们创建一个文件或者目录的时候总能得到一个默认的权限,而这个权限就是通过umask来实现的。根据文件类型的基准权限与umask值的按位取反后的数值进行与运算,就可以得到对应文件的默认权限值。umask是内置命令。

[root@localhost data]# umask     #查看umask值
0022

umask 默认权限由 4 个八进制数组成,但第 1 个数代表的是文件所具有的特殊权限(SUID、SGID、Sticky),后三位才是真正的umask值,即022,022转化为二进制数为000 010 010,按位取反为111 101 101 将这个值与普通文件的基准权限运算值666(110 110 110)进行与运算,得出结果为644(110 100 100).要注意的是:在Linux系统中,目录的基准权限为777,普通文件的基准权限为666,主要是为了避免默认创建的新文件具有执行权限,增加安全风险。
相比于取反相与计算得出默认权限,下面的方法更加的简单:
目录默认权限 :用777-umask值,;
普通文件的默认权限:用666-umask值,所得结果中,如果奇数就+1,否则不变。
例如:umask值为222,
对于目录。默认权限为:777-222=555,即r-x r-x r-x ;
对于文件。默认权限为:666-222=444,即r-- r-- r-- ;

对于umask值,可以根据个人偏好进行设置,在退出系统前,该umask值一直生效,退出后,umask值就会还原为原来的默认值,要想一直生效,可以将umask命令,存放于~/.bashrc或者/etc/bashrc中。前者只针对特定用户生效,后者则影响所有用户。

[root@localhost data]# vim ~/.bashrc     #vim打开.bashrc文件在末行添加 umask 024
# .bashrc
.....省略以上内容
umask 024 
[root@localhost data]# source ~/.bashrc    #source 执行刚修改的文件,在不重启的情况下生效
[root@localhost data]# umask   # umask值已经变为024
0024

文件的特殊权限

除了前面的普通权限,还有一些特殊权限,分别是SUID,GUID,Sticky。

SUID:设有SUID权限的程序被执行时,这个程序的进程所有者为程序文件所有者身份,不是执行者身份,而这个程序只能是可执行二进制程序,且SUID对目录无效。
命令语法格式:
chmod u+s FILE... chmod u-s FILE...

[root@localhost data]# ll /bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd
[root@localhost data]# chmod u-s /bin/passwd 
[root@localhost data]# ll /bin/passwd 
-rwxr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd
[root@localhost data]# chmod u+s /bin/passwd 
[root@localhost data]# ll /bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd
[root@localhost data]# ll test2.txt
-r--r-----. 1 root root 79 Dec 23 22:23 test2.txt  
[root@localhost data]# chmod u+s test2.txt   #当一个程序没有可执行权限,设置了SUID权限,显示为大写的S
[root@localhost data]# ll test2.txt
-r-Sr-----. 1 root root 79 Dec 23 22:23 test2.txt

SGID:SGID设置在可执行的二进制文件中时,运行该程序时,最终得到的权限将继承这个程序所属组的权限,而非默认的执行程序的用户本身的权限;
命令语法格式:
chmod g+s FILE...
chmod g-s FILE...
当SGID设置在目录时,用户在这个目录中创建的新文件的属组将自动继承此目录的数组。
命令语法格式:
chmod g+s DIR...
chmod g-s DIR...

[root@localhost data]# mkdir -m 777 test     #创建权限为777的目录test
[root@localhost data]# ll  -d test
drwxrwxrwx. 2 root root 6 Dec 30 22:45 test
[root@localhost data]# su wufujie
[wufujie@localhost data]$ touch test/test5.txt
[wufujie@localhost data]$ ll  test/test5.txt    #新创建的文件所属组默认为当前用户
-rw-rw-r--. 1 wufujie wufujie 0 Dec 30 22:49 test/test5.txt
[wufujie@localhost data]$ exit
exit
[root@localhost data]# chmod g+s test     #添加GUID权限
-rw-rw-r--. 1 wufujie wufujie 0 Dec 30 22:49 test5.txt
[root@localhost data]# ll -d test
drwxrwsrwx. 2 root root 23 Dec 30 22:49 test
[root@localhost data]# su wufujie
[wufujie@localhost data]$ touch test/test6.txt
[wufujie@localhost data]$ ll test/    #可以看到新建的文件默认所属组继承了目录的所属组
total 0
-rw-rw-r--. 1 wufujie wufujie 0 Dec 30 22:49 test5.txt
-rw-rw-r--. 1 wufujie root    0 Dec 30 22:50 test6.txt

Sticky :目前只针对目录有效。设置有Sticky权限的目录,用户在该目录下创建的文件只有这个用户和root用户可以删除。
命令语法格式:
chmod o+t DIR...
chmod o-t DIR...

[root@localhost ~]# ll -d /tmp/    #可以看到在other上执行位为t
drwxrwxrwt. 34 root root 4096 Dec 30 23:01 /tmp/
[root@localhost ~]# su wfj
[wfj@localhost root]$ touch  /tmp/test.txt
[wfj@localhost root]$ su - wufujie
[wufujie@localhost ~]$ ll /tmp/test.txt 
-rw-rw-r--. 1 wfj wfj 0 Dec 30 23:02 /tmp/test.txt
[wufujie@localhost ~]$ rm -f /tmp/test.txt     #因为有Sticky权限,所以删除失败
rm: cannot remove ‘/tmp/test.txt’: Operation not permitted
[root@localhost ~]# chmod o-t /tmp    #去除Sticky权限
[root@localhost ~]# ll -d /tmp/
drwxrwxrwx. 34 root root 4096 Dec 30 23:04 /tmp/
[root@localhost ~]# ll -d /tmp
drwxrwxrwx. 34 root root 4096 Dec 30 23:04 /tmp
[root@localhost ~]# su - wufujie
Last login: Mon Dec 30 23:02:45 CST 2019 on pts/1
[wufujie@localhost ~]$ rm -f /tmp/test.txt   #删除成功

要注意的是,与SUID类似的是,当一个目录其他权限位没有可执行权限时,设置了Sticky权限,则以T表示。
上面所说的三种特殊权限,可以用数字形式设置,SUID为4,GUID为2,Sticky为1

[root@localhost data]# ll
total 1
-rwxr-xr-t. 1 root root  0 Dec 30 23:22 test
[root@localhost data]# chmod 1755 test
[root@localhost data]# ll
total 1
-rwxr-xr-t. 1 root root  0 Dec 30 23:22 test
[root@localhost data]# chmod 0755 test
[root@localhost data]# ll
total 1
-rwxr-xr-x. 1 root root  0 Dec 30 23:22 test
[root@localhost data]# chmod 6755 test
[root@localhost data]# ll
total 1
-rwsr-sr-x. 1 root root  0 Dec 30 23:22 test
[root@localhost data]# chmod 0755 test
[root@localhost data]# ll
total 1
-rwxr-xr-x. 1 root root  0 Dec 30 23:22 test

文件的特殊属性

上面介绍的权限通常只能限制普通用户,对root这样的超级用户是无法限制的。chattr命令就是专门针对root用户的命令,通过chattr命令可以修改文件或目录的隐藏属性,只有root用户可以使用。
命令语法格式:
chattr [ -RVf ] [ -+=ia ] file...
chattr命令常用选项和参数说明:

选项 说明
-R 递归处理,遇到符号链接时,遍历跳过
-V 显示详细信息
-f 隐藏大部分的错误信息
- 表示去掉属性
+ 表示添加属性
= 表示重设属性
i 表示不能删除,修改,重命名和创建硬链接
a 表示不能删除,重命名和创建硬链接,但可以追加内容

lsattr: 显示文件在Linux第二扩展文件系统上的特有属性,命令语法格式:
lsattr [-RVadv] [file...]
lsattr命令常用选项说明:

选项 说明
-a 显示所有文件和目录
-d 显示目录名称,而非内容
-R 递归处理
-v 显示文本或目录版本
-V 显示版本信息
[root@localhost data]# lsattr test
---------------- test
[root@localhost data]# chattr +a test
[root@localhost data]# lsattr  test
-----a---------- test
[root@localhost data]# rm -f test      # +a 不能删除修改重命名和创建硬链接,可以追加内容
rm: cannot remove ‘test’: Operation not permitted
[root@localhost data]# mv test test1
mv: cannot move ‘test’ to ‘test1’: Operation not permitted
[root@localhost data]# ln test test1
ln: failed to create hard link ‘test1’ => ‘test’: Operation not permitted
[root@localhost data]# echo 123 >> test
[root@localhost data]# cat test
123

文件的FACL

利用FACL可以实现更加灵活的权限控制。管理FACL主要有两个常见命令setfacl和getfacl,其中setfacl用来设置FACL权限,getfacl用来查看FACL权限。
setfacl 命令语法格式:
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
setfacl命令常用选项说明:

选项 说明
-m, --modify=acl 更改文件的访问控制列表
-M --modify-file=file 从文件读取访问控制列表条目更改
-x --remove=acl 根据文件中访问控制列表移除条目
-X --remove-file=file 从文件读取访问控制列表条目并删除
-b --remove-all 删除所有扩展访问控制列表条目
-k --remove-default 移除默认访问控制列表
--set=acl 设定替换当前的文件访问控制列表
--set-file=file 从文件中读取访问控制列表条目设定
--mask 重新计算有效权限掩码
-n, --no-mask 不重新计算有效权限掩码
-d, --default 应用到默认访问控制列表的操作
-R, --recursive 递归操作子目录
-L, --logical 依照系统逻辑,跟随符号链接
-P, --physical 依照自然逻辑,不跟随符号链接
--restore=file 恢复访问控制列表,和“getfacl -R”作用相反
--test 测试模式,并不真正修改访问控制列表属性
-v, --version 显示版本并退出
-h, --help 显示本帮助信息

getfacl 命令语法格式:
getfacl [-aceEsRLPtpndvh] file ...
getfacl命令常用选项说明:

选项 说明
-a, --access 仅显示文件访问控制列表
-d, --default 仅显示默认的访问控制列表
-c, --omit-header 不显示注释表头
-e, --all-effective 显示所有的有效权限
-E, --no-effective 显示无效权限
-s, --skip-base 跳过只有基条目(base entries)的文件
-R, --recursive 递归显示子目录
-L, --logical 逻辑遍历(跟随符号链接)
-P, --physical 物理遍历(不跟随符号链接)
-t, --tabular 使用制表符分隔的输出格式
-n, --numeric 显示数字的用户/组标识
-p, --absolute-names 不去除路径前的 '/' 符号
-v, --version 显示版本并退出
-h, --help 显示本帮助信息
[root@localhost data]# touch facl.txt    #创建facl.txt文件
[root@localhost data]# ll facl.txt           #查看其他用户只具有读权限
-rw-r--r--. 1 root root 0 Dec 31 22:42 facl.txt
[root@localhost data]# su wufujie         
[wufujie@localhost data]$ echo 1231232 >>facl.txt    #切换到wufujie,追加写入内容,被拒绝。无写权限
bash: facl.txt: Permission denied
[wufujie@localhost data]$ exit 
exit
[root@localhost data]# setfacl -m u:wufujie:rwx facl.txt    #为wufujie设置FACL权限为rwx
[root@localhost data]# ll facl.txt      #查看信息,看到多出一个“+”号
-rw-rwxr--+ 1 root root 0 Dec 31 22:42 facl.txt
[root@localhost data]# getfacl facl.txt         #getfacl查看facl信息   
# file: facl.txt
# owner: root
# group: root
user::rw-
user:wufujie:rwx         #此处为wufujie用户设置的权限
group::r--
mask::rwx
other::r--
[root@localhost data]# su wufujie          #切换到wufujie,再次追加写入,发现已OK
[wufujie@localhost data]$ echo 1231232 >>facl.txt 
[wufujie@localhost data]$ cat facl.txt 
1231232
[wufujie@localhost data]$ exit 
exit
[root@localhost data]# setfacl -m u:wfj:0 facl.txt   #对wfj设置无任何读写执行权限
[root@localhost data]# getfacl facl.txt 
# file: facl.txt
# owner: root
# group: root
user::rw-
user:wufujie:rwx
user:wfj:---       #此处为wfj设置的FACL权限
group::r--
mask::rwx
other::r--
[root@localhost data]# su wfj             #测试发现wfj不具备读写执行权限
[wfj@localhost data]$ echo 123432 >>facl.txt 
bash: facl.txt: Permission denied
[wfj@localhost data]$ cat facl.txt 
cat: facl.txt: Permission denied
[wfj@localhost data]$ exit
exit
[root@localhost data]# touch facl2.txt       #创建facl2.txt文件,使其具有与fact.txt文件相同的FACL权限
[root@localhost data]# getfacl facl.txt | setfacl --set-file=- facl2.txt 
[root@localhost data]# getfacl facl2.txt
# file: facl2.txt
# owner: root
# group: root
user::rw-
user:wufujie:rwx
user:wfj:---
group::r--
mask::rwx
other::r--
[root@localhost data]# setfacl -b facl.txt 
[root@localhost data]# getfacl facl.txt 
# file: facl.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@localhost data]# usermod -aG wufujie wfj  #将wfj添加到wufujie组中
[root@localhost data]# id wfj
uid=2004(wfj) gid=2004(wfj) groups=2004(wfj),1000(wufujie)
[root@localhost data]# setfacl -m g:wufujie:rwx facl.txt    #为组wufujie设置FACL权限为rwx
[root@localhost data]# getfacl facl.txt 
# file: facl.txt
# owner: root
# group: root
user::rw-
group::r--
group:wufujie:rwx
mask::rwx
other::r--
[root@localhost data]# su - wfj     #切换到wfj用户,测试具有rwx权限
Last login: Tue Dec 31 22:45:40 CST 2019 on pts/1
[wfj@localhost ~]$ echo 12343 >>/data/facl.txt 
[wfj@localhost ~]$ cat /data/facl.txt 
1231232
12343
[wfj@localhost ~]$ exit
logout
[root@localhost data]# setfacl -m u:wfj:0 facl.txt   #为用户wfj设置不具有读写执行的FACL权限
[root@localhost data]# getfacl facl.txt 
# file: facl.txt
# owner: root
# group: root
user::rw-
user:wfj:---
group::r--
group:wufujie:rwx
mask::rwx
other::r--
[root@localhost data]# su wfj          #再次切换到wfj 发现已不具有读写执行权限
[wfj@localhost data]$ echo 12343 >/data/facl.txt 
bash: /data/facl.txt: Permission denied

通过上面的测试,可以看出,FACL可以针对用户和组单独设置FACL权限。那么最终用户访问时,最终的权限如何判断?
ACL生效和判断顺序如下:
(1) 先判断访问者是否为文件所有者,如果是,所有者权限生效,不再往下继续
(2)判断是否为ACL中自定义用户,如果是,对用的ACL权限生效,不再往下继续
(3)判断是否属于ACL自定义组,如果是,对应的ACL权限生效,不再往下继续
(4)其他人

FACL中的mask:相当于“限高杆”,所有ACL自定义的用户和组的权限不能超过mask权限,但是对owner和otherde 权限没有影响。

[root@localhost data]# setfacl -m mask:r facl.txt    #更改mask权限为只读
[root@localhost data]# getfacl facl.txt 
# file: facl.txt
# owner: root
# group: root
user::rw-
user:wfj:---
group::r--
group:wufujie:rwx       #effective:r--     # 可以发现组wufujie最终的权限为只读
mask::r--
other::r--

相关文章

网友评论

      本文标题:Linux系统中文件权限管理

      本文链接:https://www.haomeiwen.com/subject/rqamoctx.html