Linux中的权限管理
前言
在Linux系统中,权限管理是系统安全和资源管控的基石。无论是日常文件操作、服务部署,还是多用户协作,错误的权限设置轻则导致"Permission Denied"报错,重则引发数据泄露或系统崩溃。
本文将从权限本质出发,通过大量实例带你掌握:
- 权限三要素:
r/w/x
对文件和目录的不同含义 - 数字与符号表示法:为什么
chmod 755
比chmod u+rwx
更常用? - 特殊权限:SUID、SGID、Sticky Bit 的实战应用场景
- ACL高级控制:如何实现精细化权限分配?
- SELinux:超越传统权限的强制访问控制
无论你是:
- 被
sudo
权限困扰的新手 - 需要部署Web服务的运维工程师
- 面临团队协作开发的程序员
都将在这里找到可立即落地的解决方案。文中包含18个高频场景示例和5个避坑指南,助你彻底摆脱权限管理的盲区。
“知其然更要知其所以然”——我们不仅讲解命令用法,更会通过内核视角分析权限校验的底层逻辑。现在,让我们从第一个 ls -l
的输出解读开始这段探索之旅!
为什么需要深度掌握权限?
- 当你的PHP项目突然无法写入日志文件时…
- 当团队成员误删了重要数据却无法追溯时…
- 当黑客利用配置错误提权入侵服务器时…
这些问题的答案,都藏在权限管理的细节中。
目录
一、shell命令以及运行原理
我们都知道Windows以图形化界面为交互方式,而Linux以命令行界面为交互方式。Windows和Linux的交互方式虽然不同,但本质上是一样的,图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是我们所说的“外壳程序”。
Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户不能直接使用kernel,而是通过kernel的“外壳程序”,也就是所谓的Shell,来与kernel沟通。
Shell最简单的定义就是“命令行解释器”:
1)将使用者的命令翻译给核心(kernel)处理。
2)将核心的处理结果翻译给使用者。
对比Windows中的图形化界面(GUI),我们操作Windows并不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作。Shell对于Linux具有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核,反馈结果再通过内核运行出结果,通过Shell解析给用户。
Shell运行原理:
- 创建子进程,让子进程进行命令行解释。
- 子进程出现任何问题,都不影响父进程Shell。
对比到Windows当中就是,我们每运行一个程序就是创建了一个子进程,例如,登录微信、QQ。而这些子进程当中任何一个进程出现问题,都不会影响父进程,例如,当你的QQ出现卡死情况(程序异常)或你的QQ被关掉(程序终止),但其他子程序仍然可以运行。
注意: Shell只是所有外壳程序的统称,例如在centos 7当中的外壳程序名叫bash。
二、Linux中的权限概念
在Linux下有两种用户,分别是超级用户(root)和普通用户。超级用户可以在Linux下做任何事情,几乎不受限制,而普通用户一般只能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。
换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。
超级用户的命令提示符是“#”。
普通用户的命令提示符是“$”
1、如何实现用户账号的切换
可能有时你的权限不够,需要从普通用户切换到超级用户,进而完成某些操作。
语法: su 用户名
功能: 用户切换。
从普通账号切换为root账号:
从root账号切换为普通账号:
注意事项:
- 从普通账号切换为root账号时,指令当中的root可省略,因为root账号只有一个。
- 该指令也可以从一个普通用户切换为另一个普通用户,输入待切换用户的账号密码即可。
- 切换用户后,若想切回上次的用户,可通过Ctrl+D实现。
- 如果root和用户的密码设置成同一个可能会造成认证失败情况
2、如何仅提升当前指令的权限
但可能某些情况下,你只想提升当前指令的权限,那么不必切换到超级用户。
语法: sudo 指令
功能: 提升当前指令的权限。
例如,我现在要以一名普通用户的身份,修改另一个普通用户的账号密码。
当你输入完你的密码后,可能会出现以下提示:
该提示说你没有被超级用户(root)添加到信用列表当中,所以该条指令的权限得不到提升(你想想嘛,怎么可能让一个普通用户随意更改另一个普通用户的密码嘛),只有当你被超级用户添加到信任列表后,你才拥有提升当前指令权限的能力。
3、如何将普通用户添加到信任列表
那么首先你得先切换到超级用户,只有超级用户才有权力将普通用户添加到信任列表。
添加完毕后,该用户就可以使用sudo指令,也就是拥有提升当前指令权限的能力了。
三、Linux中的权限管理
1、文件访问者的分类(人)
对于用户来说,权限可以将用户分为三大类:
- 文件和文件目录的所有者(文件拥有者)。
- 文件拥有者所在的组的用户(文件所属组)。
- 其他用户(other)。
注意:
对于某一文件而言,其拥有者、所属组和other就是由超级用户(root)和普通用户所扮演。
在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有你一个人(此时该组就以你的用户名为组名)。
那么为什么会有所属组这个概念呢? 下面举个例子。
在某个公司当中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马模式),而你就是A组当中的一员。
如果没有所属组的概念,那么当你创建了一个文件后,要么就是只有你自己(拥有者)能看到,要么就是其他人(other)也都能看到。而你所希望的是你自己和你的小组成员能看到,剩下的人看不到。
于是就有了所属组这个概念,这时你就可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作。
我们可以通过指令ll来查看某一文件或文件目录的拥有者和所属组。
注意:注: 除了文件拥有者和文件所属组之外的都叫other。
2、文件类型和访问权限(事物属性)
权限涉及到某个具体的事物来说,我们还需要讨论事物本身的属性。对于文件来说,我们应该讨论其文件类型,以及是否具有可读、可写和可执行的属性。
使用指令ll,我们可以看到前面有一串字符,这串字符实际上就代表着该文件的类型和属性。
这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型。
不同的字符代表不同的文件类型。
- -:代表普通文件。
- d:代表目录。
- l:代表链接文件(类似于Windows当中的快捷方式)。
- b:代表块设备文件(例如硬盘、光驱等)。
- p:管道文件。
- c:字符设备文件。
- s:套接口文件。
注意: 在Linux当中,文件类型与文件后缀无关。
每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。
若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性。
现在我们来阐述一下该文件的类型以及权限。
tset.txt目录是一个普通目录,该目录的拥有者和所属组对其都是可读可写可执行的,但该文件的other对其只有读的权力和可执行的权力。
3、文件权限值的表现方法
- 字符表示方法
ll指令打印文件权限值时的表示方法就是字符表示法。例如
字符表示法 | 说明 |
---|---|
f - - | 仅可读 |
- w - | 仅可写 |
- - x | 仅可执行 |
f w - | 可读可写 |
f - x | 可读可执行 |
- w x | 可写可执行 |
f w x | 可读可写可执行 |
- - - | 无权限 |
- 八进制数值表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。例如
字符表示法 | 二进制 | 八进制数值表示法 | 说明 |
---|---|---|---|
r– | 100 | 4 | 仅可读 |
-w- | 010 | 2 | 仅可写 |
–x | 001 | 1 | 仅可执行 |
rw- | 110 | 6 | 可读可写 |
r-x | 101 | 5 | 可读可执行 |
-wx | 011 | 3 | 可写可执行 |
rwx | 111 | 7 | 可读可写可执行 |
— | 000 | 0 | 无权限 |
4、文件访问权限的相关设置方法
1)如何改变文件访问权限
语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。
常用选项: -R 递归修改目录文件的权限。
chmod指令权限值的格式:
格式一: 用户符号 +/-/= 权限字符
- +:向权限范围增加权限代号所表示的权限。
- -:向权限范围取消权限代号所表示的权限。
- =:向权限范围赋予权限代号所表示的权限。
用户符号:
- u:拥有者。
- g:所属组。
- o:other。
- a:所有用户。
若要同时设置不同类用户的访问权限,则需用逗号隔开。
格式二: 三位八进制数字
将对应的八进制数转换为二进制,进而设置对应权限值。
2)如何改变文件的拥有者
语法: chown 选项 用户名 文件名或目录名
功能: 修改文件的拥有者。
常用选项: -R 递归修改目录文件的拥有者。
注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升。
也可以使用chown指令同时修改文件的拥有者和所属组,将拥有者和所属组的用户名用冒号隔开即可。
3)如何改变文件的所属组
语法: chgrp 选项 用户名 文件名或目录名
功能: 修改文件的所属组。
常用选项: -R 递归修改目录文件的所属组。
注意: 修改文件的所属组也需要进行权限提升。
4)如何修改文件的掩码
我们查看新建的文件和目录,它们都有自己默认的权限。
实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,我们这里不必深究,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法。
但实际上你会发现,你所创建出来的文件和目录的权限值往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)
语法: umask 权限值
功能: 查看或修改文件掩码。
我们可以通过指令umas 查看文件默认掩码。
因此我们实际创建出来的文件和目录的权限值还需要进行进一步换算才能得出。首先我们将掩码的的后三位八进制换算为二进制,然后对其进行按位取反。
然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值。
因此我们也可以通过修改umask来设置文件的访问权限。
四、目录权限
对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?
- 可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
- 可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
- 可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。
于是,问题来了~~换句话来讲,就是只要⽤⼾具有⽬录的写权限,⽤⼾就可以删除⽬录中的⽂件,⽽不论
这个⽤⼾是否有这个⽂件的写权限.
这好像不太科学啊,我张三创建的⼀个⽂件,凭什么被你李四可以删掉?我们⽤下⾯的过程印证⼀下.
为了解决这个不科学的问题,Linux引⼊了粘滞位的概念.
五、粘位键
当⼀个⽬录被设置为"粘滞位"(⽤chmod+t),则该⽬录下的⽂件只能由
- 超级管理员删除
- 该⽬录的所有者删除
- 该⽂件的所有者删除
六、关于权限总结
- ⽬录的可执⾏权限是表⽰你可否在⽬录下执⾏命令。
- 如果⽬录没有-x权限,则⽆法对⽬录执⾏任何命令,甚⾄⽆法cd进⼊⽬,即使⽬录仍然有-r读权限(这个地⽅很容易犯错,认为有读权限就可以进⼊⽬录读取⽬录下的⽂件)
- ⽽如果⽬录具有-x权限,但没有-r权限,则⽤⼾可以执⾏命令,可以cd进⼊⽬录。但由于没有⽬录的读权限
- 所以在⽬录下,即使可以执⾏ls命令,但仍然没有权限读出⽬录下的⽂档。