您的位置:首页 > 其它

用户身份与文件权限(下)

2020-02-29 13:26 246 查看
  • 用户身份与能力
  • 文件权限与归属
  • 文件的特殊权限
  • 文件的隐藏属性
  • 文件访问控制列表
  • su命令与sudo服务

 

 

 

 

文件的特殊权限

 

    单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能

 

特殊权限涉及的2个命令:

chmod  (赋权)

chown (赋身份,设置文件的所有者和所有组身份)

 

赋值权限:chmod  权限值  文件名&目录名

例:chmod  755  文件名    (文件赋权)

       chomd -R 755  目录名 (目录赋权)

 

赋值身份:chown   所有者:所有组   文件名&目录名

例:chown  root:root  文件名

       chown  -R  root:root   目录名

 

-R 与 -f

-R 是递归操作目录,即对目录内所有的文件进行整体操作

-f  是强制

 

特殊权限位

 

linux系统基本权限位为9位权限,但还有额外3为权限位,共12位权限:

 

suid    s(有x) S  4  用户对应的权限位(用户对应的3位上)

 

sgid    s(有x) S  2  用户组对应的权限位(用户组对应的3位上)

 

sbid    t(有x) T  1  其他用户对应的权限位 (其他人权限组的3位上)

 

SUID  rwxrwxrwx=rwsrwxrwx

SGID  rwxrwxrwx=rwxrwsrwx

SBID  rwxrwxrwx=rwxrwxrwt

 

————————————————

 

SUID    针对二进制可执行命令或者程序使用

命令格式:chmod  u+s   二进制可执行文件名称 (u用户 , s SUID最高权限)

   用来临时获取文件当前所有者的最高权限

     SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。这很像我们在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。

      查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限

    另外有读者会好奇,那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S,如下:

ls -l /etc/shadow

----------. 1 root root 1753 Feb 27 22:24 /etc/shadow

  但是当linux用户执行passwd 重置密码的时候,该命令就对密码文件临时获取了最高权限,让命令执行者临时获取了该文件的所有者权限也就是root权限

ls -l /usr/bin/passwd

-rwsr-xr-x. 1 root root 27832 Jan 29  2014 /usr/bin/passwd  (s出现在所有者权限位上)

 

 

 

SGID   针对二进制可执行命令文件&目录

命令格式:chmod g+s       二进制可执行文件&命令名称 (g用户组 , s SGID最高权限)

针对目录:chomd  -R g+s  目录名

 

   SGID主要实现如下两种功能:

    让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)

    在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)

 

     SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限

 

例:

cr--r-----   1 root system 2,  1 Feb 11 2017  kmem

       大家看出问题了吗?除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:

-r-xr-sr-x   1 bin system 59346 Feb 11 2017  ps

这样一来,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而可以顺利地读取设备文件了。

        

  SGID的应用:

    前文提到,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

 

 

 

SBID   (保护位)    针对文件或者目录

命令格式:目录   chmod -R o+t  

                 文件   chmod   o+t  

保护文件只有所属用户可删除,防止被其他用户恶意删除

     SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

      文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限(其原理会在下个章节讲到)。为了避免现在很多读者不放心,所以上面的命令还是赋予了这个test文件最大的777权限(rwxrwxrwx)。我们切换到另外一个普通用户,然后尝试删除这个其他人创建的文件就会发现,即便读、写、执行权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件

      与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T

例:普通权限转特殊权限

rwx=rwt

rw-=rwT

 

rw-rwSr-T 转换数字权限

普通权限=664

全部权限=3664

 

rw-r-xrwx

普通权限=657

 

rwSr-xrwt

全部权限=5667

 

权限位与数字法转换

普通权限          特殊权限

r=4                   s=4 

w=2                  S=2  

x=1                   T=1 

linux满权限是7777

chmod  赋权  =  特殊权限位  + 一般权限位

 

大小写S的说明:   

通过大小写判断原文件是否有执行权限,s为有,S为没有

rwx=rws

rw-=rwS  (原文件没有执行权限位的,就不用再赋予SUID权限没意义,S纯补位用)

 

SBID中其他人权限位上大小写T的说明:

rw-=rwT

