前言
在看到apue的進(jìn)程的時(shí)候,我發(fā)現(xiàn)一個(gè)叫suid的概念桌粉,也就是"設(shè)置用戶ID"蒸绩。一開始對這個(gè)概念十分陌生,單憑從字面來看確實(shí)不容易理解铃肯,后面通過查閱資料并且了解到它的一些應(yīng)用場景之后才逐步了解患亿,本文就是簡單記錄一下我對suid的個(gè)人見解。
其實(shí)要了解一個(gè)抽象東西最好的方法就是:找到它的應(yīng)用場景押逼,并且獲取一個(gè)應(yīng)用的例子步藕,通過例子來了解它。那么suid的應(yīng)用例子是什么呢挑格?最典型的就是passwd了咙冗。
passwd是如何運(yùn)用suid的
相信有過一定開發(fā)或者運(yùn)維經(jīng)驗(yàn)的都知道,passwd就是一個(gè)可以用于修改用戶密碼的linux工具漂彤,如果再深入了解一點(diǎn)雾消,就會知道這個(gè)工具其實(shí)是修改/etc/passwd這個(gè)文件的灾搏。讓我們先簡單看一看/etc/passwd這個(gè)文件:
-rw-r--r-- 1 root root 1537 Jan 12 16:18 /etc/passwd
這個(gè)文件存儲的就是linux所有用戶的一些密碼信息,出于安全的要求仪或,文件的所屬用戶和所屬組均是root确镊,并且只能讓root去修改文件。
然而范删,作為一個(gè)普通用戶蕾域,我就想改我自己的密碼,難道還得取得root權(quán)限或者說讓root管理員給我們?nèi)バ薷拿艽a到旦?這很明顯是不人性化的旨巷。
當(dāng)然,你可以想添忘,那既然這樣也可以把其他用戶設(shè)置成可寫嘛采呐。那么這就問題大了,如果這個(gè)用戶亂改怎么辦呢搁骑?因此最好的解決辦法就是我們開發(fā)一個(gè)程序斧吐,這個(gè)程序去驗(yàn)證執(zhí)行用戶的修改密碼操作是否合法,如果合法則把它的新密碼寫到/etc/passwd這個(gè)文件的對應(yīng)用戶中去仲器。
但是我們又忽略了這么一點(diǎn)煤率,作為一個(gè)普通用戶,我們確實(shí)可以執(zhí)行修改密碼程序乏冀,但是我們執(zhí)行時(shí)候得實(shí)際用戶id依然不是root蝶糯,因此即使我們的操作合法,也不能讓這個(gè)程序去修改/etc/passwd文件辆沦,因?yàn)檫@個(gè)文件僅僅運(yùn)行root管理員去修改昼捍。
passwd很好的告訴我們應(yīng)該怎么解決這個(gè)問題,且先看看passwd這個(gè)程序的信息:
-rwsr-xr-x 1 root root 47032 May 16 2017 /usr/bin/passwd*
我們知道第三個(gè)位置是執(zhí)行位肢扯,但很奇怪的是妒茬,這次執(zhí)行位不是常規(guī)的"x"而是"s"。其實(shí)這個(gè)"s"就是表示這個(gè)passwd程序具有suid的功能鹃彻。因此郊闯,當(dāng)普通用戶執(zhí)行這個(gè)passwd程序的時(shí)候,它就具備了root的權(quán)限蛛株,當(dāng)具備了root權(quán)限的時(shí)候团赁,當(dāng)然也能去修改/etc/passwd文件了,這么一來谨履,我們既讓普通用戶在非root權(quán)限下?lián)碛辛诵薷淖约好艽a的能力欢摄,也能最大限度的保證了整個(gè)系統(tǒng)的安全,可以說是一舉兩得的笋粟。
總結(jié)
最后簡單總結(jié)一句話:suid就是允許用戶在執(zhí)行程序的時(shí)候擁有這個(gè)程序?qū)僦鞯臋?quán)限的一個(gè)機(jī)制怀挠,也可以理解為執(zhí)行程序的時(shí)候被屬主"靈魂上身"析蝴,但執(zhí)行結(jié)束后又會"打回原形"了。