重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 795|回复: 0
打印 上一主题 下一主题

[系统管理] Linux特殊权限SUID和SGID揭秘

[复制链接]
跳转到指定楼层
楼主
发表于 2024-4-10 22:43:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 梅钟园 于 2024-4-10 23:20 编辑
Linux特殊权限SUID和SGID揭秘
1、SUID和SGID深入剖析
1.1 基础知识 - Linux中的相关系统调用
  • 运行中的进程用户身份:基本上对于每个进程,组和用户都有两个ID,甚至更多。

  • 有效ID(EUID,Effective Real User ID) - 文件所有者的用户/组(仅在有SUID或SGID情况下)
  • 真实ID(RUID,Real User ID) - 启动进程的用户/组
  • 保存的UID(SUID,Saved User ID) - 被保存的UID

简单一点(针对UID系列):
  • RUID - 程序实际的执行者,仅root用户可更改RUID
  • EUID - 检测进程在执行中所获得的权限
  • SUID - 保存EUID,便于EUID被设置为其他ID时能够设置回来

  • 通常进程RUID和EUID相同

       但是对于启用 SUID/SGID 位的程序,EUID 更改为文件所有者/组,而 RUID是启动进程的用户/组。
       要使进程"实际"具有提升权限的操作,仍然需要使用 setuid 系统调用.

setuid(uid) 系统调用,首先请求内核本进程的RUID、EUID、SUID,都设置成函数指定的UID,若权限不足,则仅请求设置EUID为函数指定的UID,再不行,直接调用失败
  规则A: 当具有超级用户权限时,setuid() 对三者均有效
  规则B:否则,仅当ID为RUID或者SUID时,ID对EUID有效
  规则C:否则,直接调用失败

seteuid(uid) 仅请求内核本进程的EUID设置成函数指定的UID

其他系统调用
getuid()        RUID
geteuid()       EUID
getresuid()     SUID


getgid()        RGID
getegid()       EGID
getresgid()     SGID

setgid(gid) 和 setuid() 规则一致

seteuid()       设置EUID
setegid()       设置EGID

setreuid()      交换RUID和EUID
setregid()      交换RGID和EGID

1.2 示例 - SUID 和 SGID
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>

  5. int main(void) {
  6.   // store uids
  7.   uid_t ruid = getuid();
  8.   uid_t euid = geteuid();
  9.   // store gids
  10.   gid_t rgid = getgid();
  11.   gid_t egid = getegid();

  12.   printf("----------------------------------------------------------------------\n");
  13.   printf("before UID/RUID is: %d ,EUID is: %d\n", ruid, euid);
  14.   printf("before GID/RGID is: %d ,EGID is: %d\n", rgid, egid);
  15.   printf("----------------------------------------------------------------------\n");

  16.   // elevate the privileges -> EUID and EGID
  17.   setuid(euid);
  18.   setgid(egid);

  19.   // perform action
  20.   printf("perform program action ...\n");
  21.   system("id");
  22.   printf("----------------------------------------------------------------------\n");

  23.   // drop privileges -> RUID and RGID
  24.   // the UID and GID can only be changed by the root permissions
  25.   if (setuid(ruid)) {
  26.     fprintf(stderr, "drop user privileges setuid(%d) failed!\n", ruid);
  27.   }else{
  28.     fprintf(stderr, "drop user privileges setuid(%d) success.\n", ruid);
  29.   }
  30.   // permission denied, the most specific permissions take precedence
  31.   // user permissions override group permissions,which override other permissions.
  32.   if (setgid(rgid)) {
  33.     fprintf(stderr, "drop group privileges setgid(%d) failed!\n", rgid);
  34.   }else{
  35.     fprintf(stderr, "drop group privileges setgid(%d) success.\n", rgid);
  36.   }

  37.   printf("----------------------------------------------------------------------\n");
  38.   // end output information
  39.   printf("after UID/RUID is: %d ,EUID is: %d\n", getuid(), geteuid());
  40.   printf("after GID/RUID is: %d ,EGID is: %d\n", getgid(), getegid());
  41.   printf("----------------------------------------------------------------------\n");

  42.   // perform action
  43.   printf("perform program action ...\n");
  44.   system("id");
  45.   printf("----------------------------------------------------------------------\n");
  46.   return 0;
  47. }
复制代码
[user@host]$ gcc -Wall -o process process.c # 编译
[user@host]$ ls -l process*
-rwxr-xr-x. 1 root  root  24760 Apr  9 22:09 process
-rw-r--r--. 1 kiosk kiosk  1994 Apr  9 22:09 process.c
[user@host]$
[user@host]$ sudo chown root:root process
[user@host]$ sudo chmod +sx process # 设置 SUID 和 SGID 权限
[user@host]$
-rwsr-sr-x. 1 root  root  24760 Apr  9 22:09 process
[user@host]$ ./process

