Linux 深入理解权限

一.权限

1.权限是什么

结合生活实际,我们可以知道:权限是用来约束我们能做什么,不能做什么 的东西。对于Linux来说,有着一切皆文件 的思想,所以我们对权限的一切行为(修改)都会基于文件进行。根据上篇文章的文件权限,我们能得出一个重要结论:权限=角色+属性。

2.对权限的理解

既然权限=角色+属性,我们也可以进一步得出:权限约束角色的行为,并约束目标的特定属性。就好比:学校看门的保安,在你进校门时不会拦你,是因为你是学生这个角色 ,并不是因为你是什么特定的人;你不可能在leetcode上看电影,也不可能在某视频软件上写代码,因为这些目标本身不带有那些属性 。接下来我们就谈谈在Linux中的角色与属性

3.Linux中的角色

总的来说,Linux中的角色大致可以分为三个:拥有者(user),所属组(group),其他(other)。我们新建一个目录来看看这个目录的角色分配。
mkdir filename

bash 复制代码
wujiahao@VM-12-14-ubuntu:~$ mkdir test
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/

由上篇文章的基础我们已经得知前面的信息代表着什么:1位表示文件类型+3位用户权限+3位所属组权限+3位其他权限。

1.拥有者

简单来说,拥有者就是当前目录的创建者,他们用有这个文件的生杀大权,同时也可以修改对其他用户的各种权限。

2.所属组

所属组的出现是对角色的更细化区分,举个例子:现在公司拟用赛马模式令两个不同的项目组完成同一个软件。那么可以假定老板是机器的拥有者,由A,B两组来完成这个项目:

由之前的讲解我们知道,每在一台机器上创建一个用户,对应的家目录就会出现相应的用户的目录

例如我自己的机器上的多个用户。

bash 复制代码
wujiahao@VM-12-14-ubuntu:~$ tree /home
/home
├── lesson2
│?? ├── mydir
│?? │?? ├── hello.txt
│?? │?? ├── nature.txt
│?? │?? ├── poet.txt
│?? │?? ├── test.c
│?? │?? └── test.i
│?? └── yourdir
├── lighthouse  [error opening dir]
├── ubuntu  [error opening dir]
├── wujiahao
│?? ├── gitcode
│?? │?? ├── file4
│?? │?? ├── file5
│?? │?? └── ReadMe
│?? └── test
└── wujiaqi  [error opening dir]

对于公司中的其他人,也可能在使用这个机器,但是对于这个项目而言,只需要你们AB两个组有相应的权限即可,其他人是无权干涉的。

那么这里的AB,就可以被称为是所属组

3.其他

对于这个项目而言,拥有者是老板,所属组为AB,那么其他的与项目无关的员工就是其他

4.用户的权限

用户可以被分为root(超级用户)和普通用户。root拥有在系统中的最高权限------只有你想不到没有他做不到。而用户的权限,可以说是实现了Linux多用户系统隔离性的重要机制。

我们不妨查看家目录下的各个用户
ll

bash 复制代码
wujiahao@VM-12-14-ubuntu:/home$ ll
total 28
drwxr-xr-x  7 root       root       4096 Sep 10 09:22 ./
drwxr-xr-x 20 root       root       4096 Sep 12 16:06 ../
drwxr-xr-x  3 root       root       4096 Sep  9 20:33 lesson2/
drwxr-x---  2 lighthouse lighthouse 4096 Sep  7 20:53 lighthouse/
drwxr-x---  4 ubuntu     ubuntu     4096 Sep  7 20:53 ubuntu/
drwxr-x---  5 wujiahao   wujiahao   4096 Sep 12 15:47 wujiahao/
drwxr-x---  3 wujiaqi    wujiaqi    4096 Sep 10 09:55 wujiaqi/

看看wujiahao和wujiaqi两个用户,他们的权限都只对拥有者开放rwx,所属组开放rx,其他用户全部屏蔽。那么作为wujiahao的我想去访问wujiaqi的家目录:

