第六章 linux用户组和权限管理
用户组和权限管理
介绍安全3A
?资源分派:
Authentication:认证
Authorization:授权
Accouting|Audition:审计
用户user
?令牌token,identity
登陆成功后拿到令牌。
?Linux用户:Username/UID
?管理员:root, 0
?普通用户:1-65535
系统用户:1-499, 1-999(CentOS7)
对守护进程获取资源进行权限分配
登录用户:500+, 1000+(CentOS7)
交互式登录
组group
?Linux组:Groupname/GID
?管理员组:root, 0
?普通组:
系统组:1-499, 1-999(CENTOS7)
普通组:500+, 1000+(CENTOS7)
其实在Linux中并不分成管理员组和用户组,主要分主组和附加组。
安全上下文
?Linux安全上下文
运行中的程序:进程(process)
以进程发起者的身份运行:
root: /bin/cat
mage: /bin/cat
进程所能够访问资源的权限取决于进程的运行者的身份
组的类别
?Linux组的类别
用户的主要组(primary group)
用户必须属于一个且只有一个主组(并且主组不能删除)
组名同用户名,且仅包含一个用户,私有组
用户的附加组(supplementary group)
一个用户可以属于零个或多个辅助组
[root@localhost ~]#id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
查看用户的id和主组和附加组,一个组已经成为了某个账号的主组,这个组是不能删除的。
用户和组的配置文件
?Linux用户和组的主要配置文件:
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/group:组及其属性信息
/etc/shadow:用户密码及其相关属性
/etc/gshadow:组密码及其相关属性
passwd文件格式 ?login name:登录用名(wang) ?passwd:密码(x) ?UID:用户身份编号(1000) ?GID:登录默认所在组编号(1000) ?GECOS:用户全名或注释 ?home directory:用户主目录(/home/wang) ?shell:用户默认使用shell (/bin/bash) [root@localhost ~]#whatis passwd passwd (1) - update user‘s authentication tokens sslpasswd (1ssl) - compute password hashes passwd (5) - password file 查看/etc/passwd帮助,是在第5章。 [root@localhost ~]#man 5 passwd PASSWD(5) Linux Programmer‘s Manual PASSWD(5)
NAME passwd - password file
DESCRIPTION The /etc/passwd file is a text file that describes user login accounts for the system. name:password:UID:GID:GECOS:directory:shell 查看/etc/passwd的帮助,每个字段表示的意思如上面最后一行描述所示,字段间用冒号隔开,其中CECOS是用户全名或注释,其他的应该都是可以理解的。 [root@localhost ~]#getent passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@localhost ~]#cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 上面两条命令都能查看passwd内容,第一条命令方便点。 [root@localhost ~]#getent passwd sunan sunan:x:1000:1000:sunan:/home/sunan:/bin/bash 想查看某个用户后面直接加上用户名即可,这就是上面说的方便。 [root@localhost ~]#pwunconv [root@localhost ~]#getent passwd sunan sunan:$6$5ROKagTj/2yRGbuE$zwaSMvClYng4.oIE0fY90cY2SWL4HoIzZ.3da8x0BE1wJSn64fAXbS1E9leXiYvQ04tgv/Hf9E2lAl7BTOW/N0:1000:1000:sunan:/home/sunan:/bin/bash 使用上面命令是使/etc/shadow中的密码回归到/etc/passwd中,但是这样不安全,并且使得/etc/shadow文件丢失。同时对修改用户名,不建议在passwd中直接改, 因为不止passwd中有用户名,shadow中也有,这样就需要改多个文件。尽量使用命令改用户名,这样涉及这个用户的所有文件都可以修改掉。 [root@localhost ~]#cat /etc/shadow cat: /etc/shadow: No such file or directory [root@localhost ~]#pwconv [root@localhost ~]#cat /etc/shadow root:$6$N23hSc6iqrrtt7A.$OL78oRDi5TwUd1fy6tnzQxeZIA3/jlU3WhGVynPTaymVsJdBftbL6jLGD2l41GLSWs4H0F1DaSV8C.deWCeDl1:17486:0:99999:7::: 再回到系统默认的文件,执行pwconv即可。 root@localhost ~]#vim /etc/passwd root:x:1000:0:root:/root:/bin/bash sunan:x:0:1000:sunan:/home/sunan:/bin/bash gentoo:x:1001:1001:Gentoo Distribution:/home/gentoo:/bin/csh "/etc/passwd" 42L, 2168C written 修改root UID为1000,sunan UID为0这样孙安就拥有了超级管理员权限。如果是root和sunan的UID都不为0了怎么办,这样就没人拥有管理员权限了,其实只要有一个终端还没退出管理员登陆,就可以形式管理员权限,因为在登录的时候就已经授予管理员权限了,只要不退出就一直拥有管理员权限。创建个快照,我们试一试没有管理员系统会发生什么。 root@localhost ~]#vim /etc/passwd root:x:1000:0:root:/root:/bin/bash sunan:x:0:1000:sunan:/home/sunan:/bin/bash gentoo:x:1001:1001:Gentoo Distribution:/home/gentoo:/bin/csh "/etc/passwd" 42L, 2168C written 重启发现启动不了了,重启进入菜单选项,centos7上选择第一项按e键,进入编辑界面。
在上图的最后添加 init=/bin/sh
最后的提示可以看到敲Ctrl+x启动生效
上图可以看到文件系统是只读的,不能在 / 下面创建文件,通过命令把 / 改为可读写,这样就可以创建文件了。然后,修改/etc/passwd文件中的root的UID为0,exit退出重启即可。 Centos6.9上:
在上面的最后空格添加 init=/bin/bash 然后敲回车
可以看到文件系统是只读的,不能在 / 下面创建文件,通过命令把 / 改为可读写,这样就可以创建文件了。
通过nano修改root的UID为0,exit退出重启。 [root@localhost ~]#chfn sunan Changing finger information for sunan. Name [sunan]: sunan Office []: opt Office Phone []: 12 Home Phone []: 12 Finger information changed. [root@localhost ~]#getent passwd sunan sunan:x:1000:1000:sunan,opt,12,12:/home/sunan:/bin/bash chfn修改用户的信息说明,可以看到用户信息已经修改 [root@localhost ~]#finger sunan Login: sunan Name: sunan Directory: /home/sunan Shell: /bin/bash Office: opt, 12 Home Phone: 12 Last login Thu Nov 16 10:29 (CST) on pts/1 No mail. No Plan. 使用finger查看信息,finger默认没有安装,需要手工进行安装。 一般不推荐直接改文件,可能很多的相关文件没有一起改过来导致许多问题。推荐使用命令改文件。 [root@localhost ~]#usermod -d /a sunan [root@localhost /]#getent passwd sunan sunan:x:1000:1000:sunan,opt,12,12:/a:/bin/bash usermod -d 修改文件的家目录为/a. [root@localhost /]#usermod -s /bin/csh sunan [root@localhost /]#getent passwd sunan sunan:x:1000:1000:sunan,opt,12,12:/a:/bin/csh uermod -s修改文件的shell。 shadow文件格式 ?登录用名 ?用户密码:一般用sha512加密 ?从1970年1月1日起到密码最近一次被更改的时间 ?密码再过几天可以被变更(0表示随时可被变更) ?密码再过几天必须被变更(99999表示永不过期) ?密码过期前几天系统提醒用户(默认为一周) ?密码过期几天后帐号会被锁定 ?从1970年1月1日算起,多少天后帐号失效 密码加密 ?加密机制: 加密:明文--> 密文 解密:密文--> 明文 ?单向加密:哈希算法,原文不同,密文必不同 相同算法定长输出,获得密文不可逆推出原始数据 雪崩效应:初始条件的微小改变,引起结果的巨大改变 md5: message digest, 128bits(被山东大学的王晓云破解) sha1: secure hash algorithm, 160bits sha224: 224bits sha256: 256bits sha384: 384bits sha512: 512bits ?更改加密算法authconfig--passalgo=sha256 --update 密码的复杂性策略 ?使用数字、大写字母、小写字母及特殊字符中至少3种 ?足够长 ?使用随机密码 ?定期更换,不要使用最近曾经使用过的密码 密码期限
[sunan@localhost ~]$cat /etc/passwd |tail -1 sunan:x:500:500::/home/sunan:/bin/bash [sunan@localhost ~]$cat /etc/shadow cat: /etc/shadow: Permission denied 普通用户能够查看/etc/passwd的文件内容,所以说把密码放到/etc/passwd 中是不安全的。因为普通用户无法查看/etc/shadow的文件内容,所以将密码放到此文件中安全。 [root@localhost ~]#getent shadow sunan sunan:$6$5qiTgU8L79smDQjz$q0x9YtylUSvKk6we5vFxh0fniK/NztI5TvxYJiNUyKNbTq/UF4fDSW6v/SNcXs8b/Yc6XcA4TU4ptPznYBGrc1:17477:0:99999:7::: 查看文件的密码格式,其中5qiTgU8L79smDQjz是salt作用是为了两个口令一样的用户使得他们的加密口令不同。6代表使用sha512加密算法。 [root@localhost ~]#authconfig --passalgo=sha256 --update [root@localhost ~]#passwd sunan 修改加密算法 [root@localhost ~]#getent shadow sunan sunan:$5$SinBLQy1$Cp6PRG5sx4KwRrY/gaTbTCJ3Ucqyk8YhfWdbO5vxJy7:17480:0:99999:7::: 可以看到加密算法变成了5即sha256 [root@localhost ~]#openssl rand -base64 30 RJtQTh4g+npXoiU0YOoySeLZIZLLs4Gk8HgeSQgP 产生base64的30不是30位的随机密码,想要30位随机密码还需要处理。 [root@localhost ~]#cat /etc/login.defs 文件中设定的是什么样的加密算法,不建议直接更改。 [root@localhost ~]#useradd sun [root@localhost ~]#getent shadow sun sun:!!:17480:0:99999:7::: 系统默认创建的账号不是空口令,看到密码位是!!是锁定的意思,不能空口令登陆,redhat使用usermod -U sun 两次解锁可以登陆,centos6就不行。 注意:关于将shell改为/sbin/nologin 则不可以进行交互式登陆了。 [root@localhost ~]#usermod -L sun [root@localhost ~]#getent shadow sun sun:!$6$.hHKjOk4$RFAVAXDBsABcPTQcPle1UMtD9KMUOtJthFKDyrnplYNVEUJUkw8.3UekyoeAskpblkrDW1USxvuopOnyTVyu41:17480:0:99999:7::: 可以看到加密密码前面有个!,意思是被锁定了,不能登陆。 [root@localhost ~]#usermod -U sun 将账户解锁 [root@localhost ~]#echo 123456|passwd --stdin sunn Changing password for user sunn. passwd: all authentication tokens updated successfully. 直接修改口令。 [root@localhost ~]#HISTCONTROL=ignoreboth [root@localhost ~]# echo a a 将命令前面加空格的命令不记入history,这样修改密码就会不记入历史了。 [root@localhost ~]#getent shadow sunn sunn:$6$K2cnHStn$6p5kCrPubFjOewLG0poYDbTsLsbGTUZK0tYQ2xlxQzz3hfb3G5F0Hry/L6ZMq2JLK10oSEqNcaIq2xbx7UuvD1:17486:0:99999:7::: [root@localhost ~]#passwd -e sunn Expiring password for user sunn. passwd: Success [root@localhost ~]#getent shadow sunn sunn:$6$K2cnHStn$6p5kCrPubFjOewLG0poYDbTsLsbGTUZK0tYQ2xlxQzz3hfb3G5F0Hry/L6ZMq2JLK10oSEqNcaIq2xbx7UuvD1:0:0:99999:7::: 使用户的密码马上失效命令,即17486为0了,登陆这个账号必须马上改口令。 [root@localhost ~]#chage -d0 sunn [root@localhost ~]#getent shadow sunn sunn:$6$/GeZGBic$qREMr/tD.L4RVNdDuBPy3V09cU1f3Bjbm/UPkozpOdJf0bqVVPOuw3uUMDYU.8HEVOjWrFd9SCp1SbEFUplN.0:0:0:99999:7::: 这样也可以。 [root@localhost ~]#chage -d chage: option requires an argument -- ‘d‘ Usage: chage [options] LOGIN
Options: -d, --lastday LAST_DAY set date of last password change to LAST_DAY -E, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE -h, --help display this help message and exit -I, --inactive INACTIVE set password inactive after expiration to INACTIVE -l, --list show account aging information -m, --mindays MIN_DAYS set minimum number of days before password change to MIN_DAYS -M, --maxdays MAX_DAYS set maximim number of days before password change to MAX_DAYS -R, --root CHROOT_DIR directory to chroot into -W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS chage的使用用法。 [root@localhost ~]#chage sunn Changing the aging information for sunn Enter the new value, or press ENTER for the default
Minimum Password Age [0]: Maximum Password Age [99999]: 99999 Last Password Change (YYYY-MM-DD) [1970-01-01]: 2017-11-15 Password Expiration Warning [7]: 7 Password Inactive [-1]: -1 Account Expiration Date (YYYY-MM-DD) [-1]: --》-1是永不过期,设2018-11-11过期 一个一个改。 group文件格式 ?群组名称:就是群组名称 ?群组密码:通常不需要设定,密码是被记录在/etc/gshadow ?GID:就是群组的ID ?以当前组为附加组的用户列表(分隔符为逗号) 记录一个问题: 同学问为什么在/etc/group最后只能看到以这个组为附加组用户,不能看到以这个组为主组用户? 答:/etc/group记录了 组名 组密码 组ID 附加组列表,以当前组为主组的用户是记录到/etc/passwd中的,通过对应组ID就可以找到这个以这个组为主组的用户。 修改group: id不加任何选项,查看的是当前登录的当前信息。刚改的文件需要重新登录,才能显示出来。id后面加用户名,系统认为你读取的是别的用户,即可读取到新的信息。如果把当前用户加到组里面了,必须要重新登录,用户才知道自己加到这个新组了。 gshdow文件格式 ?群组名称:就是群组名称 ?群组密码:(组默认没有口令) ?组管理员列表:组管理员的列表,更改组密码和成员(添加和删除用户账号) 默认root账号是组管理员 ?以当前组为附加组的用户列表:(分隔符为逗号) same as /etc/group 文件操作 ?vipw和vigr:直接打开passwd、group,语法检测功能。 ?pwck和grpck:检查关于用户账号,和组账号的相关的文件的格式是否正确。 用户和组管理命令 ?用户管理命令 ?useradd ?usermod ?userdel ?组帐号维护命令 ?groupadd ?groupmod ?groupdel 用户创建:useradd ?useradd[options] LOGIN -u UID -o 配合-u 选项,不检查UID的唯一性 -g GID:指明用户所属基本组,可为组名,也可以GID -c "COMMENT":用户的注释信息 -d HOME_DIR:以指定的路径(不存在)为家目录 -s SHELL: 指明用户的默认shell程序 可用列表在/etc/shells文件中 -G GROUP1[,GROUP2,...]:为用户指明附加组,组须事先存在 -N 不创建私用组做主组,使用users组做主组 -r: 创建系统用户CentOS 6: ID<500,CentOS 7: ID<1000 -m 创建家目录,用于系统用户 -M 不创建家目录,用于非系统用户 [root@localhost ~]#useradd -u 1005 -o merry [root@localhost ~]#useradd -u 1005 -o lilei [root@localhost ~]#cat /etc/passwd | tail -2 merry:x:1005:1005::/home/merry:/bin/bash lilei:x:1005:1006::/home/lilei:/bin/bash 创建两个相同的id的用户可以看到UID相同但GID和家目录都不相同,得到的权限一样。这两个用户谁在前登陆显示谁。 [root@localhost ~]#useradd -r -m -d /app/nginx nginx [root@localhost ~]#ls /app a aaa.log fstab ls.out new1win.txt who.out win.txt aa a.txt linux.txt man.txt newwin.txt win1.txt aaaa f lost+found name nginx win22.txt -r默认不创建家目录,系统用户,-m强制创建家目录。有时候就是指定的1-500的uid,系统也认为是一个普通的用户,因为没有-r指定。 [root@localhost ~]#useradd -r -m -d /app/zabbix -s /sbin/nologin zabbix 设置一个服务使用的系统用户。 [root@localhost /home/sunan]#cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes useadd默认生成的文件。 [root@localhost /home/sunn]#ls -a /home/lilei . .. .bash_logout .bash_profile .bashrc .mozilla [root@localhost /home/sunn]#ls -a /etc/skel . .. .bash_logout .bash_profile .bashrc .mozilla 默认生成的家目录下面的文件和/etc/skel中的文件相同,因为来自于/etc/skel [root@localhost ~]#cp -r /etc/skel /home/suna 如果删除一个用户的家目录,想要恢复,需要新建一个和原来一样的文件名然后把/etc/skel下的文件全部拷贝过去。 [root@localhost ~]#cp -r /etc/skel/* /home/suna 上面这条命令很危险,会把skel中所有的文件和etc中所有的文件拷贝过去,因为目录下包括.和.. [root@localhost ~]#cat /etc/login.defs UID_MIN 1000 UID_MAX 60000 # System accounts SYS_UID_MIN 201 SYS_UID_MAX 999 上面的文件存放许多登陆的默认信息 创建用户:useradd ?默认值设定:/etc/default/useradd文件中 ?显示或更改默认设置 useradd-D =cat /etc/default/useradd useradd–D -s SHELL useradd–D –b BASE_DIR useradd–D –g GROUP 新建用户的相关文件和命令 ?/etc/default/useradd ?/etc/skel/* ?/etc/login.defs ?newusers passwd格式文件批量创建用户 将和/etc/passwd文件中一样的格式的内容保存到一个文件a.txt中 newusers a.txt即可批量创建用户,即同时改变了那4个文件。 ?chpasswd 批量修改用户口令 在b.txt文件中存放用户名:密码的格式,chpasswd b.txt
用户属性修改 ?usermod[OPTION] login -u UID: 新UID -g GID: 新主组 -G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项 -s SHELL:新的默认SHELL -c ‘COMMENT‘:新的注释信息 -d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据,同时使用-m选项 -l login_name: 新的名字; -L: lock指定用户,在/etc/shadow 密码栏的增加! -U: unlock指定用户,将/etc/shadow 密码栏的! 拿掉 -e YYYY-MM-DD: 指明用户账号过期日期 -f INACTIVE: 设定非活动期限 [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),0(root),1000(sunan) [root@localhost ~]#usermod -G "" sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn) [root@localhost ~]#usermod -aG root,sunan sunn [root@localhost ~]#id uid=0(root) gid=0(root) groups=0(root) [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),0(root),1000(sunan) [root@localhost ~]#usermod -G sunn sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn) 上面是两种去除用户附加组的方法,一种是用空的去覆盖原来的附加组,另一种是使用主组去覆盖附加组,因为主组只能是主组不能是附加组,所以将附加组清空了。 [root@localhost ~]#usermod -d /app/sunn -m /home/sunn [root@localhost /app/sunn]#ls -a /app/sunn . .bash_history .bash_profile .cache .mozilla .. .bash_logout .bashrc .config 其中的-d是指定家目录 -m是搬家。 删除用户 ?userdel[OPTION]... login -r: 删除用户家目录 查看用户相关的ID信息 ?id [OPTION]... [USER] -u: 显示UID -g: 显示GID -G: 显示用户所属的组的ID -n: 显示名称,需配合ugG使用 [root@localhost /app]#userdel sunn [root@localhost /app]#cd /home [root@localhost /home]#ll total 24 drwx------ 5 bb sunan 4096 Nov 16 17:21 bb drwx------ 3 gentoo gentoo 4096 Nov 15 08:58 gentoo drwx------ 3 merry lilei 4096 Nov 16 18:46 lilei drwx------ 3 merry merry 4096 Nov 16 18:46 merry drwx------. 5 sunan sunan 4096 Nov 16 10:29 sunan drwx------ 5 1002 1002 4096 Nov 16 15:48 sunn 删除用户只是用户名没了,其他的一切还在。 [root@localhost /home]#useradd -u 1002 sunn useradd: warning: the home directory already exists. Not copying any file from skel directory into it. Creating mailbox file: File exists [root@localhost /home]#ll total 24 drwx------ 5 bb sunan 4096 Nov 16 17:21 bb drwx------ 3 gentoo gentoo 4096 Nov 15 08:58 gentoo drwx------ 3 merry lilei 4096 Nov 16 18:46 lilei drwx------ 3 merry merry 4096 Nov 16 18:46 merry drwx------. 5 sunan sunan 4096 Nov 16 10:29 sunan drwx------ 5 sunn sunn 4096 Nov 16 15:48 sunn 创建一个相同名字的用户又可以找回原来用户了 [root@localhost /home]#userdel -r sunn 这样把家目录和邮箱也删除了,-r命令太危险。 [root@localhost /home]#userdel -r -f sunn userdel: user sunn is currently used by process 8453 即使有进程正在使用也可以使用-f选项直接删除 切换用户或以其他用户身份执行命令 ?su[options...] [-] [user [args...]] ?切换用户的方式: su UserName:非登录式切换,即不会读取目标用户的配置文件,变量不切换,不改变当前工作目录 su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换 ?root su至其他用户无须密码;非root用户切换时需要密码 ?换个身份执行命令: su[-] UserName -c ‘COMMAND‘ ?选项:-l --login su-l UserName相当于su-UserName [sunn@localhost ~]$su - root -c ‘cat /etc/shadow‘ Password: root:$6$N23hSc6iqrrtt7A.$OL78oRDi5TwUd1fy6tnzQxeZIA3/jlU3WhGVynPTaymVsJdBftbL6jLGD2l41GLSWs4H0F1DaSV8C.deWCeDl1:17486:0:99999:7::: bin:*:17486:0:99999:7::: 使用管理员权限不用多次切换。 设置密码 ?passwd[OPTIONS] UserName: 修改指定用户的密码,仅root用户权限 ?passwd: 修改自己的密码 ?常用选项: -l:锁定指定用户 -u:解锁指定用户 -e:强制用户下次登录修改密码 -n mindays: 指定最短使用期限 -x maxdays:最大使用期限 -w warndays:提前多少天开始警告 -iinactivedays:非活动期限 --stdin:从标准输入接收用户密码 echo "PASSWORD" | passwd—stdinUSERNAME 修改用户密码策略 ?chage[OPTION]... LOGIN -d LAST_DAY -E --expiredateEXPIRE_DATE -I --inactive INACTIVE -m --mindaysMIN_DAYS -M --maxdaysMAX_DAYS -W --warndaysWARN_DAYS –l 显示密码策略 ?示例: chage-d 0 tom 下一次登录强制重设密码 chage-m 0 –M 42 –W 14 –I 7 tom chage-E 2016-09-10 tom
用户相关的其它命令 ?chfn指定个人信息 ?chsh指定shell ?finger 创建组 ?groupadd[OPTION]... group_name -g GID: 指明GID号;[GID_MIN, GID_MAX] -r: 创建系统组 CentOS 6: ID<500 CentOS 7: ID<1000 [root@localhost ~]#usermod -G sunan sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),1000(sunan) [root@localhost ~]#usermod -G root sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),0(root) 通过上面可以看到一个账号用于一个附加组的情况下,再添加附加组会导致原来的附加组被替换掉。解决办法添加-a(append)选项即可 [root@localhost ~]#groups sunn sunn : sunn root sunan 使用groups命令查看用户属于的所有组,其中第一个是主组,后面是附加组。 [sunn@localhost ~]$newgrp sunan [sunn@localhost ~]$id uid=1002(sunn) gid=1000(sunan) groups=1000(sunan),0(root),1002(sunn) 切换主组命令 newgrp
修改和删除组 ?组属性修改:groupmod groupmod[OPTION]... group -n group_name: 新名字 -g GID: 新的GID ?组删除:groupdel groupdelGROUP [root@localhost /home]#groupdel sunn groupdel: cannot remove the primary group of user ‘sunn‘ 组下面存在以这个组为主组的用户,那么这个组不能删除。 更改组密码 ?组密码:gpasswd ?gpasswd[OPTION] GROUP -a user 将user添加至指定组中 -d user 从指定组中移除用户user -A user1,user2,... 设置有管理权限的用户列表 ?newgrp命令:临时切换主组 如果用户本不属于此组,则需要组密码 [sunn@localhost ~]$newgrp aa Password: [sunn@localhost ~]$groups aa root sunan sunn 如果用户本不属于此组,则需要组密码,组密码设定gpasswd。但是newgrp只能临时生效,没有写到配置文件中。 注意:一般情况下,组是不设口令的,因为不安全,普通用户只要知道组口令就可以把自己加到组里面,拥有一些权限。组不设口令,就只能使用root添加了。 sunn:!:: [root@localhost ~]#gpasswd sunn Changing the password for group sunn New Password: Re-enter new password: [root@localhost ~]#getent gshadow sunn sunn:$6$ZMWfIRMv$jbirRff67fLIEd9/VxdrQnpz0xLGuRYl068Bj3QRtdO/46Xll1bLD6z92nvQT252UTb94mNmjC/q.uHNv.zP20:: sunn组默认没有密码,通过gpasswd命令添加密码。 [root@localhost ~]#getent gshadow aa aa:$6$FCDelTjwb4$r9SSfGGKi.fpb1ITJWczoeEUxHxlZMv7.CXT47hNDVLvGycLQ2IbSU9ZHy45WD4fPJTt9jqWMCZgeUu5XkDBC1:: [root@localhost ~]#gpasswd -A sunn aa [root@localhost ~]#getent gshadow aa aa:$6$FCDelTjwb4$r9SSfGGKi.fpb1ITJWczoeEUxHxlZMv7.CXT47hNDVLvGycLQ2IbSU9ZHy45WD4fPJTt9jqWMCZgeUu5XkDBC1:sunn: 组默认没有管理员,使用gpasswd -A添加管理员。 [sunn@localhost ~]$gpasswd -a sunan aa Adding user sunan to group aa [sunn@localhost ~]$ 因为sunn用户是aa组的管理员这样sunn用户就可以向aa组添加成员了。 更改和查看组成员 groupmems[options] [action] options: -g, --group groupname更改为指定组(只有root) Actions: -a, --add username 指定用户加入组 -d, --delete username 从组中删除用户 -p, --purge 从组中清除所有成员(清空的是附属组,主组不能清除) -l, --list 显示组成员列表 groups [OPTION].[USERNAME]... 查看用户所属组列表 [root@localhost /home]#groups sunn sunn : sunn [root@localhost /home]#groupmems -l -g root Gentoo 显示用户所属组,显示组中用户。 文件权限 文件属性 有一个文件属性图解析没画 文件属性操作 chown设置文件的所有者 chgrp设置文件的属组信息 修改文件的属主和属组 ?修改文件的属主:chown
chown[OPTION]... [OWNER][:[GROUP]] FILE... 用法: OWNER OWNER:GROUP :GROUP 命令中的冒号可用.替换 -R: 递归 chown[OPTION]... --reference=RFILE FILE... ?修改文件的属组:chgrp chgrp[OPTION]... GROUP FILE... chgrp[OPTION]... --reference=RFILE FILE... -R 递归 文件权限 ?文件的权限主要针对三类对象进行定义 owner: 属主, u group: 属组, g other: 其他, o ?每个文件针对每类访问者都定义了三种权限 r: Readable w: Writable x: eXcutable 文件权限 ?文件: r: 可使用文件查看类工具获取其内容 w: 可修改其内容 x: 可以把此文件提请内核启动为一个进程 ?目录: r: 可以使用ls查看此目录中文件列表 w: 可在此目录中创建文件,也可删除此目录中的文件 x: 可以使用ls -l查看此目录中文件列表,可以cd进入此目录 X:只给目录x权限,不给文件x权限 文件权限操作: 文件权限(rwx|W) |
||||||||||||
|
权限项 |
文件类型 |
读 |
写 |
执行 |
读 |
写 |
执行 |
读 |
写 |
执行 |
|
字符表示 |
(d|l|c|s|p) |
r |
w |
x |
r |
w |
x |
r |
w |
x |
||
|
数字表示 |
|
4 |
2 |
1 |
4 |
2 |
1 |
4 |
2 |
1 |
|
权限分配 |
|
文件所有者 |
文件所属组 |
其他用户 |
文件权限操作命令
chmod
八进制数字
?---000 0
?--x 001 1
?-w- 010 2
?-wx 011 3
?r-- 100 4
?r-x 101 5
?rw- 110 6
?rwx 111 7
?例如:
640: rw-r-----
755: rwxr-xr-x
fat文件系统不止权限设置,ext文件系统支持。
修改文件权限
?chmod[OPTION]... OCTAL-MODE FILE...
-R: 递归修改权限
?chmod[OPTION]... MODE[,MODE]... FILE...
MODE:
修改一类用户的所有权限:
u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限
u+ u-g+ g-o+ o-a+ a-+ -
?chmod[OPTION]... --reference=RFILE FILE...
参考RFILE文件的权限,将FILE的修改为同RFILE
权限设置示例
?chgrp sales testfile
?chown root:admins testfile
?chmod u+wx,g-r,o=rx file
?chmod -R g+rwX /testdir
?chmod 600 file
?chown mage testfile
所有者可以执行chgrp命令,不能执行chown,因为你不能把你生成的文件变成别人的。同时要删除一个文件,必须要对文件所在的目录有写权限,不然删除不掉,
因为文件名和节点对应信息在目录的数据中存放。
读和写权限对root是不生效,但是执行权限对root生效。root比较特殊,只要是有执行权限就行不管是u g o上的,但其他用户就必须严格执行先后匹配顺序,先匹配了,后面的权限就不能再匹配了。
文件能不能删不是 取决于文件本身,而是取决于文件的家目录。
新建文件和目录的默认权限
[root@localhost /home/wang]#chown -R wang /home/wang
递归创建用户为wang
[root@localhost /home/wang]#chmod --reference f1 f2
参考f1权限设置f2
创建的文件默认没有执行权限,危险。创建的目录默认有执行权限。
[root@localhost /home/wang]#chmod -R a+X /app/
默认给目录执行权限。-R递归赋予权限。
但是如果文件有一个选项有执行权限,+X全部有执行文件。
6.1 umask和suid权限
[root@centos7 ~]#useradd -p abcdef sunny
[root@centos7 ~]#getent passwd sunny
sunny:x:1001:1001::/home/sunny:/bin/bash
[root@centos7 ~]#getent shadow sunny
sunny:abcdef:17488:0:99999:7:::
[root@centos7 ~]#su - sunan
Last login: Wed Nov 8 11:01:40 CST 2017 on pts/0
[sunan@centos7 ~]$su - sunny
Password:
su: Authentication failure
可以看到使用useradd -p添加的明文密码是不能登陆的。
[sunnyy@centos7 ~]$openssl passwd -1
Password:
Verifying - Password:
$1$VrT8vFZo$S0Nuf1g4EinoJ9wV09JTN/
[sunnyy@centos7 ~]$exit
logout
[root@centos7 ~]#useradd -p ‘$1$VrT8vFZo$S0Nuf1g4EinoJ9wV09JTN/‘ sun
[root@centos7 ~]#getent shadow sun
sun:$1$VrT8vFZo$S0Nuf1g4EinoJ9wV09JTN/:17488:0:99999:7:::
[root@centos7 ~]#su - sunan
Last login: Sat Nov 18 08:38:25 CST 2017 on pts/0
[sunan@centos7 ~]$su - sun
Password:
[sun@centos7 ~]$
使用openssl passwd -1产生密文密码添加上去才能登陆。
?umask值 可以用来保留在创建文件权限
?新建FILE权限: 666-umask
如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变。
新建的文件为了安全考虑,默认不加执行权限。
?新建DIR权限: 777-umask
?非特权用户umask是002
?root的umask是022
umask: 查看
?umask#: 设定
umask 002
?umask–S 模式方式显示
?umask–p 输出可被调用
?全局设置:/etc/bashrc用户设置:~/.bashrc
[root@centos7 ~]#umask
0022
查看当前用户的umask值
[sunan@centos7 ~]$umask 644
[sunan@centos7 ~]$touch a
[sunan@centos7 ~]$ll
total 0
-----w--w-. 1 sunan sunan 0 Nov 18 09:43 a
设定用户的umask值,创建文件查看成功,但是只能临时生效,注销登陆失效。
[sunan@centos7 ~]$umask
0002
[sunan@centos7 ~]$pwd
/home/sunan
[sunan@centos7 ~]$nano .bashrc
umask 026
[sunan@centos7 ~]$. .bashrc
[sunan@centos7 ~]$umask
0026
永久生效修改用户配置文件信息,添加umask 026执行生效,只是针对此用户生效,如果是需要其他用户生效,需要修改/etc/bashrc。
[root@centos7 ~]#umask 145 ;touch f1
[root@centos7 ~]#ll f1
-rw--w--w-. 1 root root 0 Nov 18 09:54 f1
可以看到将umask修改为145,默认创建的文件f1权限应该是521,但实际是622,因为文件默认没有执行权限,奇数+1。
总结:其实真正的计算不是这样的,是用666的二进制与掩码的二进制记性计算
110110110
001100101 其中掩码中的0表示不关心,1表示从最大权限中去掉对应权限。
110010010=622 只和文件有关系,和目录没关系,因为目录不用考虑安全问题。
[root@centos7 ~]#umask -S
u=rw,g=wx,o=w
显示生成目录的权限
[root@centos7 ~]#umask u=rwx,g=w,o=r
设置生成目录的权限,当然生成文件权限去计算一下就行,这里不浪费时间讲解
[root@localhost Desktop]# rpm -i /run/media/root/CentOS\ 7\ x86_64/Packages/man-pages-zh-CN-1.5.2-4.el7.noarch.rpm
warning: /run/media/root/CentOS 7 x86_64/Packages/man-pages-zh-CN-1.5.2-4.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
安装man手册中文包。
设置环境变量:vim .bashrc
输入内容:
alias cman=‘man -M /usr/local/share/man/zh_CN‘
生效:. .bashrc
cman ls 查看命令
Linux文件系统上的特殊权限
?SUID, SGID, Sticky
?三种常用权限:r, w, x user, group, other
?安全上下文
?前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
可执行文件上SUID权限
?任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
?启动为进程之后,其进程的属主为原程序文件的属主
?SUID只对二进制可执行程序有效
?SUID设置在目录上无意义
?权限设定:
chmod u+s FILE...
chmod u-s FILE...
可执行文件上SGID权限
?任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
?启动为进程之后,其进程的属组为原程序文件的属组
?权限设定:
chmod g+s FILE...
chmod g-s FILE...
目录上的SGID权限
默认情况下,用户创建文件时,其属组为此用户所属的主组
一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
通常用于创建一个协作目录
权限设定:
chmod g+s DIR...
chmod g-s DIR...
[root@centos7 ~]#chmod g+s aaaa/
[root@centos7 ~]#ll -d aaaa/
drwxr-sr-x. 2 root root 4096 Nov 18 14:21 aaaa/
[root@centos7 ~]#chmod 0755 aaaa/
[root@centos7 ~]#ll -d aaaa/
drwxr-sr-x. 2 root root 4096 Nov 18 14:21 aaaa/
[root@centos7 ~]#echo aaa>a.txt
[root@centos7 ~]#ll a.txt
-rw-r--r--. 1 root root 4 Nov 18 14:24 a.txt
[root@centos7 ~]#chmod g+s a.txt
[root@centos7 ~]#ll a.txt
-rw-r-Sr--. 1 root root 4 Nov 18 14:24 a.txt
[root@centos7 ~]#chmod g+x a.txt
[root@centos7 ~]#ll a.txt
-rw-r-sr--. 1 root root 4 Nov 18 14:24 a.txt
[root@centos7 ~]#chmod 0654 a.txt
[root@centos7 ~]#ll a.txt
-rw-r-xr--. 1 root root 4 Nov 18 14:24 a.txt
使用数字能去掉文件的SUID和SGID,但不能去掉目录的SGID和SUID。man chmod给出了详细的解释。
Sticky 位
?具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
?在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
?sticky 设置在文件上无意义,因为删除文件要对文件所在目录有权限。
目录上有rwxrwxrws权限,不能删除文件,不能对文件重命名,mv f1 f2不能重命名,因为重命名相当于删了重建。可以读文件,可以向文件中追加内容和清空文件内容。
[root@centos7 ~]#ll -d /tmp
drwxrwxrwt. 15 root root 4096 Nov 18 14:30 /tmp
tmp目录是大家公用目录,能在里面创建文件但是不能删除别人建的文件。
?权限设定:
chmod o+t DIR...
chmod o-t DIR...
?例如:
? ls-ld /tmp
drwxrwxrwt 12 root root 4096 Nov215:44 /tmp
[sunan@centos7 /aa]$passwd
Changing password for user sunan.
Changing password for sunan.
(current) UNIX password:
passwd: Authentication token manipulation error
sunan:$6$gVNv8Jd8$uSh2LL/4v2FAnMCfjdkMxw4pH4Yt4Iz4Jrke8w9UyAJuutKrGylYkId3e5afT3CIezdEGIFpx9SAdBIQTHyU70:17488:3:99999:7:::
不能修改密码是因为密码最小有效期时间是3天
[root@centos7 /aa]#chage -m 0 sunan
sunan:$6$gVNv8Jd8$uSh2LL/4v2FAnMCfjdkMxw4pH4Yt4Iz4Jrke8w9UyAJuutKrGylYkId3e5afT3CIezdEGIFpx9SAdBIQTHyU70:17488:0:99999:7:::
修改密码最小时间有效期为0即可修改密码。
[root@centos7 /aa]#ll /etc/shadow
----------. 1 root root 1346 Nov 18 12:35 /etc/shadow
sunan:$6$yBIaPLgZ$AHxtOXkPE0HZVto5.2zSbYWU/EBk3Hy0NzJO/NQ1ZCKFC9XvuWoD9QW8nGZ8IWiVlDm6rj8E2eJnIDhxK8kyh0:17488:0:99999:7:::
对于sunan用户对文件/etc/shadow没有任何权限为什么修改了文件的内容。
[root@centos7 /aa]#ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
是因为特殊权限s的作用,使得运行它的用户临时自动继承它的所有者root的权限,他再通过passwd命令去修改/etc/shadow文件。
[root@centos7 /aa]#chmod u+s /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwsr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
[root@centos7 /aa]#chmod u-s /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwxr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
[root@centos7 /aa]#chmod 4755 /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwsr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
[root@centos7 /aa]#chmod 755 /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwxr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
为nano命令添加和删除s权限。
[root@centos7 /aa]#chmod u-x /bin/passwd
[root@centos7 /aa]#ll /bin/passwd
-rwSr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd
[root@centos7 /aa]#chmod u+x /bin/passwd
[root@centos7 /aa]#ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd
去除x权限使得s变成了S,即s权限有问题了。
SUID一般不去手动设置,是开发者设置好,只要知道是做什么的就行。
特殊权限数字法
?SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
?chmod4777 /tmp/a.txt
权限位映射
?SUID: user,占据属主的执行权限位
s: 属主拥有x权限
S:属主没有x权限
?SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
?Sticky: other,占据other的执行权限位
t: other拥有x权限
T:other没有x权限
设定文件特定属性
?chattr +i 不能删除,改名,更改(包括root)
-i 去除属性。
?chattr +a 只能追加内容
nano不能追加,因为不知道你是不是在修改文件,即使你在最后加东西。
echo sdfa>>a.txt 可以追加。
chattr +A 不会更新读时间
?lsattr 显示特定属性
[root@centos7 /app]#groupmems -l -g opts
sun sunny
[sunny@centos7 /app/sharegroup]$ll
total 0
-rw-rw-r--. 1 sun sun 0 Nov 18 15:00 sun
-rw-rw-r--. 1 sunny sunny 0 Nov 18 15:01 sunny
[sunny@centos7 /app/sharegroup]$echo new>>sun
bash: sun: Permission denied
虽然两个用户属于一个组,但是相互之间还是改不了文件,因为文件的所属组不一样。
[root@centos7 /app]#chgrp opts sharegroup/sun*
[root@centos7 /app]#cd sharegroup/
[root@centos7 /app/sharegroup]#ll
total 0
-rw-rw-r--. 1 sun opts 0 Nov 18 15:00 sun
-rw-rw-r--. 1 sunny opts 0 Nov 18 15:01 sunny
[root@centos7 /app/sharegroup]#su sun
[sun@centos7 /app/sharegroup]$echo aa>>sunny
[sun@centos7 /app/sharegroup]$cat sunny
aa
把文件的所属组改成一样就可以相互修改数据了。 但是用户每次新建的文件的所属组每次都会变成原来的组,这样需要每次都要修改文件的所属组。解决办法:只要在组权限上面天剑SGID权限即可解决。
[root@centos7 /app]#chmod g+s sharegroup/
[root@centos7 /app]#ll
drwxrws---. 2 root opts 4096 Nov 18 15:14 sharegroup
[sun@centos7 /app/sharegroup]$touch sun1
[sun@centos7 /app/sharegroup]$ll
total 4
-rw-rw-r--. 1 sun sun 0 Nov 18 15:14 a
-rw-rw-r--. 1 sun opts 0 Nov 18 15:00 sun
-rw-rw-r--. 1 sun opts 0 Nov 18 15:16 sun1
-rw-rw-r--. 1 sunny opts 3 Nov 18 15:09 sunny
g+s权限后,所有新建的文件的所属组就变成了opts。一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
通常用于创建一个协作目录
注意:SUID和SGID、Sticky只是针对普通的用户生效,对root无效。
访问控制列表
?ACL:Access Control List,实现灵活的权限管理
?除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
?CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
?CentOS7 之前版本,装完系统有新建的分区,即默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl/dev/sdb1
mount –o acl/dev/sdb1 /mnt/test
[root@localhost ~]#tune2fs -l /dev/sda3
Default mount options: user_xattr acl
查看某个分区是否支持ACL功能,命令仅支持ext系列。
?ACL生效顺序:所有者,自定义用户,自定义组,其他人
访问控制列表
?为多用户或者组的文件和目录赋予访问权限rwx
mount -o acl /directory
getfacl file |directory
setfacl -m u:wang:rwx file|directory
-m:设置后续的参数给文件用。
setfacl -Rm g:sales:rwX directory
-R:递归赋予属性
setfacl -M file.acl file|directory
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory
setfacl -x u:wang file |directory
setfacl -X file.acl directory
ACL文件上的group权限是mask值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限
getfacl 可看到特殊权限:flags
通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
base ACL 不能删除
setfacl –k dir 删除默认ACL权限
setfacl –b file1清除所有ACL权限
getfacl file1|setfacl --set-file=- file2 复制file1的acl权限给file2
?mask只影响除所有者和other的之外的人和组的最大权限
Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
用户或组的设置必须存在于mask权限设定范围内才会生效
setfacl-m mask::rxfile
?--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
?示例:
setfacl --set u::rw,u:wang:rw,g::r,o::-file1
?备份和恢复ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt
getfacl -R /tmp/dir1
[root@centos7 /app]#setfacl -m u:sun:rw f1
[root@centos7 /app]#getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:sun:rw-
group::r--
mask::rw-
other::r--
mask:除了属主和other的其他的用户的最高权限不能超过mask。
同时设置group的权限不能使用chmod g+权限 f1这种方式,这种方式设置的是mask权限,要使用setfacl -m group::x f1这种形式。
[root@centos7 /app]#echo u:sun:rwx > sun.acl
[root@centos7 /app]#cat sun.acl
u:sun:rwx
[root@centos7 /app]#touch d2
[root@centos7 /app]#setfacl -R -M sun.acl d2
[root@centos7 /app]#getfacl d2
# file: d2
# owner: root
# group: root
user::rw-
user:sun:rwx
group::r--
mask::rwx
other::r--
通过文件创建权限 -M选项的作用。
[root@centos7 ~]#setfacl -R -m sunan:rw /app/html
[root@centos7 ~]#getfacl /app/html/c.html
getfacl: Removing leading ‘/‘ from absolute path names
# file: app/html/c.html
# owner: root
# group: root
user::rw-
user:sunan:rw-
group::r--
mask::rw-
other::r--
[root@centos7 ~]#touch /app/html/b.html
[root@centos7 ~]#getfacl !$
getfacl /app/html/b.html
getfacl: Removing leading ‘/‘ from absolute path names
# file: app/html/b.html
# owner: root
# group: root
user::rw-
group::r--
other::r--
事实表明上面创建的ACL权限只对设置ACL权限前生成的文件有效,对以后新的生成的文件无效。
[root@centos7 ~]#setfacl -R -m d:sunan:rw /app/html
[root@centos7 ~]#touch /app/html/d.html
[root@centos7 ~]#getfacl !$
getfacl /app/html/d.html
getfacl: Removing leading ‘/‘ from absolute path names
# file: app/html/d.html
# owner: root
# group: root
user::rw-
user:sunan:rw-
group::r-x #effective:r--
mask::rw-
other::r--
要相对以后的文件生效需要加上d选项。
[root@centos7 ~]#getfacl -R /app/html/ >/app/html.acl
getfacl: Removing leading ‘/‘ from absolute path names
[root@centos7 ~]#setfacl -Rb /app/html 清空ACL权限
[root@centos7 ~]#setfacl -R --set-file=/app/html.acl /app/html/ 恢复ACL权限