目录
一、Linux权限
1.1 什么叫做权限
权限的本质是一套规则系统,它明确定义了“谁”在“什么条件下”可以对“什么资源”进行“哪些操作”,也就是能不能访问资源的问题。
1.2 为什么需要有权限
Linux
是多用户操作系统,Linux
同时会有大量人员进行登录访问,其中用户分为普通用户和超级用户root
,有权限能更好的进行用户管理。
1.3 Linux下用户问题和角色问题
在Linux
下,权限=人+文件属性
,权限是针对特定群体的,在Linux
下用户分为普通用户
和root
,不论是普通用户还是root
用户,目标群体必须天然具备对应的属性才能访问对应文件(可读r
,可写w
,可执行x
)。
1.3.1 Linux用户问题
超级用户root
:基本不受权限约束,属于Linux
系统中的特权级别;普通用户:受权限约束。
切换用户指令:su [用户名]
,超级用户可以直接切换到普通用户:
如上图,root
用户可以直接切换到普通用户,这就是root
账号的特权表现之一。而普通账户切换成root
账户就没有那么容易了。
如上图,普通用户切换成root
用户需要我们输入root
账户的密码。其中root
可以省略,su
默认切换到root
用户。
普通用户切换成root
用户除了上面的指令还有一个指令su -
:
如上图,使用su -
进行切换后会弹出一条登录信息,su -
的作用是让目标用户以重新登录的方式切换。
注意:普通用户userA
想切换到普通用户userB
,他需要输入userB
账户的密码。
普通用户短暂提权的方法
假设普通用户想要安装软件并拷贝到系统目录下,但是它不让普通用户进行拷贝,必须要有root
权限,那必须要root
用户来吗?那每个人都要root
用户来,那root
用户不得忙死。不是这样的,普通用户也可以。
普通用户也可以短暂获得root
权限,就是使用sudo
指令! 普通用户创建文件,默认是以自己的身份创建的。
现在我就想以root
的身份进行创建文件,那么sudo
!
诶,怎么没有反应,它报出一条信息:用户wuhu不在sudoers文件中,此次事件将被报告。
普通用户想要获得root
权限,也是需要条件的,如果所有的普通用户都可以进行提权获得root
权限,它还分什么普通用户和超级用户root
。
普通用户想要提权,必须是root
的白名单/etc/sudoers
上的用户,/etc/sudoers
是Linux
系统中控制sudo权限
的核心配置文件,只有被列在该文件中的用户或用户组才能使用sudo
命令获取临时root
权限,它必须经过root
授权!
这个文件只有root
用户有权限更改。现在我们切换成root
用户,并将普通用户添加到白名单上。
如上图,切换到root
账户后,打开/etc/sudoers
文件并在对应部分添加wuhu ALL=(ALL) ALL
。建议使用vim
指令进行修改,vim
指令后期博客会讲解。
添加成为root
白名单上的账户后,就可以进行短暂提权操作了。
1.3.2 Linux角色问题
我们的权限是依附于角色的,没有角色之分,权限的设定也就没有意义。在Linux
下,角色分为拥有者角色、所属组角色和other角色
。拥有者就等同于房主(你自己),所属组就等同于你的家人,other
就等同于陌生人。
拥有者和other
角色都容易理解,为什么要有所属组呢?那是为了对文件权限进行局部范围组级别的管理,方便地给一组用户分配相同的权限,而不需要逐个用户设置。比如,一个“开发组”可以对项目代码文件有读写权限,而其他人只有读权限。
以上图中txt
文件为例,文件的拥有者是root
,所属组是root
,不是拥有者角色和所属组角色就是other
角色,所以wuhu
对于该文件来说就是other
角色。
1.4 文件权限属性问题
Linux
下常见的权限有三个,只读r、只写w、可执行x
,接下来下图中会显示文件信息对应位置对应的分别是什么。
其中文件类型:
-
表示普通文件源代码、文本、动静态库、可执行文件等
d
表示目录文件l
表示链接文件p
表示管道文件c
表示字符文件b
表示块设备文件
剩下的权限部分,三个为一组表示对应角色所对应的权限。可读就是r
否则就是-
,可写就是w
否则就是-
,可执行就是x
否则就是-
。 它们三个的顺序是固定的。
1.4.1 如何正确表达一个文件的权限
以上图test.exe
文件为例,该文件是一个普通文件,拥有者是wuhu
,所属组是wuhu
,拥有者的权限是可读可写可执行,所属组的权限是可读可写可执行,other
的权限是可读不可写可执行。
2.1 权限的指令操作
权限=人+文件属性
,我们首先对文件属性进行更改。
如上图,我创建了一个文件,并向其中写入了一行文字,接下来我要修改文件属性。想要修改文件属性只能是超级用户root
或者是文件的拥有者。
chmod
命令,作用:用来更改文件的权限。三类权限对象:uUser - 所有者
、gGroup - 所属组
、oOthers - 其他人
、aAll - 所有人
。
chmod
的两种使用方法:符号模式和数字模式。
- 方法一:符号模式
通过符号+、-、=
来增加、删除或直接指定权限。+
增加权限,-
移除权限,=
直接设定权限(覆盖之前的权限)。
如下图,是对文件权限修改的操作。
- 方法二:数字模式
直接使用一个三位数的数字来代表完整的权限。这种方法更快捷,但需要简单计算。将r、w、x
视为二进制位,有权限则为1
,无则为0
。例如rwx
为7
,r--
为4
。
语法:chmod [ABC] 文件名
。
2.2 没有权限的表现
上面讲了如何更改文件的权限,我们再来看没有权限会有什么表现。
现在我打开了两个普通用户,并登录在了同一个路径下。
接下来,下图中zbc
将以other
的身份对文件进行访问。
接下来,下图中wuhu
将以拥有者的身份对文件进行访问。
拥有者的读写权限被去除之后,身为拥有者角色的wuhu
就不能对文件进行读写操作了,这倒是符合我们的预期,但是! 大家不要忽略了一个问题,wuhu
还是所属组呀!所属组是有读写权限的呀,但现在既定事实就是不能进行读写操作!
这是为什么? 注意:用户在访问文件的时候,系统只会对你相对于文件的身份角色验证一次! 举个例子,如果你是文件的拥有者,检查到此结束,你将以拥有者的角色访问文件,否则,系统继续检查你是不是文件的所属组,如果是,检查到此结束,你将以所属组的角色访问文件,否则,你将以other
的角色访问文件。
那么如何验证呢? 很简单,现在wuhu
是文件的拥有者,他可以执行chown
操作将文件的拥有者改成其他人。比如将文件的拥有者更改成普通用户zbc
。
如上图所示,我是文件的拥有者,我想把文件的拥有者改成zbc
但是被拒绝了,这是为什么? 这是因为普通用户无权更改文件的拥有者,就算你是文件的拥有者也不行!
这也很合理,你想一下如果有个人把事情搞砸了,弄出一口黑锅,如果没有上面的规则,他转手就将文件给别人了,那这不就乱套了吗。所以更改文件的拥有者需要root
权限。
那么我们就短暂提权,将文件给zbc
。
现在文件的拥有者是zbc
,wuhu
属于所属组角色了,我们再使用wuhu
对文件进行读写操作。扩充:chgrp
更改文件的所属组。同时更改文件的拥有者和所属组:chown 拥有者:所属组 文件名
。
这样就验证了用户在访问文件的时候,系统只会对你相对于文件的身份角色验证一次!
接下来,root
将对文件进行访问。
上面没有问题,符合我们的预期。
直到有一天,wuhu
身为文件的拥有者,他不想再让root
用户读写了,于是他就将other
的rw
权限去除了。
超级用户root
属于Linux
系统中的特权级别,他完全不受任何文件权限的约束! 文件权限就像是一个国家的法律,它对所有普通用户都具有约束力。但root
用户是国王/皇帝,凌驾于法律之上,法律无法约束他。
关于可执行
如上图,我是文件的拥有者,我给文件加上了可执行,紧接着我就执行该文件,但是运行失败了,这是为什么?
注意:当文件本身是一个能够执行的文件且具有可执行权限时,这个文件才能运行。 给文件可执行权限x
,并不是让该文件能够执行,而是该文件要执行时,系统允许文件执行。如果没有可执行权限,当文件想要执行时系统直接就拒绝了。
3.1 三个子问题
3.1.1 进入一个目录文件需要什么权限?
现在我在当前目录下,创建了一个新的目录,我对于该目录而言是拥有者角色。
接下来,为了搞清楚问题的答案是什么,我们可以一次次尝试,首先就是去除r
权限。
所以r
权限决定了用户是否有权利查看指定目录下的文件属性。
紧接着,我们恢复r
权限,去除w
权限。
所以w
权限决定了特定用户是否有权利在该目录下新增文件、删除文件和修改文件名
。
紧接着,我们恢复w
权限并去除x
权限。
所以想要进入一个目录文件需要的是x
权限。
3.1.2 为什么新建的目录和普通文件的权限是我们所看到的样子?
如上图所示,目录文件是775
,普通文件是664
,为什么是这样而不是其他的呢?
那是因为Linux
存在权限掩码umask
,对于普通文件而言,起始权限是666
,对于目录文件而言,起始权限是777
。
如上图就是权限掩码,我们只关注标注的部分。
文件的最终权限等于起始权限“去掉”umask
,计算公式是最终权限 = 起始权限 & (~umask)
。
如上就是普通文件和目录文件最终权限的计算过程。
只要更改掉umask
,再次创建的文件默认权限就会更改。
如上图,新建立的目录文件和普通文件的权限都改变了,将umask
更改为000
,也进一步验证了目录文件的起始权限是777
,普通文件的起始权限是666
。
也不必担心,随意更改导致umask
的默认值遗忘的情况,在命令行上更改属于临时更改,当你退出登录之后,再次重新登录时umask
就又会恢复成默认值。
3.1.3 权限---
的文件能够删除吗?及 粘滞位问题
现在普通用户wuhu
,在他创建的目录下。
有一天超级用户root
也跑到了他的目录下,并创建了一个文件。
wuhu
比较好奇,root
在搞什么,于是就开始研究这个文件。
如上图,wuhu
想看这个文件看不了,想写这个文件写不了,于是wuhu
急了,不让读写,我把它删掉!
就这样wuhu
很愉快的把root
在他的目录下创建的文件删除了,请问这合理吗?
1、权限的合理性,file
目录是wuhu
创建的,他是拥有者,具有w
权限,所以可以删除文件,即使是root
创建的。
2、想象一下,你在你的家里玩着手机唱着歌儿,突然有个陌生人闯进了你的家里,并在你的家里放了他的箱子,并告诉你不能动他的东西,此时你当然有权利把他的东西丢出去了,这是你家。这是合理的。
结论:删除文件的权限由目录决定,与文件本身无关。对目录有写权限的用户可以删除其中的任何文件,包括属于root
且权限为---
的文件。除非该目录被设置了粘滞位。
关于粘滞位
如果我们想让多用户之间共享文件该怎样做呢? 首先不能在一个普通用户的目录下进行。
上图已经将的很清楚了,所以共享文件一定不会在普通用户的家目录下。那在哪里呢? 它需要在系统级别的路径下。
现在有三个普通用户进行角色扮演,分别是wuhu、zbc、oth
。root
在根目录下创建了share
目录用于共享文件。
今天wuhu
和zbc
两个普通用户开始共享文件,wuhu
创建了一个文件,并在其中写了一些内容邀请zbc
来看。
后来,wuhu
不想分享内容了于是就把权限关闭了。后来第三方oth
来了,他想看看wuhu
和zbc
在搞什么东西。
oth
访问文件别拒绝,于是一气之下就把wuhu
所创建的文件删除了!那么这合理吗?
从权限的角度看,oth
拥有目录的w
权限,于是可以删除wuhu
所创建的文件,这很合理,但是从场景来看,这可是共享文件的公共场合,你oth
没有经过文件拥有者的允许就将文件删了!这太不合理了!
那么这个问题该如何处理呢? 如何既可以共享文件,又可以不让除了超级用户root
和文件拥有者之外的人删除文件呢? 第一不能让root
去除other
角色的w
权限,因为wuhu
也是other
,去除之后wuhu
就不能共享文件了。那该怎么办呢?
这时候就可以提出粘滞位了,粘滞位是一种特殊的权限,t
就是粘滞位的符号标志。 给目录设置了粘滞位之后,规则变为:即使一个目录对所有人可写o+w
,用户也只能删除或重命名该目录下【自己拥有】的文件或子目录,而不能删除或重命名【其他用户】的文件。
紧接着为了解决这个问题,root
用户对share
目录加上了粘滞位权限。
紧接着wuhu
在极度舒适的情况下与zbc
进行了又一波文件分享,之后就将权限关闭了,后来oth
又来了,他又想看看他们在搞什么东西。
如上图,oth
看到他们又不让访问文件,于是oth
又生气了,你这wuhu
是不长记性呀,看我给你删掉!
总结:加上了粘滞位权限的目录,其中的文件只能由超级用户root、目录的拥有者、文件的拥有者删除
。
一个经典的例子: /tmp
目录在几乎所有的Linux
系统上,/tmp
目录都是一个临时目录,允许所有用户在里面创建文件。
总结:
以上就是本期博客分享的全部内容啦!如果觉得文章还不错的话可以三连支持一下,你的支持就是我前进最大的动力!
技术的探索永无止境! 道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~