2020.5.16-第八天
文件的特殊权限、文件的隐藏属性、文件访问控制列表
碎碎念:现在也逐渐复工了,感觉开始不够时间来分配游戏工作学习了,时间管理一直都是弱项啊。
一、文件的特殊权限
单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能
:
1.SUID:是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)-执行者临时获取命令的所有权限;
例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。因此这只是一种有条件的、临时的特殊权限授权方法。
查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
2.SGID主要实现如下两种功能:
a.让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
b.在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置,而且文件夹要给予其他用户操作权限);
c.使用者若對於此目錄具有 r 與 x 的權限時,該使用者能夠進入此目錄。
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。为了让其他用户在平时也能查看系统状态,可在用于查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:
这样一来,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而可以顺利地读取设备文件了。
当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,就要用到的SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
设置好目录的777权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID特殊权限位;
可以看出,其他用户在该目录中创建文件,是会继承新创建文件所在目录的所属组名称;
3.SBIT(Sticky Bit)特殊权限位(也可以称之为特殊权限位之粘滞位)可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了(那就叫做“保护位”吧):
a.當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
b.當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案.。
(RHEL 7系统中的/tmp作为一个共享文件的目录,默认已经设置了SBIT特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件)
与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限;
即便读、写、执行权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件;
4.SUID/SGID/SBIT权限设定(4为SUID,2为SGID,1为SBIT):
假设要将一个文件权限改为[ -rwsr-xr-x ]时,可以在原先的755前面加上4,即[ chmod 4755 filename ];或者使用符号法,SUID为u+s,SGID为g+s,SBIT为o+t。(大写的S,T代表该位置权限为空)
1.chmod命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。如果要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760
(chmod [-R] 777 文件/目录;chmod [-R] u=rwx,g=rwx,o=rwx 文件/目录);
2.chown命令可以设置文件或目录的所有者和所属组,其格式为“chown [参数] 所有者:所属组 文件或目录名称”:
它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。
二、文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
(权限充足但却无法删除某个文件的情况,或者仅能在日志文件中追加内容而不能修改或删除内容,这在一定程度上阻止了黑客篡改系统日志的图谋,因此这种“奇怪”的文件也保障了Linux系统的安全性。)
1.chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”:
2.lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用ls之类的命令则没办法看出来:
三、文件访问控制列表(ACL,Access Control List)
一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的,但如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
普通用户尝试进入root管理员的家目录中,在没有针对普通用户对root管理员的家目录设置ACL之前,是不能进去的:
1.setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”:文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数
(最简单的[u:帐号:权限],另外“-”代表无权限 ):
常用的“ls”命令虽然是看不到ACL表信息,但是通过“ls -ld ”可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。
设定值中的 u 后面未接使用者列表,代表设定该文件拥有者,即上面为“yanshifu”的权限变成了“rwx”。
2.getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”:
针对有效权限设定:[m:权限]:意义是使用者或群组设定的权限必须要存在于mask的权限设定范围内才会生效。
四、su命令与sudo服务
1.su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root管理员切换至普通用户:
上面的su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。(
强烈建议在切换用户身份时添加这个减号“-”)
另外,当从root管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成root管理员就需要进行密码验证了;这也是一个必要的安全检查:
尽管像上面这样使用su命令后,普通用户可以完全切换到root管理员身份来完成相应工作,但这将暴露root管理员的密码,从而增大了系统密码被黑客获取的几率;这并不是最安全的方案。
总结来说,“su”的用法:
A.若要完整的切換到新使用者的環境,必須要使用『 su - username 』或『 su -l username 』, 才會連同 PATH/USER/MAIL 等變數都轉成新使用者的環境;
B.如果僅想要執行一次 root 的指令,可以利用『 su - -c “指令串” 』的方式來處理;
C.使用 root 切換成為任何使用者時,並不需要輸入新使用者的密碼;
2.sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”/“sudo [-b] [-u 新使用者帐号]”:
总结来说,sudo命令具有如下功能:
A.限制用户执行指定的命令:
B.记录用户执行的每一条命令;
C.配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
D.验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
3.如果担心直接修改配置文件会出现问题,则可以使用sudo命令提供的visudo命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错
(“visudo”=“vim /etc/sudoers”,且只有root管理员才可以使用visudo命令编辑sudo服务的配置文件)。
使用visudo命令配置sudo命令的配置文件时,其操作方法与Vim编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出。在sudo命令的配置文件中,按照下面的格式将第99行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表(只能使用命令的绝对路径模式):
(多个命令时,使用逗号做分隔)
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用“sudo -l”命令查看到所有可执行的命令了(下面的命令中,验证的是该普通用户的密码,而不是root管理员的密码)。
或者直接使用“sudo 命令”也可以:
添加“NOPASSWD”参数,使得用户执行sudo命令时不再需要密码验证: