Linux - 权限管理(文件权限)
一:基本权限
1.基本权限介绍
基本权限类型
类型 | 全拼 | 释义 | 权限位 |
---|---|---|---|
r | read | 可读 | 4 |
w | write | 可写 | 2 |
x | execute | 可执行 | 1 |
权限的归属
归属 | 字母 |
---|---|
属主 | u |
属组 | g |
其他用户 | o |
2.设置权限
修改属主、属组
# 修改文件:1.txt的 属主为:darker 属组为:human [root@localhost ~]# chown darker.human 1.txt # 修改文件:1.txt的 属主为:darker [root@localhost ~]# chown darker 1.txt # 修改文件:1.txt的 属组为:human [root@localhost ~]# chown .human 1.txt # 递归修改目录:file1的 属主为:darker 属组为:human [root@localhost ~]# chown -R darker.human file1
修改u、g、o对应的权限
# 加减法 # 修改文件:1.txt的权限为:属主为u 属组为w [root@localhost ~]# chmod u+x,g-w 1.txt # 赋值法 # 修改文件:1.txt的权限为:所有用户为rwx [root@localhost ~]# chmod a=rwx 1.txt # 修改文件:1.txt的权限为:- [root@localhost ~]# chmod a=- 1.txt # 修改文件:1.txt的权限为:属主属组为rw 其他用户为r [root@localhost ~]# chmod ug=rw,o=r 1.txt # 数字 # 修改文件:1.txt的权限为:所有用户的权限为rwx [root@localhost ~]# chmod 777 1.txt # 递归修改目录:file1的权限为:所有用户的权限为rwx [root@localhost ~]# chmod 777 file1
注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人
权限对文件/目录的意义
文件:ls -l 文件名
权限 | 释义 |
---|---|
r | 可以cat读取文件内容 |
w | 可以修改文件 |
x | 可以执行文件代码,如果该文件的代码是编译好的结果 那么只有 x 权限即可执行但如果该文件的代码是一个解释型的脚本程序 则需要配合 r 权限才可执行 |
目录:ls -dl 文件名
权限 | 释义 |
---|---|
r | 可以ls 浏览文件下的内容 |
w | 可以在目录下创建 新文件or目录 |
x | 可以执行 目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行可以正常 cd 切换到目录下涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级 |
对文件夹的操作(不操作文件内容),需要当前用户具备的权限
- 对沿途所有文件夹有x权限
- 对目标文件夹有r或w权限
权限 | 释义 |
---|---|
r | 可以浏览 |
w | 可以创建、删除、移动子文件和子目录 |
对文件的操作(操作文件内容),需要当前用户具备的权限
- 对沿途所有文件夹有x权限
- 对目标文件有r或w权限
权限 | 释义 |
---|---|
r | 可以读取文件内容 |
w | 可以修改文件内容 |
注意点:
vim修改的原理是将原文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文件名
验证vim修改的原理
# (root用户)切换到/usr/local目录 [root@localhost local]# cd /usr/local # (root用户)递归创建test01/dir1目录 [root@localhost local]# mkdir -p test01/dir1 # (root用户)递归修改目录test01权限为733 [root@localhost local]# chmod -R 733 test01 # (root用户)在test01目录下创建1.txt并写入内容“123” [root@localhost local]# echo "123" > test01/1.txt # (root用户)查看1.txt的内容 [root@localhost local]# cat test01/1.txt 123 # (root用户)查看test01目录下的文件1.txt的详情信息:其他用户只有(r)读的权限 [root@localhost local]# ll test01/1.txt -rw-r--r--. 1 root root 4 Nov 25 10:02 test01/1.txt # (root用户)查看test01目录下的文件1.txt的iNode信息 [root@localhost local]# stat test01/1.txt File: ‘test01/1.txt’ Size: 4 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 23609 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:usr_t:s0 Access: 2020-11-25 10:02:58.471562017 -0500 Modify: 2020-11-25 10:02:58.471562017 -0500 Change: 2020-11-25 10:02:58.471562017 -0500 Birth: - # 切换到其他用户/用其他用户登录 PS C:\Users\Darker> ssh darker@192.168.50.101 darker@192.168.50.101's password: [darker@localhost ~]$ whoami darker # (普通用户)用vim打开/usr/local/test01目录下的1.txt [darker@localhost ~]$ vim /usr/local/test01/1.txt 123 ~ ~ ~ "/usr/local/test01/1.txt" [readonly] 1L, 4C 1,1 All # [readonly] 只读 # 按i进入插入模式 -- INSERT -- W10: Warning: Changing a readonly file # (普通用户)修改1.txt的内容,强制保存并退出 456 Esc :wq! # 回到原来的root用户的窗口 # (root用户)查看1.txt的内容 [root@localhost local]# cat test01/1.txt 456 # (root用户)查看test01目录下的文件1.txt的详情信息:属主和属主变了 [root@localhost local]# ll test01/1.txt -rw-r--r--. 1 darker darker 4 Nov 25 10:21 test01/1.txt # (root用户)查看test01目录下的文件1.txt的iNode信息 [root@localhost local]# stat test01/1.txt File: ‘test01/1.txt’ Size: 4 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 23609 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ darker) Gid: ( 1000/ darker) Context: unconfined_u:object_r:usr_t:s0 Access: 2020-11-25 10:30:54.822530748 -0500 Modify: 2020-11-25 10:21:17.823541511 -0500 Change: 2020-11-25 10:21:17.824541511 -0500 Birth: -
结论
vim修改文件时:会将原文件删除,生成新的文件,属主和主组会变成修改的那个用户和用户所在的组
二:特殊权限
权限 | 权限位 |
---|---|
SUID | 4 |
SGID | 2 |
SBIT | 1 |
SUID
1.疑问
普通用户既不是root也不属于root组,因此 它对/etc/shadow文件没有任何权限(全是---
)
# 查看/etc/shadow信息 [darker@localhost ~]# ll /etc/shadow ----------. 1 root root 970 Nov 24 07:29 /etc/shadow
但是:普通用户为何可以用passwd
直接修改密码?并且修改的是/etc/shadow
文件,如何实现的?
[darker@localhost ~]$ ll `which passwd` -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
这里可以看到,本应为rwx
的第三个x
变成了s
,这就是s权限
2.s权限的特殊之处
- SUID权限仅对
二进制可执行文件
有效(对目录无效) - 如果执行者对于该二进制可执行文件具有
x
的权限,执行者将具有该文件的所有者的权限
- 本权限 仅在执行该二进制可执行文件的过程中有效
3.权限设定的方法
- 字母表示法
chmod u+s 可执行文件 # 给属主添加s权限
chmod u-s 可执行文件 # 删除属主的s权限
- 数字表示法(第1位
4
表示SUID
,后3位表示普通权限 rwx
)
chmod 4755 可执行文件 # 添加SUID权限到二进制可执行文件 chmod 0xxx ... # 可以删除文件的SUID(但是无法删除目录的SUID)
4.实例
# (root用户)查看which cat [root@localhost ~]# ll `which cat` -rwxr-xr-x. 1 root root 54048 Nov 20 2015 /usr/bin/cat # (普通用户)查看/etc/shadow:没有权限(普通用户虽然是r-x,但是无法直接查看) [darker@localhost local]$ cat /etc/shadow cat: /etc/shadow: Permission denied # (root用户)修改 which cat 权限 [root@localhost ~]# chmod u+s `which cat` # 或者 chmod 4755 `which cat` #(root用户) 再次查看which cat [root@localhost ~]# ll `which cat` -rwsr-xr-x. 1 root root 54048 Nov 20 2015 /usr/bin/cat # (普通用户)查看/etc/shadow:有权限了 [darker@localhost local]$ cat /etc/shadow root:$6$Jvw3z/jmU1ASO4P1$vpTJ5OGEtfBOmIpjyK55k87iQPHXCC3.kKOFW9jkyslqC2DMdN7SZdT/zYRfmQ4hBAQXG6CQ4kKdRQ8eFqChf.::0:99999:7::: bin:*:16659:0:99999:7::: daemon:*:16659:0:99999:7::: adm:*:16659:0:99999:7::: lp:*:16659:0:99999:7::: ...
5.上例的工作原理
环境前提: Linux中有1个二进制程序:cat,属组属组都是root Linux中有一个系统文件:/etc/shadow,属组属组是: root:root 有一个普通用户:darker 普通用户:darker 属于其他用户,对二进制程序:cat 有执行(x)的权限 普通用户:darker 对系统文件:/etc/shadow 没有任何权限 默认情况下: 普通用户:darker 执行二进制程序:cat 系统会创建1个:cat进程 该进程的属主属组是该程序的发起者:darker,也就是: darker:darker cat进程 访问系统文件:/etc/shadow cat进程的属主和属主:darker:darker /etc/shadow文件的属主和属主:root:root 二者的属主属组不匹配,所以被拒绝访问了:Permission denied 给二进制程序:cat 设置SUID之后: 普通用户:darker 执行二进制程序:cat 系统会创建1个:cat进程 执行者对于该二进制可执行文件具有 x 的权限,执行者将拥有该文件的属组的权限 该进程属主是程序的发起者:darker,属组是cat原来的:root,属主属组就是:darker:root cat进程 访问系统文件:/etc/shadow cat进程的属主和属主:root:darker /etc/shadow文件的属主和属主:root:root 二者的属主匹配,可以正常访问
SGID
1.权限设定的方法
- 字母表示法
chmod g+s 文件/目录 # 给文件/目录的属组添加s权限
chmod g-s 文件/目录 # 删除文件/目录的属组的s权限
- 数字表示法(第1位
2
表示SGID
,后3位表示普通权限 rwx
)
chmod 2755 文件/目录 # 给文件/目录的属组添加s权限 chmod 0755 文件/目录 # 删除文件/目录的属组的s权限 chmod 755 文件/目录 # 同上
2.文件权限位的表示
[root@localhost ~]# ll 1.txt -rwxr-sr-x. 1 root root 3243 Nov 25 15:41 1.txt
3.SGID相关说明
作用在二进制可执行文件上时:
执行有SGID权限的程序时,该用户将继承该程序的属组权限
作用在目录上时:
该目录下所有用户新建的文件 都会自动继承该目录的属组
当一个用户对某一目录有写
和执行
权限时,该用户就可以在该目录下建立文件
如果该目录同时用 SGID
修饰,则该用户在这个目录下建立的文件都是属于这个目录的属组
4.实例
# (root用户)切换到/usr/loca/目录 并创建目录:test02 [root@localhost ~]# cd /usr/local [root@localhost local]# mkdir test02 # (root用户)查看目录:test02 的信息 [root@localhost local]# ls -dl test02/ drwxr-xr-x. 2 root root 6 Nov 25 14:19 test02/ # !测试(root用户)在目录:test02 下创建文件:1.txt 并查看该文件的信息 [root@localhost local]# touch /usr/local/test02/1.txt [root@localhost local]# ll /usr/local/test02/1.txt -rw-r--r--. 1 root root 0 Nov 25 14:19 /usr/local/test02/1.txt # !测试(普通用户)在目录:test02 下创建文件:2.txt 并查看该文件的信息 [darker@localhost ~]$ touch /usr/local/test02/2.txt [darker@localhost ~]$ ll /usr/local/test02/2.txt -rw-rw-r--. 1 darker darker 0 Nov 25 14:20 /usr/local/test02/2.txt # (root用户)修改目录:test02 的权限 [root@localhost local]# chmod 2773 test02 # (root用户)再次查看目录:test02 的信息 [root@localhost local]# ls -dl test02/ drwxr-sr-x. 2 root root 6 Nov 25 14:20 test02/ # !测试(root用户)在目录:test02 下创建文件:3.txt 并查看该文件的信息 [root@localhost local]# touch /usr/local/test02/3.txt [root@localhost local]# ll /usr/local/test02/3.txt -rw-r--r--. 1 root root 0 Nov 25 14:21 /usr/local/test02/3.txt # !测试(普通用户)在目录:test02 下创建文件:4.txt 并查看该文件的信息 [darker@localhost ~]$ touch /usr/local/test02/4.txt [darker@localhost ~]$ ll /usr/local/test02/4.txt -rw-rw-r--. 1 darker root 0 Nov 25 14:21 /usr/local/test02/4.txt
SBIT
SBIT 是 the restricted deletion flag or sticky bit
的简称,有时也称为Sticky
,粘滞位
SBIT 与 SUID 和 SGID 的关系并不大
1.权限设定的方法
- 字母表示法
chmod o+t 文件/目录 # 给文件/目录的其他用户设置Sticky
chmod o-t 文件/目录 # 删除文件/目录的其他用户的Sticky
- 数字表示法(第1位
1
表示添加Sticky位
,后3位表示普通权限 rwx
)
chmod 1755 文件/目录 # 给文件/目录的其他用户设置Sticky chmod 0755 文件/目录 # 删除文件/目录的其他用户的Sticky chmod 755 文件/目录 # 同上
2.文件权限位的表示
- 文件other位有
x权限
,并且用t
代替了,表示被设置了Sticky
- 如果other位
没有x权限
,会显示为大写T
,表示有故障
(权限无效)
[root@localhost local]# ls -dl test03 drwxr-xr-t. 2 root root 18 Nov 25 14:34 dir01
3.相关说明
- 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件/目录
- 只能作用在目录上,普通文件设置无意义,而且会被Linux内核忽略
- 用户在设置 Sticky 权限的目录下
新建的目录
不会自动继承Sticky权限
4.实例
# (root用户)切换到 /usr/loca/目录 [root@localhost ~]# cd /usr/local # (root用户)递归创建test03目录及2个子目录dir1和dir2 [root@localhost local]# mkdir -p test03/dir{1,2} # (root用户)创建2个用户:user01、user02 [root@localhost local]# useradd user01 [root@localhost local]# useradd user02 # (root用户)分别设置dir1和dir2的属主属组为user01和user02 [root@localhost local]# chown -R user01:user01 test03/dir1 [root@localhost local]# chown -R user02:user02 test03/dir2 # (root用户)查看目录:test03的信息 [root@localhost local]# ls -dl test03 drwxr-xr-x. 4 root root 28 Nov 25 15:37 test03 [root@localhost local]# ll test03 total 0 drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1 drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2 # (root用户)修改目录:test03 的权限 [root@localhost local]# chmod 1777 test03 # (root用户)查看目录:test03的信息 [root@localhost local]# ls -dl test03 drwxrwxrwt. 4 root root 28 Nov 25 15:37 test03 [root@localhost local]# ll test03 total 0 drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1 drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2 # 切换到普通用户:user01 [root@localhost local]# su - user01 # !测试(普通用户)切换到test03目录 [user01@localhost ~]$ cd /usr/local/test03 # !测试(普通用户)查看当前目录下的信息 [user01@localhost test03]$ ll total 0 drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1 drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2 # !测试(普通用户)用户user01将dir1重命名为dir11 [user01@localhost test03]$ mv dir1 dir11 # !测试(普通用户)用户user01将dir2重命名为dir22 [user01@localhost test03]$ mv dir2 dir22 mv: cannot move ‘dir2’ to ‘dir22’: Operation not permitted # !测试(普通用户)用户user01在dir11目录中创建文件:1.txt [user01@localhost test03]$ touch dir11/1.txt # !测试(普通用户)用户user01在dir2目录中创建文件:2.txt [user01@localhost test03]$ touch dir2/2.txt touch: cannot touch ‘dir2/2.txt’: Permission denied
5.注意点
- SBIT 目前只对目录有效,用来
阻止非文件的所有者删除文件
:比较常见的例子就是/tmp
目录 - 权限信息中最后一位
t
表示该目录被设置了 SBIT 权限 - SBIT 对目录的作用是:当用户在该目录下创建 新文件或目录时,仅有自己和 root 才有权力删除,主要作用于一个
共享的文件夹(目录)
三:chattr
引言
你是否遇到过文件或目录具有可读写权限
,但是使用root用户删除、修改时提示"Operation not permitted
"的情况?
可能是由chattr设置了文件的隐藏保护权限
导致
通过chattr命令修改文件或目录属性能够提高系统的安全性
与chmod命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr命令改变的。
说明
这两个命令在工作中用的比较少,经常用到的场景就是解决"Operation not permitted"问题
chattr 命令语法
语法
chattr [+-=] [ASacdistu] File/Directory
选项说明
选项 | 释义 |
---|---|
+-= | 分别为 [+ 增加] [- 减少] [= 设定] 指定属性 |
A | 当设定了 A 这个属性时,文件或目录的存取时间atime (访问时间) 将不可被修改 |
S | 这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中! 可以有效的避免数据流失! |
a | 文件将只能增加数据,而不能删除,只有 root 才能设定这个属性 |
C | 这个属性设定之后,将会自动的将此文件『压缩』 在读取的时候将会自动解压缩出来,但是在储存的时候,将会先进行压缩之后再储存 |
d | 当 dump (备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)具有 dump 功效! |
i | 指定文件不能被删除、改名、也无法写入或新增数据!对于系统安全性有相当大的帮助! |
j | 当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中! 但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效! |
s | 当文件设定了 s 参数时,他将会被完全的移除出这个硬盘空间 |
u | 与 s 相反的 当使用 u 来设定文件时,则数据内容其实还存在磁盘中,可以使用来 undeletion |
chattr 使用实例
1.设置指定文件的隐藏属性,使其无法删除、修改
# 添加"i"隐藏属性后,就无法更动config.conf这个文件了 chattr +i /home/config/config.conf
2.取消文件的删除、修改保护权限
# 解除"i"这个隐藏属性 chattr -i /home/config/config.conf
lsattr 命令语法
语法
lsattr [-aR] File/Directory
选项说明
选项 | 释义 |
---|---|
-a | 将隐藏文件的属性也列出来 |
-R | 连同子目录的数据也一并列出来 |
lsattr 使用实例
查看指定文件隐藏属性
# 查看文件:file.txt的隐藏属性
lsattr file.txt
四:umask
1.新建文件、目录的默认权限是由umask决定的
① uid>199
并且属主与属组相等的用户下,umask: 0002
- 文件:664
- 目录:775
② 除1之外的其他用户下,比如root用户,umask: 0022
- 文件:664
- 目录:755
③ 默认权限(在umask的影响下)
- 文件默认权限:666
- 目录权限默认:777
2.权限的计算方法
文件权限的计算方法:偶数位直接相减,奇数位相减后加1
文件的起始权限值 | umask值 | 操作 | 计算后的文件权限值 |
---|---|---|---|
666 | 022 (每位如果都是偶数) | 直接相减 | 644 |
666 | 033 (每位如果有奇数或偶数) | 相减(奇数位相减后在其原奇数 位加1) | 644 |
666 | 325(每位如果有奇数或偶数) | 相减(奇数位相减后在其原奇数 位加1) | 442 |
目录权限的计算方法:直接相减即可
文件的起始权限值 | umask值 | 操作 | 计算后的文件权限值 |
---|---|---|---|
777 | 022 | 相减 | 755 |
777 | 033 | 相减 | 744 |
777 | 325 | 相减 | 452 |
3.设置umask
临时设置umask
[root@localhost local]# umask 000 # 设置umask为000
永久设置umask
# 用vim编辑/stc/profile [root@localhost local]# vim /etc/profile # 或者:vim /etc/bashrc # 在最后添加如下代码 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then umask 002 //表示uid大于等于199的默认umask值,表示普通用户 else umask 022 //表示uid小于199的默认umask值,表示root fi