Linux之权限管理(ACL权限、特殊位、和隐藏属性)

1、文件归属

        由于Linux是一个多人多任务的系统,因此经常会出现同一台机器同时有多个人进行操作,为了考虑每个人的隐私权以及每个人喜好的工作环境,所以文件的权限归属就至关重要。为了保障系统的安全性和文件的隐私性,一个文件针对不同权限的账户有着不同的权限。

#查看文件相关信息
ll -d 文件名  或者  ls -l 文件名或者目录

        

2、文件权限

        文件权限是由一个字符串所表示,其所代表的含义如下:

        

  • 文档类型参数说明如下:

文档类型说明
d目录
-文档
l连结档(link file),类似于windows系统中的桌面快捷方式
b装置文件里面的可供储存的接口设备(可随机存取装置)
c装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
  • 权限参数说明如下:

权限参数说明
rr=Reader,表示为可读
ww=Writer,表示为可行
xx=eXecute,表示为可执行

权限由rwx三个字幕表示,分别表示为可读、可写、可执行,如果没有该权限,则用“ - ”表示。

对于目录来说,必须有x权限,否则无法读取目录内容;如果文件名前面有“ . ”,则表示这个文档或目录是隐藏的。查看隐藏文件:

#查看隐藏文件
ls -a

3、改变所有者

        改变文档所有者chown命令(change owner),改变文档所有组命令chgrp(change group),他们拥有相同的参数,-R,可以该文件的所有子文件。也可以单独使用chown 所有者:所有组  文件名,这样去改变文件

        使用:

#单独改变文件拥有者
chown 改变后的拥有者 文件名
#单独改变组
chown :改变的组名 文件名
#改变文件所有者,又改变文件的组
chown 文件拥有者:文件所属组 文件名
#递归改变某个目录下的所有文件拥有者
chown -R 文件拥有者 文件名
#递归改变某个目录下的所属组
chown -R :文件所属组 目录名
#递归同时改变文件拥有者和所属组
chown -R 文件拥有者:文件所属组 文件名

4、文件权限操作

        文件权限操作语法:

#案例演示如下
chmod 参数 文件名

参数如下:

文件的权限主要针对三类对象进行定义:

  • owner 属主, u:针对前三个部分的权限修改

  • group 属组, g:针对中间三个部分的权限修改

  • other 其他, o:针对最后三个部分的权限修改

什么权限的修改?答案:可读可写可执行 = rwx;a -> all 表示这三者皆是。

文件:

  • r:可使用文件查看类工具获取其内容

  • w:可修改其内容

  • x:可以把此文件提请内核启动为一个进程

目录:

  • r:可以使用ls查看此目录中文件列表

  • w:可在此目录中创建文件,也可删除此目录中的文件

  • x:可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录

  • X:只给目录x权限,不给文件x权限

可以使用如下方法直接设置文件的权限:

        

        例如:

#数字操作文件
chmod 777 文件名

案列演示:

        

  • 示例二:给文件添加或减去某些权限

# 给user用户加上w权限
chmod u+w 文件名    
# 将group中的r权限去掉
chmod g-r 文件名   
# 给user、group、other全部加上x权限
chmod a+x 文件名   
  • 示例三:其它操作

# 给属主增加rw权限,给属组加r权限
chmod u+rw,g+r shadow  
# 给其它人用户加w权限
chmod o=w shadow   
# 我们为ls命令减去执行权限,我们发现ls命令将无法执行啦  
chmod a-x /bin/ls    
chmod a+x /bin/ls

5、文件的ACL权限、特殊位和隐藏属性

       5.1 ACL权限

ACL是Access Control List的缩写,即访问控制列表。可以通过下列的实例来理解ACL的作用:

      理解:如图,临时用户不能拥有写的权限(write),并且,临时又不属于所在组,以及文件所有者,其他人没有此权限,去操作此文件!我们该如何去添加一个这样的临时用户???这就需要用到ACL权限,去设置临时用户的操作权限!!

        5.1.1、添加ACL权限

语法:

#设置ACL权限
setfacl u:临时用户名:权限 文件or文件夹
#查看ACL权限
getfacl 文件名

