第八章:权限管理
——>实验专题<——
#ACL权限:用于解决用户对文件身份不足的问题的。#ACL权限:一旦递归之后,不可避免的出现权限溢出#sudo:赋予的权限越详细,普通用户得到的权限越小// 赋予的权限越简单,普通用户得到的权限越大#SUID:// 必须针对执行文件才可以赋予SUID权限// 命令执行者要对该程序拥有x(执行)权限// 命令执行者在执行该程序时获得该程序文件属主的身份// SetUID权限旨在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效#SUID建议:// 关键目录应严格控制写权限,比如“/”“/usr”等// 用户的密码设置要样遵守密码三原则// 对系统中默认应该具有SUID权限的文件做一列表,定时检查这之外的文件被设置了SetUID权限// 4表示:SUID:只能针对执行程序的;// 2代表:SGID:既可以针对执行程序;也可以针对目录;命令本身没有风险,但是对应文件和目录需要777权限,带来风险// 1代表:SBIT:只能针对目录的权限;命令本身没有风险,但是对应目录需要777权限,带来风险# chattr// +: 增加权限// -: 删除权限// =: 等于某权限// i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。// a: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删// e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消 e 属性。
一、ACL 权限
1、ACL 概述:
ACL 是用于解决用户对文件身份不足的问题的

