前文中介绍了用户和用户组管理,因而,我们可以针对不同的用户和用户组在文件上设置不同的权限,达到控制访问文件的目的。
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--
网友评论