注:拥有ACL文件的文件权限的显示与一般文件不一样!!!(拥有ACL权限的文件后面会有+号)

操作:

        

注:上图中设置临时组权限给错了,应该给rx权限

        5.1.2、ACL中mask最大权限修改

什么是最大权限,如下:

       

最大权限是指: 如果给用户赋予了ACL权限,则用户所获取的权限并不是ACL时所附的权限,而是赋予的ACL权限 与 mask权限 进行 与 操作 之后的权限。例如:user:tempuser:r-x 第一位是r, mask的第一位也是r, 则与操作后,用户则有 r 的权限, user:tempuser:r-x 第二位是 - ,mask的第二位是 w,则与操作后用户则没有 w 的权限。

最大权限的作用:mask的默认值为rwx,即最大权限,任何其他的权限值和mask相“与”都会得到其自身; 可以通过调整mask的方式来控制分配给用户的最大权限,例如: mask值调整为 r-x ,则不管是否给用户分配”w”权限,用户都没有“w”的权限。mask可以用来避免权限分配不当而给系统带来的风险

注意:mask不会影响文件所有者的权限

测试:      

        

5.1.3、删除ACL权限

       删除指定的ACL权限

也可以把u改成g删除掉临时组的权限

        删除所有的ACL权限

        5.1.4、ACL权限的递归及默认值

所谓递归是指:指定目录下的所有文件及其子目录,都具体指定的ACL权限属性

注意:ACL权限只对已有的文件或目录起作用,对新加的不起作用

ACL的默认值:如果希望新加的文件或目录都具有父目录所拥有的ACL权限属性,则需要设置默认值

# 设置ACL权限
[root@localhost project]# setfacl -m u:tempuser:rx /project
[root@localhost project]# ll -d 
drwxrwx---+ 2 root tgroup 6 8月  23 13:07 .
# project目录已经设置好了ACL权限,在该目录中添加一个文件,文件并不具有ACL权限,因为在设置ACL权限时并没有指定递归属性
[root@localhost project]# touch abc.txt
[root@localhost project]# ll
总用量 0
-rw-r--r--. 1 root root 0 8月  23 17:29 abc.txt
# 设置ACL权限可以递归,注意:R参数的位置在此处是固定的,这算是Linux中命令的一个特例,Linux中命令参数的位置一般是不敏感的
[root@localhost ~]# setfacl -m u:tempuser:rx -R /project
[root@localhost project]# ll /project
总用量 0
-rw-r-xr--+ 1 root root 0 8月  23 17:29 abc.txt
# 在设置了project目录递归ACL权限属性后,再在该目录中创建一个新的文件,此时发现新的文件并没有ACL权限,这说明ACL权限只对已有的文件或目录起作用,对新加的不起作用
[root@localhost project]# touch def.txt
[root@localhost project]# ll
总用量 0
-rw-r-xr--+ 1 root root 0 8月  23 17:29 abc.txt
-rw-r--r--. 1 root root 0 8月  23 17:43 def.txt
# 设置ACL默认值,默认值的参数是d,可以和-R结合使用
[root@localhost project]# setfacl -m d:u:tempuser:rx -R /project
[root@localhost project]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: tgroup
user::rwx
user:tempuser:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:tempuser:r-x
default:group::rwx
default:mask::rwx
default:other::---

[root@localhost project]# touch www.txt
[root@localhost project]# ll
总用量 0
-rw-r-xr--+ 1 root root 0 8月  23 17:29 abc.txt
-rw-r--r--. 1 root root 0 8月  23 17:43 def.txt
  # 该文件在设置规则之后,默认值之前创建,两头都不管,所以没有ACL权限属性
-rw-rw----+ 1 root root 0 8月  23 17:51 www.txt
[root@localhost project]# 

5.2、特殊位

5.2.1 SUID

  1. 什么是suid
  • SUID是对二进制可执行的文件才有效, 普通文件设置之后是没有意义的
  • 执行者对该程序有x权限
  • 当程序具有suid时,程序执行者在执行程序期间,会暂时获得该程序所有者的身份
  • 程序执行者所获取的属主身份,只在程序运行过程中有效