bash 复制代码
wujiahao@VM-12-14-ubuntu:/home$ whoami
wujiahao
wujiahao@VM-12-14-ubuntu:/home$ cd /home/wujiaqi
-bash: cd: /home/wujiaqi: Permission denied

就会被拒绝,也就是说:每创建一个用户,家目录中就会出现对应的目录,而用户各自的家目录相对于其他用户都是被隔离的。

那么,对于这种隔离,是不是绝对的铁律呢?

实际上也并不是,root用户可以访问任意用户的家目录。

bash 复制代码
root@VM-12-14-ubuntu:~# pwd
/root
root@VM-12-14-ubuntu:~# whoami
root
root@VM-12-14-ubuntu:~# cd /home/wujiaqi
root@VM-12-14-ubuntu:/home/wujiaqi# pwd
/home/wujiaqi

没错,root用户就是可以这么为所欲为,不仅可以进入其他普通用户家目录,而且可以在他们各自的目录下创建删除目录,甚至可以直接把这个普通用户删掉。

5.sudo与权限

实际上,用户和用户之间的壁垒也并不是绝对的。普通用户可以通过执行sudo命令完成暂时的提权来获得root的权限,如下:

bash 复制代码
wujiahao@VM-12-14-ubuntu:/home$ sudo cd /home/wujiaqi
[sudo] password for wujiahao: 

在普通用户的账号下,sudo指令最常用的是我们安装某些指令。

bash 复制代码
wujiahao@VM-12-14-ubuntu:/home$ sudo apt install zip
[sudo] password for wujiahao: 

那么现在有个很大的问题

问题:用户之间能通过sudo提权跨过壁垒,root用户能随意执行各种指令,Linux的权限到底还有什么意义?

不急,其实这反而能体现Linux的多用户精髓所在。虽然sudo能让普通用户暂时获得最高权限,但是你不妨想一想,是所有人都能用sudo指令吗?

bash 复制代码
wujiahao@VM-12-14-ubuntu:/home$ sudo cd /home/wujiaqi
[sudo] password for wujiahao: 
wujiahao is not in the sudoers file.  This incident will be reported.

作为普通用户的我试图通过sudo去访问其他用户的家目录,结果出现这些提示:我不在sudoers这个文件中。sudoers文件,实际上就是我们常说到的白名单。这里我们用root进入sudoers一探究竟

这个白名单上,压根就没有任何人的用户名------也就是说,当前这台机器,没有任何人能执行sudo指令。再来回头看看sudoers文件的属性:

bash 复制代码
drwxr-x---   2 root root       4096 Sep  7 20:52 sudoers.d/

它的拥有者和所属组都是root,并且不允许其他用户有任何权限。也就是说:要执行sudo------当前用户需要在白名单------白名单只有root有权限进行修改。也就是说,实际上依然是root掌管一切,其他用户只有经过root的同意才能将名字留在sudoers上。

6.Linux中的属性

1.权限一览

1.说完角色,我们再来谈谈属性。

上文反复提到rwx,那么他们到底是什么东西?

r(read):可读权限

w(write):可写权限

x(execute):可执行权限

bash 复制代码
wujiahao@VM-12-14-ubuntu:/home$ ll
total 28
drwxr-xr-x  7 root       root       4096 Sep 10 09:22 ./
drwxr-xr-x 20 root       root       4096 Sep 12 16:31 ../
drwxr-xr-x  3 root       root       4096 Sep  9 20:33 lesson2/
drwxr-x---  2 lighthouse lighthouse 4096 Sep  7 20:53 lighthouse/
drwxr-x---  4 ubuntu     ubuntu     4096 Sep  7 20:53 ubuntu/
drwxr-x---  5 wujiahao   wujiahao   4096 Sep 12 15:47 wujiahao/
drwxr-x---  3 wujiaqi    wujiaqi    4096 Sep 10 09:55 wujiaqi/

作为文件的拥有者,我们可以任意修改各个角色对该文件的权限。例如:先创建一个文件my.txt

