Linux权限管理
Posted 徐中祥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux权限管理相关的知识,希望对你有一定的参考价值。
Linux系统权限管理
把一个用户加入了一个组,该用户就拥有了该组的权限,当一个用户要操作某个文件时,系统会依次检索该用户是否是该文件的拥有者,其次是组成员,最后是其他人,如果扫描到是拥有者,则具备拥有者的权限,不必往后扫描,以此类推
一 文件权限管理
1.1 基本权限介绍
基本权限类型
- r:可读=》4
- w:可写=》2
- x:可执行=》1
权限的归属
- 属主:u
- 属组:g
- 其他人:o
例如
[root@aliyun ~]# ls -l a.txt
-rw-r--r-- 1 root root 1146 Jul 16 18:42 a.txt
文件类型:
-:文本文档
d:目录
b:设备block
c:字符设备
s:套接字文件
l:软链接
权限
硬链接个数
属主
属组
文件所占用的空间(以字节为单位)
文件(目录)最近访问(修改)时间
文件名
1.2 设置权限
修改属主、属组
[root@aliyun ~]# chown alice.hr file1 # 改属主、属组
[root@aliyun ~]# chown alice file1 # 只改属主
[root@aliyun ~]# chown .hr file1 # 只改属组
[root@aliyun ~]# chown -R /test # 递归修改
修改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
chmod -R 777 xxx/
注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人
1.3 权限对文件or目录的意义
- 文件:ls -l 文件名
-rw-r--r-- 1 root root 1488 5月 12 16:13 /etc/passwd
- r:# 可以cat读取文件内容
- w:# 可以修改文件
- x:# 可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行
- 目录:ls -dl 文件名
drwxr-xr-x. 91 root root 8192 5月 12 16:25 /etc
- r:# 可以ls浏览文件下的内容
- w:# 可以在目录下创建新文件or目录
- x:
# 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
# 可以正常切换到目录下
# 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
- 总结
一:对文件夹的操作(不操作文件内容),需要当前用户具备的权限
1、对沿途所有文件夹有x权限
2、对目标文件夹有r或w权限
r-》可以浏览
w-》可以创建、删除、移动子文件和子目录
二:对文件的操作(操作文件内容),需要当前用户具备的权限
1、对沿途所有文件夹有x权限
2、对目标文件有r或w权限
r-》可以读取文件内容
w-》可以修改文件内容
!!!注意!!!
储备知识:vim修改的原理是将源文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文件名
例子:
1、当前用户对沿途所有文件夹都有x权限
2、并且当前用户对目标文件夹有w权限
3、但是当前用户对目标文件没有w权限
此时当前用可以vim编辑文件内容,并且可以wq!强制保存退出完成文件修改,其实是将源文件删掉了,可以通过查看前后操作的文件inode号来确定
1.4 案例
例1:要想在目录下创建\\删除内容:对目录的x权限+对目录的w权限
# 1、设置权限
[root@aliyun ~]# mkdir -p /a/b/c
[root@aliyun ~]# chmod -R o=x /a # 其他人o对当前目录及其子目录都有x权限
[root@aliyun ~]# chmod o+w /a/b/c # 其他人o对/a/b/c目录有w权限
# 2、查看权限
[root@aliyun ~]# ls -dl /a
drwxr-x--x 3 root root 4096 Aug 11 16:24 /a
[root@aliyun ~]# ls -dl /a/b
drwxr-x--x 3 root root 4096 Aug 11 16:24 /a/b
[root@aliyun ~]# ls -dl /a/b/c
drwxr-x-wx 2 root root 4096 Aug 11 16:25 /a/b/c
# 3、验证
[root@aliyun ~]#
[root@aliyun ~]# su - gg
Last login: Tue Aug 11 16:17:28 CST 2020 on pts/2
[gg@aliyun ~]$ touch /a/b/c/1.txt
[gg@aliyun ~]$ exit
logout
[root@aliyun ~]# ls /a/b//c/
1.txt
例2:要浏览目录下内容:对目录的x权限+对目录的r权限
[root@aliyun ~]# mkdir -p /a/b/c
[root@aliyun ~]# chmod -R o=x /a
[root@aliyun ~]# chmod o+r /a/b/c
[root@aliyun ~]#
[root@aliyun ~]# touch /a/b/c/{1..3}.txt
[root@aliyun ~]#
[root@aliyun ~]# su - gg
Last login: Tue Aug 11 16:27:33 CST 2020 on pts/2
[gg@aliyun ~]$ ls /a/b/c
1.txt 2.txt 3.txt
例3:要执行目录下程序:对目录的x权限+对文件的x权限,如果文件是解释型语言的脚本程序,还需要对文件有r权限
[root@aliyun ~]# mkdir -p /a/b/c
[root@aliyun ~]# chmod -R o=x /a/b/c
[root@aliyun ~]# cp /bin/echo /a/b/c
[root@aliyun ~]# chmod o=x /a/b/c/echo
[root@aliyun ~]#
[root@aliyun ~]# su - gg
Last login: Tue Aug 11 16:30:17 CST 2020 on pts/2
[gg@aliyun ~]$ /a/b/c/echo "hello egon"
hello egon
二 文件权限管理之特殊权限
详解:https://www.cnblogs.com/linhaifeng/articles/13357542.html
suid 4
sgid 2
sticky 1
2.1 SUID
普通用户不是root也不属于root组,于是它对/etc/shadow文件没有任何权限
[root@aliyun ~]# ll /etc/shadow
---------- 1 root root 1109 Aug 11 16:11 /etc/shadow
但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件,如何实现的???
[root@aliyun ~]# ll `which passwd`
-rwsr-xr-x 1 root root 27856 Aug 9 2019 /bin/passwd
可以看到一个s权限,s权限的特殊之处
- SUID 权限仅对二进制可执行文件有效
- 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
- 本权限仅在执行该二进制可执行文件的过程中有效
示例
[root@localhost ~]# ll `which cat`
-rwxr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat
[root@localhost ~]# chmod 4755 `which cat` # 或者 chmod u+s `which cat`
[root@localhost ~]# ll `which cat`
-rwsr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat
[root@localhost ~]# su - egon
[egon@localhost ~]$ 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.2 SGID
-
当SGID 作用于普通文件时,和 SUID 类似,在执行该文件时,用户将获得该文件所属组的权限。
-
当 SGID 作用于目录时,意义就非常重大了:
当一个用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件
如果该目录同时用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。
[root@localhost ~]# mkdir /test [root@localhost ~]# chmod g+s /test/ # 等同于chmod 2755 /test/ [root@localhost ~]# ll -dl /test/ drwxr-sr-x 2 root root 6 8月 11 17:06 /test/ [root@localhost ~]# [root@localhost ~]# chown .egon /test/ # 后期任何人在该目录下创建的文件or目录的属组都是egon
2.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
权限信息中最后一位 t 表明该目录被设置了 SBIT 权限。SBIT 对目录的作用是:当用户在该目录下创建新文件或目录时,仅有自己和 root 才有权力删除,主要作用于一个共享的文件夹。
三 文件权限管理之umask
新建文件、目录的默认权限是由umask决定的
1、uid>199并且属主与数组相等的用户下,umask: 0002
- 文件 664
- 目录 775
2、除1之外的其他用户下,比如root用户,umask: 0022
- 文件 644
- 目录 755
linux中文件默认权限为666、目录权限默认为777
文件权限计算方法:偶数位直接相减,奇数位相减后加1
文件的起始权限值 | umask值 | 操作 | 计算后文件权限 |
---|---|---|---|
666 | 022 (每位如果都是偶数) | 直接相减即可 | 644 |
666 | 033 (每位如果有奇数或偶数) | 相减(奇数位相减后在其原奇数位加1) | 644 |
666 | 325(每位如果有奇数或偶数) | 相减(奇数位相减后在其原奇数位加1) | 442 |
目录权限计算方法:直接相减即可
文件的起始权限值 | umask值 | 操作 | 计算后文件权限 |
---|---|---|---|
777 | 022 | 相减 | 755 |
777 | 033 | 相减 | 744 |
777 | 325 | 相减 | 452 |
总结: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
高级权限
一 文件权限管理ACL权限
用命令setfacl设置的ACL(Access Control List) 权限是UGO权限的扩展,ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。
ps:UGO中的O即其他人,涵盖了非常大的范围,我们使用setfacl可以将用户对文件的权限进行进一步细化
文件一旦设置了acl权限后,查看信息会出现一个加号,以后包括UGO在内的权限都可以用setfacl来设置
修改属主的权限
setfacl -m u::权限 a.txt
修改属组的权限
setfacl -m g::权限 a.txt
修改其他人的权限
setfacl -m o::权限 a.txt
修改具体某一个用户的权限
setfacl -m u:用户名:权限 a.txt
修改具体某一个组的权限
setfacl -m g:组名:权限 a.txt # 组必须存在
# 也可以给目录设置,都一样
查看与删除
# 查看
getfacl /opt/a.txt
# 删除
setfacl -x g:group1 /opt/a.txt # 删除组hr的权限
setfacl -b /opt/a.txt #删除所有acl权限
应用:当前用户如果检索不到对应的acl权限或者检索到后发现权限为空,都会对应到other权限上
# 应用场景1: 其他人对文件没有任何权限,然后单独设置其他人里的egon01对文件有r权限、egon02对文件有w权限
setfacl -b b.txt # 可以先清理掉所有的acl权限,保证实验环境干净
setfacl -m o::- b.txt
setfacl -m u:egon01:r b.txt
setfacl -m u:egon02:w b.txt
# egon01 对 b.txt的权限为r
# egon02 对 b.txt的权限为w
# 剩余的其他人中:
# 例如egon03 对 b.txt的权限为-
# 应用场景2:其他人对文件有rw权限,然后单独设置其他人里的egon01对文件有r权限、egon02对文件有w权限
setfacl -b b.txt # 可以先清理掉所有的acl权限,保证实验环境干净
setfacl -m o::rw b.txt
setfacl -m u:egon01:r b.txt
setfacl -m u:egon02:w b.txt
# egon01 对 b.txt的权限为r
# egon02 对 b.txt的权限为w
# 剩余的其他人中:
# 例如egon03 对 b.txt的权限为rw
应用示例
[root @ web01 ~]# pwd
/ root
[root @ web01 ~]# echo 1111 > b.txt
[root @ web01 ~]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::rw -
group::r - -
other::r - -
[root @ web01 ~]# setfacl -m o::- b.txt
[root @ web01 ~]# setfacl -m u:egon01:r b.txt
[root @ web01 ~]# setfacl -m u:egon02:w b.txt
[root @ web01 ~]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::rw -
user: egon01:r - -
user: egon02:-w -
group::r - -
mask::rw -
other::---
[root @ web01 ~]# su - egon01 -c "cat /root/b.txt"
1111
[root @ web01 ~]# su - egon01 -c "echo 222 >> /root/b.txt"
-bash: / root / b.txt: 权限不够
[root @ web01 ~]# su - egon02 -c "cat /root/b.txt"
cat: / root / b.txt: 权限不够
[root @ web01 ~]# su - egon02 -c "echo 222 >> /root/b.txt"
=>ACL高级用法<==
1、mask
设置mask命令如下
setfacl -m m:rw /opt/a.txt
设置完mask后除了所有者和other不受影响,其他都会受到mask的影响,mask决定了他们的最高权限
mask值就像一个筛子,文件属主和other之外的所有权限都需要被它筛一遍,
如果mask值为rw-则代表该筛子只放行rw权限。
本质原理是权限A需要与mask值B进行按位与运算,得到的结果才是effective有效权限
建议:为了方便管理文件权限,其他人的权限置为空:chmod o=- /opt/a.txt
# 1、保证其他人对/opt/a.txt没有权限,然后展开实验
[root@egon ~]# echo 111 > /opt/a.txt
[root@egon ~]# setfacl -m o::- /opt/a.txt
[root@egon ~]# getfacl /opt/a.txt
getfacl: Removing leading '/' from absolute path names
# file: opt/a.txt
# owner: root
# group: root
user::rw-
group::r--
other::---
# 2、添加acl权限
[root@egon opt]# setfacl -m u:egon:rw /opt/a.txt # 其他人egon对a.txt有rw权限
[root@egon opt]# setfacl -m u:lili:r /opt/a.txt # 其他人lili对a.txt有r权限
[root@egon opt]# getfacl /opt/a.txt # 可以看到mask默认值为rw-
getfacl: Removing leading '/' from absolute path names
# file: opt/a.txt
# owner: root
# group: root
user::rw-
user:lili:r--
user:egon:rw-
group::r--
mask::rw-
other::---
[root@egon opt]# ll /opt/a.txt
-rw-rw----+ 1 root root 4 10月 29 19:33 /opt/a.txt
[root@egon opt]#
# 3、按位与运算
lili权限:r--
mask权限:rw-
lili最终权限: r--
[root@egon opt]# su - lili -c "cat /opt/a.txt"
111
222
[root@egon opt]# su - lili -c "echo 666 >> /opt/a.txt"
-bash: /opt/a.txt: 权限不够
[root@egon opt]#
egon权限:rw-
mask权限:rw-
最终权限: rw-
[root@egon opt]# su - egon -c "cat /opt/a.txt"
111
[root@egon opt]# su - egon -c "echo 222 >> /opt/a.txt"
[root@egon opt]#
# 4、设置mask
[root@egon opt]# setfacl -m m:- /opt/a.txt
[root@egon opt]# getfacl /opt/a.txt
getfacl: Removing leading '/' from absolute path names
# file: opt/a.txt
# owner: root
# group: root
user::rw-
user:lili:r-- #effective:---
user:egon:rw- #effective:---
group::r-- #effective:---
mask::---
other::---
[root@egon opt]# su - egon -c "cat /opt/a.txt"
cat: /opt/a.txt: 权限不够
[root@egon opt]# su - lili -c "cat /opt/a.txt"
cat: /opt/a.txt: 权限不够
[root@egon opt]#
# ps:我们一般不更改 mask 权限,只要赋予 mask 最大权限(也就是 rwx),则给用户或群组设定的 ACL 权限本身就是有效的。
2、default: 继承(默认)
# 要求:
希望egon能够对/home以及以后在/home下新建的文件有读、写、执行权限
# 思路:
步骤一: 赋予egon对/home读、写、执行权限
[root@localhost ~]# setfacl -m u:egon:rwx /home
步骤二: 赋予egon对以后在/home下新建的文件有读、写、执行权限 (使egon的权限继承)注意:是作用到子目录,对当前文件没有相应权限
[root@localhost ~]# setfacl -m d:u:egon:rwx /home
- 测试:
[root@egon opt]# mkdir /test
[root@egon opt]# setfacl -m u:egon:rwx /test
[root@egon opt]# setfacl -m d:u:egon:rwx /test
[root@egon opt]# getfacl /test
getfacl: Removing leading '/' from absolute path names
# file: test
# owner: root
# group: root
user::rwx
user:egon:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:egon:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@egon opt]# mkdir /test/aaa
[root@egon opt]# touch /test/b.txt
[root@egon opt]# getfacl /test/aaa/
getfacl: Removing leading '/' from absolute path names
# file: test/aaa/
# owner: root
# group: root
user::rwx
user:egon:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:egon:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@egon opt]# getfacl /test/b.txt
getfacl: Removing leading '/' from absolute path names
# file: test/b.txt
# owner: root
# group: root
user::rw-
user:egon:rwx #effective:rw- # 权限已经继承过来了,但是因为mask的影响,以上是关于Linux权限管理的主要内容,如果未能解决你的问题,请参考以下文章