深入攻克并了解权限ACL

2024-02-24 01:04
文章标签 深入 了解 权限 攻克 acl

本文主要是介绍深入攻克并了解权限ACL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 一、ACL使用

1.1、ACL中mask修改最大权限

什么是最大权限,看下面的信息:

[root@localhost ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: tgroup
user::rwx# 所属用户权限
user:tempuser:r-x# 临时用户权限
group::rwx# 所属组权限, 文件创建时的所属组
group:temp:r-x# 一般组的权限  创建的临时组
mask::rwx# 权限掩码,用来控制最大权限  
other::---

最大权限是指: 如果给用户赋予了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不会影响文件所有者的权限

实验:

# 设置mask
[root@localhost ~]# setfacl -m m:rx /project
# 查看mask
[root@localhost ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: tgroup
user::rwx
user:tempuser:r-x
group::rwx			#effective:r-x# 所属组虽然设置的权限为rwx,但其实际的权限 r-x  ✨
group:temp:r-x
mask::r-x# 修改之后的mask

1,2、ACL权限的删除

# 删除指定ACL权限
[root@localhost ~]# setfacl -x u:tempuser /project
[root@localhost ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: tgroup
user::rwx
group::rwx
group:temp:r-x
mask::rwx
other::---
# 删除所有ACL权限
[root@localhost ~]# setfacl -b /project
[root@localhost ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: tgroup
+
user::rwx
group::rwx
other::---
# 注意: 权限没有 + 
[root@localhost ~]# ll -d /project
drwxrwx---. 2 root tgroup 6 8月  23 13:07 /project

1.3、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]# 

二. 特殊位

2.1 SUID

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

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

[root@localhost ~]# whereis passwd


 

[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月   1 2020 /usr/bin/passwd
[root@localhost ~]#passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
 

注意: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 <文件名>

2.2 SGID

  1. 什么是SGID

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

  • 如果设置的对象是文件,则只能是可执行的二进制文件,且命令的执行者需要对文件有 x 权限
  • 命令执行过程中,组身份升级为该文件的所属组
  • 只有在程序执行的过程中才有效
  1. 使用案例
  2. # 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]$ 

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
    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]# 
    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中就拥有了超级用户的身份,这是很危险的,使用普通用户有权修改任何文件。

这篇关于深入攻克并了解权限ACL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740475

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争