上图过程中不难看出,运行 process 时此程序由于设置了SUID和SGID,故而EUID、EGID都是0,有超级管理员用户权限
1.第一次 perform program action 运行 id 命令时得到的是以 root 用户 root 组身份运行。2.在清除SUID特殊权限时,setuid() 由于一开始有超级管理员权限,故而能设置成功,此时身份可以理解为已经变为 kiosk 用户,用户ID为 1000.满足规则A要求
3.再次清除SGID特殊权限时,此时用户身份为 kiosk 用户,不满足规则A要求,所以权限清除失败
上述 2 ~ 3 过程也可以理解为权限优先级,用户上的权限 优先于 组上的权限
最后得到的结果应该是 SUID 特殊权限清除成功,SGID 特殊权限清除失败
4.第二次 perform program action 运行  id 命令时得到以 kiosk 用户 root 组身份运行

1.2 仅 SUID 示例
[user@host]$ sudo chmod g-s process # 去除 SUID 权限
[user@host]$
-rwxr-sr-x. 1 root  root  24760 Apr  9 22:09 process
[user@host]$ ./process

1.第一次 perform program action 运行 id 命令时得到的是以 root 用户 kiosk 组身份运行。
2.在清除SUID特殊权限时,setuid() 由于一开始有超级管理员权限,故而能设置成功,此时身份可以理解为已经变为 kiosk 用户,用户ID为 1000.满足规则A要求
3.再次清除SGID特殊权限时,此时用户身份一直为 kiosk 用户,不满足规则A要求,但满足规则B要求,设置成功
最后得到的结果应该是 SUID 特殊权限清除成功,SGID 特殊权限清除成功,其实也是等于没有清除,一直都是 GID 1000 (kiosk)
4.第二次 perform program action 运行  id 命令时得到以 kiosk 用户 kiosk 组身份运行


其他相关基础知识
1、常见的访问控制模型
直接访问控制(DAC)、强制访问控制(MAC)、基于角色的访问控制(RBAC),此外还有属性访问控制(PAC)、基于策略的访问控制(PBAC)、审计访问控制(AAC)、时间访问控制(TAC)、定位访问控制(LAC)等
典型:
  • DAC - 操作系统基本都会提供基础权限控制或者ACL权限控制
  • MAC - Linux操作系统的SELinux、AppArmor,Windows的MIC
  • RBAC - Windows组策略提供类似功能,诸多网站后台业务提供类似功能,还有单独的RBAC模块,诸多DBMS(数据库管理系统)也提供此类权限模型
  • PAC - OAuth 这类认证方式归属于PAC
  • PBAC - 例如XACML,网络安全设备基本会提供此类权限模型
  • AAC - SIEM解决方案,来监控、记录和分析系统和网络上的安全事件,网络安全设备一般具有此类权限模型
  • TAC - 例如计划任务
  • LAC - 例如门禁系统
  • ...

2、直接访问控制(DAC)与 Linux传统UGO模型
  • 文件权限可以控制用户对文件的访问,传统UGO模型权限属于直接访问控制(DACDiscretionary Access Control)的一种,也称自主访问控制。
  • DAC是一种访问控制模型,资源的所有者直接控制对资源的访问权限。资源的所有者可以自由地决定谁可以访问其资源,通常通过访问控制列表(ACL)来实现。
  • 就像你是房子的主人,你可以决定谁可以进入你的房子,你可以给予朋友、家人或其他人进入的权限。这就是 DAC 模型,资源的所有者(就是你)可以直接控制对资源(房子)的访问权限。

3、传统9位基础权限
  • 应用权限的用户类别:用户、组、其他人
  • 权限优先级:用户权限 > 组权限 > 其他人权限
  • 三种权限:R(Read)W(Write)X(Exec),即 读、写、可执行
  • 特别说明:任何人只要在目录上具备W权限,其对目录下其他任何人拥有的文件和目录都有删除权限【弊端】


4、12位权限 - 含特殊权限位
  • SUID:针对二进制文件有效,目录无效,二进制文件在执行时以二进制文件的拥有者身份执行,典型 /usr/bin/passwd 程序
  • SGID:针对二进制文件有效,目录有效,二进制文件在执行时以二进制文件的组拥有者身份执行,针对目录时能够使得目录下新建的任何文件和目录自动集成目录的组拥有者身份
  • STID:针对目录有效,对文件无效,主要解决目录上W(写)权限的影响,达到目录下的内容谁创建谁管理的作用,因此这也主要针对共享目录进行设置,典型 /tmp 目录
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-11-28 15:14 , Processed in 0.157187 second(s), 25 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表