linux 文件/目录 权限管理

2022-05-25

ps:修改与2024-3-14
讲到拿shell,提权,其实这些跟linux的权限管理是分不开的(笑,虽然我现在才开始了解。
虽然对于普通用户来说,那么严格的权限划分是没有意义的(相信大家在使用linux系统时,大部分只用到了root和你自己创建的普通用户吧

1. 用户和用户组

linux系统中的每个file文件,都有两个属性,即用户(创建改文件的用户是谁)用户组(这个文件属于用户的哪个组里)

1.1 uid和gid

每个用户都有一个uid(标明自己身份的)和一个gid(表明它所属的组)
毕竟用户名和组名,其实说白了,是方便我们人来理解的,计算机可不认这个。

2. linux文件管理

对于文件来说,使用它的人只有以下3种身份。
owner,group,other,即创建者,除了所有者,所有者所在的组的其他成员,剩余用户访问文件都是other类别

2.1 rwx

对于不同3种身份,正常情况下都有rwx来表示他们的权限
r为可读,w为可写,x为可执行

2.2 可执行文件管理

可执行文件执行时的权限,是继承自当前进程的权限的。(一般情况下,你是root执行这个程序,这个程序执行时就有root权限,普通用户执行,就是普通用户权限,但是有特例)
可执行文件比较特殊,它相比正常文件(拥有uid和gid,这个是你执行的用户的uid和gid)外,多了euidegid(有效用户和有效group)
可执行文件在运行过程的实际权限是由euid和egid决定的。这跟特殊权限s有关。
s权限和x权限是占据同一个位置的
仅针对可执行文件。此种权限通常称为 SetUID,简称 SUID 特殊权限。
SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失(uid仍然是普通用户,但是euid为root)
换句话说,如果这个文件所有者是root,设置了suid,当你普通用户可以执行这个程序时,你运行这个程序获得的就是root权限。

注意,如果是fork一个进程的话,因为完全复制进程的内容,所以也有root权限,指euid,egid;执行system(“/bin/sh”)或者exec(“/bin/sh”)也是可以拿到root shell的,然而这件事情并不绝对,可以通过设置某些安全开关,让system/exec这些函数在执行目标程序时清除原有配置,转而使用目标程序自身配置的权限 以sh为例,在执行sh时,往往sh会自己检查权限并把euid改为uid的值,解决办法: sh -p ,这样就不会清除euid的值

还有一个有意思的事情是,Ubuntu 16.04以上版本,/bin/sh实际上是一个指向/bin/dash的链接文件,dash实现了 一个保护机制,当它发现自己在一个Set-UID的进程中运行时,会立刻把euid变成实际uid,主动放弃特权。安装一个zsh的shell程序来做这个实验,再建个链接过去
sudo apt install zsh
sudo ln -sf /bin/zsh /bin/sh)

2.3 特例root

原则上,其实只有文件的owner可以任意修改该文件的访问权限。但是也有例外
没错就是高贵的root!root是linux的超级管理员,想干啥就干啥,它可以对任何一个文件或目录进行修改。

3. linux 目录权限

linux目录权限如下

1 可执行权限(x): 如果目录没有可执行权限, 则无法cd到目录中。
2 可读权限(r): 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容。
3 可写权限(w): 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。

3.1 linux目录权限和目录下文件权限的冲突

比如你是一个普通用户user。
abc是由root创建的任何用户都具有rwx权限的目录
abc目录下有一个文件 test.c test.c对普通用户是完全拒绝的,没有rwx。
此时你进入了abc目录下,执行删除命令

rm test.c

你把它删掉了。凭什么?

如果目录本身对others具有w权限,那么others可以删除掉任何目录下的文件。

如果目录本身对others没有w权限,那么others则不可以删除文件。

3.2 粘滞位t

那当我们有这么一种需求,others可以在特定的目录下创建自己的文件、写入自己文件、删除自己的文件,但是不想让他删除别人的文件。这时后这么办呢?
这时可以对目录添加一个粘滞位:【chmod +t 文件目录】,这个粘滞位只能对目录设置。一般是限制others的权限。对于设置了粘滞位的目录。在该目录下。只能文件的拥有者或root可以删除,其他人不能删除。

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除

4. 针对+s安全问题的消解措施

SUID 虽然可以解决问题,却带来了安全隐患。当运行设置了 SUID 的命令时,通常只是需要很小一部分的特权,但是 SUID 给了它 root 具有的全部权限。因此一旦 被设置了 SUID 的命令出现漏洞,就很容易被利用。也就是说 SUID 机制在增大了系统的安全攻击面。
Linux 引入了 capabilities 机制对 root 权限进行细粒度的控制,实现按需授权,从而减小系统的安全攻击面。本文将介绍 capabilites 机制的基本概念和用法。
https://www.cnblogs.com/sparkdev/p/11417781.html

4.1 进程的capabilities

进程的capabilities,指的是进程在运行时的权限,值得一提的是,linux不区分进程和线程,一般情况下,理论上每个线程都有独自的capabilities,实际上一个进程中的线程capabilities是一样的

1. Permitted:实际上是规定了进程的capabilities的上限
2. Effective:实际上进程拥有的capabilities
3. Inheritable:exec()系列调用后,新进程能被继承的集合
4. Bounding: Bounding提供了系统级别的限制,每个进程的bounding都是一样的,也规定了进程的上限(比permitted等级要高,比如permitted有的capability,如果Bound没有,想通过自行添加这个capability是不可行的)
5. Ambient:Ambient是Linux 4.3引入的,解决的是权限稳定传递的问题

4.2 可执行文件的capabilities

可执行文件,在未执行,作为文件时,有如下3个capabilities

1. Permitted: 在文件被执行时,会被添加到进程的permitted中
2. Inheritable:与进程的inheritable的交集会被添加到线程Permitted中
3. Effective:实际上是一个标志位,如果开启,在执行完exec后,会将进程permitted的capabilites添加到它的effective中

4.3 exec/fork的capalities继承关系

有一个公式可以说明:
规定P代表EXEC前的进程P'代表EXEC后的进程F代表可执行文件

P'(ambient)     = (file is privileged) ? 0 : P(ambient)
P'(permitted)   = (P(inheritable) & F(inheritable)) |  (F(permitted) & P(bounding))) | P'(ambient)
P'(effective)   = F(effective) ? P'(permitted) : P'(ambient)
P'(inheritable) = P(inheritable)    [i.e., unchanged]
P'(bounding)    = P(bounding)       [i.e., unchanged]

4.4 getcap setcap capsh

getcapsetcap 两个命令来分别查看和设置文件的 capabilities,同时还提供了 capsh 来查看当前 shell 进程的 capabilities