权限管理

chown

chown 命令可以修改文件的属主, 也可以修改文件属组

1
2
3
4
# 修改文件的属主、属组
chown [OPTION]... [OWNER][:[GROUP]] FILE...
# 参考 rfile 修改file文件的属主和属组
chown [OPTION]... --reference=RFILE FILE...
  • -R 递归修改目录下的所有文件的属主和属组, 此项慎用, 非常危险

chgrp

chgrp 命令只用来修改属组

1
2
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE..
  • -R 递归

文件权限

u 属主
g 属组
o 其他

用户的最终权限, 从左向右进行顺序匹配, 一旦匹配权限立即生效, 不再向右查看其权限

rwx 读、写、执行

注意: 权限设置对 root 无效

目录和文件的权限区别

主要区别在执行权限 x
文件的x表示可以把文件提请内核启动一个进程, 即可以执行(运行)此文件(此文件必的内容必须是可执行)
目录的x是目录可访问的最小权限, 对文件进行读写操作的时候, 文件路径上经过的所有目录, 都必须先具有执行权限, 否则访问就无法进行下去, 定位不到目录文件

删除和新建文件, 需要有目录的执行(x)和写(w)权限: 这个很好理解, 因为删除和新建文件需要修改文件项, 而文件项就是目录的数据内容

chmod

1
2
3
4
5
6
7
8
9
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
#参考RFILE文件的权限,将FILE的修改为同RFILE
chmod [OPTION]... --reference=RFILE FILE...

# MODE: who opt permission
# who: u g o a
# opt: + - =
# permission: r w x X

X 只针对目录 配合 -R 使用的时候可以只递归修改目录的权限, 不影响文件的权限

面试题

1
2
3
4
5
6
7
8
执行 cp /etc/issue /data/dir 所需要的最小权限?

/bin/cp x
/etc/ x
/etc/issue r
/data/ x
/data/dir w、x

新建文件和目录的默认权限

对于文件来说, 大部分文件的内容是不可执行的, 所以默认不给执行权限
对于目录来说, 执行权限是必备的, 所以默认给执行权限

1
2
3
4
5
6
[20:27:57 root@centos7.mageedu.org  data]#mkdir test
[20:28:04 root@centos7.mageedu.org data]#touch a.log
[20:28:07 root@centos7.mageedu.org data]#ll
total 0
-rw-r--r-- 1 root root 0 Aug 3 20:28 a.log
drwxr-xr-x 2 root root 6 Aug 3 20:28 test

umask

umask 可以设定文件创建时的缺省模式, 不是直接设置, 而是间接设置, 首先预设两组默认权限上限:
对于文件来说, 默认权限上限是666(不给执行权限), 666 减去 umask值 就是文件创建时的默认权限;
对于目录来说, 默认权限上限是777(不做任何限制), 777 减去 umask值, 就是目录创建时的默认权限.
所以, 如果umask的值为 022 那么创建文件默认的权限就是 644, 创建目录默认的权限就是 755

1
umask [-p] [-S] [mode]

可以在~/.bashrc 中设置 umask 的值, 永久生效

1
[20:46:48 root@centos7.mageedu.org  data]#echo `umask -p` >> ~/.bashrc 

但是一般不会修改默认的权限, 如果修改也是临时的

练习

  1. 当用户docker对/testdir 目录无执行权限时,意味着无法做哪些操作?

无法ls查看目录下的文件列表; 无法cd到目录; 无法对目录下的文件进行读写操作; 也无法在目录下新建文件, 删除目录下的文件

  1. 当用户mongodb对/testdir 目录无读权限时,意味着无法做哪些操作?

无法ls查看目录下的文件列表

  1. 当用户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
  1. 误删除了用户git的家目录,请重建并恢复该用户家目录及相应的权限属性