Linux中具有suid权限的文件,如:passwd

注意:passwd的权限中在文件所有者的权限中有一个“s”,这说明:

  • passwd执行程序具有suid权限
  • 在passwd执行期间会获取root权限
  • 同时所属组和其他用户是用户r和x权限

为什么需要这么设置权限?

  • passwd修改的实际上是/etc/shadow的内容,但该文件只有root超级管理员才能修改,一般用户不可以
  • 但一般用户应该可以修改自己的账户密码,这是正当的需求
  • 在passwd执行期间,让普遍用户暂时获取root用户的权限,以便于修改shadow文件,执行完成临时赋予的权限消失,这即满足了用户可以修改自己密码的需求,也照顾到了系统安全性。
  1. 怎么设置suid?
  • 字母方式
    • chmod u+s <文件名>
    • u代表设置的是suid
  • 数字方式
    • chmod 4755 <文件名>
    • 最前方的4表示设置的是suid,后面的755分别代码 所有者,所属组,其他人的权限
  1. 怎样移除suid
  • 设置设置权限
    • chmod 755 <文件名>
  • 字符方式
    • chmod u-s <文件名>

5.2.2 SGID

  1. 什么是SGID

相对于SUID只能设置可执行的文件,SGID可以设置可执行文件,也可以设置目录,SGID有如下特征:

  • 如果设置的对象是文件,则只能是可执行的二进制文件,且命令的执行者需要对文件有 x 权限
  • 命令执行过程中,组身份升级为该文件的所属组
  • 只有在程序执行的过程中才有效
  1. 使用案例
# centos7默认没有安装locate,先执行安装
[root@localhost ~]# yum install mlocate
[root@localhost ~]# updatedb
[root@localhost ~]# locate inittab
/etc/inittab
/usr/share/vim/vim74/syntax/inittab.vim
# 查看locate命令,注意权限 所属组部分的s,这个s即表示开启了SGID,在执行该
# 命令时,会在执行期间临时将组身份升级为该文件的所属组
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 4月  11 2018 /usr/bin/locate
# locate命令需要使用mlocate.db文件,但该文件默认情况下普通用户是没有权限读的,当用户
# 运行locate命令时,临时获取了SGID属性,组身份升级为了该文件的所属组,所以具有了对
# mlocate文件的读权限。
[root@localhost test]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1123834 10月  2 15:06 /var/lib/mlocate/mlocate.db
#  ---- 为目录设置SGID的示例 -----
# 查看当前目录
[root@localhost ~]# pwd
/root
# 在tmp目录下创建一个目录
[root@localhost ~]# mkdir /tmp/test
# 给test赋予SGID的权限,(第一2表示SGID),如果需要清除SGID则可以使用 777
# 也可以使用 chmod g+s 文件或目录名
[root@localhost ~]# chmod 2777 /tmp/test
# 权限所属组部分的s,表示拥有SGID权限
[root@localhost ~]# ll -d /tmp/test
drwxrwsrwx. 2 root root 6 10月  2 14:58 /tmp/test
# 切换用户
[root@localhost ~]# su lisen
[lisen@localhost root]$ pwd
/root
# 普通用户无权在root目录下创建文件
[lisen@localhost root]$ touch abc.txt
touch: 无法创建"abc.txt": 权限不够
# 在home目录下创建一个文件,文件的默认的所属组为,当前用户的所属组
[lisen@localhost root]$ cd /home/lisen
[lisen@localhost ~]$ touch abc.txt
[lisen@localhost ~]$ ll
总用量 0
-rw-rw-r--. 1 lisen lisen 0 10月  2 15:01 abc.txt
# 在设置了SGID的目录中,创建文件,默认的所属组变成了目录的所属组,这是SGID的作用
[lisen@localhost ~]$ cd /tmp/test
[lisen@localhost test]$ touch bcd.txt
[lisen@localhost test]$ ll
总用量 0
-rw-rw-r--. 1 lisen root 0 10月  2 15:01 bcd.txt
[lisen@localhost test]$ 