bash 复制代码
wujiahao@VM-12-14-ubuntu:~$ touch my.txt
wujiahao@VM-12-14-ubuntu:~$ ls
gitcode  my.txt  test
wujiahao@VM-12-14-ubuntu:~$ ll
total 56
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 16:38 ./
drwxr-xr-x 7 root     root     4096 Sep 10 09:22 ../
-rw------- 1 wujiahao wujiahao 4960 Sep 12 16:38 .bash_history
-rw-r--r-- 1 wujiahao wujiahao  220 Sep  8 18:51 .bash_logout
-rw-r--r-- 1 wujiahao wujiahao 3771 Sep  8 18:51 .bashrc
drwx------ 2 wujiahao wujiahao 4096 Sep  8 20:21 .cache/
drwxrwxr-x 3 wujiahao wujiahao 4096 Sep 11 20:15 gitcode/
-rw------- 1 wujiahao wujiahao   20 Sep 11 20:19 .lesshst
-rw-rw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt
-rw-r--r-- 1 wujiahao wujiahao  807 Sep  8 18:51 .profile
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/
-rw------- 1 wujiahao wujiahao 4994 Sep 11 20:15 .viminfo
-rw------- 1 wujiahao wujiahao  183 Sep 12 15:32 .Xauthority

接着修改my.txt的权限
chmod u/g/o +/- rwx

bash 复制代码
----rw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt

再试着访问my.txt

vim my.txt

发现已经被拒绝。

2.目录的权限

进入/退出目录需要x权限,那么rw对目录意味着什么?

r:没有r无法看到目录中的文件 ,但可以在目录中创建文件

w:如果没有w无法在指定目录中创建文件

bash 复制代码
wujiahao@VM-12-14-ubuntu:~$ ll
total 64
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 16:55 ./
drwxr-xr-x 7 root     root     4096 Sep 10 09:22 ../
-rw------- 1 wujiahao wujiahao 5365 Sep 12 16:58 .bash_history
-rw-r--r-- 1 wujiahao wujiahao  220 Sep  8 18:51 .bash_logout
-rw-r--r-- 1 wujiahao wujiahao 3771 Sep  8 18:51 .bashrc
drwx------ 2 wujiahao wujiahao 4096 Sep  8 20:21 .cache/
drwxrwxr-x 3 wujiahao wujiahao 4096 Sep 11 20:15 gitcode/
-rw------- 1 wujiahao wujiahao   20 Sep 11 20:19 .lesshst
--wxrw-r-- 1 wujiahao wujiahao   23 Sep 12 16:55 my.txt*
-rw-r--r-- 1 wujiahao wujiahao  807 Sep  8 18:51 .profile
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/
-rw------- 1 wujiahao wujiahao 8591 Sep 12 16:49 .viminfo
-rw------- 1 wujiahao wujiahao  183 Sep 12 15:32 .Xauthority
wujiahao@VM-12-14-ubuntu:~$ chmod u-x gitcode
wujiahao@VM-12-14-ubuntu:~$ cd ./gitcode
-bash: cd: ./gitcode: Permission denied

可以看到,我们去掉x权限,是无法进入目录的。

2.重要问题解释

接着来谈几个问题

问题1:能修改其他人的文件的权限吗?

回答1:不能,用户只能修改自己的文件的权限

如下测试,用户只能修改拥有者为自己的文件,试图修改其他用户的文件会直接被拒绝

bash 复制代码
wujiahao@VM-12-14-ubuntu:~$ cd /home/lesson2
wujiahao@VM-12-14-ubuntu:/home/lesson2$ ll
total 12
drwxr-xr-x 3 root root 4096 Sep  9 20:33 ./
drwxr-xr-x 7 root root 4096 Sep 10 09:22 ../
drwxr-xr-x 2 root root 4096 Sep 10 09:37 mydir/
-rw-r--r-- 1 root root    0 Sep  9 20:34 yourdir
wujiahao@VM-12-14-ubuntu:/home/lesson2$ chmod u-r mydir
chmod: changing permissions of 'mydir': Operation not permitted

问题2:当拥有者本人没有某项权限,但所属组包含拥有者,且有这个权限,会发生什么?

回答2:Linux中想要对文件进行操作,首先会确认你是什么角色;既然确定了你是拥有者,并且没有该权限,那你便无权访问,而不会进行再次匹配角色。

