首页 > 技术文章 > -linux-权限管理-文件权限

arher 2020-12-11 19:15 原文

把一个用户加入了一个组,该用户就拥有了该组的权限,当一个用户要操作某个文件时,系统会一次检索该用户是否是该文件的拥有者,其次是组成员,最后是其他人,如果扫描到是拥有者,其次是组成员,最后是其他人,如果扫描到是拥有者,则具备拥有者的权限,不必往后扫描,以此类推。

一 文件权限管理:基本权限

1 基本权限介绍

基本权限类型

  • r: 可读 ===》4
  • w: 可写 ===》2
  • x: 可执行 ==》1

权限的归属

  • 属主:u
  • 属组:g
  • 其他人:o

例如

[user10@arther-linux /]$ ls -l a.txt
-rw-r-----. 1 root root 186 Nov 23 17:23 a.txt
  
  
文件类型: 
		-:文本文档 
  	d:目录 
    b:设备block 
    c:字符设备 
    s:套接字文件 
    l:软链接

权限:
		硬链接个数 
  	属主
    属组
    文件所占用的空间(以字节为单位) 
    文件(目录)最近访问(修改)时间 
    文件名

2 设置权限

修改属主、属组

[root@arther-linux /]# ls -l a.txt 
-rw-r-----. 1 root root 186 Nov 23 17:23 a.txt
  
[root@arther-linux /]# chown bibibi.user10 a.txt 
[root@arther-linux /]# ls -l a.txt 
-rw-r-----. 1 bibibi user10 186 Nov 23 17:23 a.txt 
# 同时改了属主与属组

[root@arther-linux /]# chown root a.txt 
[root@arther-linux /]# ls -l a.txt 
-rw-r-----. 1 root user10 186 Nov 23 17:23 a.txt
# 只改了属主

[root@arther-linux /]# chown .root a.txt 
[root@arther-linux /]# ls -l a.txt 
-rw-r-----. 1 root root 186 Nov 23 17:23 a.txt
# 只改了属组

修改属主(u)、属组(g)、其他(o)的权限

# 加减法
chmod u+x,g+w,o+r a.txt 

# 赋值 
chmod a=rwx a.txt 
chmod a=- a.txt 
chmod ug=rw,o=r file1

# 数字
chmod 644 file1
从前到后,每一位分别代表u、g、o,
所以每一位数都对应着该类别的权限,
如下图 664 则是
rw_r__r__
属主:可读可写
属组:只可读
其他:只可读
数字 意义 显示
0 无权限 _ _ _
1 只有执行权限 _ _ x
2 只有写权限 _ w _
3 = 1+2 可写可执行 _wx
4 只能读 r _ _
5 = 1+4 可读可执行 r _ x
6 = 2+4 可读可写 rw_
7 = 1+2+4 可读可写可执行 rwx

注意:把某一个非属主用户添加到文件的属组,他就拥有了该组的权限,而不再是其他人。

3 权限对文件or目录的意义

文件:ls -l 文件名

  • r: 可以cat读取文件内容
  • w: 可以修改文件
  • x: 可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行(需要边读边编译)

目录:ls -dl 文件名

  • r: 可以ls浏览文件下的内容
  • w: 可以在目录下创建新文件or目录
  • x:
    • 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
    • 可以正常切换到目录下
    • 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
一:对文件夹的操作(不操作文件内容),需要当前用户具备的权限 
	1、对沿途所有文件夹有x权限 
	2、对目标文件夹有r或w权限 
		r-》可以浏览 
		w-》可以创建、删除、移动子文件和子目录 
    # 如取消了用户对a目录的执行权限,但可读可写
    [bibibi@arther-linux /]$ ls /a/
		ls: cannot access /a/1.txt: Permission denied
		ls: cannot access /a/b: Permission denied
		1.txt  b
    # 会提示不能深入进行其他操作,即进入文件夹进行写、读操作
    [bibibi@arther-linux /]$ cd /a/
		bash: cd: /a/: Permission denied
 		# 直接没有权限
    
    # 所以读写操作的权限需要配合执行权限


二:对文件的操作(操作文件内容),需要当前用户具备的权限 
	1、对沿途所有文件夹有x权限 
  2、对目标文件有r或w权限 
  	r-》可以读取文件内容 
    w-》可以修改文件内容
    

!!!注意!!! 
储备知识:vim修改的原理是将源文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文件名
例子: 
1、当前用户对沿途所有文件夹都有x权限 
2、并且当前用户对目标文件夹有w权限 
3、但是当前用户对目标文件没有w权限 
此时当前用可以vim编辑文件内容,并且可以wq!强制保存退出完成文件修改,其实是将源文件删掉了,可以 通过查看前后操作的文件inode号来确定

例1:要想在目录下创建\删除内容:对目录的x权限+对目录的w权限

1.设置权限
[root@arther-linux ~]# chmod 777 /a/

2.切换其他用户
[bibibi@arther-linux ~]$ cd /a/
[bibibi@arther-linux a]$ cd /a/b/
-bash: cd: /a/b/: Permission denied # 没有使用递归,a下的b目录不能执行无法cd
# 此时在a目录下有了wx的权限,可以近些删除或创建操作

3.验证
[bibibi@arther-linux a]$ ls 
1.txt  b
[bibibi@arther-linux a]$ rm 1.txt 
[bibibi@arther-linux a]$ ls
b

'''
所以在目录下进行读写操作需要配合x的执行权限,
也就是能cd到该目录下的权限,然后如果有r的权限即可ls,
如果是w的权限,即可rm删除或touch,mkdir创建。

'''

例2:要执行目录下程序:对目录的x权限+对文件的x权限,如果文件是解释型语言的脚本程序,还需要对文件有r权限

# 保险起见,递归设置可读可执行
[root@arther-linux ~]# chmod  -R 775 /a/
[root@arther-linux ~]# ls -dl /a/b/c
drwxrwxr-x. 2 root root 4096 Nov 25 17:54 /a/b/c
[root@arther-linux ~]# ls -l /a/b/c/echo 
-rwxrwxr-x. 1 root root 33088 Nov 25 17:54 /a/b/c/echo
# 其他用户顺利打印出来
[bibibi@arther-linux ~]$ /a/b/c/echo "hello egon"
hello egon

# 设置只可执行
[root@arther-linux ~]# chmod -R 771 /a/
[bibibi@arther-linux ~]$ /a/b/c/echo "hello egon"
hello egon # 当文件此时是解释性语言脚本则会权限不够,因为解释性语言需要边读边编译

二 文件权限管理:特殊权限

1 SUID

普通用户不是root也不属于root组,于是它对/etc/shadow文件没有任何权限

[bibibi@arther-linux ~]$ ls -l /etc/shadow
----------. 1 root root 1592 Nov 25 10:25 /etc/shadow

但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件,那不相当于是在没有修改权限的情况下,修改了该文件,如何实现的???

