一、文件的权限与归属
“可读”表示能够读取目录内的文件列表;
“可写”表示能够在目录内新增、删除、重命名文件;
“可执行”则表示能够进入该目录。
文件权限的字符与数字表示
有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r–,数字法表示即为764。千万不要将这三个数字相加,计算出7+6+4=17的结果,这是小学的数学加减法,不是Linux系统的权限数字表示法,三者之间没有互通关系。
以rw-r-x-w-权限为例进行讲解,要想转换成数字法,首先要进行各个位之上的数字替代,如下图所示。
减号是占位符,代表这里没有权限,数字法用0表示,也就是说rw-转换后是420,r-x转换后是401,-w-转换后是020,三组数字之间相加后得出652便是转换后的数字法权限。
数字法转回到字符权限,以652权限为例进行讲解。首先数字6是由4+2得到的,不可能是4+1+1,因为每个权限只能占一位,所以数字5则是4+1得到的,2便是本身,没有权限即是空值0,可以按照表5-6所示的格式填写进去后得到420401020这样一串数字。如下图所示:
文件的所有者、所有组和其他人权限之间无关联,不要写成rrwwx----的样子,一定要把rwx权限位对应到正确的位置,写成rw-r-x-w-。
在上图中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是34298字节,最近一次的修改时间为4月2日的凌晨23分,文件的名称为install.log。
二、文件的特殊权限
对一般权限功能的补充。
2.1、SUID
让二进制程序的执行者临时拥有属主的权限
查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1312 Jul 21 05:08 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 13 2018 /bin/passwd
2.2、SGID
让执行者临时获取到文件所有组的权限
chmod命令用于设置文件的一般权限及特殊权限。
语法格式为:“chmod [参数] 文件名”。
这是一个与日常设置文件权限强相关的命令,例如要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760。
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg
[root@linuxprobe ~]# chmod 760 anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg
chown命令用于设置文件的所有者和所有组。
语法格式为:“chown 所有者:所有组 文件名”。
chmod和chown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。
使用“所有者:所有组”的格式轻松把刚刚那个文件的所属信息修改一下,变更后的效果如下:
[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 linuxprobe linuxprobe 1407 Jul 21 05:09 anaconda-ks.cfg
2.3、SBIT
确保用户只能删除自己的文件,而不能删除其他用户的文件。
当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
/tmp目录上的SBIT权限默认已经存在,体现为“其他用户”权限字段的权限变为rwt:
[root@linuxprobe ~]# ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Oct 28 00:29 /tmp
三、文件的隐藏属性
3.1、chattr
chattr命令用于设置文件的隐藏权限。
语法格式为:“chattr [参数] 文件名称”。
把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”;
把某个隐藏功能移出文件,则需要在命令后面追加“-参数”
chattr命令中的参数及其作用
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
3.2、lsattr
lsattr命令用于查看文件的隐藏权限。
语法格式为:“lsattr [参数] 文件名称”。
四、文件访问控制列表
FACL:针对某一类用户或文件,更加准确的权限控制。
setfacl -m u:用户名:权限 文件名
getfacl 文件名
4.1、setfacl
删除某个文件的ACL,可以使用-b参数
文件的权限最后一个点(.)变成了加号(+),意味着该文件已经设置了ACL。
[root@linuxprobe ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2020 /root
4.2、getfacl
getfacl命令用于查看文件的ACL权限规则。
语法格式为:“ getfacl [参数] 文件名称”。
五、su命令与sudo服务
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ id
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
上面的su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。
sudo命令:把特定命令的执行权限赋予给指定用户。
sudo命令中的可用参数以及作用
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
visudo命令:用于编辑配置用户sudo权限文件。
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
**谁可以使用:**稍后要为那位用户进行命令授权。
**允许使用的主机:**可以填写ALL代表不限制来源主机,亦可填写如192.168.10.0/24的网段限制来源地址,只有从允许网段登录时才能使用sudo命令。
**以谁的身份:**可以填写ALL代表系统最高权限,也可以是另外一位用户的名字。
**可执行命令的列表:**可以填写ALL代表不限制命令的列表,亦可填写如/usr/bin/cat的文件名称来限制命令列表,多个命令文件之间用逗号(,)间隔。
在Linux系统中配置服务文件时,虽然没有硬性规定,但从经验来讲新增的参数位置不建议太靠上,避免服务一些必要的功能没加载完成时,我们填写的新参数不被执行成功。一般会在配置文件中找一下相似的参数,然后在相邻位置进行新的修改,或者选择文件的中下部位置。
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 **linuxprobe ALL=(ALL) ALL**
2021/1/16