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

4.总结

能力(权限)越大,责任越大

数据(生命)无价,谨慎操作

Linux - 权限管理(文件)

Linux - 权限管理(文件)

上一篇:Linux - 常用快捷键


下一篇:Linux - 文件目录