權(quán)限是Unix安全的一部分喇完,這篇博客介紹了與權(quán)限有關(guān)的3種用戶ID: Real User ID,
Effective User ID, saved Set-User-ID
進(jìn)程的三種ID
每一個(gè)進(jìn)程都有三個(gè)與用戶有關(guān)的ID
- Real User ID
真實(shí)用戶ID伦泥,在登錄的時(shí)候就確定了,一般也不會(huì)改變 - Effective User ID
有效用戶ID何暮,當(dāng)進(jìn)程訪問某個(gè)文件時(shí),內(nèi)核根據(jù)這個(gè)ID判斷進(jìn)程是否有訪問權(quán)限 - Saved Set-User-ID
初始化時(shí)铐殃,和Effective User ID
值一樣海洼,是Effective User ID
的一個(gè)副本,在某些
場合會(huì)有用途富腊,后面例子會(huì)介紹
實(shí)際上進(jìn)程除了以上跟用戶有關(guān)的三個(gè)ID外坏逢,還有三個(gè)跟組有關(guān)的ID,類似的赘被,分別是
Real Group ID
, Effective Group ID
和Saved Set-Group-ID
權(quán)限判斷
當(dāng)一個(gè)進(jìn)程需要訪問某個(gè)文件時(shí)是整,操作系統(tǒng)需要檢查該進(jìn)程的訪問權(quán)限,
Effective User ID
與權(quán)限緊密相關(guān)民假,檢驗(yàn)過程概括起來有:
- 如果進(jìn)程的
Effective User ID
等于0浮入,0代表是超級(jí)用戶(root),因此可以訪問 - 如果該文件被設(shè)置為所有者可以訪問羊异,且進(jìn)程的
Effective User ID
等于文件的所有者
ID事秀,那么可以訪問 - 如果該文件被設(shè)置為同組的用戶可以訪問,且進(jìn)程的
Effective Group ID
等于文件所有者
的Group ID野舶,那么可以訪問 - 如果該文件被設(shè)置為其他人可以訪問易迹,那么改進(jìn)程可以訪問
- 以上條件都不滿足,那么該進(jìn)程的訪問被拒絕
三種ID的初始值
一般情況
任何運(yùn)行的程序都是一個(gè)可執(zhí)行文件平道,運(yùn)行后睹欲,會(huì)產(chǎn)生一個(gè)新的進(jìn)程,一般情況下,這個(gè)
新進(jìn)程的Real User ID
,Effective User ID
和Saved Set-User-ID
都是執(zhí)行者用戶ID特殊情況
特殊情況下窘疮,進(jìn)程的Effective User ID
會(huì)被設(shè)置為可執(zhí)行文件所有者的用戶ID
這樣做的目的是袋哼,有些可執(zhí)行程序,比如修改密碼的passwd
考余,程序的所有者是root先嬉,
但普通用戶需要運(yùn)行passwd
來修改自己的密碼(通常需要修改/etc/passwd文件里的信息)。
因此普通用戶運(yùn)行passwd
時(shí)楚堤,進(jìn)程的Effective User ID
被設(shè)置為root疫蔓,進(jìn)程就有了root
的權(quán)限,能夠順利修改密碼
可執(zhí)行程序文件是否屬于這種特殊情況身冬,由文件元信息中的set-user-ID
位來決定
三種ID的修改
在進(jìn)程運(yùn)行過程中衅胀,超級(jí)管理員可以修改進(jìn)程的三種ID,函數(shù)如下;
#include <unistd.h>
int setuid(uid_t uid);
例子
Unix中at
命令可以在指定時(shí)間運(yùn)行指定的程序時(shí)酥筝,我們以at
運(yùn)行舉例滚躯,分析進(jìn)程的三種
ID在運(yùn)行過程中的變化
- 假設(shè)
at
的所有者是root,且設(shè)置了set-user-ID
位嘿歌,當(dāng)我們運(yùn)行at
命令時(shí)掸掏,新建的
進(jìn)程擁有root權(quán)限,三種ID如下:
real user ID = 運(yùn)行者ID
effective user ID = root
saved set-user-ID = root
-
at
首先降低進(jìn)程的權(quán)限為實(shí)際運(yùn)行用戶的權(quán)限
real user ID = 運(yùn)行者ID
effective user ID = 運(yùn)行者ID
saved set-user-ID = root
-
at
運(yùn)行宙帝,直到需要將何時(shí)運(yùn)行哪些指令的信息寫入配置文件丧凤,因?yàn)榕渲梦募乃姓?br> 是root,這時(shí)需要提高權(quán)限步脓,將進(jìn)程Effective User ID
設(shè)置為saved set-user-ID
愿待,
這里就是saved set-user-ID
發(fā)揮作用的地方,此時(shí)進(jìn)程擁有了root權(quán)限
real user ID = 運(yùn)行者ID
effective user ID = root
saved set-user-ID = root
- 配置文件修改完成后靴患,
at
降低進(jìn)程的權(quán)限
real user ID = 運(yùn)行者ID
effective user ID = 運(yùn)行者ID
saved set-user-ID = root
- 時(shí)間到了預(yù)設(shè)時(shí)間世蔗,后臺(tái)守護(hù)進(jìn)程創(chuàng)建一個(gè)新的進(jìn)程娱颊,代表我們執(zhí)行指令,該進(jìn)程的權(quán)限
就是最開始運(yùn)行at
命令用戶的權(quán)限
real user ID = 運(yùn)行者ID
effective user ID = 運(yùn)行者ID
saved set-user-ID = root