关于 Unix 用户权限及进程权限及 Saved set-user-id

最近在看APUE,看到3.14节,fcntl的时候
#include <fcntl.h>
int fcntl(int fd, int cmd, .../* int arg */);
出错返回-1,具体返回值依赖于cmd参数。
其中提到一个CMD,FD_GETFD FD_SETFD所返回的文件描述符标志FD_CLOEXEC(当前的文件描述符标志只有这一个)
最8.10节 函数子进程调用exec是对打开文件的处理。
对于fork一个进程,子进程与父进程共享一些数据,包裹已打开的文件描述符(子进程复制了所有父进程打开的文件描述符)
fork后,经常地,会调用exec程序,执行另外的一些任务,将子进程的正文段、数据段、堆、栈等替换为新的程序内容。此时,若设置了FD_CLOEXEC标志,子进程对父进程的文件描述符副本,被关闭。否则,将不关闭。
默认情况下,子进程调用exec并不关闭这些文件描述符副本,除非显式地用fcntl(fd,FD_SETFL,1)进行设置。
对于目录流,POSIX.1明确要求将此标志设置为1,通常,由opendir函数调用fcntl实现。

4.14节:
与一个进程关联的ID有6个。
real uid/real gid < login时从登录文件取出,显然,你用什么用户登录系统,实际用户就是谁。
effective uid/effective gid/supplementary group IDs.
saved set-user-ID/saved set-group-ID 被exec函数保存的saved set-user-ID/saved set-group-ID。

当一个程序被加载到内存执行的时候,通常用的是exec函数中的一个。
通常情况下,real uid与effective uid是相同的,你以什么身份执行一个程序,这个进程就属于谁这个相当容易理解。
但是:当 set-user-ID位被设置,也就是文件权限位第三位是s的时候,exec将会:把进程的effective user id 设置为 文件所有者ID。
这个时候,如果不属于当前用户的文件被执行,其effective user id = 文件所有者ID。
同时,exec还会将此文件所有者ID进行保存,所以,才叫 saved set-user-id;
那么,当执行一个具有set-user-id位的程序的时候,进程的real user id 与 effective user id 是不一定相同的。

我们可以用一个小程序来验证是否属实。
这个程序打印 程序运行时候的 real user ID与effective user ID。
#include <stdio.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
puts("I am child process");
printf("userId=%d,euserId=%d\n",getuid(),geteuid());
return 0;
}

同时将其权限设置为 -rwsr-xr-x 中的‘s‘就是saved-user-Id,当执行此程序时将以超级用户权限执行。要想验证很简单。
编译后执行他。获得输出:
I am child process
userId=500,euserId=0
-----------
同时,我们可以在程序中调用 int setuid (uid_t newuid) 函数来更改进程的real user id, effective user id;
但是我们必须明白:
1、只有root进程可以更改 real user id , saved set-user-id。
2、当root进程调用setuid函数时 real user id , effective user id , saved-user-id 都被设置为newuid;
3、如果一个不具有root权限的进程试图调用此函数,会出现什么呢?
如果 newuid == real user id or newuid == saved set-user-id
那么进程的 uid = newuid。
不然,出错。
同时,任何时候,进程都可以用setuid函数将,进程UID设置为:real user id 或者 saved set-user-id;

我们可以用 getuid() geteuid() 函数获取 real user id 和 effective user id,但我们无法用函数获得 save set-user-id;

时间: 2024-10-26 10:37:20

关于 Unix 用户权限及进程权限及 Saved set-user-id的相关文章

Linux基础:用户身份与进程权限

一.基本概念 权限: 定义了用户对资源的访问能力. 用户: 对于多用户多任务的Linux操作系统来说,是通过什么来区分不同的使用者呢? 用户:用户就是获取资源或服务的凭证.当我们登录系统的时候,系统会提示输入用户名和密码进行登录验证.对于Linux系统来说,用户通常就是一个标识,以 UID 来表示. 进程: 程序的执行过程.所谓对计算机的操作,比如双击某个应用程序图标或者是通过命令提示符敲入命令,其最终产生的结果就是创建进程.看似用户的操作,实际上是进程在代替我们完成,进程就是我们访问计算机资源

UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制

lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 实际组 ID 有效用户 ID 用于文件访问权限检查 有效组 ID 附加组 ID 保存的设置用户 ID 由 exec 函数保存 保存的设置组 ID 保存的设置用户 ID 和保存的设置组 ID 在执行一个程序时包含了有效用户 ID 和有效组 ID 的副本,这个后面我们学习到进程时在详细学习. 此处,我

0220自学Linux_逻辑理解用户进程权限相关+理解文件内各字段(passwd,shadow,group)

11 内核是真正意义上的操作系统 库有动态库也有静态库,Linux的动态库是.so后缀的,也称为共享库 库是不能够独立运行的,只能被调用 Window的动态库是.dll后缀的 我们平时所谓的安装操作系统是装在硬盘上的 我们对于系统而言,最基本的程序就是shell,不然我们无法和系统交互,打开一个命令行窗口,就打开了一个shell进程 硬件之上的是内核,内核之上是进程 如果进程中他需要调用库,那首先启动这个程序,他的进程会把这个调用的库装入内存 ,而如果是共享库,其他进程调用的话就直接在内存调用这

Linux中用户,组及权限的概念及相关命令

Linux的用户.组和权限管理 用户: 计算机的资源是有限的,但使用者有很多,为了能够实现这些使用者彼此之间在资源上进行隔离而保证各使用者的文件得到保护,并且我们让主机能够认定这个使用者的确是他所声称的那个使用者,所以我们必须要在整个系统上完成两种机制,1.认证机制Authertication,2.授权机制Authorization,3审计机制 Audition. 用户类别: 管理员用户:root 普通用户:分系统用户和登录用户两种 用户的标识:UserID,UID,范围16bits的二进制数字

第5章 用户身份与文件权限

章节简述: 详细的为读者讲述了用户.用户组和其余人在系统中的不同身份与能力,以及文件的读(r)写(w)执行(x)权限的作用. 为了让系统更加的安全还需要学习SUID.SGID和SBIT的文件特殊权限,文件隐藏权限以及ACL访问控制列表. 学会su命令和sudo服务后一定能够满足您以非超级用户操作实验或日常工作的需求,同时也保证了系统的安全性. 本章目录结构 5.1 用户身份与能力 5.2 文件权限与归属 5.3 文件的特殊权限 5.4 文件的隐藏属性 5.5 su命令与sudo服务 5.6 文件

用户、组和权限

在Linux系统中每一个文件都具有"所有者与所属用户组"属性,那么下面我们就来简单介绍一下所有者与所属用户组. 在Linux系统中每一个文件都具有"所有者与所属用户组"属性,那么下面我们就来简单介绍一下所有者与所属用户组. ☆所有者即用户(Username/UID),),用户分为管理员用户和普通用户. 管理员用户: 名称:一般为root                         uid:0 普通用户(uid范围:1-65535): 1. 系统用户:名称可以随便

Linux用户、组和权限的概念

用户.组和权限 安全上下文(Security Context): 1.权限 权限定义的例子: 文件: tom和jerry同时运行/tmp/inittab.new tom(属主) tom(属组) TOM:     ls /tmp/inittab.newJerry:     ls /tmp/inittab.new只会运行Tom,因为进程的属主是Tom 用户的三个主要权限: r,w,x 文件:r:可读,可以使用类似cat等命令查看文件内容:w:可写,可以编辑或删除此文件:x:可执行,eXcutable

linux初步学习之用户和用户组及权限管理浅谈

用户.组: 多用户:多人同时使用系统资源:        AAA: Authentication身份验证多任务:同行运行多个进程:               Authorization授权 Account账户 用户的类别: 管理员:root 普通用户: 系统用户:仅用于运行服务程序: 登录用户:系统资源的正常使用者: 用户标识:UserID, UID 16bits二进制数字:0-65535: 管理员:0 普通用户: 系统用户: CentOS 5, 6: 1-499 CentOS 7: 1-99

用户,用户组及权限管理

用户.用户组.其他的权限 多用户:多人同时使用系统资源: 多任务:同行运行多个进程: AAA: Authentication认证 Authorization授权 Account账户 用户的类别: 管理员:root 普通用户: 系统用户:仅用于运行服务程序: 登录用户:系统资源的正常使用者: 用户标识:UserID, UID 16bits二进制数字:0-65535: 管理员:0 普通用户: 系统用户: CentOS 5, 6: 1-499 CentOS 7: 1-999 普通用户: CentOS