[root@arther-linux ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd

可以看出在属主上多了一个s权限

s权限的特殊之处

  • SUID权限仅对二进制可执行文件有效
  • 如果执行者对于该二进制可执行文件具有x的权限,执行者将具有该文件的所有者的权限
  • 本权限仅在执行该二进制可执行文件的过程中有效
[root@arther-linux ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd
# s 权限让我们临时passwd文件的属主权限,而这个属主权限则是root最高权限,即拥有了对/etc/shadow文件的root权限,所以可以通过passwd命令去执行在/etc/shadow修改密码的功能,前提是passwd必须是二进制可执行文件。

# 现在对 cat 命令添加s权限,这样普通用户可以通过cat命令去查看/etc/shadow文件
[root@arther-linux ~]# ll `which cat`
-rwxr-xr-x. 1 root root 54080 Aug 20  2019 /bin/cat
[root@arther-linux ~]# chmod u+s `which cat`
[root@arther-linux ~]# ll `which cat`
-rwsr-xr-x. 1 root root 54080 Aug 20  2019 /bin/cat
# s 权限添加完毕,试验普通用户

[root@arther-linux ~]# su - bibibi
Last login: Wed Nov 25 18:08:58 CST 2020 on pts/0
[bibibi@arther-linux ~]$ cat /etc/shadow # 此时执行者获得了所有者的权限
# 执行成功

了解

-1.在没有设置suid的情况下,我们登陆了一个用户,来执行操作目标文件的命令
# 会依次比对当前登录用户是否是目标文件的属主、属组、其他人来确定是否拥有操作权限

-2.在设置了suid的情况下,我们登录了一个用户,来执行操作目标文件的命令
# 当前用户会转换成命令文件的属主身份,然后拿着该身份去对应目标文件,如果该身份不是目标文件的主人, 那么就直接被归为其他人一栏,即没有访问权限,不会检索组 sgid一样

例子

# 准备 
mkdir /test 
chmod 777 /test/ 
echo 1111 > /test/a.txt 
chmod 000 /test/a.txt 
chown user1.group1 /test/a.txt 
chown egon.devops /usr/bin/cat chmod u+s /usr/bin/cat 
# 实验 
[root@egon ~]# ll /test/a.txt 
# 目标文件的属主:user1,属组:group1 
----------. 1 user1 group1 4 10月 29 18:31 /test/a.txt 
[root@egon ~]# 
[root@egon ~]# [root@egon ~]# ll /usr/bin/cat 
# 命令文件的属主:egon 
-rwxr-xr-x. 1 egon devops 54160 10月 31 2018 /usr/bin/cat 
[root@egon ~]# 
[root@egon ~]#
[root@egon ~]# su - lili -c "cat /test/a.txt" # lili切换为egon用户执行,egon用户没 有对上a.txt的属主,所以直接被当成其他人,没有任何权限 
cat: /test/a.txt: 权限不够 
[root@egon ~]# chmod o+r /test/a.txt 
[root@egon ~]# su - lili -c "cat /test/a.txt" 111 
[root@egon ~]# 
[root@egon ~]# 
[root@egon ~]# chmod o-r,g+r /test/a.txt 
[root@egon ~]# ll /test/a.txt ----r-----. 1 user1 group1 4 10月 29 18:31 /test/a.txt 
[root@egon ~]# usermod -a -G group1 egon 
[root@egon ~]# ll /usr/bin/cat # 确保suid还在 
-rwsr-xr-x. 1 egon devops 54160 10月 31 2018 /usr/bin/cat

[root@egon ~]# id egon 
uid=1005(egon) gid=1005(egon) 组=1005(egon),1003(group1) 
[root@egon ~]# 
[root@egon ~]# su - lili -c "cat /test/a.txt" # lili--->egon,egon用户没有对上 a.txt的属主,所以直接被当成其他人,虽然此时egon属于文件a.txt的属组group1的成员,但是对suid来 说那没用 
cat: /test/a.txt: 权限不够 
[root@egon ~]# 
[root@egon ~]# su - egon -c "cat /test/a.txt" 
# 如果当前用户与suid的用户重叠,那么就 无所谓用户转换,同样会按照:属主、属组、其他人的次序依次对照 1111 

# 注意: 
sgid规则同suid 
同时设置suid与sgid的情况下,suid优先级高于sguid

2 SGID

  • 当SGID作用于普通文件时,和SUID类似,在执行该文件时,用户将获得该文件所属组的权限。
  • 当SGID作用于目录时,意义就非常重大了:
    • 当一个用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件
    • 如果该目录同时用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。
[root@arther-linux /]# mkdir /test/
[root@arther-linux /]# chmod g+s /test/
[root@arther-linux /]# ls -dl test/
drwxr-sr-x. 2 root root 4096 Nov 25 19:58 test/
[root@arther-linux /]# ls -dl /test/
[root@arther-linux test]# chown user10.user10 /test/
drwxr-sr-x. 3 user10 user10 4096 Nov 25 20:07 /test/
  
  
#然后再在该目录下创建文件夹或是文件都继承了该目录的属组
[root@arther-linux test]# touch 2.txt
[root@arther-linux test]# mkdir arther
[root@arther-linux test]# ls
2.txt  arther
[root@arther-linux test]# ll
total 4
-rw-r--r--. 1 root user10    0 Nov 25 20:06 2.txt
drwxr-sr-x. 2 root user10 4096 Nov 25 20:07 arther
  
# SGID的优先级大于创建文件或文件夹生成的默认属组
[bibibi@arther-linux test]$ touch 1.txt
[bibibi@arther-linux test]$ ls -dl 1.txt 
-rw-rw-r--. 1 bibibi user10 0 Nov 25 20:28 1.txt

3 SBIT

其实 SBIT 与 SUID 和 SGID 的关系并不大。

SBIT the restricted deletion flag or sticky bit 的简称,有时也称为Sticky。

SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录:

[root@localhost ~]# ls -dl /tmp/ 
drwxrwxrwt. 13 root root 4096 8月 11 17:09 /tmp/ 
[root@localhost ~]# chmod o+t /test/ # 或者 chmod 1755 /test

[root@arther-linux /]# chmod o+t /test/
[root@arther-linux /]# ls -dl test/
drwxr-sr-t. 3 user10 user10 4096 Nov 25 20:07 test/
[root@arther-linux /]# chmod o+w /test/
[root@arther-linux /]# ls -dl test/
drwxr-srwt. 3 user10 user10 4096 Nov 25 20:07 test/
# 同时非用户可以进行修改操作

# 非用户不可删除
[bibibi@arther-linux /]$ rm -rf /test/
rm: cannot remove ‘/test/’: Permission denied
    

权限信息中最后一位 t 表明该目录被设置了 SBIT 权限。SBIT 对目录的作用是:当用户在该目录下创建新文件或目录时,仅有自己和 root 才有权力删除,主要作用于一个共享的文件夹。

三 文件权限管理:umask

新建文件、目录的默认权限是由umask决定的

1、uid>199并且属主与属组相同的用户下,umask: 0002

  • 文件 664
  • 目录 775

2、除1之外的其他用户下,比如root用户,umask: 0022

  • 文件 644

  • 目录 755

linux中文件默认权限为666、目录权限默认为777,在umask的影响下

文件权限计算方法:偶数位直接相减,奇数位相减后加1

目录权限计算方法:直接相减即可

总结:umask设置的越小,权限越大,慎用

临时设置umask

[root@localhost ~]# umask 000 //设置umask权限

永久设置umask

[root@localhost tmp]# vim /etc/profile # 或者/etc/bashrc内容一样 
...... 
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then 
	umask 002 //表示uid大于等于199的默认umask值,表示普通用户 
  else
  umask 022 //表示uid小于199的默认umask值,表示root fi

推荐阅读