在Linux中,suid(Set User ID)和sgid(Set Group ID)是文件权限的一种特殊设置,用于提供额外的权限。当suid和sgid位设置在可执行文件上时,它们的作用如下:

  1. SUID:当用户执行具有SUID位的可执行文件时,该文件将以文件所有者的权限而不是执行者的权限来运行。这允许普通用户执行一些特定任务,而无需提供超出其权限的完整访问权限。

  2. SGID:当用户执行具有SGID位的可执行文件时,该文件将以文件所属组的权限而不是执行者的权限来运行。这对于允许特定用户组在共享目录中创建文件,并确保这些文件继承目录的组权限非常有用。

总的来说,suid和sgid位提供了一种机制,允许普通用户执行某些特权操作或以特定用户组的身份执行操作,同时确保安全性和权限控制。

5.2.3 SBIT粘着位权限

SBIT权限的特点:

  • SBIT权限只能针对目录有效
  • 普通用户对目录拥有w和x权限,即普通用户对目录有写入权限
  • 若没有SBIT,则普通用户可以删除目录下的所有文件,包括其他用户创建的文件;若目录有SBIT权限,则只用root用户可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,对于其他用户创建的文件则无权删除。
  • SBIT权限的设置只能是root用户,其他用户不可以
# Linux中的tmp目录是使用SBIT权限的典型目录,注意权限部分最后的t字母
[root@localhost ~]# ll -d /tmp
drwxrwxrwt. 10 root root 218 10月  2 16:05 /tmp
# 创建一个新用户,并设置密码
[root@localhost ~]# useradd test
[root@localhost ~]# passwd test
# 切换到lisen用户,在/tmp目录下创建文件
[lisen@localhost root]$ touch /tmp/abcd.txt
# 切换到test用户,删除/tmp/目录下的abcd.txt文件,因为tmp目录具有SBIT权限,且abcd.txt
# 文件不是当前用户创建,所以无权删除。
[test@localhost root]$ cd /tmp
[test@localhost tmp]$ ls
abcd.txt
abc.txt
systemd-private-a092fa5008e44207b2cdbcae85170c80-chronyd.service-WocDs1
test
vmware-root_665-3988687359
[test@localhost tmp]$ rm abcd.txt
rm:是否删除有写保护的普通空文件 "abcd.txt"?y
rm: 无法删除"abcd.txt": 不允许的操作
# ---- 设置SBIT权限 ----
[root@localhost /]# mkdir /test
# 创建的目录默认的权限是755
[root@localhost /]# ll -d /test
drwxr-xr-x. 2 root root 6 10月  2 17:33 /test
# 设置SBIT权限
[root@localhost /]# chmod 1755 /test
[root@localhost /]# ll -d /test
drwxr-xr-t. 2 root root 6 10月  2 17:33 /test
# 上面的设置test的其他用户没有写入的权限,所以SBIT权限的没有什么含义
[root@localhost ~]# chmod 1777 /test
[root@localhost ~]# ll -d /test
drwxrwxrwt. 2 root root 6 10月  2 17:33 /test

5.3. 文件系统属性chattr权限

命令格式: chattr [+-=] [权限选项] 文件或目录, + 增加权限, -删除权限, =赋予权限

权限选项:

  • i 如果文件被设置i属性,则不允许文件进行删除,改名,文件内容也不允许改动; 如果目录被设置了i选项,则只能修改目录下的文件数据,但不允许建立和删除文件。需要注意的是该属性对root用户也同样有效
  • a 如果对文件设置了a属性,则只能在文件中增加数据,但不能修改也不能删除数据; 如果对目录设置了a属性,那么只能在目录中建立或修改文件,但不能删除
