Linux——权限

886 阅读11分钟

一、文件访问者的类型

1.两种用户:超级用户(root)、普通用户

  • 超级用户:可以再linux系统下做任何事情,不受限制;命令提示符是“#”

  • 普通用户:在linux下做有限的事情;命令提示符是“$”

命令: su [用户名]功能:切换用户。例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码

2.文件访问者分为3类:

  • 文件所有者(user)
  • 群组(group)
  • 其他人(others)

二、文件类型和权限

image.png 文件的属性信息中包括文件的权限,process_bar的权限为-rwxrwxr-x,而process的权限为-rw-rw-r--,一共10位,第1位为文件类型

1.linux文件类型

  • d:文件夹
  • -:普通文件
  • l:软链接(类似Windows的快捷方式)
  • b:块设备文件(例如硬盘、光驱等)
  • p:管道文件
  • c:字符设备文件(例如屏幕等串口设备)
  • s:套接口文件

2.权限

第2-4位、5-7位、8-10位分别为文件所有者、群组、其他人的权限,其中每3位代表r(read)、w(write)、x(execute),-代表没有该权限

  • read:对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限(目录的状态信息、文件列表)
  • write:对文件而言,具有修改文件内容的权限;对目录来说具有删除、创建目录内文件的权限
  • execute:对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限

ps:如果没有对目录的x权限,那么对目录内文件和子目录的rwx权限全是无效的,因为根本无法进入目录,也就无法操作其中的文件和子目录

上面这种用10个字符表示文件权限的方法为字符表示方法,除此之外,我们还可以用8进制数值表示方法来表示文件的权限

权限符号二进制八进制
---0000
--x0011
-w-0102
-wx0113
r--1004
r-x1015
rw-1106
rwx1117

例如上面的process_bar文件:

image.png 0开头表示八进制,775对应rwx、rwx、r-x

三、设置文件权限

1.chmod:设置文件的访问权限

说明:只有文件的拥有者和root才可以改变文件的权限

命令格式: chmod [参数] 权限 文件名

常用选项:-R:递归修改目录文件的权限

设置权限值的格式:

(1)用u、g、o、a代表user、group、others、all(所有用户),用+、-、=代表赋予、剥夺、等于某权限

eg:

chmod u+w filename
chmod u=rwx,go=rx filename 

(2)用3位8进制数值设置权限

chmod 777 filename

2.chown:改变文件的拥有用户

格式: chown [参数] 用户名 文件名

3.chgrp:改变文件所在的群组

格式:chgrp [参数] 用户组名 文件名

4.umask:(改变)文件掩码

文件和目录在创建时有默认的权限,文件为0666(因为文件默认不能执行),目录为0777(目录默认能够进入)。

但这还不是最终的默认权限,比如我们不想让others有修改我的文件、目录的权限,这时候umask文件掩码就上场了,我们可以让umask为0002,代表去掉others的w权限,那么 最终的默认权限 = 原始的默认权限 - umask

因此文件的最终默认权限为0664,文件夹的最终默认权限为0775

  • umask:查看当前umask的值
  • umask -S:按字符模式显示去掉当前umask权限后的默认权限
  • umask 值:把umask设置为指定值

eg:

image.png

但是在关闭shell或者重启后,umaks又恢复到了原来的值,如果想让umask的设置值一直保留下去, 那么需要将该命令写入~/.bashrc文件中。root的umask会拿掉比较多的属性,root的umask默认是0022, 这是基于安全的考虑. 至于一般用户,默认的umask为0002,即保留用户群组的写入权限! 其实,关于默认umask的设置可以参考/etc/bashrc文件,不过,不建议修改该文件。

四、file命令:辨识文件类型

由于Linux系统并不是像Windows系统那样通过扩展名来定义文件类型的,因此用户无法直接通过文件名来进行区别。file命令可以通过分析文件头部信息中的标识信息来显示文件类型,使用很方‍便。

1.语法

file [选项] 文件或目录

2.常用选项

  • -b  列出辨识结果时,不显示文件名称。
  • -c  详细显示指令执行过程,便于排错或分析程序执行的情形。
  • -f<名称文件>  指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
  • -L  直接显示符号连接所指向的文件的类别。
  • -m<魔法数字文件>  指定魔法数字文件。
  • -v  显示版本信息。
  • -z  尝试去解读压缩文件的内容。
  • [文件或目录...] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

五、sudo

1.sudo命令与su命令

(1)sudo命令

Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。 

  sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以提权到root,执行一些root才能执行的命令。

  执行sudo -u <用户名> <命令>, 将允许当前用户,提权到<用户名>的身份,再执行后面的<命令>, 即使<命令>原本需要root权限。提权到<用户名>身份时,是以<用户名>的身份来执行命令的,因此创建的文件默认属于<用户名>用户。如果不带-u, 则默认使用root用户。需要注意的是: 执行sudo时输入的密码是当前用户的密码, 并非<用户名>的密码。

(2)su命令

su [选项] [用户名]

su 命令是 Unix-like 操作系统中的一个命令,用于切换用户身份。su 是 "Switch User" 的缩写

  • [选项] 是一些可选的参数,用于修改 su 命令的行为,比如 -c 参数用于执行指定的命令。
  • [用户名] 是要切换到的目标用户的用户名。如果不指定用户名,默认会切换到超级用户(root)。