1
2
3
4
5
6
mkdir /home/git
# 不要拷贝/etc/skel/.*因为.*包括..会把/etc目录内容也拷贝过去,就不对了,复制隐藏和非隐藏文件
# . 代表当前目录
cp -r /etc/skel/. /etc/skel/* /home/git
chmod 700 /home/git
chown -R git:git /home/git

Linux文件系统上的特殊权限

前面介绍了常见的三种权限 r w x, 还有三种特殊权限: SUID、SGID、Sticky

前提: 进程有属主和属组, 文件有属主和属组

SUID

SUID只对二进制可执行程序(后面称:bin文件)有效,SUID设置在目录上毫无意义。
如果bin文件设置了SUID,那么当前用户执行这个bin文件的时候,会自动继承这个bin文件的属主的身份。
例如:给/usr/bin/passwd设置SUID

1
2
[21:36:33 root@centos7.mageedu.org  home]#ll `which passwd`
-rwsr-xr-x. 1 root root 27856 Apr 1 11:57 /usr/bin/passwd

passwd的属主是root, 当前用户是wang, 那么当wang执行passwd的时候, 就等于root在执行passwd

1
2
3
4
5
6
# SUID权限的设定
chmod u+s file...
chmod u-s file...
chmod 4xxx file... # ugo 中u对应 100 是 4

-rwsr-xr-x. 1 root root 34928 May 11 2019 /usr/bin/passwd

SGID

类似SUID, 区别有两点:

  1. 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限,启动为进程后,其进程的属组为原程序文件的属组
  2. SUID作用在目录上无意义, SGID作用在目录上有意义
1
2
3
chmod g+s file...
chmod g-s file...
chmod 2xxx file... # ugo 中 g对应 010 是 2

目录上的SGID的权限功能:
默认情况下, 用户创建文件时, 其属组为此用户所属的主组, 一旦某目录被设置了SGID, 则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组, 通常用于创建一个协作目录

Sticky

具有写权限的目录, 用户通常可以删除该目录下的任何文件, 和文件的权限无关。当目录设置了Sticky权限,只有文件的所有者和root可以删除该文件。

1
2
3
4
5
chmod o+t DIR...
chmod o-t DIR...
chmod 1xxx DIR... # ugo 中 o对应 001 是 1

drwxrwxrwt. 15 root root 4096 Dec 12 20:16 /tmp

权限的数字表示

我们知道rwx可以用421来表示,修改文件权限可以这么写:chmod 755 file,其实755前面还有一个0。这个0就是特殊权限位,当权限位是0的时候,可以省略

suid、sgid、sticky
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

权限位映射

有suid时,属主位的x变成s,如果属主位没有x,则x位置上的-变成S
有sgid时,属组位的x变成s,如果属组位没有x,则x位置上的-变成S
有sticky时,OHTER位的x变成t,如果OHTER位没有x,则x位置上的-变成T

1
2
3
4
5
6
7
# 注意t和T
lujinkai@Z510:~/data/test$ chmod 1755 ./grep/
lujinkai@Z510:~/data/test$ ll -d grep/
drwxr-xr-t 2 lujinkai lujinkai 4096 Aug 13 17:27 grep//
lujinkai@Z510:~/data/test$ chmod o-x grep/
lujinkai@Z510:~/data/test$ ll -d grep/
drwxr-xr-T 2 lujinkai lujinkai 4096 Aug 13 17:27 grep//

设定文件的特殊属性 chattr

设置文件的特殊属性, 可以防止root用户删除或修改文件

1
2
3
4
5
6
7
8
9
# 不能删除、改名、更改
chattr +i files...

# 只能追加内容,不能删除、改名
chattr +a files...

# 显示特殊属性
lsattr

访问控制列表 ACL

Access Control List 实现灵活的权限管理
除了 u g o, 可以对更多用于设置权限
CentOS6可能不支持, 需要手动增加ACL功能

ACL生效顺序

owner > acl user > group > other

ACL相关命令

  • setfacl 为用户或群组添加针对某目录或文件的 ACL 权限

    1
    2
    setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
    setfacl --restore=file
    • -m –modify-acl 更改文件的访问控制列表
    • -x –remove-acl
    • -b –remove-all
    • –set 选项会把原有的ACL项都删除, 用新的替代, 需要注意的是一定要包含u g o设置, 不能像-m一样只是添加ACL就可以
      1
      2
      setfacl --set u::rw,u:wang:rw,g::r,o::- file1
      # 设置u的权限为rw、设置用户wang的权限是rw、设置g的权限是r,清空o的所有权限
  • getfacl 查看设置ACL权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 设置test对a.log文件没有任何权限 可以用 - 或 0 或 000 表示
[08:57:42 root@centos7.mageedu.org test]#setfacl -m u:test:- a.log
# 查看对a.log文件设置的ACl权限
[08:58:30 root@centos7.mageedu.org test]#getfacl a.log
# 设置apps群组对a.log文件只有写权限
[08:58:33 root@centos7.mageedu.org test]#setfacl -m g:apps:w a.log
[08:59:06 root@centos7.mageedu.org test]#getfacl a.log
# file: a.log
# owner: root
# group: root
user::rw-
user:test:---
group::r--
group:apps:-w-
mask::rw-
other::r--
# 清除test用户, 对a.log文件acl权限
[08:59:07 root@centos7.mageedu.org test]#setfacl -x u:test a.log
[08:59:32 root@centos7.mageedu.org test]#getfacl a.log
# file: a.log
# owner: root
# group: root
user::rw-
group::r--
group:apps:-w-
mask::rw-
other::r--
# 清除a.log上的所有acl权限
[08:59:33 root@centos7.mageedu.org test]#setfacl -b a.log
[08:59:55 root@centos7.mageedu.org test]#getfacl a.log
# file: a.log
# owner: root
# group: root
user::rw-
group::r--
other::r--

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
2
3
4
# 备份 先导出acl权限信息,然后再压缩备份
get -R /tmp/dir > acl.txt
# 恢复 先解压文件,然后导入acl权限信息
setfacl -R --set-file=acl.txt /tmp/dir

练习

  1. 在/testdir/dir里创建的新文件自动属于webs组,组apps的成员如:test能对这些新文件有读写权限,组dbs的成员如:mysql只能对新文件有读权限,其它用户(不属于webs,apps,dbs)不能访问这个文件夹

1.将apps、dbs中的成员加入到webs组中
2.注意setfacl设置apps和dbs的ACL时给x权限

  1. 误将 /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