2、开启 ACL
[root@localhost ~]# dumpe2fs -h /dev/sda3// dumpe2fs 命令是查询指定分区详细文件系统信息的命令// 选项:// -h 仅显示超级块中信息,而不显示磁盘块组的详细信息。// ...省略部分输出...Default mount options: user_xattr acl// ...省略部分输出...// 如果没有开启,手工开启分区的 ACL 权限:[root@localhost ~]# mount -o remount,acl /// 重新挂载根分区,并挂载加入 acl 权限// 也可以通过修改/etc/fstab 文件,永久开启 ACL 权限:[root@localhost ~]# vi /etc/fstabUUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4// 加入 acl[root@localhost ~]# mount -o remount /// 重新挂载文件系统或重启动系统,使修改生效
——>实验专题<——
#ACL权限没有开启,手动开启ACL权限[root@server11 ~]# dumpe2fs -h /dev/sda3Default mount options: user_xattr acl #默认挂载权限由acl权限
3、ACL 基本命令
// getfacl 文件名// 查询文件的 ACL 权限// setfacl 选项 文件名// 设定 ACL 权限// -m 设定 ACL 权限// -b 删除 ACL 权限// -x:用户 删除单个用户的 ACL 权限// setfacl -m u:用户名:权限 文件名// setfacl -m g:组名:权限 文件名// setfacl -m u:aa:rwx /test 给 test 目录赋予 aa 是读写执行的 ACL 权限// setfacl -m u:cc:rx -R soft/ 赋予递归 ACL 权限,只能赋予目录// -R 递归// setfacl -m d:u:aa:rwx -R /test ACL 默认权限。注意:默认权限只能赋予目录// 注意:如果给目录赋予 acl 权限,两条命令都要输入// 递归与默认的区别:// setfacl -m u:cc:rx -R soft/ 只对已经存在的文件生效// setfacl -m d:u:aa:rwx -R /test 只对以后新建的文件生效
——>实验专题<——
#1、设置ACL权限#添加一个新的用户[root@server21 ~]# useradd www3[root@server21 ~]# passwd www3#授予ACL权限[root@server21 ~]# setfacl -m u:www3:5 /www/ #u:www3:5用户:用户名:权限数字或者权限数字也可以#查看有个+好,[root@server21 ~]# ll -d /www/drwxrwx---+ 2 www1 www 4096 Feb 4 10:29 /www/[root@server21 ~]# getfacl /www/# file: www/ #文件名# owner: www1 #所有者# group: www #所属组user::rwx #用户权限user:www3:r-x #单独的用户拥有5权限group::rwx #所属组权限mask::rwx #最大权限other::--- #其他人权限#验证:他可以进入到该目录,但是不可以创建文件 #只能查看文件内容,但是没有操作权限[root@server21 ~]# su - www3[www3@server21 ~]$ cd /www/[www3@server21 www]$ touch wwwtouch: cannot touch# `www': Permission denied#2、递归创建子文件:针对已经存在子文件生效[root@server21 ~]# touch /www/wwwtest1[root@server21 ~]# touch /www/wwwtest2[root@server21 ~]# setfacl -m u:www3:5 -R /www/#查看www下的所有文件都有ACL权限[root@server21 ~]# ll /www/-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest1-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest2[root@server21 ~]# getfacl /www/wwwtest1getfacl: Removing leading '/' from absolute path names# file: www/wwwtest1# owner: root# group: rootuser::rw-user:www3:r-xgroup::r--mask::r-xother::r--#再创建一个文件,是没有ACL权限的[root@server21 ~]# touch /www/wwwtest3[root@server21 ~]# ll /www/total 0-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest1-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest2-rw-r--r-- 1 root root 0 Feb 4 10:38 wwwtest3 #是没有ACL权限,递归只能对已经存在的文件生效#对于新建的文件也会有ACL权限[root@server21 ~]# setfacl -m d:u:www3:5 -R /www/ #加入d参数[root@server21 ~]# getfacl /www/default:user::rwxdefault:user:www3:r-xdefault:group::rwxdefault:mask::rwxdefault:other::---[root@server21 ~]# touch /www/wwwtest4[root@server21 ~]# ll /www/total 0-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest1-rw-r-xr--+ 1 root root 0 Feb 4 10:35 wwwtest2-rw-r--r-- 1 root root 0 Feb 4 10:38 wwwtest3 #这个文件还是没有ACL权限,刚好卡在这两个权限生效之间,所以不会生效-rw-rw----+ 1 root root 0 Feb 4 10:40 wwwtest4 #新建的文件有ACL权限#ACL权限最大的问题:一旦递归之后,不可避免权限溢出# setfacl -m u:cc:rx -R soft/ 只对已经存在的文件生效# setfacl -m d:u:aa:rwx -R /test 只对以后新建的文件生效
4、 最大有效权限 mask
[root@localhost /]# setfacl -m m:rx project/// 设定 mask 权限为 r-x。使用“m:权限”格式[root@localhost /]# getfacl project/// file: project/// owner: root// group: tgroupuser::rwxgroup::rwx #effective:r-xmask::r-x// mask 权限变为了 r-xother::---
——>实验专题<——
[root@server21 ~]# getfacl /www/mask::rwx #调整最大权限的[root@server21 ~]# setfacl -m m:6 /www/[root@server21 ~]# getfacl /www/user::rwxuser:www3:r-x #effective:r-- #只读;建议使用默认的group::rwx #effective:rw-mask::rw-other::---default:user::rwxdefault:user:www3:r-xdefault:group::rwxdefault:mask::rwxdefault:other::---[root@server21 ~]# setfacl -m m:7 /www/
5、删除 ACL 权限
[root@localhost /]# setfacl -x u:st /project/// 删除指定用户和用户组的 ACL 权限[root@localhost /]# setfacl -b project/// 会删除文件的所有的 ACL 权限
——>实验专题<——
#再添加一个用户授予ACL权限[root@server21 ~]# setfacl -m u:www2:5 /www/[root@server21 ~]# getfacl /www/user:www2:r-xuser:www3:r-x#删除某一个用户的ACL权限[root@server21 ~]# setfacl -x u:www2 /www/[root@server21 ~]# getfacl /www/user:www3:r-x #只能查看到www3用户的ACL权限#删除所有的ACL权限[root@server21 ~]# setfacl -b /www/[root@server21 ~]# getfacl /www/
二、sudo 授权 给普通用户赋予部分管理员权限
// /sbin/ 在此目录下命令只有超级用户才能使用/usr/sbin/// 1 root 身份// visudo 赋予普通用户权限命令,命令执行后和 vi 一样使用root ALL=(ALL) ALL// 用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)// %wheel ALL=(ALL) ALL// %组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)// 用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加“%”// 用户可以用指定的命令管理指定 IP 地址的服务器。如果写 ALL,代表可以管理任何主机,如果写固定 IP,代表用户可以管理指定的服务器。(这里真的很奇怪啊,超哥一直认为这里的// IP 地址管理的是登录者来源的 IP 地址,查了很多资料也都是这样的。直到有一天超哥查看“man 5 sudoers”帮助,才发现大家原来都理解错误了,这里的 IP 指定的是用户可以管理// 哪个 IP 地址的服务器。那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。// 如果我们这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而代表指定的用户可以从任何 IP 地址来管理当前服务器。// 可使用身份:就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略// 授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL,代表任何命令,这个当然不行。如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径// 2、举例// 1)举个例子,比如授权用户 user1 可以重启服务器,则由 root 用户添加如下行:[root@localhost ~]# visudouser1 ALL= /sbin/shutdown –r now[user1@localhost ~]$ sudo -l// 查看可用的授权// 2)再举个例子,授权一个用户管理你的 Web 服务器,不用自己插手是不是很爽,以后修改设置更新// 网页什么都不用管,一定 Happy 死了,Look:// 首先要分析授权用户管理 Apache 至少要实现哪些基本授权:// 1、可以使用 Apache 管理脚本// 2、可以修改 Apache 配置文件// 3、可以更新网页内容// 假设 Aapche 管理脚本程序为/etc/rc.d/init.d/httpd 。// 为满足条件一,用 visudo 进行授权:[root@localhost ~]# visudouser1 192.168.0.156=/etc/rc.d/init.d/httpd reload,\/etc/rc.d/init.d/httpd configtest// 授权用户 user1 可以连接 192.168.0.156 上的 Apache 服务器,通过 Apache 管理脚本重新读取配// 置文件让更改的设置生效(reload)和可以检测 Apache 配置文件语法错误(configtest),但不允// 许其执行关闭(stop)、重启(restart)等操作。(“\”的意思是一行没有完成,下面的内容和上一行是同一行。)// 为满足条件二,同样使用 visudo 授权:[root@localhost ~]# visudouser1 192.168.0.156=/binvi /etc/httpd/conf/httpd.conf// 授权用户 user1 可以用 root 身份使用 vi 编辑 Apache 配置文件。// 以上两种 sudo 的设置,要特别注意,很多朋友使用 sudo 会犯两个错误:第一,授权命令没有细化到选项和参数;第二,认为只能授权管理员执行的命令。// 条件三则比较简单,假设网页存放目录为/var/www/html ,则只需要授权 user1 对此目录具有写权限// 或者索性更改目录所有者为 user1 即可。如果需要,还可以设置 user1 可以通过 FTP 等文件共享服务更新网页。// 3)授权 aa 用户可以添加其他普通用户aa ALL=/usr/sbin/useradd // 赋予 aa 添加用户权限.命令必须写入绝对路径aa ALL=/usr/bin/passwd // 赋予改密码权限,取消对 root 的密码修改aa ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root// aa 身份sudo /usr/sbin/useradd ee // 普通用户使用 sudo 命令执行超级用户命令
——>实验专题<——
#sudo赋予权限的原则#sudo:赋予的权限越详细,普通用户得到的权限越小# 赋予的权限越简单,普通用户得到的权限越大#1、被管理主机的地址定义:[root@server11 ~]# man 5 sudoersHost_Alias CSNETS = 128,.138.243.0, 128.138.204.0/24, 128.138.242.0 #CSNETS定义的别名jack CSNETS = ALL #给jack用户赋权限,赋centos这个权限#sudo执行文件[root@server11 ~]# visudoroot ALL=(ALL) ALL #给root赋予了所有权限,例子#2、切换到普通用户并授予重启权限[root@server11 ~]# su yanqi[yanqi@server11 ~]$ shutdown -r nowUser root is logged in on sshd.User root is logged in on sshd.Please retry operation after closing inhibitors and logging out other users.Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.[root@server11 ~]# visudo #给yanqi用户授予重启命令yanqi ALL=/sbin/shutdown#查看yanqi用户可以执行的命令[yanqi@server11 ~]$ sudo -l[sudo] password for yanqi: #输入密码(root) /sbin/shutdown #可以执行的命令[root@server11 ~]# visudoyanqi ALL=/sbin/shutdown -r now[yanqi@server11 ~]$ sudo -l(root) /sbin/shutdown -r now #普通用户执行的命令发生变化[yanqi@server11 ~]$ sudo /sbin/shutdown -h now #必须执行特定命令,若是不一致会失败Sorry, user yanqi is not allowed to execute '/sbin/shutdown -h now' as root on server11.[yanqi@server11 ~]$ sudo /sbin/shutdown -r now #重启生效#3、授予普通用户的特定权限://1、可以使用Apache管理脚本[root@server21 ~]# /etc/rc.d/init.d/httpd configtestSyntax OK[root@server21 ~]# visudoyanqi ALL=/etc/rc.d/init.d/httpd configtest[yanqi@server21 ~]$ sudo /etc/rc.d/init.d/httpd configtest #普通用户就可以执行apache的脚本Syntax OK//2、可以修改Apache配置文件[root@server21 ~]# visudoyanqi ALL=/usr/bin/vim /etc/httpd/conf/httpd.conf #只能打开文件,但是不能更改[root@server21 yanqi]# visudoyanqi ALL=/usr/bin/vim[yanqi@server21 ~]$ vim /etc/httpd/conf/httpd.conf #可以更改文件内容//3、可以更新网页内容[root@server21 ~]# visudo#4、授权添加用户[root@server21 ~]# visudoyanqi ALL=/usr/sbin/useraddyanqi ALL=/usr/bin/passwdyanqi ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root #限制普通用户不可以修改root的密码[yanqi@server21 ~]$ sudo useradd yanqitest[yanqi@server21 ~]$ sudo passwd yanqitest[yanqi@server21 ~]$ sudo passwd root #限制普通用户不可以修改root密码Sorry, user yanqi is not allowed to execute '/usr/bin/passwd root' as root on server21.#5、查看加入了那些sudo命令权限[yanqi@server21 ~]$ sudo -l(root) /etc/rc.d/init.d/httpd configtest(root) /usr/bin/vim(root) /usr/sbin/useradd(root) /usr/bin/passwd(root) /usr/bin/passwd [A-Za-z]*, (root) !/usr/bin/passwd \"\", (root) !/usr/bin/passwd root
三、文件特殊权限 SetUID、SetGID、Sticky BIT
1、SetUID
// 1)SetUID 是什么// SetUID 的功能可以这样理解:// 只有可以执行的二进制程序才能设定 SUID 权限// 命令执行者要对该程序拥有 x(执行)权限// 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)// SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效// 2)举例[root@localhost ~]# ll /etc/passwd-rw-r--r-- 1 root root 1728 1 月 19 04:20 /etc/passwd[root@localhost ~]# ll /etc/shadow---------- 1 root root 1373 1 月 19 04:21 /etc/shadow// 因为[root@localhost ~]# ll /usr/bin/passwd-rwsr-xr-x 1 root root 25980 2 月 22 2012 /usr/bin/passwd// /usr/bin/passwd 命令拥有特殊权限 SetUID ,也就是在属主的权限位的执行权限上是 s。可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户执行这个文件时将以文件所有者的// 身份执行。/usr/bin/passwd 命令具有 SetUID 权限,所有者为 root(Linux 中的命令默认所有者都是 root),// 也就是说当普通用户使用 passwd 更改自己密码的时候,那一瞬间突然灵魂附体了,实际是在用 passwd// 命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入/etc/shadow 文件(不要忘记 root// 这个家伙是 superman 什么事都可以干),所以普通用户也可以修改/etc/shadow 文件,命令执行完成后该身份也随之消失

