文件特殊权限: SUID, SGID, SBIT [Linux]

2024-08-22 13:58
文章标签 linux 特殊 权限 sgid suid sbit

本文主要是介绍文件特殊权限: SUID, SGID, SBIT [Linux],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 文件特殊权限: SUID, SGID, SBIT

    我们前面一直提到关於文件的重要权限,那就是 rwx 这三个读、写、运行的权限。看看先:

    [root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
    drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
    -rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd
    

    不是应该只有 rwx 吗?还有其他的特殊权限( s 跟 t )啊?啊.....头又开始昏了~ @_@ 因为 s 与 t 这两个权限的意义与系统的帐号 (第十四章)及系统的程序(process, 第十七章)较为相关, 所以等到后面的章节谈完后你才会比较有概念!底下的说明先看看就好,如果看不懂也没有关系, 先知道s放在哪里称为SUID/SGID以及如何配置即可,等系统程序章节读完后,再回来看看喔!
    当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 那么SUID的权限对於一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:

    • SUID 权限仅对二进位程序(binary program)有效;
    • 运行者对於该程序需要具有 x 的可运行权限;
    • 本权限仅在运行该程序的过程中有效 (run-time);
    • 运行者将具有该程序拥有者 (owner) 的权限。

    讲这么硬的东西你可能对於 SUID 还是没有概念,没关系,我们举个例子来说明好了。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!

    唔!有没有冲突啊!明明 /etc/shadow 就不能让 vbird 这个一般帐户去存取的,为什么 vbird 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦!藉由上述的功能说明,我们可以知道

    1. vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
    2. passwd 的拥有者是 root 这个帐号;
    3. vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
    4. /etc/shadow 就可以被 vbird 所运行的 passwd 所修改。

    但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:

    SUID程序运行的过程示意图
    图4.4.1、SUID程序运行的过程示意图

    另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的~这点要特别留意。


    • Set GID

    当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 罗!是这样没错!^_^。 举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:

    [root@www ~]# ls -l /usr/bin/locate
    -rwx--s--x 1 root slocate 23856 Mar 15  2007 /usr/bin/locate
    

    与 SUID 不同的是,SGID 可以针对文件或目录来配置!如果是对文件来说, SGID 有如下的功能:

    • SGID 对二进位程序有用;
    • 程序运行者对於该程序来说,需具备 x 的权限;
    • 运行者在运行的过程中将会获得该程序群组的支持!

    举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容 (详细说明会在下节讲述), mlocate.db 的权限如下:

    [root@www ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
    -rwx--s--x 1 root slocate   23856 Mar 15  2007 /usr/bin/locate
    -rw-r----- 1 root slocate 3175776 Sep 28 04:02 /var/lib/mlocate/mlocate.db
    

    与 SUID 非常的类似,若我使用 vbird 这个帐号去运行 locate 时,那 vbird 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!非常有趣吧!

    除了 binary program 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途! 当一个目录配置了 SGID 的权限后,他将具有如下的功能:

    • 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
    • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
    • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

    SGID 对於专案开发来说是非常重要的!因为这涉及群组权限的问题,您可以参考一下本章后续情境模拟的案例,应该就能够对於 SGID 有一些了解的!^_^


    • Sticky Bit

    这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:

    • 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
    • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

    换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

    举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:

    1. 以 root 登陆系统,并且进入 /tmp 当中;
    2. touch test,并且更改 test 权限成为 777 ;
    3. 以一般使用者登陆,并进入 /tmp;
    4. 尝试删除 test 这个文件!

    由於 SUID/SGID/SBIT 牵涉到程序的概念,因此再次强调,这部份的数据在您读完第十七章关於程序方面的知识后,要再次的回来瞧瞧喔! 目前,你先有个简单的基础概念就好了!文末的参考数据也建议阅读一番喔!


    • SUID/SGID/SBIT 权限配置

    前面介绍过 SUID 与 SGID 的功能,那么如何配置文件使成为具有 SUID 与 SGID 的权限呢? 这就需要第六章的数字更改权限的方法了! 现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!

    • 4 为 SUID
    • 2 为 SGID
    • 1 为 SBIT

    假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!

    Tips:
    注意:底下的范例只是练习而已,所以鸟哥使用同一个文件来配置,你必须了解 SUID 不是用在目录上,而 SBIT 不是用在文件上的喔!
     
    [root@www ~]# cd /tmp
    [root@www tmp]# touch test                  <==创建一个测试用空档
    [root@www tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限
    -rwsr-xr-x 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
    -rwsr-sr-x 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
    -rwxr-xr-t 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限
    -rwSrwSrwT 1 root root 0 Sep 29 03:06 test
    

    最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^

    而除了数字法之外,你也可以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 罗!来看看如下的范例:

    # 配置权限成为 -rws--x--x 的模样:
    [root@www tmp]# chmod u=rwxs,go=x test; ls -l test
    -rws--x--x 1 root root 0 Aug 18 23:47 test# 承上,加上 SGID 与 SBIT 在上述的文件权限中!
    [root@www tmp]# chmod g+s,o+t test; ls -l test
    -rws--s--t 1 root root 0 Aug 18 23:47 test
    

这篇关于文件特殊权限: SUID, SGID, SBIT [Linux]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级