例如我们这里以wujiahao身份创建了my.txt,并修改了拥有者的read权限。

bash 复制代码
wujiahao@VM-12-14-ubuntu:~$ chmod u-r my.txt
--wxrw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt*
wujiahao@VM-12-14-ubuntu:~$ vim my.txt

此时会发现即使所属组包含wujiahao且有read权限,但在匹配角色时只会匹配一次,read操作被拒绝。

问题3:root用户的权限真的无限吗?

回答3:是的,不要用你有限的认知挑战root无限的权限

不管是进入家目录,打开my.txt,修改my.txt,都如入无人之境。。。

bash 复制代码
root@VM-12-14-ubuntu:/home/wujiahao# whoami
root
root@VM-12-14-ubuntu:/home/lesson2/mydir# cd /home/wujiahao
root@VM-12-14-ubuntu:/home/wujiahao# ll
--wxrw-r-- 1 wujiahao wujiahao    0 Sep 12 16:38 my.txt*
root@VM-12-14-ubuntu:/home/wujiahao# vim my.txt
root@VM-12-14-ubuntu:/home/wujiahao# cat my.txt
I am root
I am supreme

问题4:如何理解x(可执行)权限?

回答4:可执行权限!=文件可以执行

我们知道,要进入目录首先需要x权限。而对于可执行文件(编译之后的c程序文件)可执行权限才有意义,如果一个文件没有可执行的属性(如普通文本文件),即使有可执行权限x也没有太大意义。

问题5:有了属性更改的指令chmod,有没有角色更改的指令?

回答5:有,叫做chown/chgrp,用于修改当前目录的拥有者或所属组

需要注意的是,操作系统默认不支持更改拥有者或所属组(有点甩锅的意思。。),需要更高权限(sudo或root用户)才能执行这个指令。
问题6:删除文件,与文件本身的权限有关吗?

回答6:无关。删除当前文件与当前文件所在的目录有无w写权限有关。例如,root在wujiahao创建的目录下创建文件,wujiahao是有权对该文件进行删除的。

7.权限表示法------八进制表示法

八进制表示法是一种更简洁、常用于命令设置权限的方法。它将每一组权限(rwx)视为一个二进制数,然后转换为一个八进制数字。

计算原理:

每个权限都有一个固定的数值:

  • r (读) = 4

  • w (写) = 2

  • x (执行) = 1

  • - (无权限) = 0

要计算一组的权限数字,只需将其有权限的值相加即可。

权限组合 计算过程 八进制数字
--- 0 + 0 + 0 0
--x 0 + 0 + 1 1
-w- 0 + 2 + 0 2
-wx 0 + 2 + 1 3
r-- 4 + 0 + 0 4
r-x 4 + 0 + 1 5
rw- 4 + 2 + 0 6
rwx 4 + 2 + 1 7

格式:

整个文件的权限由三个八进制数字表示,分别对应所有者所属组其他用户

[所有者权限数字][所属组权限数字][其他用户权限数字]

示例:

bash 复制代码
# 将 file.txt 的权限设置为 644 (rw-r--r--)
chmod 644 file.txt

# 将 script.sh 的权限设置为 755 (rwxr-xr-x),使其可执行
chmod 755 script.sh

# 将目录 mydir 及其内部所有内容权限设置为 700 (rwx------)
chmod -R 700 mydir
# -R 选项表示递归操作

8.缺省权限与umask

1. 什么是缺省权限?

当你在 Linux 中创建一个新的文件或目录时,系统并不会给它分配 777 (rwxrwxrwx) 或 666 (rw-rw-rw-) 这样宽松的权限,而是会遵循一个更安全、更合理的原则。这个系统自动赋予的初始权限,就叫做缺省权限(Default Permissions)。

系统有一个预定义的最大权限 ,但会用一个叫做 umask 的值来"削减"这个最大权限,从而得到最终的缺省权限。

  • 文件的最大初始权限666 (rw-rw-rw-),即没有执行(x)权限。这是出于安全考虑,防止新创建的文件自动拥有可执行权限。

  • 目录的最大初始权限777 (rwxrwxrwx),因为目录需要可执行(x)权限才能被进入和访问。