rwx=rwt

 

 

 

 

文件的隐藏属性

      Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。表现为权限充足但却无法删除某个文件的情况,或者仅能在日志文件中追加内容而不能修改或删除内容,这在一定程度上阻止了黑客篡改系统日志的图谋,因此这种“奇怪”的文件也保障了Linux系统的安全性

这是对普通权限法和特殊权限法的进一步补充

 

命令格式:chattr + 参数 +  文件名           (change file attributes)

 

chattr +i     文件名   文件无法被删除修改 全局生效(root权限下 rm -rf 都无法删除)

chattr -i      文件名   去除隐藏权限

chattr  +a   文件名   只能追加写入而不能删除编辑(常用于log文件权限锁定防止黑客修改)

chattr -s      彻底删除文件,无法回复,用0数据填充了硬盘底层的逻辑区域

 

lsattr  文件名      查看文件的隐藏权限    有i参数 为有隐藏权限

 

                    chattr命令中用于隐藏权限的参数及其作用

参数

作用

i

无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件

a

仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)

S

文件内容在变更后立即同步到硬盘(sync)

s

彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)

A

不再修改这个文件或目录的最后访问时间(atime)

b

不再修改文件或目录的存取时间

D

检查压缩文件中的错误

d

使用dump命令备份时忽略本文件/目录

c

默认将文件或目录进行压缩

u

当删除该文件后依然保留其在硬盘中的数据,方便日后恢复

t

让文件系统支持尾部合并(tail-merging)

x

可以直接访问压缩文件中的内容

 

 

 

文件访问控制列表

针对单用户配置精细访问策略

        前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL

 

setfacl  设置文件ACL   file access control list

         setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数  

 

  例:

       setfacl  -Rm u:zhangsan:rwx  123.txt   设置zhangsan用户对123文件的权限为rwx,其他人则无权编辑处理(-R是目录,m是修改,文件可以不加R)

 

 

getfacl  查看文件ACL

         getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。Linux系统中的命令就是这么又可爱又好记。想要设置ACL,用的是setfacl命令;要想查看ACL,则用的是getfacl命令

 

专业命令查看

例:getfacl  123.txt

 

普通 ls -ld查看

查看文件权限多出了用户组位置上的rwx和末尾的+号,+代表该文件上有facl策略

 

 setfacl  -b  文件名    移除facl策略

 

 

 

 

Su命令与Sudo服务

 

       用sudo命令把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露root管理员密码。我们要做的就是合理配置sudo服务,以便兼顾系统的安全性和用户的便捷性。sudo服务的配置原则也很简单—在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。

 

切换用户

su    用户名(环境变量沿用当前账户)

su -  完全切换到新用户(环境变量也切换到对应账户)

 

root切换普通用户无需密码

普通用户切换root需要密码

 

sudo服务(对用户指定赋权)

  限制用户执行指定的命令:

   记录用户执行的每一条命令;

   配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;

   验证密码的后5分钟内(默认值)无须再让用户再次验证密码。

 

配置sudo服务:

打开 visudo

编辑权限98行之后

    98 root            ALL=(ALL)       ALL

     99 zhangsan   ALL=(ALL)      /usr/sbin/reboot  

 

    第一个all 代表允许用户允许使用的主机=(以什么样的身份)可以配置为IP,子网,本机    第二个all 为允许所有命令 ,99行写reboot的绝对路径说明只允许该用户执行reboot命令

 

普通用户执行sudo服务中的命令格式为:sudo reboot   , 输入本用户密码确认 

 

可以添加NOPASSWD参数,使得用户执行sudo命令时不再需要密码验证:

例:zhangsan  all=NOPASSWD    /usr/sbin/reboot  

 

                                      sudo服务中的可用参数以及作用

参数

作用

-h

列出帮助信息

-l

列出当前用户可执行的命令

-u 用户名或UID值

以指定的用户身份执行命令

-k

清空密码的有效时间,下次执行sudo时需要再次进行密码验证

-b

在后台执行指定的命令

-p

更改询问密码的提示语

(window.slotbydup = window.slotbydup || []).push({ id: "u5894387", container: "_0hv0l6ey3zro", async: true });
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: