【Linux】Linux的权限

引言

        在Linux系统中,权限机制是整个系统安全体系的核心基石,也是Linux区别于Windows的关键特性之一。Linux将一切资源抽象为文件,并通过严格的权限规则划分拥有者、所属组以及其他用户的访问能力,从根本上防止非法读取、篡改和误删数据。无论是日常文件管理、服务部署,还是服务器运维,权限配置不当都是绝大多数的安全漏洞、程序报错、访问失败的直接原因。熟练掌握读、写、执行权限的含义,理解数字权限与符号权限的转换逻辑,是入门Linux运维、后端开发的必备基础。本文将从零梳理Linux的权限机制的完整原理与实操用法。

1、用户

        在Linux中,用户分为两种,一种是root用户,也就是我们常说的超级用户,一种是普通用户,也就是我们平常操作所用的用户。root用户权限高,普通用户权限低,受管控。

        Linux的大部分系统文件都不允许普通文件修改,如果我们想对它们进行修改,就必须切换为root用户,在终端里,我们可以直接通过su/su -命令来切换用户,命令后面接具体的用户名时就是切换到该用户,不接用户名时就默认切换到rooot用户

su
su -

        可以看到,su和su -都可以切换为root用户,它们两的区别就在我红框圈出来的地方,使用su切换用户时,所处路径会保持切换之前的位置不变,使用su -则会进入所切换用户的家目录中,一般情况下我们使用su就足够了。在从普通用户切换为超级用户时需要输入超级用户账号的密码,从超级用户切换为普通用户就不用输密码。

        此外,在有些情况下,我只是需要超级用户的权限进行少量的操作,如果反复切换用户会很麻烦,这时候我们就可以用一个命令“sudo”来对我们的指令纪念性短暂的提权,此命令后面接的命令会被判定为时root用户输入的命令。比如上一篇文章中我们在安装zip等命令时就使用了sudo这个命令。

2、权限

        现在我们来正式进入对权限的学习,首先我们要思考的第一个问题是:权限是什么?简单来说,权限的本质就是你能或不能做什么事情,就像上面说的,你是普通用户,你就不能安装原件,必须是超级用户才可以。第二个问题是:为什么要有权限?大家不妨设想一下,如果有一天公司里新来了一个实习生,因为不会操作误删除了系统中的重要组件,是不是会导致很严重的后果。所以要有权限的原因是为了控制用户的行为,防止错误的发生。权限首先限制的是角色,权限要求目标必须具备对应的属性,权限=角色+目标权限属性

        在上篇文章中关于文件属性的部分,有一部分我们没有学习,是因为它们都是和权限有关的属性,这节课我们就来讲解一下它们。在讲解这张图之前,我们需要先了解一下Linux系统中角色的概念,角色分为三种,分别是:拥有者、所属组、其他用户。拥有者就是当时创建这个文件的用户,所属组就是该用户所属的组别,其他用户就是其他用户。上图中红色下划线标注的两个角色分别就是该文件的拥有者和所属组,其他用户默认不显示。前面我用红框框出来的位置我们已经知道了它代表着文件的类型,后面用绿框框出来的部分我们可以看到由九个字符组成,我们将其每三个分为一组,它们分别对应的就是拥有者、所属组和其他用户的权限类型。

        每组的三个字符分别代表该角色的读、写、执行权限,横杠 ‘ - ’ 代表该角色无对应权限,当前我们可以看到拥有者和所属组拥有读写该文件的权限,其他用户只有读的权限,那如果我连读都不想让其他用户读呢?这时候我们就可以用chmod来更改权限,chmod后接 ‘ u ’代表改变拥有者权限,加 ‘ g’为所属组,加 ‘ o’为其他角色,加 ‘ a’为所有角色都更改,后面再加减号 ‘ - ’ 代表取消某权限,加加号 ‘ + ’ 代表添加某权限。

        可以看到当前其他用户的读权限也被我去掉了,我们再来试试将所有人的权限都取消。

重点

1、用户只能更改自己的文件权限

        用户只能更改拥有者为自己的文件权限,我们来用一个其他文件来试试看。我先进入ubuntu的上级目录home,尝试修改lighthouse的权限,可以看到,系统会提示我们权限等级不够无法修改该文件的权限。

 2、如果没有权限,系统会拒绝让我们访问文件

        我们之前将test文件的所有权限都取消了,那么此时我们还能对该文件进行访问吗?我们来试一下。可以看到,在取消了权限后,哪怕是身为文件拥有者的我们也无法再对文件进行读写操作,系统会提示我们权限不足无法访问。

3、确定权限信息的时候,系统会先确定用户是谁?是拥有者,所属组还是其他用户?(重点)

        我们来做个测试,先将test文件所属组和其他用户的权限恢复,试试看能不能对文件进行访问。

        可以看到,我们仍然没有权限对文件进行读写,这时候就有个疑问了:虽然我作为拥有者没有权限,但是所属组也是我啊,或者说我还在所属组里,为什么明明所属组有权限我却还是无法进行访问呢?

        这就要归功于Linux系统确定用户所属角色的机制了:系统在确定用户是什么角色时,只会确定一次,优先确定你是什么角色,就以什么角色的权限来判定你是否有权限对文件进行访问,匹配顺序是拥有者 -> 所属组 -> 其他用户。意思就是,当用户申请访问某个文件时,系统就会开始确定你的角色,发现你是拥有者,就只会按拥有者的权限来判定,判定失败了也不会接着向后确定你是不是在所属组里或者是不是其他用户,第一次确定你没有权限后就结束,直接判定为你没有权限访问该文件。

        这时候我们再试试将拥有者改成root我们能不能访问test文件。使用chown可以改变文件的拥有者,使用chgrp可以改变所属组,不过需要注意的是,系统默认不允许我们将文件给别人,想给别人就必须得是高权限,所以我们将用户切换为root再进行操作。可以看到,我们将文件的拥有者改为root用户后,我们再尝试访问文件时,系统就会确定我们为所属组成员,就可以正常对文件进行访问了。

4、root不受权限约束

        在Linux系统中,root用户拥有比所有权限都更高一级的权限,上述我们所说的所有权限对root用户都没有影响,我们可以做个测试来验证一下。

        可以看到,即便我们将所有人的权限都取消,root依旧可以对文件进行随意访问。

5、可执行权限 ≠ 文件可以执行

        接下来我们来了解一下可执行权限,可执行权限决定了我们能否去执行一个文件,但是需要注意的是,拥有文件的可执行权限并不等于我们就可以执行这个文件,一个文件想要被执行,首先需要它本身就是一个可执行文件,其次才是拥有可执行权限。我们即使给自己加上了可执行权限,文件依然无法执行

6、八进制数表示权限

        之前我们说过,三种角色的权限组里都有三个字符来表示是否拥有该权限,如果我们将拥有权限记作 ‘ 1 ’ ,无权限记作 ‘ 0 ’ ,我们就可以用三个二进制数来表示三种角色的权限,就拿现在test文件的权限来举例,拥有者的权限可以记作 ‘ 111 ’,所属组的权限记作 ‘ 110 ’,其他角色的权限记作 ‘ 100 ’,将它们三个转化成八进制数并合在一起,我们就得到了一组能表示文件权限内容的八进制数,test的八进制数为 ‘ 764 ’。我们在修改权限时也可以通过直接输入八进制数来进行修改。

三个问题

        在完成了上面对于权限基础知识的学习之后,我们还有三个问题需要进行探讨。

1、目录权限

        上面我们所有关于权限的讲解都是基于普通文件来进行的,那么目录文件的权限与普通文件有什么区别呢?我们先来看看一个基础目录都由什么权限构成:

        可以看到目录的权限为775,那现在我有两个疑问:1、如果想要进入目录需要什么权限?2、rwx权限对目录来说分别代表着什么?接下来我们来挨个进行学习。

        要研究第一个问题,我们就先来试试,分别去掉r、w、x时,去掉哪个会导致文件无法进入。可以看到,当我们取消掉dtest目录的可执行权限时,目录就无法进入了。由此可见,想要进入目录需要的是可执行权限。

        接下来我们再看看第二个问题,我们已经知道了x权限对目录来说意味着是否可以进入文件内部,我们接着看看rw权限对目录来说意味着什么。

去掉r权限

        当我们去掉r权限,进入文件,想看看当前目录下有什么文件时,我们发现,系统报错说我们没有相应的权限,这时候我们就知道了,r权限对文件来说,意味着你能否查看目录里的内容。

去掉w权限

        这回我们去掉w权限后再进入目录,查看发现目录里什么都没有,这时我们尝试创建一个文件,我们发现,我们没有权限在目录里创建文件。这可以证明w权限对目录来说意味着是否可以更改目录中的内容。

        此外,我们还有一个拓展内容,假如我们是超级用户,现在我们看上了你目录里的某个文件,我将它的所有人,所属组都改成root,将其他所有权限也都改成0,这时候,按我们之前所学的内容来看,其他用户是不是无论如何都无法使用这个文件了?

        但是在这个时候,如果我们尝试删掉这个文件会怎么样呢?

        这时候我们发现,在我们尝试产出这个文件后,系统会弹出一条信息问我们是否确定删除该文件,这时候我们输入 ‘ y ’,我们就成功将这个文件删除了!这是为什么呢?因为在Linux系统中,一个文件是否能被删除,与文件本身无关,与文件的权限也无关,只与文件所处目录的w权限有关!也就是说作为目录拥有者,有w权限,就能删除任意在该目录下的文件,管你是谁的文件我都有资格去删除。

        最后一点,Linux中多用户之间是如何互相隔离的呢?Linux系统规定,任何用户都无法进入其他用户的家目录

2、缺省权限

        相信很多同学在最开始看到文件和目录的权限时就存在一个疑问:为什么默认权限时我们现在看到的这样?为什么它不是别的?其实在Linux系统中,对于普通文件来说,起始权限为666,默认不带可执行权限;对于目录文件来讲,起始权限为777,默认携带可执行权限。可是在我们上面的讲解中好像却不是这样,文件默认权限为664,目录默认权限为775,这是为什么呢?

        因为系统默认会存在一个叫做权限掩码的概念,在命令行输入umask我们就可以看到当前的权限掩码,可以看到我们当前的权限掩码为0002,第一个零我们暂时忽略,最终权限 = 起始权限 & ~umask,就是起始权限按位与上umask的反码。

        所以现在大家理解664和775是怎么来的了吧。那么umask的目的是什么呢?为什么要有umask呢?使用umask的目的就是,希望所有在umask中出现的权限,在最终权限中都不出现。至于为什么要有umask,首先,默认权限由操作系统本身决定,在创建文件之前是无法进行认为修改的,那如果我就想取消一些权限或增加一些权限,就都得人为地手动修改,在大型项目中就很麻烦,umask就应运而生了。umask的存在其实是系统可配置、可以灵活满足需要的一种表现,在特殊情况下,配置umask可以控制文件的默认权限,让我们的代码都是可控的。

        当我们尝试将umask改为0000,再创建新文件时,新文件的权限就变成666了。所以在使用中我们可以灵活运用umask来达成一些特殊的效果,当然,如果你改的太多,忘记自己之前改过umask也不用担心,每次重新启动机器,umask都会恢复为默认值0002。

3、粘滞位

        之前我们讲过,在Linux系统中任何用户都无法进入其他用户的家目录,那如果我现在就需要多个用户之间进行合作怎么办?我们就只能将目录创建在家目录以外的地方。但这样也会带来一个弊端,首先,如果我们想所有合作的用户都可以在里面自由的创建自己的工作文件,我们就必须得开放其他用户的w权限,但是一旦我们开放了这个权限,就意味着任何人都可以对我们的目录进行删除操作,如果有别有用心的人将我们辛苦做好的文件删掉了怎么办?

        Linux系统针对这种情况也设置了应对之法,系统中设置了一个特殊的权限标志位叫做粘滞位,在共享类文件里,粘滞位的存在可以让非文件的拥有者无法删除文件,但是所有人还是可以在当前目录下自由的新建文件。如何添加这个粘滞位呢?只要在命令行输入chmod +t,就可以将其他用户的x权限变成特殊的t权限,这个位置就被称为粘滞位。如下图所示。

        其实当我们进入根目录,我们也可以看到Linux系统内其实默认给我们配置好了一个带粘滞位的共享文件,名为 “tmp”。

总结

        本文围绕Linux权限机制展开讲解,从基础的读写执行权限、数字权限配置,再到目录权限、缺省权限和粘滞位的讲解,细致地带大家将Linux系统的内容学完了,希望大家都能掌握,我们一起进步。

评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值