权限管理

文件权限

1
2
ugo:属主、属组、其他
rwx:读、写、执行

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

注意:权限设置对 root 用户无效

目录和文件的 x 权限:

  • 文件 x:把文件提请内核,启动一个进程,文件必的内容必须是可执行
  • 目录 x:目录可访问的最小权限,对文件进行读写操作的时候,文件路径上经过的所有目录,都必须先具有执行权限

删除和新建文件,需要有目录的执行(x)和写(w)权限

默认权限

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

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

chown

修改文件属主、属组

1
2
3
4
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

-R 递归修改目录下的所有文件的属主和属组

chgrp

chgrp 命令只用来修改属组

1
2
3
4
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE.. # 参考--reference指定的文件的属组

-R 递归

chmod

修改文件权限

1
2
3
4
5
6
7
8
9
10
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE... # 参考--reference指定的文件的权限

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

X:只针对目录,配合-R使用只递归修改目录的权限

umask

umask 通过 间接 的方式设定文件创建时的缺省模式

  • 对于文件来说,默认权限上限是 666(不给执行权限),666 减去 umask 值就是文件创建时的默认权限
  • 对于目录来说,默认权限上限是 777(不做任何限制),777 减去 umask 值,就是目录创建时的默认权限

注意:出于安全方面的考虑,普通文件的执行权限不能通过权限掩码来设置,必须手工修改(使用 chmod 命令)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
umask [-p] [-S] [mode]

# 示例
$umask # 查看当前umask
0022
$umask -S # 格式化打印当前umask
u=rwx,g=rx,o=rx
$umask -p # 输出可被调用,就是说输出一个可执行的命令
umask 0022
$echo `umask -p` >> ~/.bashrc # 设置 umask 的值,永久生效

umask 002 # 设置umask,这样创建文件默认的权限就是644,创建目录默认的权限就是755
umask u=rw,g=r,o=

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

特殊权限

r w x 是普通权限,还有三种特殊权限:suid、sgid、sticky

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

  • 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
  • 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
  • 进程访问文件时的权限,取决于进程的发起者

suid

执行二进制文件,会启动进程,默认进程的属主是当前用户的属主,属组是当前用户的主组,如果执行设置 suid 的二进制文件,进程的属主会是此文件的属主

如果二进制可执行文件的属主是 root,那么设置了 suid 后,其他所有用户都可以运行此文件,并且是以 root 用户的身份运行

注意:

  • suid 只对二进制可执行程序(shell 脚本不是二进制可执行程序)有效
  • suid 设置在目录上毫无意义

设置 suid 权限:

1
2
3
4
5
chmod u+s file...
chmod u-s file...
chmod 4xxx file...

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

应用场景:

  1. 某些服务必须以 root 用户运行,可是每次启动都要运维 sudo 很不方便,此时就给可执行程序设置 suid
  2. 某些服务必须以 nologin 用户(例如 www)运行,也可以设置 suid

sgid

sgid 和 suid 类似,后者进程继承文件的属主,前者进程继承文件的属组

执行二进制文件,会启动进程,默认进程的属主是当前用户的属主,属组是当前用户的主组,如果执行设置 sgid 的二进制文件,进程的属组会是此文件的属组

suid 作用在目录上无意义,但是 sgid 作用在目录上有意义:

默认情况下,新建文件的属组为用户的主组,如果目录设置了 sgid,则在此目录下新建文件,文件的属组为此目录的属组,可以用于创建协作目录

设置 sgid 权限:

1
2
3
chmod g+s file...
chmod g-s file...
chmod 2xxx file...

sticky

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

1
2
3
4
5
chmod o+t DIR...
chmod o-t DIR...
chmod 1xxx DIR...

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

chattr

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

1
2
3
chattr +i files...   # 不能删除、改名、更改
chattr +a files... # 只能追加内容,不能删除、改名
lsattr # 显示特殊属性

权限的数字表示

rwx 前面还有一个特殊权限位,rwx 对应的数字 421,特殊权限位取值 0-7,默认 0 可省略

0-7,8 种情况能够表示 suid、sgid、sticky 这三个特殊权限:

1
2
3
4
5
6
7
8
9
suid sgid sticky
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

权限位映射

设置 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
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//

ACL

Access Control List,访问控制列表,实现灵活的权限管理

除了 u g o,可以对更多的用户设置权限

CentOS6 可能不支持,需要手动增加 ACL 功能

ACL 生效顺序

1
owner(u) > acl user > group(g) > other(o)

ACL 相关命令

setfacl

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

1
2
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
setfacl --restore=file
1
2
3
4
- -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. 执行 cp /etc/issue /data/dir 所需要的最小权限?

    1
    2
    3
    4
    5
    /bin/cp  x
    /etc/ x
    /etc/issue r
    /data/ x
    /data/dir/ w、x
  2. 当用户 docker 对/testdir 目录无执行权限时,意味着无法做哪些操作?

    1
    无法ls查看目录下的文件列表; 无法cd到目录; 无法对目录下的文件进行读写操作; 也无法在目录下新建文件,删除目录下的文件
  3. 当用户 mongodb 对/testdir 目录无读权限时,意味着无法做哪些操作?

    1
    无法ls查看目录下的文件列表
  4. 当用户 redis 对/testdir 目录无写权限时,该目录下的只读文件 file1 是否可修改和删除?

    1
    不可以
  5. 当用户 zabbix 对/testdir 目录有写和执行权限时,该目录下的只读文件 file1 是否可修改和删除?

    1
    不可以修改,可以删除
  6. 复制/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
  7. 误删除了用户 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
  8. 在 /testdir/dir 里创建的新文件自动属于 webs 组,组 apps 的成员如:test 能对这些新文件有读写权限,组 dbs 的成员如:mysql 只能对新文件有读权限,其它用户(不属于 webs、apps、dbs)不能访问这个文件夹

    1
    2
    1.将apps、dbs中的成员加入到webs组中
    2.注意setfacl设置apps和dbs的ACL时给x权限
  9. 误将 /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