权限管理
文件权限
1 | ugo:属主、属组、其他 |
用户的最终权限从左向右进行顺序匹配,一旦匹配权限立即生效,不再向右继续匹配
注意:权限设置对 root 用户无效
目录和文件的 x 权限:
- 文件 x:把文件提请内核,启动一个进程,文件必的内容必须是可执行
- 目录 x:目录可访问的最小权限,对文件进行读写操作的时候,文件路径上经过的所有目录,都必须先具有执行权限
删除和新建文件,需要有目录的执行(x)和写(w)权限
默认权限
对于文件来说,大部分文件的内容是不可执行的,所以默认不给执行权限
对于目录来说,执行权限是必备的,所以默认给执行权限
1 | [20:27:57 root@centos7.mageedu.org data]#mkdir test |
chown
修改文件属主、属组
1 | chown [OPTION]... [OWNER][:[GROUP]] FILE... |
chgrp
chgrp 命令只用来修改属组
1 | chgrp [OPTION]... GROUP FILE... |
chmod
修改文件权限
1 | chmod [OPTION]... MODE[,MODE]... FILE... |
umask
umask 通过 间接 的方式设定文件创建时的缺省模式
- 对于文件来说,默认权限上限是 666(不给执行权限),666 减去 umask 值就是文件创建时的默认权限
- 对于目录来说,默认权限上限是 777(不做任何限制),777 减去 umask 值,就是目录创建时的默认权限
注意:出于安全方面的考虑,普通文件的执行权限不能通过权限掩码来设置,必须手工修改(使用 chmod 命令)
示例:
1 | umask [-p] [-S] [mode] |
一般不会修改默认的权限,如果修改也是临时的
特殊权限
r w x 是普通权限,还有三种特殊权限:suid、sgid、sticky
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
suid
执行二进制文件,会启动进程,默认进程的属主是当前用户的属主,属组是当前用户的主组,如果执行设置 suid 的二进制文件,进程的属主会是此文件的属主
如果二进制可执行文件的属主是 root,那么设置了 suid 后,其他所有用户都可以运行此文件,并且是以 root 用户的身份运行
注意:
- suid 只对二进制可执行程序(shell 脚本不是二进制可执行程序)有效
- suid 设置在目录上毫无意义
设置 suid 权限:
1 | chmod u+s file... |
应用场景:
- 某些服务必须以 root 用户运行,可是每次启动都要运维 sudo 很不方便,此时就给可执行程序设置 suid
- 某些服务必须以 nologin 用户(例如 www)运行,也可以设置 suid
sgid
sgid 和 suid 类似,后者进程继承文件的属主,前者进程继承文件的属组
执行二进制文件,会启动进程,默认进程的属主是当前用户的属主,属组是当前用户的主组,如果执行设置 sgid 的二进制文件,进程的属组会是此文件的属组
suid 作用在目录上无意义,但是 sgid 作用在目录上有意义:
默认情况下,新建文件的属组为用户的主组,如果目录设置了 sgid,则在此目录下新建文件,文件的属组为此目录的属组,可以用于创建协作目录
设置 sgid 权限:
1 | chmod g+s file... |
sticky
具有写权限的目录,用户通常可以删除该目录下的任何文件,和文件的权限无关。当目录设置了 sticky 权限,只有文件的所有者和 root 可以删除该文件
1 | chmod o+t DIR... |
chattr
设置文件的特殊属性,可以防止 root 用户删除或修改文件
1 | chattr +i files... # 不能删除、改名、更改 |
权限的数字表示
rwx 前面还有一个特殊权限位,rwx 对应的数字 421,特殊权限位取值 0-7,默认 0 可省略
0-7,8 种情况能够表示 suid、sgid、sticky 这三个特殊权限:
1 | suid sgid sticky |
权限位映射
设置 suid,u 的 x 变成 s,如果 u 本来没有 x,则 x 位置上的 - 变成 S
设置 sgid,g 的 x 变成 s,如果 g 本来没有 x,则 x 位置上的 - 变成 S
设置 sticky,o 位的 x 变成 t,如果 o 本来没有 x,则 x 位置上的 - 变成 T
1 | # 注意t和T |
ACL
Access Control List,访问控制列表,实现灵活的权限管理
除了 u g o,可以对更多的用户设置权限
CentOS6 可能不支持,需要手动增加 ACL 功能
ACL 生效顺序
1 | owner(u) > acl user > group(g) > other(o) |
ACL 相关命令
setfacl
为用户或群组添加针对某目录或文件的 ACL 权限
1 | setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ... |
1 | - -m --modify-acl 更改文件的访问控制列表 |
1 | setfacl --set u::rw,u:wang:rw,g::r,o::- file1 |
getfacl
查看设置 ACL 权限
1 | # 设置test对a.log文件没有任何权限 可以用 - 或 0 或 000 表示 |
mask
mask 设置除 u 和 o 之外的用户和组的最大权限
1 | [09:28:44 root@centos7 test]#getfacl -m mask::r a.log |
设置 mask 之后,如果再使用 setfacl 或者 chmod 更改文件的权限,mask 的值会自动调整
备份和还原 ACL
主要的文件操作命令 cp 和 mv 都支持 ACL,cp 命令需要加上 -p 参数。但是 tar 等常见的备份工具不会保留目录和文件的 ACL 信息
1 | # 备份 先导出acl权限信息,然后再压缩备份 |
练习
执行 cp /etc/issue /data/dir 所需要的最小权限?
1
2
3
4
5/bin/cp x
/etc/ x
/etc/issue r
/data/ x
/data/dir/ w、x当用户 docker 对/testdir 目录无执行权限时,意味着无法做哪些操作?
1
无法ls查看目录下的文件列表; 无法cd到目录; 无法对目录下的文件进行读写操作; 也无法在目录下新建文件,删除目录下的文件
当用户 mongodb 对/testdir 目录无读权限时,意味着无法做哪些操作?
1
无法ls查看目录下的文件列表
当用户 redis 对/testdir 目录无写权限时,该目录下的只读文件 file1 是否可修改和删除?
1
不可以
当用户 zabbix 对/testdir 目录有写和执行权限时,该目录下的只读文件 file1 是否可修改和删除?
1
不可以修改,可以删除
复制/etc/fstab 文件到/var/tmp 下,设置文件所有者为 tomcat 读写权限,所属组为 apps 组有读写权限,其他人无权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14[21:01:39 root@centos7.mageedu.org data]#useradd -s /sbin/nologin -M tomcat
[21:01:53 root@centos7.mageedu.org data]#groupadd apps
[21:03:36 root@centos7.mageedu.org tmp]#ll
total 4
-rw-r--r-- 1 root root 595 Aug 3 21:03 fstab
[21:03:37 root@centos7.mageedu.org tmp]#chown tomact:apps ./fsta
[21:04:05 root@centos7.mageedu.org tmp]#chown tomcat:apps ./fstab
[21:04:16 root@centos7.mageedu.org tmp]#ll
total 4
-rw-r--r-- 1 tomcat apps 595 Aug 3 21:03 fstab
[21:08:20 root@centos7.mageedu.org tmp]#chmod 660 fstab
[21:08:50 root@centos7.mageedu.org tmp]#ll
total 4
-rw-rw---- 1 tomcat apps 595 Aug 3 21:03 fstab误删除了用户 git 的家目录,请重建并恢复该用户家目录及相应的权限属性
1
2
3
4
5
6mkdir /home/git
# 不要拷贝/etc/skel/.*因为.*包括..会把/etc目录内容也拷贝过去,就不对了,复制隐藏和非隐藏文件
# . 代表当前目录
cp -r /etc/skel/. /etc/skel/* /home/git
chmod 700 /home/git
chown -R git:git /home/git在 /testdir/dir 里创建的新文件自动属于 webs 组,组 apps 的成员如:test 能对这些新文件有读写权限,组 dbs 的成员如:mysql 只能对新文件有读权限,其它用户(不属于 webs、apps、dbs)不能访问这个文件夹
1
21.将apps、dbs中的成员加入到webs组中
2.注意setfacl设置apps和dbs的ACL时给x权限误将 /bin/chmod 文件的执行权限删除,如何恢复?
方法一:从别的机器上拷贝一个过来
方法二:用系统中已有的各种脚本语言解释器修改权限
方法三:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21[14:24:31 root@centos7 data]#chmod -x /usr/bin/chmod
[14:24:41 root@centos7 data]#ll /usr/bin/chmod
-rw-r--r--. 1 root root 58592 Aug 20 2019 /usr/bin/chmod
[14:24:48 root@centos7 data]#setfacl -m u:root:rwx /usr/bin/chmod
[14:25:18 root@centos7 data]#getfacl /usr/bin/chmod
getfacl: Removing leading '/' from absolute path names
# file: usr/bin/chmod
# owner: root
# group: root
user::rw-
user:root:rwx
group::r--
mask::rwx
other::r--
[14:25:30 root@centos7 data]#chmod +x /usr/bin/chmod
[14:25:43 root@centos7 data]#ll /usr/bin/chmod
-rwxrwxr-x+ 1 root root 58592 Aug 20 2019 /usr/bin/chmod
[14:25:48 root@centos7 data]#setfacl -b /usr/bin/chmod
[14:26:03 root@centos7 data]#ll /usr/bin/chmod
-rwxr--r-x. 1 root root 58592 Aug 20 2019 /usr/bin/chmod