主要内容:
1、进程与权限
2、进程相关用户ID
3、相关API
之前学习了下进程的相关属性(结合APUE2),这里总结下进程用户ID相关的概念,其中进程用户组ID与之相似,不再单独列出。其他内容后续补充。
一、进程与权限
进程是LIUNX/UNIX 操作系统中最重要也是最近本的抽象之一。
---A process is a program (object code stored on some media) in the midst of execution.
---进程是一个处于执行期的程序(目标代码存储在某种介质上)。
而进程在执行过程中经常涉及到文件访问操作等。
1、一个运行中的进程究竟可以访问哪些资源,而不能访问哪些资源?
2、一个进程运行过程中如何实现在某个执行阶段拥有一些权限而在另一个阶段又具备另外一种权限呢?
上述状况对应于进程的访问权限以及进程执行中不同权限的切换。这里就引出学习的重点:进程实际用户ID,进程有效用户ID,进程保存设置用户ID。
二、进程的用户ID
Linux/Unix进程涉及到三类用户ID:
1、实际用户ID(real user id,RUID):为该进程的的创建者的用户ID,也可以说是进程的执行者。该ID仅root用户可以修改;
2、有效用户ID(effective user id,EUID):该ID用于标识用户进程执行操作的权限。普通用户可以将EUID设置为RUID或者SUID,而普通用户可以将EUID设置为任意的合法的UID。
3、保存设置用户ID(saved set-user-id,SUID):该ID主要用于进程用于切换其有效用户ID(EUID)时使用。对于没有设置set-uid-bit的可执行程序(文件)而言,其对应进程的保存设置用户ID(SUID)为其实际用户ID;而对于设置了set-uid-bit 的程序(文件)而言,其对应的保存设置用户ID(SUID)为该可执行文件的文件拥有者用户ID。另外SUID在其值发生改变时会记录新的SUID值。
一个可执行的二进制文件,如果其set-use-id bit 被设置,则运行该程序时,对应进程的有效用户ID(EUID)为该文件的文件所有者用户ID。这个在文件访问目录中有描述,可参考。
在APUE2中,对于进程涉及的三类用户ID有详细说明,结合该内容整理几点:
1、如果进程具有超级用户特权,则通过setuid(uid)函数可将实际用户ID,有效用户ID,以及保存设置用户ID设置为uid。此时不关心uid的值是否与RUID,EUID,SUID相等(超级用户就是牛叉,想设定什么uid就设定什么用户uid)。特权用户执行setuid时候,会将RUID,EUID,SUID全部设置为uid,如果uid对应用户非特权的话,则执行此类操作后无法重新回到超级用户了(已经装换为普通的权力了)。
2、没有超级用户特权的普通用户,通过调用setuid(uid)时,仅当uid=RUID,或者SUID时候,才可以将其有效用户ID(EUID)设置为uid,此时不影响RUID,SUID的值。
3、如果用户通过setuid(uid)设置进程的UID时候,uid不满足上述所说的规则,则setuid函数执行失败,返回EPERM错误。
通过上述描述可以看出:
1、只有超级用户可以更改进程的实际用户ID(RUID),其他用户无法修改其RUID。
2、仅当程序文件设置了set-user-id bit时,EUID 才等于程序文件的所有者用户ID,没有设置,则EUID为用户的RUID。任何时候可以通过setuid将进程的有效用户ID(EUID)设置为实际用户ID(RUID)或者保存是指用户ID(SUID),但不能将EUID设置为任意的uid(即,随即值)。
3、保存设置用户ID(SUID)是从用户的有效用户ID(EUID)复制而来。
下表为改变三个用户ID的 不同方法(APUE2)
-----------------------------------------------------------------------
| exec | setuid(uid)
ID ------------------------------------------------------------------
| set-user-id bit off | set-user-id bit on | superuser|normal user
------------------------------------------------------------------------
RUID | 不变 | 不变 |设置为uid |不变
EUID | 不变 | 设置为程序文件RUID |设置为uid |设置为uid
SUID | 从EUID复制 | 从EUID复制 |设置为uid |不变
------------------------------------------------------------------------
另外,通过seteuid可将设置进程的有效用户ID(EUID),且如下:
1、一个非特权用户通过该进程有效用户ID(EUID)设置为其实际用户ID(RIIOD),或者保存设置用户ID(SUID);
2、对于一个特权用户,可以将有效用户ID(EUID)设置为uid(uid为任意值,且仅影响其EUID,不改变其他ID:RUID,SUID)
三、相关API
1、int setuid(uid_t u i d) ;
2、int setgid(gid_t g i d) ;
------设置用户的RUID/RGID(特权用户会涉及EUID/EGID,SUID/SGID).
3、int setreuid(uid_t ru i d, uid_t e u i d) ;
4、int setregid(gid_t rg i d, gid_t e g i d) ;
------交换进程实际用户(组)与有效用户(组)ID.
5、int seteuid(uid_t u i d) ;
6、int setegid(gid_t g i d) ;
-------设置进程有效用户(组)ID.
7、uid_t getuid(void);
8、uid_t geteuid(void);
----------获取用户实际用户ID(RUID)/有效用户ID(EUID).
9、gid_t getgid(void);
10、gid_t getegid(void);
----------获取用户实际用户组ID(RUID)/有效用户组ID(EGID).
在Fedora上进行了相关UID的变换验证,加深了理解。代码很简单,主要涉及上述API,不再列出。为了理解上述各概念,还是验证下理解更清晰。
阅读(1275) | 评论(0) | 转发(0) |