当你运行 su 命令时,系统通常会要求你输入目标用户的密码。如果密码输入正确,你将会以目标用户的身份登录系统。此时你可以执行该用户所允许的操作。

sudo -u <用户名>和su - <用户名>相比:

sudo -u <用户名> :需要输入当前用户的密码,提权到<用户名>身份执行命令后返回当前用户;
su - <用户名>: 则是输入目标用户的密码,切换到目标用户。

2.sudoers文件

(1)sudoers文件用途

sudoers 文件是 Unix-like 操作系统中用于配置 sudo 命令的文件。它定义了哪些用户或用户组有权利执行哪些特定的命令,以及这些命令是否需要密码认证等规则。sudoers 文件的配置允许系统管理员精确地控制系统上的特权操作,以提高系统的安全性。

sudoers 文件的格式相对复杂,它使用了特定的语法规则。通常不推荐直接编辑这个文件,而是使用 visudo 命令,因为它能够在编辑过程中进行语法检查,避免可能引起系统问题的错误。

执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限

确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认

若密码输入成功,则开始执行sudo后续的命令

(2)sudoers文件格式

对/etc/sudoers文件进行编辑的代码公式可以概括为:

授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...

eg:

lighthouse ALL=(ALL) NOPASSWD: ALL

%sudo ALL=(ALL:ALL) ALL

我们把用户/组、主机、切换到的用户/组、是否需要密码、命令分为5个字段

"字段1" 不以%号开头的表示"将要授权的用户", 比如例子中的root;以%号开头的表示"将要授权的组", 比如例子中的%wheel组 和 %sudo组。

"字段2" 表示允许登录的主机, ALL表示所有; 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令

"字段3" 如果省略, 相当于(root:root),表示可以通过sudo提权到root; 如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。请注意,"字段3"如果没省略,必须使用( )双括号包含起来。这样才能区分是省略了"字段3"还是省略了"字段4"。

"字段4" 的可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码。

"字段5" 是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作。
命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。比如你有一个名为useradd的程序,你给一个user用sudo执行该程序的权限,如果使用的是相对路径的话,那user也拥有了添加用户的权限,造成危险。

(3)编辑sudoers文件

在sudoers文件的开头,系统推荐了编辑sudoers的稳妥做法:

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.

即我们必须使用visudo命令来编辑sudoers,因为通过visudo修改,如果配置出错,会有提示。

系统文档推荐的做法,不是直接修改/etc/sudoers文件,而是将修改写在/etc/sudoers.d/目录下的文件中。如果使用这种方式修改sudoers,需要在/etc/sudoers文件的最后行,加上#includedir /etc/sudoers.d一行(默认已有)

注意了,这里的指令#includedir是一个整体, 前面的#号不能丢,并非注释,也不能在#号后有空格。任何在/etc/sudoers.d/目录下,不以~号结尾的文件和不包含.号的文件,都会被解析成/etc/sudoers的内容

sudoers.d/README文档如下:

#
# The default /etc/sudoers file created on installation of the
# sudo  package now includes the directive:
# 
# 	@includedir /etc/sudoers.d
# 
# This will cause sudo to read and parse any files in the /etc/sudoers.d 
# directory that do not end in '~' or contain a '.' character.
# 
# Note that there must be at least one file in the sudoers.d directory (this
# one will do).
# 
# Note also, that because sudoers contents can vary widely, no attempt is 
# made to add this directive to existing sudoers files on upgrade.  Feel free
# to add the above directive to the end of your /etc/sudoers file to enable 
# this functionality for existing installations if you wish! Sudo
# versions older than the one in Debian 11 (bullseye) require the
# directive will only support the old syntax #includedir, and the current
# sudo will happily accept both @includedir and #includedir
#
# Finally, please note that using the visudo command is the recommended way
# to update sudoers content, since it protects against many failure modes.
# See the man page for visudo and sudoers for more information.
#

六、粘滞位

回顾一下目录的权限:

  • r:允许用户列出目录中的文件和子目录
  • w:允许用户在目录中删除、新建文件和子目录
  • x:允许用户进入该目录

思考:如果用户b拥有文件夹dir的w权限,dir中有个用户a的的文件a.txt,a.txt的权限是不允许others写入的,也就不允许others删除该文件。但由于b有了dir的w权限,从而b可以删除a.txt,演示如下: image.png 可以看到,只给了一条提示:rm: remove write-protected regular empty file 'ubuntu_dir/ubuntu.txt'?就可以允许用户lighthouse删除ubuntu用户的ubuntu.txt文件了

为了解决这个问题,我们引入一个粘滞位t

使用chmod +t dir命令可以设置粘滞位

image.png

可以看到others的x权限变成了't',此时others即使有dir的w权限,也无法更改/删除dir中属于其他用户并且others没有w权限的文件了。

image.png

使用chmod -t dir可以去掉dir的粘滞位,由于粘滞位成立的前提是others要有dir的x权限,因此规定others没有dir的x权限时,粘滞位显示'T',此时粘滞位无效,相当于权限为‘-’

粘滞位对文件无效