权限细分
文件分类
虽说文件权限不过三类三组
,不过想理解特殊权限,还得把文件再分类。
- 操作文件
一般的操作文件,对应的就是rw
读写权限,常被命令
作为元素所操作。
- 执行文件
可执行文件,对应的就是x
等其他权限。此类文件可以直接进行执行,是命令
一类。
命令
分两类
- 纯命令
脚本或程序当中不需要外部参数,不操作其他文件,单纯执行操作。
- 操作命令
需要操作其他文件,对其他文件进行操作,依赖其他文件权限。
权限依赖
- 操作文件
单纯的rw
权限,对于自身而言没有任何意义。
提供给执行文件
进行操作的权限依据,由rw
判断执行文件
是否拥有操作权限。
- 执行文件
单纯的判断用户是否拥有执行此命令的权限。
- 相互关联
- 命令权限
判断此用户是否拥有此命令的执行权限。
- 操作权限
判断此用户是否拥有此文件的操作权限。
权限判断
- 执行权限
- 操作权限
- 进程归属
当两个部分归纳完毕,命令执行的进程的属主
就看命令执行时的运行角色了。
当other
运行了一个属主为godme
的命令,启动的进程属主是other
。
进程不看命令归属,只看启动角色,谁启动的谁就是进程的属主。
特殊权限
基本权限
符号 | 权限 | 说明 |
---|---|---|
r |
读 | 读取内容 |
w |
写 | 写入内容 |
x |
执行 | 作为命令执行 |
三个权限,全部依照上述流程,大部分的权限不外乎这三个。
SUID
权限设置
命令 | 效果 |
---|---|
chmod u+s file |
添加s 权限 |
chmod u-s file |
移除s 权限 |
chmod u=rws,go= file |
设置权限 |
- 权限分类
该特殊权限为
执行权限
,通用x
第三位置,与rw
的操作权限
无关。
- 特殊显示
原操作权限为
x
,+s
后显示权限为s
。原操作权限为
-
,+s
后显示权限为S
。
权限操作
s
虽然作为执行权限
,但是影响的却是操作权限
。
在执行权限
的鉴权阶段,和一般权限一致,在文件权限的判断阶段有特殊逻辑。
逻辑梳理
- 旧逻辑
- 新逻辑
可以发现,整个过程增添了额外一步。
- 执行权限鉴权
- 更换操作权限
- 操作权限鉴权
默认没有第二步
更换操作
权限。s
的作用就是更换操作权限。同时,进程的归属,也会被替换。
进程的属主不再是先到先得的
启动者
,而是标记了s
命令的属主。
例子详解
- 基本文件
/etc/passwd
chmod u=rw,go= /etc/passwd
/bin/cat
chmod u=rwx, go= /bin/cat
- 直接执行
root
cat /etc/passwd
# 成功
other
cat /etc/passwd
# 失败,没有cat的运行权限
- 执行权限
/bin/cat
chmod a+x /bin/cat
other
cat /etc/passwd
# 失败,没有passwd的操作权限
- 文件权限
/etc/passwd
chmod a+r /etc/passwd
other
cat /etc/passwd
# 成功,但是不安全
- 权限替换
/bin/cat
chmod u=rws,go= /bin/cat
other
cat /etc/passwd
# 运行成功
没有
操作权限
却能够操作文件,这是因为在文件操作
鉴权的时候更换了鉴权对象
。默认情况下,
执行鉴权
和操作鉴权
鉴权对象是同一个。但是
s
会修改操作鉴权
的对象,从而让有些没有权限的用户可以操作某些文件。再次声明,这样更换身份后,进程的属主也会对应的更换为命令的属主,而不是启动者。
SGID
和SUID
一样,SGID
也是s
权限。
SUID
是针对属主
的操作鉴权角色替换。
SGID
是针对属组
的操作鉴权角色替换。
- 设置
chmod g+s cat
chmod g-s cat
- 逻辑
逻辑同
SUID
- 特殊
chmod a+s cat
同时设置了
SUID
和SGID
,不具有实用意义。普通用户
other
不具备s
权限,因为把自己替换为自己
实在是…
实际作用
- 文件共享
半路更换了鉴权对象
,让其他用户(组)拥有特定的文件操作权限。
相当于是把文件共享给了用户(组)。
不过是通过命令
进行的共享,必须通过特定的命令
才有所谓的共享。
- 进程归纳
启动者启动,进程归属却是命令属主(组)
。
可以很明确的对进程进行分类管理,不过人太多了也会变得更杂乱。
回归一句话,谁启动的进程,谁就是进程的属主。
关键看顶着的谁的名,而不是谁做的。
s
在启动过程当中,把名号给换了。所以后续的一切都变了,
操作鉴权
对象换了,启动的进程属主(组)也换了,启动者已不重要了。
Sticky
SUID
和SGID
针对的是执行权限
,那么sticky
针对的就是操作权限
。
操作权限
- 基本权限
符号 | 权限 |
---|---|
r |
读取 |
w |
修改 |
x |
执行 |
之前因为显示占据的位置是
x
所在的位置,划分的不够明确,现在重申一遍。
- 基本权限
rwx
是基本权限,x
不是特殊权限。
- 显示合并
特殊权限的显示合并
x
一起显示,原来没有x
显示为大写,原来有x
显示成小写。但是并不覆盖。
- 操作权限
操作权限
是什么,就是rw
。所谓的
SUID
和SGID
是针对x
的特殊权限设置。影响后续归纳。先说说读写权限
rw
算什么。
说实话,读写没啥更多东西,关键是目录的读写。
把读写进行扩展,目录的读写也即是创建
和删除
。
问题就出在这,多个用户同时工作时,必然属于同一个组。
如果能够创建,必然能够删除。
也就是说,用户之间可以删除别人的文件,除非每个人都没权利删除任何文件。
权限设置
命令 | 说明 |
---|---|
chmod o+t dir |
添加t 权限 |
chmod o-t dir |
移除t 权限 |
有
x
则t
,是-
就是T
。反正和
x
相关,有则小写,无则大写。
执行逻辑
- 默认逻辑
- 新逻辑
例子详解
- 基本文件
users
useradd judas
usermod -a -G foreva judas
useradd godme
usermod-a -G foreva godme
dir
mkdir -p /tmp/project
chgrp -R foreva
chmod a=rwx /tmp/project
- 操作
judas
cd /tmp/project
touch judas
# 成功
godme
cd /tmp/project
rm judas
# 成功
- 修改
dir
chmod o=r /tmp/project
judas
touch judas
# 成功
rm judas
# 失败
godme
rm judas
# 失败
- 特殊
dir
chmod -o=rt /tmp/project
judas
touch judas
rm judas
# 成功
touch judas
godme
rm judas
# 失败
设置了
t
,只能管理自己的文件,别人或可查看,不可删除。
扩展权限
基本扩展
所谓特殊权限,不过是扩展而已
基本权限 | 扩展权限 | 说明 |
---|---|---|
r |
- | 无 |
w |
t |
文件操作 |
x |
s |
进程启动 |
数值权限
umask
还记得这篇文章么,其中说到了umask
,我们简单的说了一下。
- 查看办法
umask
- 设置办法
umask 0022
- 影响
文件默认权限
666
,文件夹默认权限777
。新建文件权限为
0666-umask
。新建文件夹权限为0777-umask
。
新建类型 umask
权限 file
umask
0666-umask
dir
umask
0777-umask
第四组
最大的疑问就是,权限不是
三组三类
的么?
- 组别
- 属主
- 属组
- 其他
- 类别
- r
- w
- x
-
表示空
umask
为什么有四位?有第四组?
SUID |
SGID |
Sticky |
---|---|---|
us |
gs |
t |
就是这个意思了,而它,就是最前面的那一组。
例子详解
us
mkdir us
chmod a= us
ls -l us
# ---------
chmod 4000 us
# --S------
gs
mkdir us
chmod a= gs
ls -l gs
# ---------
chmod 2000 gs
# -----S---
t
mkdir t
chmod a= t
ls -l t
# ---------
chmod 1000 t
# --------T
数值对照
SUID |
SGID |
Sticky |
Oct |
power |
---|---|---|---|---|
0 |
0 |
0 |
0 |
--- |
0 |
0 |
1 |
1 |
--T |
0 |
1 |
0 |
2 |
-S- |
0 |
1 |
1 |
3 |
-ST |
1 |
0 |
0 |
4 |
S-- |
1 |
0 |
1 |
5 |
S-- |
1 |
1 |
0 |
6 |
SS- |
1 |
1 |
1 |
7 |
SST |