# ------ 文件的chattr属性示例 ---------
# ======= 文件的i属性 =============
# 创建一个文件,先不为其设置 i 属性, 此时可以正常写入内容
[root@localhost ~]# touch abc
[root@localhost ~]# ll
总用量 116
-rw-r--r--. 1 root root      0 10月  3 18:51 abc
-rw-------. 1 root root   1396 2月   8 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root   2381 8月  17 14:58 index.html
-rw-r--r--. 1 root root 102052 8月  17 15:02 index.html.1
-rw-r--r--. 1 root root   1612 3月  19 2021 index.html.2
-rw-r--r--. 1 root root   2381 8月  17 15:21 index.html.3
[root@localhost ~]# echo 1234345 > abc
[root@localhost ~]# cat abc
1234345
[root@localhost ~]# 
# 为abc文件设置i属性
[root@localhost ~]# chattr +i abc
# 一般的ls命令不能显示文件的i属性,需要使用lsattr命令
[root@localhost ~]# lsattr -a abc
----i----------- abc
[root@localhost ~]# 
# 设置了abc文件的i属性后,测试修改其内容,无权修改,删除也不行
[root@localhost ~]# echo efefe >> abc
-bash: abc: 权限不够
[root@localhost ~]# 
[root@localhost ~]# rm abc
rm:是否删除普通文件 "abc"?y
rm: 无法删除"abc": 不允许的操作
[root@localhost ~]# 
# ========= 目录的i属性示例 =========
[root@localhost ~]# mkdir /test
[root@localhost ~]# cd /test
[root@localhost test]# ll
总用量 0
# 没有设置chattr属性之前,可以添加文件
[root@localhost test]# touch a.txt
[root@localhost test]# ls
a.txt
# 设置chattr属性之后,可以对原来的目录中有的文件进行修改,但不能在目录中
# 添加或删除文件(报权限不够)
[root@localhost test]# chattr +i /test
[root@localhost test]# lsattr -a /test/
----i----------- /test/.
---------------- /test/..
---------------- /test/a.txt
[root@localhost test]# echo avaavv >> /test/a.txt
[root@localhost test]# touch /test/b.txt
touch: 无法创建"/test/b.txt": 权限不够
[root@localhost test]# 
# ============ 文件的a属性 ===========
[root@localhost test]# touch a.txt
[root@localhost test]# chattr +a a.txt
# > 将内容写入文件
[root@localhost test]# echo 123 > a.txt
-bash: a.txt: 不允许的操作
# >> 将内容追加到文件
[root@localhost test]# echo 12345 >> a.txt
[root@localhost test]# cat a.txt
12345
# ========== 目录的a属性 =========
[root@localhost /]# mkdir test02
[root@localhost /]# chattr +a test02
[root@localhost /]# cd /test02
[root@localhost test02]# touch a.txt
[root@localhost test02]# rm a.txt
rm:是否删除普通空文件 "a.txt"?y
rm: 无法删除"a.txt": 不允许的操作
[root@localhost test02]# mv a.txt b.txt
mv: 无法将"a.txt" 移动至"b.txt": 不允许的操作
[root@localhost test02]# 

5.4. sudo

作用:

  • root把本来只能由超级用户使用的命令赋予普通用户使用
  • sudo的操作对象是系统命令

使用场景:

  • 在需要将超级管理员的某些功能权限临时下方与普通用户时可以使用使用,(尚方宝剑)

修改sudo的配置(/etc/sudoers):

  • 修改格式:
    • root ALL=(ALL) ALL
    • 用户名 被管理主机IP=(可使用的身份) 授权命令(绝对路径)
    • %wheel ALL=(ALL) ALL
    • 组名 被管理主机IP=(可使用的身份) 授权命令 (绝对路径)
      # 查看或修改sudo的配置,也可以直接编辑/etc/sudoers文件
      [root@localhost ~]# visudo
      ## The COMMANDS section may have other options added to it.
      ##
      ## Allow root to run any commands anywhere
      root    ALL=(ALL)       ALL
      ## 增加lisen用户,可以执行服务器重启命令
      lisen      ALL=/sbin/shutdown -r now
      ## 切换到到lisen用户后可以使用上面的命令,但是需要注意两个地方:1. 和sudo一起用,2. 使用命令
      ## 的绝对路径

注意事项:

  • 主要不要将vim等编辑工具配置到sudo中去,如果在sudo的配置文件中配置了vim,则普通用户在运行vim中就拥有了超级用户的身份,这是很危险的,使用普通用户有权修改任何文件。
  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值