Process Credentials包含一系列的ID:
- real user ID & real group ID
- effective user ID & effective group ID
- saved set-user-ID & saved set-group-ID
- file-system user ID & file-system group ID
- supplementary group IDs
real user ID & real group ID
real user ID和real gourp ID確定了進程所屬的用戶與組从铲。在登陸過程中(只討論終端登陸情況)锚国,init進程調(diào)用getty完成用戶名與密碼的輸入后管嬉,login進程會從/etc/passwd
文件中讀取相應(yīng)用戶密碼記錄的第三字段(UID)和第四字段(GID)示绊,并調(diào)用setuid()
設(shè)定登陸成功后對應(yīng)Shell進程的real user ID與real group ID柬采。即real user ID(real group ID)用于標識當前用戶(組)是誰盏档。
可使用logname
命令獲取real user ID:
┌─[peven@Arch] - [~] - [Sat Dec 01, 16:03]
└─[$] <> logname
peven
effective user ID & effective group ID
一般而言旅赢,effective user ID(effective group ID)是與real user ID(real group ID)相同的谷朝,但當我們的程序需要額外的權(quán)限去訪問他們沒有權(quán)限訪問的資源時斜姥,他們就需要將自己的user ID或group ID改為一個具有適當權(quán)限的ID(effective user/group ID)鸿竖。這可以通過調(diào)用setuid()
,setgid()
來實現(xiàn)铸敏。
effective user ID 可以通過whoami
命令來查看:
┌─[peven@Arch] - [~] - [Sat Dec 01, 16:18]
└─[$] <> whoami
peven
┌─[peven@Arch] - [~] - [Sat Dec 01, 16:18]
└─[$] <> su #切換為root用戶
Password:
[root@Arch peven]# logname #可以看到當前Shell的real user ID仍為peven
peven
[root@Arch peven]# whoami #effctive user ID變成了root
root
saved set-user-ID & saved set-group-ID
在設(shè)計程序時缚忧,應(yīng)當遵守最小權(quán)限準則,以減少惡意用戶試圖欺騙我們的程序以非預(yù)期的方式使用其特權(quán)而損害安全性的可能性杈笔。saved set-user-ID(saved set-group-ID)是與set-user-ID(set-group-ID)程序結(jié)合使用的闪水。
此名稱中的
saved
保存的實際是effective user ID(effective group ID)。
- 若可執(zhí)行文件的set uid/gid權(quán)限位開啟(eg. chmod u+s a.out)蒙具,則將進程的effective user/group ID置為可執(zhí)行文件的屬主球榆。否則朽肥,進程的effective user/group ID將保持不變。
- 無論可執(zhí)行文件的set /uid/gid權(quán)限位是否開啟持钉,saved set-user-ID(saved set-group-ID)對effective user/group ID值的復(fù)制都會進行衡招。
比如我們有一個程序,其作用是打印real user ID每强,effective user ID以及saved set-user-ID:
/* res.c */
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
int main(void)
{
uid_t ruid, euid, suid;
getresuid(&ruid, &euid, &suid);
printf("real user ID: %d\neffective user ID: %d\nsaved set-user-ID: %d\n", ruid, euid, suid);
return 0;
}
其權(quán)限為:
-rwxr-xr-x 1 peven users 17K Dec 1 17:17 res.o
編譯運行:
- 在未開啟
set uid/gid
權(quán)限位時蚁吝,以普通用戶運行:
real user ID: 1000
effective user ID: 1000
saved set-user-ID: 1000
root用戶:
real user ID: 0
effective user ID: 0
saved set-user-ID: 0
- 開啟
set uid/gid
權(quán)限位后(chmod u+s res.o),普通用戶:
real user ID: 1000
effective user ID: 1000
saved set-user-ID: 1000
root用戶:
real user ID: 0
effective user ID: 1000
saved set-user-ID: 1000
file-system user ID & file-system group ID.
file-system user/group ID始見于Linux1.2版本舀射,當時如果某進程甲的effective user ID等同于某進程乙的real user ID或effective user ID窘茁,那么甲就可以向乙發(fā)送信號。file-system user/group ID就是為了防范這一風險而生的脆烟。不過從Linux2.0版本起山林,Linux開始在信號發(fā)送權(quán)限方面遵循SUSv3所強制規(guī)定的規(guī)則,且這些規(guī)則不再涉及目標進程的effective user ID邢羔。這樣看來驼抹,file-system user/group ID在今天已經(jīng)可以廢除了。但為了保持軟件的兼容性拜鹤,還是將其保留了下來框冀。
supplementary group IDs
supplementary group IDs用于標識進程所屬的若干附加的組。supplementary group IDs會配合file-system ID和effective ID來進行進程是否有訪問某些資源權(quán)限的判定敏簿。