2. 什么是 umask?

umask (用户文件创建掩码)是一个用于控制缺省权限 的机制。它是一个四位的八进制数字(通常第一位是特殊权限位,常为0,所以通常我们看到的是后三位),它定义了创建新文件或目录时需要从最大权限中移除(屏蔽掉)的权限

你可以把它理解为一个"权限过滤器"或"遮罩"。系统用最大权限减去 umask 值,就得到了实际的缺省权限。

查看当前 umask 值:

使用 umask 命令即可。

bash 复制代码
$ umask
0002
# 或者
$ umask -S
u=rwx,g=rwx,o=rx
# 符号表示法,显示了最终用户拥有的权限,而不是掩码本身

最终权限计算=起始权限 & (~umask)

3. 如何设置和修改 umask?

umask 值可以在以下几个级别设置:

a. 临时修改 (对当前Shell会话有效)

直接在终端中输入 umask 命令加上新的值。

bash 复制代码
# 将 umask 设置为 077 (非常严格,仅用户自己可读写)
umask 077

# 验证
umask
# 输出:0077

# 之后创建的新文件权限将是 600 (rw-------)
# 之后创建的新目录权限将是 700 (rwx------)
b. 永久修改 (对用户生效)

umask 命令添加到用户的 shell 配置文件中,这样每次登录都会自动设置。

  • 对于 Bash 用户,编辑 ~/.bashrc 文件。

  • 对于 Zsh 用户,编辑 ~/.zshrc 文件。

在文件末尾添加一行,例如:

bash 复制代码
# 设置 umask 为 002,便于组协作
umask 002
点击并拖拽以移动

然后运行 source ~/.bashrc(或 source ~/.zshrc)使更改立即生效,或者重新打开终端。

c. 系统全局修改 (不推荐轻易修改)

可以修改 /etc/profile/etc/bash.bashrc 这样的全局配置文件来为所有用户设置默认 umask。但这会影响整个系统,需要谨慎操作。

9.粘滞位

当前面临一个情况:

通过以上解释我们能了解Linux的安全性,但当一个工程需要协作文档时怎么办?

没错,很容易能想到一个解决办法------共享文档,所有成员都能读写。但与此同时伴随着风险:万一有人删除文档怎么办?Linux针对这种协作文档的情况作出了特别解决办法,就是粘滞位。

首先,我们先看看Linux中的"官方协作文档"------temp文档。

bash 复制代码
wujiahao@VM-12-14-ubuntu:/$ ls
bin  boot  data  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var
wujiahao@VM-12-14-ubuntu:/$ ll
total 76

drwxrwxrwt  12 root root  4096 Sep 13 14:23 tmp/

可以看到这个文档对所有用户都开放了读和写的权限,但是出现了一个我们从未见过的标志位------t,这就是粘滞位。

chmod +t filename

由以上命令即可实现对某文档添加粘滞位,添加粘滞位后除了拥有者外其他用户均无法删除文档,即使他们有读写权限。

相关推荐
Evan芙1 天前
Linux 进程状态与进程管理命令
linux·运维·服务器
doris6101 天前
2025年设备管理系统:智能运维成新标杆
运维
qsjming1 天前
EXT4文件系统特性说明
运维
码农12138号1 天前
Bugku HackINI 2022 Whois 详解
linux·web安全·ctf·命令执行·bugku·换行符
Joren的学习记录1 天前
【Linux运维进阶知识】Nginx负载均衡
linux·运维·nginx
用户2190326527351 天前
Java后端必须的Docker 部署 Redis 集群完整指南
linux·后端
胡先生不姓胡1 天前
如何获取跨系统调用的函数调用栈
linux
Jtti1 天前
服务器防御SYN Flood攻击的方法
运维·服务器
2501_941982051 天前
RPA 的跨平台部署与统一自动化策略
运维·自动化·rpa
b***25111 天前
电池自动分选机:精密分选保障新能源产业质量核心
运维·自动化·制造