天天看点

文件特殊权限、属性,默认权限

前两天我们学习了r、w、x这三种权限,但是在查询系统文件时会发现有一些其他权限的字母;

比如:/usr/bin/passwd文件,属主应该是x的权限位出现了s;

比如:/usr/bin/locate文件,属组应该是x的权限位出现了s;

比如:/tmp目录,其他人应该是x 的权限位出现了t;

我们把这种称为特殊权限。

特殊权限

权限字符表示

权限数字表示

SUID

s

4

SGID

2

stick-bit

t

1

setuid(suid):针对命令和二进制程序的,当普通用户执行某个(passwd)命令的时候,可以拥有这个命令对应用户的权限,即让普通用户可以以root用户的角色执行程序或命令。

可以看到,原本表示文件所有者权限中的 x 权限位,却出现了 s 权限,此种权限通常称为 SetUID,简称 SUID 特殊权限。

SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。

我们都知道,Linux 系统中所有用户的密码数据都记录在 /etc/shadow 这个文件中,通过 ll /etc/shadow 命令可以看到,此文件的权限是 0(---------),也就是说,普通用户对此文件没有任何操作权限。

这就会产生一个问题,为什么普通用户可以使用 passwd 命令修改自己的密码呢?

本节开头已经显示了 passwd 命令的权限配置,可以看到,此命令拥有 SUID 特殊权限,而且其他人对此文件也有执行权限,这就意味着,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令。

换句话说,当普通用户使用 passwd 命令尝试更改自己的密码时,实际上是在以 root 的身份执行passwd命令,正因为 root 可以将密码写入 /etc/shadow 文件,所以普通用户也能做到。只不过,一旦命令执行完成,普通用户所具有的 root身份也随之消失。

如果我们手动将 /usr/bin/passwd 文件的 SUID 权限取消,会发生什么呢?观察如下命令的执行过程:

显然,虽然用户有执行 passwd 命令的权限,但无修改 /etc/shadow 文件的权限,因此最终密码修改失败。

由此,我们可以总结出,SUID 特殊权限具有如下特点:

只有可执行文件才能设定 SetUID 权限,对目录设定 SUID,是无效的。

用户要对该文件拥有 x(执行)权限。

用户在执行该文件时,会以文件所有者的身份执行。

SetUID 权限只在文件执行过程中有效,一旦执行完毕,身份的切换也随之消失。

SUID配置语法

sgid是与用户组相关的,sgid与suid不同的是,<code>sgid既可以针对文件也可以针对目录</code>

对于文件来说,sgid仅对二进制命令程序有效,执行命令的用户可以获得该程序执行期间所属组的权限,suid是拥有这个用户的权限

对于目录来说(继承目录所属的组),Linux默认情况下用户创建文件,默认用户和组都是它自己,sgid可以让用户在此目录下创建的文件和目录,具有与此目录相同的用户组设置

默认情况下,用户创建文件时,其属组为文件的基本组;

如果目录设定了SGID,对此目录有写权限的用户创建的文件属组为此目录的属组;

存在的问题是用户可以删除其他用户的文件,所以又引入了sticky权限

SUID的配置语法是和SUID一样的:

SBIT设置语法

特殊权限时,权限位是12位,从左往右数,第1位是SUID(Set User ID),第2位是SGID(Set Group ID),第3位是Sticky bit

SGTrw-r--r--

chmod 4---是设suid,如果该位有权限, 则表示设置setuid 4--- chmod 2---是设置sgid,如果该位有权限, 则表示设置setgid 2--- chmod 1---是设sticky,如果该位有权限, 则表示设置sticky 1---

设置完这些特殊权限标志值后, ls -l显示如下 -rwsrw-r-- 表示有setuid标志 -rwxrwsrw- 表示有setgid标志 -rwxrw-rwt 表示有sticky标志 那么原来的可执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T) 即有suid时,属主位的x变成s,如果属主位没有x,则x位置上的-变成S 即有sgid时,属组位的x变成s,如果属组位没有x,则x位置上的-变成S 即有sticky时,OHTER位的x变成t,如果OHTER位没有x,则x位置上的-变成T

我们管理 Linux 系统中的文件和目录,除了可以设定普通权限和特殊权限外,还可以利用文件和目录具有的一些隐藏属性。

chattr 命令,专门用来修改文件或目录的隐藏属性,只有 root 用户可以使用。该命令的基本格式为:

+ 表示给文件或目录添加属性,- 表示移除文件或目录拥有的某些属性,= 表示给文件或目录设定一些属性。

属性选项

功能

i

如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据; 如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件;

a

如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据; 如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件;

使用 chattr 命令配置文件或目录的隐藏属性后,可以使用 lsattr 命令查看。

lsattr 命令,用于显示文件或目录的隐藏属性,其基本格式如下:

常用选项有以下 3 种:

-a:后面不带文件或目录名,表示显示所有文件和目录(包括隐藏文件和目录)

-d:如果目标是目录,只会列出目录本身的隐藏属性,而不会列出所含文件或子目录的隐藏属性信息;

-R:和 -d 恰好相反,作用于目录时,会连同子目录的隐藏信息数据也一并显示出来。

默认权限:是指用户在创建文件或目录时,默认分配给文件或目录的访问权限。

查看默认权限命令:

umask

第一位是文件特殊权限 ,002是文件默认减去的权限

用户创建一个文件的默认访问权限为:rw-rw-rw- (八进制值666)

用户创建一个目录的默认访问权限为:rwxrwxrwx(八进制值777)

但最终创建出来的文件权限是644 目录是755,为什么目录不是777,文件不是666呢?

这是因为系统创建文件或目录受UMASK控制,比如UMASK设置为:022

那么创建出来的文件权限就是644,目录是755

目录:777-022=755

文件:666-022=644

UMASK表示要减掉的权限

当用户登录系统时,会加载/etc/profile环境变量文件;

在该配置文件中有一条UMASK初始化为022

如果用户UID大于199并且组名称和用户名称一致,那么就将UMASK初始化为002

如果用户UID小于199并且组名称和用户名称一致,那么就将UMASK初始化为022

  暂时修改的方式,可以通过umask命令来更改,比如计算出权限对应的umask值要改为027,则直接用该用户登录Linux系统后,使用命令<code>umask 027</code>即可。但是,一旦用户退出登录后,umask将恢复默认值,刚才设置的将会失效。所以,这种umask命令方式,只是适合当前会话。

  除了使用umask命令进行当前会话的用户默认权限设置外,我们还可以对该用户永久性修改umask值。针对某个用户修改,需要用该用户登录Linux,然后修改/etc/profile文件中的umask值。

继续阅读