1. 程式人生 > >Linux 下程序許可權分析

Linux 下程序許可權分析

在linux下,關於檔案許可權,大部分人接觸比較多,也比較熟悉瞭解.但是對程序許可權一般知之甚少。本文總結一下linux系統下程序許可權問題和現象。

需要強調的是,本文是linux系統下討論,因為linux和unix有很多不同的地方,並且各個不同的unix系統也有很多不同。

先開門見山的列出本文討論物件:ruid(實際使用者id: real userid)、euid(有效使用者使用者:effective userid), suid(儲存使用者id:saved userid)、fuid(檔案系統使用者id)。

除了上面4個,還涉及到一個位 設定使用者id位(set user id bit),,即我們通常所說的處rwx之外那個s標誌位。

另外,本文主要討論userid,groupid規則基本一樣,例如rgid, egid, sgid, fgid等,本文就不做組id方面的重複討論了。

首先,檢視這幾個uid的方法有兩種方式:一是ps 命令 (ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname)列出這幾個uid;二是檢視status檔案,(cat /proc/2495/status | grep Uid)。

本文建立5個test使用者 test1~test5用來做本文中sample討論使用,代表常見普通許可權使用者。

一:檔案所有者使用者和程式執行者使用者是同一使用者的情況

12345678910111213141516171819202122 intmain(intargc,char*argv[]){while(1)sleep(1);}$>g++main.cpp-oa.out$>ll-rwxr-xr-x.1test1 test6780Sep1615:32a.out檔案所有者是test1,我們用test1使用者執行a.out程式$>su test1$>./a.out&$>ps-ax-oruid-oeuid-osuid-ofuid-opid-ofname
|grepa.out5025025025023192a.out(看到結果是4uid全是test1)現在我們用test2使用者執行test1的程式看看結果$su test25035035035033234a.out再用root使用者執行00003257a.out看到這個結果,我們基本可以總結:在常見情況下。這四個id只受執行使用者影響,不受檔案owner使用者影響。並且四個uid全部等於執行使用者的id

上面是我們碰到最常見最多的情況,所以導致大部分技術人員很少關心這個四個uid的區別和含義。讓我們繼續看看更多場景

二、出讓許可權給其它使用者。非root使用者是無法出讓許可權給其它使用者,只有root使用者才能出讓。

12345678910111213141516171819202122232425262728293031323334 intmain(intargc,char*argv[]){if(setuid(503)<0)perror("setuid error");while(1)sleep(1);}$>ll-rwxr-xr-x.1test1 test6780Sep1615:32a.out使用root使用者執行$>./a.out檢視狀態,所有uid都變成test2使用者。5035035035033592a.out把程式碼中setuid改成seteuid函式,會把euidfuid改成test2使用者050305033614a.out把程式碼中setuid改成setfsuid函式,會把fuid改成test2使用者0005033636a.out當把程式碼改成下面樣子if(seteuid(503)<0)perror("seteuid error");if(setfsuid(504)<0)perror("setfsuid error");while(1)sleep(1);或者if(setfsuid(504)<0)perror("setfsuid error");if(setfeuid(503)<0)perror("seteuid error");while(1)sleep(1);root使用者執行,得到都是一樣的結果050305033614a.out到了這裡我來總結一下:1setuidseteuid是有區別的,setuid是永久的放棄root使用者許可權,轉讓給非root使用者後,無法再restoreroot使用者,seteuid是臨時放棄root使用者許可權,可以通過seteuid(0),restoreroot許可權。這點應該是總所周知的特點,本文就不舉例子演示。2seteuid會同時改變euidfuid都為設定的euid值。3root使用者可以通過呼叫setxxuid來改變許可權使用者。非root使用者是無法改變和轉讓許可權使用者。

許可權出讓使用最多的場景是類似apache或mysql程式,啟動的時候使用root使用者啟動,設定一些root使用者才能操作的系統配置。建立子程序時候通過setuid降級為nobody使用者。

繼續看一下s許可權位對程序許可權的影響

三、s 標誌位影響的是 euid,suid,和 fuid

12345678910111213 intmain(intargc,char*argv[]){while(1)sleep(1);}$>g++main.cpp$>ll-rwxr-xr-x.1test1 test6780Sep1618:18a.out$>chmodu+sa.out$>ll-rwsr-xr-x.1test1 test6780Sep1618:18a.out使用root使用者執行,檢視使用者ID05025025024133a.out

s許可權位使用最經典的案例是passwd命令

下面我們看看他們對檔案許可權的影響,構建一個ruid,euid,和fuid都不同,看看創建出來的檔案所有者是哪個uid

四、影響使用者檔案許可權的是 fuid,不是 euid,該 uid 是 linux 特有的屬性,unix 系統是靠 euid 來判定使用者許可權。

12345678910111213141516171819202122 intmain(intargc,char*argv[]){if(setfsuid(503)<0)perror("setfsuid error");FILE *fp=fopen("test.log","a+");if(fp==NULL){perror("fopen error");}else{fclose(fp);}while(1)sleep(1);}使用s許可權位,檔案所有者為root,執行者為test1,改變fuidtest2,這樣就構造出3uid各部相同,方便觀察效果$>ll-rws---r-x.1root  root7397Sep1618:53a.out執行檢視狀態,ruidtest1euidrootfuidtest2502005034240a.out$>ll-rws---r-x.1root  root7397Sep1618:53a.out-rw-rw-r--.1test2 test0Sep1618:54test.log

五、許可權的繼承,當使用 fork 子程序的時候,子程序全部繼承父程序四個 uid,和父程序 uid 相同

當使用exec系列函式時候,會把suid置為euid。