0x05-1 RHEL linux 权限与归属
5.2 文件权限与归属
尽管在Linux系统中一切都是文件,但是每个文件的类型不尽相同,因此Linux系统使用了不同的字符来加以区分,常见的字符如下所示。
-:普通文件。
d:目录文件。
l:链接文件。
b:块设备文件。
c:字符设备文件。
p:管道文件。
在Linux系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的
可读(r)read 、可写(w)write、可执行(x)execute等权限。对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。

r 能够看目录的权限 w 能够新建删除重命名的权限 x能不能进入这个目录的权限
例如,若某个文件的权限为7则代表可读r、可写w 、可执行 (4+2+1);若权限为6则代表可读、可写(4+2)

如果要是细分下来为所有者,所属组,其他用户赋予权限,可以使用chmod 赋予权限 ,chown 设置所有者,所有组
| SUID | chmod u+s |
| SGID | chmod g+s |
| SBIT | chmod o+s |
| 如果三位赋予同样的可以使用 | chmod a+s |
SUID
suid是对一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时赋予拥有属主的权限。(仅对拥有执行权限的二进制程序有效)
例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。
[root@pantao ~]# ls -l /etc/shadow ----------. 1 root root 1183 Nov 18 20:17 /etc/shadow [root@pantao ~]# ls -l /bin/passwd -rwsr-xr-x. 1 root root 27832 Jan 30 2014 /bin/passwd [root@pantao ~]#
SGID
SGID主要实现如下两种功能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
SBIT特殊权限
该特殊权限位置可以保证用户可以删除自己的的文件,却不能删除其他用户的文件,也可以这么说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其他所有者执行删除操作了。
文件的隐藏属性
inux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
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 | 可以直接访问压缩文件中的内容 |
我们再次新建一个普通文件,并为其设置不允许删除与覆盖(+a参数)权限,然后再尝试将这个文件删除:
[root@linuxprobe ~]# echo "for Test" > linuxprobe [root@linuxprobe ~]# chattr +a linuxprobe [root@linuxprobe ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y rm: cannot remove ‘linuxprobe’: Operation not permitted
lsattr命令
2. lsattr命令
lsattr命令用于显示文件的隐藏权限
格式:“lsattr [参数] 文件”。
在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看
文件访问控制列表
不知道大家是否发现,前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
[root@linuxprobe ~]# su - linuxprobe Last login: Sat Mar 21 16:31:19 CST 2017 on pts/0 [linuxprobe@linuxprobe ~]$ cd /root -bash: cd: /root: Permission denied [linuxprobe@linuxprobe root]$ exit
1. setfacl命令
setfacl命令用于管理文件的ACL规则
格式“setfacl [参数] 文件名称”
文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。
其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root [root@linuxprobe ~]# su - linuxprobe Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1 [linuxprobe@linuxprobe ~]$ cd /root [linuxprobe@linuxprobe root]$ ls anaconda-ks.cfg Downloads Pictures Public [linuxprobe@linuxprobe root]$ cat anaconda-ks.cfg [linuxprobe@linuxprobe root]$ exit
可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了
getfacl命令
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”
[root@linuxprobe ~]# getfacl /root getfacl: Removing leading '/' from absolute path names # file: root # owner: root # group: root user::r-x user:linuxprobe:rwx group::r-x mask::rwx other::---
su命令与sudo服务
su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)
当从root管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成root管理员就需要进行密码验证了;这也是一个必要的安全检查:
sudo命令
sudo服务中的可用参数以及作用
| 参数 | 作用 |
| -h | 列出帮助信息 |
| -l | 列出当前用户可执行的命令 |
| -u 用户名或UID值 | 以指定的用户身份执行命令 |
| -k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
| -b | 在后台执行指定的命令 |
| -p | 更改询问密码的提示语 |
sudo命令具有如下功能:
限制用户执行指定的命令:
记录用户执行的每一条命令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
如果担心直接修改配置文件会出现问题,则可以使用sudo命令提供的visudo命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。
格式:谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
或者只给他某个命令的权限
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /usr/bin/cat #whereis cat
每次执行sudo命令都要输入一次密码其实也挺麻烦的,这时可以添加NOPASSWD参数,使得用户执行sudo命令时不再需要密码验证:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff

浙公网安备 33010602011771号