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