如果取消 SetUID 权限,则普通用户就不能修改自己的密码了
// 3)危险的 SetUID[root@localhost ~]# chmod u+s /usr/bin/vim[root@localhost ~]# ll /usr/bin/vim-rwsr-xr-x 1 root root 1847752 4 月// 4)有几点建议:// 5 2012 /usr/bin/vim// 关键目录应严格控制写权限。比如“/”、“/usr”等;// 用户的密码设置要严格遵守密码三原则;// 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限。// 5)检测 SetUID 的脚本[root@localhost ~]# vi suidcheck.sh#!/bin/bash# Author: shenchao (E-mail: shenchao@atguigu.com)find / -perm -4000 -o -perm -2000 > /tmp/setuid.check// 搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。for i in $(cat /tmp/setuid.check)// 做循环,每次循环取出临时文件中的文件名dogrep $i /root/suid.list > /dev/null// 比对这个文件名是否在模板文件中if [ "$?" != "0" ]// 如果在,不报错thenecho "$i isn't in listfile! " >> /root/suid_log_$(date +%F)// 如果文件名不再模板文件中,则报错。并把报错报错到日志中fidonerm -rf /tmp/setuid.check// 删除临时文件[root@localhost ~]# chmod u+s /bin/vi// 手工给 vi 加入 SUID 权限[root@localhost ~]# ./suidcheck.sh// 执行检测脚本[root@localhost ~]# cat suid_log_2013-01-20/bin/vi isn't in listfile!// 报错了,vi 不再模板文件中。代表 vi 被修改了 SUID 权限
——>实验专题<——
[root@server11 ~]# ll -d /etc/shadow---------- 1 root root 1888 Mar 11 22:15 /etc/shadow #用户对于这个文件是没有任何权限的#没有任何权限,是通过/usr/bin/passwd文件中授予的[root@server11 ~]# ll /usr/bin/passwd-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd #红色字体显示,权限所有者多出一个s权限,也就是SUID权限,所以shadow文件没有任何权限,但是创建用户是可以读写shadow文件#SetUID授权:给不是执行文件授予SUID权限,查看效果[root@server11 ~]# chmod u+s yanqi[root@server11 ~]# ll-rwSr--r-- 1 root root 0 Mar 12 00:03 yanqi #显示S为大写;其实是报错,说明该文件没有作用#若是想给文件授予SUID权限,必须是执行文件#若是小写s:说明该文件是执行文件+SUID权限[root@server11 ~]# chmod 755 yanqi #把之前的S权限覆盖掉,因为是没有效果的大S权限。[root@server11 ~]# ll-rwxr-xr-x 1 root root 0 Mar 12 00:03 yanqi[root@server11 ~]# chmod 4755 yanqi #4表示为SUID权限[root@server11 ~]# lltotal 0-rwsr-xr-x 1 root root 0 Mar 12 00:03 yanqi#命令执行者要对该程序拥有x(执行)权限[root@server11 ~]# ll /usr/bin/passwd-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd #其他人也是有执行权限的[root@server11 ~]# ll /etc/shadow---------- 1 root root 1888 Mar 11 22:15 /etc/shadow[yanqi@server11 ~]$ cat /etc/shadow #普通该用户不可以执行cat: /etc/shadow: Permission denied//所以普通用户只能修改自己密码,root密码是不可以修改的#危险的SetUID[root@server11 ~]# chmod u+s /usr/bin/vim[root@server11 ~]# ll /usr/bin/vim-rwsr-xr-x. 1 root root 2337208 Dec 16 00:44 /usr/bin/vim#任何人在执行vim时,权限都变为root权限,所以不可以修改[root@server11 ~]# chmod u-s /usr/bin/vim[root@server11 ~]# ll /usr/bin/vim-rwxr-xr-x. 1 root root 2337208 Dec 16 00:44 /usr/bin/vim#建议修改方案//关键目录应严格控制写权限,比如“/”“/usr”等//用户的密码设置要样遵守密码三原则//对系统中默认应该具有SUID权限的文件做一列表,定时检查这之外的文件被设置了SetUID权限#检查系统默认SUID文件是否发生变化,若是有;则处理不可控因素[root@server11 ~]# vim suidcheck.sh#!/bin/bash# Author: shenchao (E-mail: shenchao@atguigu.com)find / -perm -4000 -o -perm -2000 > /tmp/setuid.check# 搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。for i in $(cat /tmp/setuid.check)#做循环,每次循环取出临时文件中的文件名dogrep $i /root/suid.list > /dev/null#比对这个文件名是否在模板文件中if [ "$?" != "0" ]#如果在,不报错thenecho "$i isn't in listfile! " >> /root/suid_log_$(date +%F)#如果文件名不再模板文件中,则报错。并把报错报错到日志中fidonerm -rf /tmp/setuid.check#删除临时文件[root@server11 ~]# chmod u+x suidcheck.sh[root@localhost ~]# chmod u+s /bin/vi// 手工给 vi 加入 SUID 权限[root@localhost ~]# ./suidcheck.sh// 执行检测脚本[root@localhost ~]# cat suid_log_2013-01-20/bin/vi isn't in listfile!// 报错了,vi 不再模板文件中。代表 vi 被修改了 SUID 权限
2、SetGID
// 1)针对文件的作用// SGID 即可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。如果针对文件,SGID 的含义如下:// 只有可执行的二进制程序才能设置 SGID 权限// 命令执行者要对该程序拥有 x(执行)权限// 命令执行在执行程序的时候,组身份升级为该程序文件的属组// SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效[root@localhost ~]# ll /var/lib/mlocate/mlocate.db-rw-r----- 1 root slocate 1838850 1 月 20 04:29 /var/lib/mlocate/mlocate.db// 大家发现属主权限是 r、w,属组权限是 r,但是其他人权限是 0:[root@localhost ~]# ll /usr/bin/locate-rwx--s--x 1 root slocate 35612 8 月 24 2010 /usr/bin/locate// 当普通用户 user1 执行 locate 命令时,会发生如下事情:/usr/bin/locate 是可执行二进制程序,可以赋予 SGID// 执行用户 user1 对/usr/bin/locate 命令拥有执行权限// 执 行 /usr/bin/locate 命 令 时 , 组 身 份 会 升 级 为 slocate 组 , 而 slocate 组 对// /var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用 locate 命令查询mlocate.db 数据库// 命令结束,user1 用户的组身份返回为 user1 组// 2)针对目录的作用// 如果 SGID 针对目录设置,含义如下:// 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录// 普通用户在此目录中的有效组会变成此目录的属组// 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组// 这样写的实在太难看明白了,举个例子:[root@localhost ~]# cd /tmp/// 进入临时目录做此实验。因为临时目录才允许普通用户修改[root@localhost tmp]# mkdir dtest// 建立测试目录[root@localhost tmp]# chmod g+s dtest// 给测试目录赋予 SGID[root@localhost tmp]# ll -d dtest/drwxr-sr-x 2 root root 4096 1 月 20 06:04 dtest/// SGID 已经生效[root@localhost tmp]# chmod 777 dtest/// 给测试目录权限,让普通用户可以写[root@localhost tmp]# su – user1// 切换成普通用户 user1[user1@localhost ~]$ cd /tmp/dtest/// 普通用户进入测试目录[user1@localhost dtest]$ touch abc// 普通用户建立 abc 文件[user1@localhost dtest]$ ll// 总用量 0-rw-rw-r-- 1 user1 root 0 1 月20 06:07 abc// abc 文件的默认属组不再是 user1 用户组,而变成了 dtest 组的属组 root
——>实验专题<——
#针对文件的作用[root@server11 ~]# locate httpd.conf[root@server11 ~]# ll /usr/bin/locate #locate所属组是s权限的-rwx--s--x. 1 root slocate 40520 Apr 11 2018 /usr/bin/locate[yanqi@server11 ~]$ mkdir yanqi[yanqi@server11 ~]$ cd yanqi/[yanqi@server11 yanqi]$ touch yanqi1[root@server11 ~]# chmod g+s /home/yanqi/yanqi/[root@server11 ~]# ll -d /home/yanqi/yanqi/drwxrwsr-x 2 yanqi yanqi 34 Mar 12 00:46 /home/yanqi/yanqi/[yanqi@server11 yanqi]$ ll-rw-rw-r-- 1 yanqi yanqi 0 Mar 12 00:44 yanqi1-rw-rw-r-- 1 yanqi root 0 Mar 12 00:47 yanqi2 #所属组为root组
3、文件特殊权限之 Sticky BIT
// Sticky BIT 粘着位,也简称为 SBIT。SBIT 目前仅针对目录有效,它的作用如下:粘着位目前只对目录有效// 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限// 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用// 户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。// 4、设定文件特殊权限// 特殊权限这样来表示:// 4 代表 SUID// 2 代表 SGID// 1 代表 SBIT[root@localhost ~]# chmod 4755 ftest// 赋予 SUID 权限[root@localhost ~]# chmod 2755 ftest// 赋予 SGID 权限[root@localhost ~]# mkdir dtest[root@localhost ~]# chmod 1755 dtest/// SBIT 只对目录有效,所以建立测试目录,并赋予 SBIT
——>实验专题<——
#tmp本身是有SBIT权限[root@server11 ~]# ll -d /tmp/drwxrwxrwt. 10 root root 285 Mar 12 00:50 /tmp/[root@server11 ~]# touch /tmp/yanqi1[yanqi@server11 ~]$ touch /tmp/yanqi2[root@server11 ~]# ll /tmp/total 0-rw-r--r-- 1 root root 0 Mar 12 00:51 yanqi1-rw-rw-r-- 1 yanqi yanqi 0 Mar 12 00:51 yanqi2[yanqi@server11 ~]$ rm -rf /tmp/yanqi1 #root的文件是不可以删除的rm: cannot remove ‘/tmp/yanqi1’: Operation not permitted#权限想要起作用,需要给目录授予777权限
四、文件系统属性 chattr 权限
1、命令格式
[root@localhost ~]# chattr [+-=] [选项] 文件或目录名// 选项:// +: 增加权限// -: 删除权限// =: 等于某权限// i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。// a: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删// e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消 e 属性。
2、查看文件系统属性 lsattr
[root@localhost ~]# lsattr 选项 文件名// 选项:// -a 显示所有文件和目录// -d 若目标是目录,仅列出目录本身的属性,而不是子文件的
3、举例
// 例 1:// 给文件赋予 i 属性[root@localhost ~]# touch ftest// 建立测试文件[root@localhost ~]# chattr +i ftest[root@localhost ~]# rm -rf ftest// rm: 无法删除"ftest": 不允许的操作// 赋予 i 属性后,root 也不能删除[root@localhost ~]# echo 111 >> ftest// -bash: ftest: 权限不够// 也不能修改文件的数据// 给目录赋予 i 属性[root@localhost ~]# mkdir dtest// 建立测试目录[root@localhost dtest]# touch dtest/abc// 再建立一个测试文件 abc[root@localhost ~]# chattr +i dtest/// 给目录赋予 i 属性[root@localhost ~]# cd dtest/[root@localhost dtest]# touch bcd// touch: 无法创建"bcd": 权限不够// dtest 目录不能新建文件[root@localhost dtest]# echo 11 >> abc[root@localhost dtest]# cat abc11// 但是可以修改文件内容[root@localhost dtest]# rm -rf abc// rm: 无法删除"abc": 权限不够// 不能删除// 例 2:[root@localhost ~]# mkdir -p /back/log// 建立备份目录[root@localhost ~]# chattr +a /back/log/// 赋予 a 属性[root@localhost ~]# cp /var/log/messages /back/log/// 可以复制文件和新建文件到指定目录[root@localhost ~]# rm -rf /back/log/messages// rm: 无法删除"/back/log/messages": 不允许的操作// 但是不允许删除
——>实验专题<——
#给文件添加chattr权限[root@server11 ~]# touch yanqi[root@server11 ~]# chattr +i yanqi#查看文件的隐藏属性[root@server11 ~]# lsattr yanqi----i----------- yanqi[root@server11 ~]# vim yanqi #修改文件保存和修改都不可以操作,把文件权限锁起来。所有用户都不可以不执行的。[root@server11 ~]# ls #但会生成一个临时文件,防止后期使用yanqi yanqi~[root@server11 ~]# rm -rf yanqirm: cannot remove ‘yanqi’: Operation not permitted#若是想操作,需要取消-i权限[root@server11 ~]# chattr -i yanqi[root@server11 ~]# rm -rf yanqi#给目录添加Chattr权限[root@server11 ~]# mkdir yanqi[root@server11 ~]# touch yanqi/yanqi1[root@server11 ~]# chattr +i yanqi[root@server11 ~]# lsattr yanqi/---------------- yanqi/yanqi1#查看目录是否添加不可改变权限[root@server11 ~]# lsattr -d yanqi/----i----------- yanqi/[root@server11 ~]# rm -rf yanqi/yanqi1rm: cannot remove ‘yanqi/yanqi1’: Permission denied[root@server11 ~]# touch yanqi/yanqi2touch: cannot touch ‘yanqi/yanqi2’: Permission denied[root@server11 ~]# vim yanqi/yanqi1 #是可以修改的,因为我们只是对目录做了不可修改权限aaaaaaa#若是对文件设置a属性,只能在文件中增加数据,但是不能删除或者修改数据[root@server11 ~]# touch yanqi[root@server11 ~]# chattr +a yanqi[root@server11 ~]# lsattr yanqi-----a---------- yanqi[root@server11 ~]# vim yanqi #依然写入数据;不能用vi来编辑;使用echo[root@server11 ~]# echo "aaaaaaaaaaaaa" >> yanqi[root@server11 ~]# cat yanqiaaaaaaaaaaaaa#若是对目录设置a属性,只能在文件中增加数据,但是不能删除或者修改数据[root@server11 ~]# mkdir yanqi[root@server11 ~]# chattr +a yanqi[root@server11 ~]# lsattr -d yanqi/-----a---------- yanqi/[root@server11 ~]# touch yanqi/yanqi1[root@server11 ~]# mkdir yanqi/yanqi2[root@server11 ~]# rm -rf yanqi/yanqi1rm: cannot remove ‘yanqi/yanqi1’: Operation not permitted[root@server11 ~]# rm -rf yanqi/yanqi2rm: cannot remove ‘yanqi/yanqi2’: Operation not permitted//只可以对目录下的文件只有增加文件和目录的权限,但是没有删除权限
END
声明:JavaBBS论坛主要用于IT技术专题的交流学习,为开源技术爱好者提供广泛、权威的技术资料。若您在技术专题有更好的想法或者建议,欢迎交流!!!




推荐阅读
Recommended reading


JavaBBS
Git → https://www.javabbs.cn/git
JavaBBS大数据→ https://www.javabbs.cn/dsj
JavaBBS云存储→ https://www.javabbs.cn/ycc
JavaBBS数据库→ https://www.javabbs.cn/sjk
JavaBBS云计算→ https://www.javabbs.cn/yjs
JavaBBSIT.Log→ https://www.javabbs.cn/itl
JavaBBSNginx→ https://www.javabbs.cn/ngx
JavaBBSzabbix→ https://www.javabbs.cn/zbx
JavaBBSJavaSE→ https://www.javabbs.cn/jse JavaBBS社区文章→ https://www.javabbs.cn/bwz
JavaBBS社区资料→ https://www.javabbs.cn/bzl





