Unix 傳統(tǒng)中的操作系統(tǒng)不同于那些 MS-DOS 傳統(tǒng)中的系統(tǒng),區(qū)別在于它們不僅是多任務(wù)系統(tǒng),而且也是 多用戶系統(tǒng)。這到底意味著什么?它意味著多個(gè)用戶可以在同一時(shí)間使用同一臺(tái)計(jì)算機(jī)。然而一個(gè) 典型的計(jì)算機(jī)可能只有一個(gè)鍵盤和一個(gè)監(jiān)視器,但是它仍然可以被多個(gè)用戶使用。例如,如果一臺(tái) 計(jì)算機(jī)連接到一個(gè)網(wǎng)絡(luò)或者因特網(wǎng),那么遠(yuǎn)程用戶通過(guò) ssh(安全 shell)可以登錄并操縱這臺(tái)電腦。 事實(shí)上,遠(yuǎn)程用戶也能運(yùn)行圖形界面應(yīng)用程序,并且圖形化的輸出結(jié)果會(huì)出現(xiàn)在遠(yuǎn)端的顯示器上。 X 窗口系統(tǒng)把這個(gè)作為基本設(shè)計(jì)理念的一部分,并支持這種功能。
Linux 系統(tǒng)的多用戶性能,不是最近的“創(chuàng)新”,而是一種特性,它深深地嵌入到了 Linux 操作系統(tǒng)的 設(shè)計(jì)過(guò)程中。想一下 Unix 系統(tǒng)的誕生環(huán)境,這會(huì)很有意義。多年前,在個(gè)人電腦出現(xiàn)之前,計(jì)算機(jī) 都是大型的,昂貴的,集中化的。一個(gè)典型的大學(xué)計(jì)算機(jī)系統(tǒng),例如,是由坐落在一座建筑中的一臺(tái) 大型中央計(jì)算機(jī)和許多散布在校園各處的終端機(jī)組成,每個(gè)終端都連接到這臺(tái)大型中央計(jì)算機(jī)。 這臺(tái)計(jì)算機(jī)可以同時(shí)支持很多用戶。
為了使多用戶特性付諸實(shí)踐,那么必須發(fā)明一種方法來(lái)阻止用戶彼此之間受到影響。畢竟,一個(gè) 用戶的行為不能導(dǎo)致計(jì)算機(jī)崩潰,也不能亂動(dòng)屬于另一個(gè)用戶的文件。
在這一章中,我們將看看這一系統(tǒng)安全的本質(zhì)部分,會(huì)介紹以下命令:
id – 顯示用戶身份號(hào)
chmod – 更改文件模式
umask – 設(shè)置默認(rèn)的文件權(quán)限
su – 以另一個(gè)用戶的身份來(lái)運(yùn)行 shell
sudo – 以另一個(gè)用戶的身份來(lái)執(zhí)行命令
chown – 更改文件所有者
chgrp – 更改文件組所有權(quán)
在第四章探究文件系統(tǒng)時(shí),當(dāng)我們?cè)噲D查看一個(gè)像/etc/shadow 那樣的文件的時(shí)候,我們會(huì)遇到一個(gè)問(wèn)題。
[me@linuxbox ~]$ file /etc/shadow
/etc/shadow: regular file, no read permission
[me@linuxbox ~]$ less /etc/shadow
/etc/shadow: Permission denied
產(chǎn)生這種錯(cuò)誤信息的原因是,作為一個(gè)普通用戶,我們沒有權(quán)限來(lái)讀取這個(gè)文件。
在 Unix 安全模型中,一個(gè)用戶可能擁有文件和目錄。當(dāng)一個(gè)用戶擁有一個(gè)文件或目錄時(shí), 用戶對(duì)這個(gè)文件或目錄的訪問(wèn)權(quán)限擁有控制權(quán)。用戶,反過(guò)來(lái),又屬于一個(gè)由一個(gè)或多個(gè) 用戶組成的用戶組,用戶組成員由文件和目錄的所有者授予對(duì)文件和目錄的訪問(wèn)權(quán)限。除了 對(duì)一個(gè)用戶組授予權(quán)限之外,文件所有者可能會(huì)給每個(gè)人一些權(quán)限,在 Unix 術(shù)語(yǔ)中,每個(gè)人 是指整個(gè)世界。可以用 id 命令,來(lái)找到關(guān)于你自己身份的信息:
[me@linuxbox ~]$ id
uid=500(me) gid=500(me) groups=500(me)
讓我們看一下輸出結(jié)果。當(dāng)用戶創(chuàng)建帳戶之后,系統(tǒng)會(huì)給用戶分配一個(gè)號(hào)碼,叫做用戶 ID 或者 uid,然后,為了符合人類的習(xí)慣,這個(gè) ID 映射到一個(gè)用戶名。系統(tǒng)又會(huì)給這個(gè)用戶 分配一個(gè)原始的組 ID 或者是 gid,這個(gè) gid 可能屬于另外的組。上面的例子來(lái)自于 Fedora 系統(tǒng), 比方說(shuō) Ubuntu 的輸出結(jié)果可能看起來(lái)有點(diǎn)兒不同:
[me@linuxbox ~]$ id
uid=1000(me) gid=1000(me)
groups=4(adm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),44(v
ideo),46(plugdev),108(lpadmin),114(admin),1000(me)
正如我們能看到的,兩個(gè)系統(tǒng)中用戶的 uid 和 gid 號(hào)碼是不同的。原因很簡(jiǎn)單,因?yàn)?Fedora 系統(tǒng) 從500開始進(jìn)行普通用戶帳戶的編號(hào),而 Ubuntu 從1000開始。我們也能看到 Ubuntu 的用戶屬于 更多的用戶組。這和 Ubuntu 管理系統(tǒng)設(shè)備和服務(wù)權(quán)限的方式有關(guān)系。
那么這些信息來(lái)源于哪里呢?像 Linux 系統(tǒng)中的許多東西一樣,來(lái)自一系列的文本文件。用戶帳戶 定義在/etc/passwd 文件里面,用戶組定義在/etc/group 文件里面。當(dāng)用戶帳戶和用戶組創(chuàng)建以后, 這些文件隨著文件/etc/shadow 的變動(dòng)而修改,文件/etc/shadow 包含了關(guān)于用戶密碼的信息。 對(duì)于每個(gè)用戶帳號(hào),文件/etc/passwd 定義了用戶(登錄)名,uid,gid,帳號(hào)的真實(shí)姓名,家目錄, 和登錄 shell。如果你查看一下文件/etc/passwd 和文件/etc/group 的內(nèi)容,你會(huì)注意到除了普通 用戶帳號(hào)之外,還有超級(jí)用戶(uid 0)帳號(hào),和各種各樣的系統(tǒng)用戶。
在下一章中,當(dāng)我們討論進(jìn)程時(shí),你會(huì)知道這些其他的“用戶”是誰(shuí),實(shí)際上,他們相當(dāng)忙碌。
然而許多像 Unix 的系統(tǒng)會(huì)把普通用戶分配到一個(gè)公共的用戶組中,例如“users”,現(xiàn)在的 Linux 會(huì)創(chuàng)建一個(gè)獨(dú)一無(wú)二的,只有一個(gè)成員的用戶組,這個(gè)用戶組與用戶同名。這樣使某種類型的 權(quán)限分配更容易些。
對(duì)于文件和目錄的訪問(wèn)權(quán)力是根據(jù)讀訪問(wèn),寫訪問(wèn),和執(zhí)行訪問(wèn)來(lái)定義的。如果我們看一下 ls 命令的輸出結(jié)果,我們能得到一些線索,這是怎樣實(shí)現(xiàn)的:
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
列表的前十個(gè)字符是文件的屬性。這十個(gè)字符的第一個(gè)字符表明文件類型。下表是你可能經(jīng)常看到 的文件類型(還有其它的,不常見類型):
| 屬性 | 文件類型 |
|---|---|
| - | 一個(gè)普通文件 |
| d | 一個(gè)目錄 |
| l | 一個(gè)符號(hào)鏈接。注意對(duì)于符號(hào)鏈接文件,剩余的文件屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的文件屬性是指符號(hào)鏈接所指向的文件的屬性。 |
| c | 一個(gè)字符設(shè)備文件。這種文件類型是指按照字節(jié)流,來(lái)處理數(shù)據(jù)的設(shè)備。 比如說(shuō)終端機(jī),或者調(diào)制解調(diào)器 |
| b | 一個(gè)塊設(shè)備文件。這種文件類型是指按照數(shù)據(jù)塊,來(lái)處理數(shù)據(jù)的設(shè)備,例如一個(gè)硬盤,或者 CD-ROM 盤。 |
剩下的九個(gè)字符,叫做文件模式,代表著文件所有者,文件組所有者,和其他人的讀,寫,執(zhí)行權(quán)限。
當(dāng)設(shè)置文件模式后,r,w,x 模式屬性對(duì)文件和目錄會(huì)產(chǎn)生以下影響:
更改文件或目錄的模式(權(quán)限),可以利用 chmod 命令。注意只有文件的所有者或者超級(jí)用戶才 能更改文件或目錄的模式。chmod 命令支持兩種不同的方法來(lái)改變文件模式:八進(jìn)制數(shù)字表示法,或 符號(hào)表示法。首先我們討論一下八進(jìn)制數(shù)字表示法。
究竟什么是八進(jìn)制?
八進(jìn)制(以8為基數(shù)),和她的親戚,十六進(jìn)制(以16為基數(shù))都是數(shù)字系統(tǒng),通常 被用來(lái)表示計(jì)算機(jī)中的數(shù)字。我們?nèi)祟?,因?yàn)檫@個(gè)事實(shí)(或者至少大多數(shù)人)天生具有 十個(gè)手指,利用以10為基數(shù)的數(shù)字系統(tǒng)來(lái)計(jì)數(shù)。計(jì)算機(jī),從另一方面講,生來(lái)只有一個(gè) 手指,因此它以二進(jìn)制(以2為基數(shù))來(lái)計(jì)數(shù)。它們的數(shù)字系統(tǒng)只有兩個(gè)數(shù)值,0和1。 因此在二進(jìn)制中,計(jì)數(shù)看起來(lái)像這樣:
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011...
在八進(jìn)制中,逢八進(jìn)一,用數(shù)字0到7來(lái)計(jì)數(shù),像這樣:
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21...
十六進(jìn)制中,使用數(shù)字0到9,加上大寫字母"A"到"F"來(lái)計(jì)數(shù),逢16進(jìn)一:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13...
雖然我們能知道二進(jìn)制的意義(因?yàn)橛?jì)算機(jī)只有一個(gè)手指),但是八進(jìn)制和十六進(jìn)制對(duì)什么 好處呢? 答案是為了人類的便利。許多時(shí)候,在計(jì)算機(jī)中,一小部分?jǐn)?shù)據(jù)以二進(jìn)制的形式表示。 以 RGB 顏色為例來(lái)說(shuō)明。大多數(shù)的計(jì)算機(jī)顯示器,每個(gè)像素由三種顏色組成:8位紅色,8位綠色, 8位藍(lán)色。這樣,一種可愛的中藍(lán)色就由24位數(shù)字來(lái)表示:
010000110110111111001101
我不認(rèn)為你每天都喜歡讀寫這類數(shù)字。另一種數(shù)字系統(tǒng)對(duì)我們更有幫助。每個(gè)十六進(jìn)制 數(shù)字代表四個(gè)二進(jìn)制。在八進(jìn)制中,每個(gè)數(shù)字代表三個(gè)二進(jìn)制數(shù)字。那么代表中藍(lán)色的24位 二進(jìn)制能夠壓縮成6位十六進(jìn)制數(shù):
436FCD
因?yàn)槭M(jìn)制中的兩個(gè)數(shù)字對(duì)應(yīng)二進(jìn)制的8位數(shù)字,我們可以看到”43“代表紅色,“6F” 代表綠色,“CD”代表藍(lán)色。
現(xiàn)在,十六進(jìn)制表示法(經(jīng)常叫做“hex”)比八進(jìn)制更普遍,但是我們很快會(huì)看到,用八進(jìn)制 來(lái)表示3個(gè)二進(jìn)制數(shù)非常有用處...
通過(guò)八進(jìn)制表示法,我們使用八進(jìn)制數(shù)字來(lái)設(shè)置所期望的權(quán)限模式。因?yàn)槊總€(gè)八進(jìn)制數(shù)字代表了 3個(gè)二進(jìn)制數(shù)字,這種對(duì)應(yīng)關(guān)系,正好映射到用來(lái)存儲(chǔ)文件模式所使用的方案上。下表展示了 我們所要表達(dá)的意思:
|Octal| Binary | File Mode| |0 | 000 | ---| |1 | 001 | --x| |2 | 010 | -w-| |3 | 011 | -wx| |4 | 100 | r--| |5 | 101 | r-x| |6 | 110 | rw-| |7 | 111 | rwx|
通過(guò)使用3個(gè)八進(jìn)制數(shù)字,我們能夠設(shè)置文件所有者,用戶組,和其他人的權(quán)限:
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
[me@linuxbox ~]$ chmod 600 foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw------- 1 me me 0 2008-03-06 14:52 foo.txt
通過(guò)傳遞參數(shù) “600”,我們能夠設(shè)置文件所有者的權(quán)限為讀寫權(quán)限,而刪除用戶組和其他人的所有 權(quán)限。雖然八進(jìn)制到二進(jìn)制的映射看起來(lái)不方便,但通常只會(huì)用到一些常見的映射關(guān)系: 7 (rwx),6 (rw-),5 (r-x),4 (r--),和 0 (---)。
chmod 命令支持一種符號(hào)表示法,來(lái)指定文件模式。符號(hào)表示法分為三部分:更改會(huì)影響誰(shuí), 要執(zhí)行哪個(gè)操作,要設(shè)置哪種權(quán)限。通過(guò)字符 “u”,“g”,“o”,和 “a” 的組合來(lái)指定 要影響的對(duì)象,如下所示:
| u | "user"的簡(jiǎn)寫,意思是文件或目錄的所有者。 |
| g | 用戶組。 |
| o | "others"的簡(jiǎn)寫,意思是其他所有的人。 |
| a | "all"的簡(jiǎn)寫,是"u", "g"和“o”三者的聯(lián)合。 |
如果沒有指定字符,則假定使用"all"。執(zhí)行的操作可能是一個(gè)“+”字符,表示加上一個(gè)權(quán)限, 一個(gè)“-”,表示刪掉一個(gè)權(quán)限,或者是一個(gè)“=”,表示只有指定的權(quán)限可用,其它所有的權(quán)限被刪除。
權(quán)限由 “r”,“w”,和 “x” 來(lái)指定。這里是一些符號(hào)表示法的實(shí)例:
| u+x | 為文件所有者添加可執(zhí)行權(quán)限。 |
| u-x | 刪除文件所有者的可執(zhí)行權(quán)限。 |
| +x | 為文件所有者,用戶組,和其他所有人添加可執(zhí)行權(quán)限。 等價(jià)于 a+x。 |
| o-rw | 除了文件所有者和用戶組,刪除其他人的讀權(quán)限和寫權(quán)限。 |
| go=rw | 給群組的主人和任意文件擁有者的人讀寫權(quán)限。如果群組的主人或全局之前已經(jīng)有了執(zhí)行的權(quán)限,他們將被移除。 |
| u+x,go=rw | 給文件擁有者執(zhí)行權(quán)限并給組和其他人讀和執(zhí)行的權(quán)限。多種設(shè)定可以用逗號(hào)分開。 |
一些人喜歡使用八進(jìn)制表示法,而另些人真正地喜歡符號(hào)表示法。符號(hào)表示法的優(yōu)點(diǎn)是, 允許你設(shè)置文件模式的單個(gè)組成部分的屬性,而沒有影響其他的部分。
看一下 chmod 命令的手冊(cè)頁(yè),可以得到更詳盡的信息和 chmod 命令的各個(gè)選項(xiàng)。要注意"--recursive"選項(xiàng): 它可以同時(shí)作用于文件和目錄,所以它并不是如我們期望的那么有用處,因?yàn)槲覀兒苌傧M募?目錄擁有同樣的權(quán)限。
現(xiàn)在我們已經(jīng)知道了怎樣設(shè)置文件和目錄的權(quán)限,這樣我們就可以更好的理解 GUI 中的設(shè)置 權(quán)限對(duì)話框。在 Nautilus (GNOME)和 Konqueror (KDE)中,右擊一個(gè)文件或目錄圖標(biāo)將會(huì)彈出一個(gè)屬性對(duì)話框。下面這個(gè)例子來(lái)自 KDE 3.5:
\
圖 2: KDE 3.5 文件屬性對(duì)話框
{: .figure}
從這個(gè)對(duì)話框中,我們看到可以設(shè)置文件所有者,用戶組,和其他人的訪問(wèn)權(quán)限。 在 KDE 中,右擊"Advanced Permissions"按鈕,會(huì)打開另一個(gè)對(duì)話框,這個(gè)對(duì)話框允許 你單獨(dú)設(shè)置各個(gè)模式屬性。這也可以通過(guò)命令行來(lái)理解!
當(dāng)創(chuàng)建一個(gè)文件時(shí),umask 命令控制著文件的默認(rèn)權(quán)限。umask 命令使用八進(jìn)制表示法來(lái)表達(dá) 從文件模式屬性中刪除一個(gè)位掩碼。大家看下面的例子:
[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ umask
0002
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:53 foo.txt
首先,刪除文件 foo.txt,以此確定我們從新開始。下一步,運(yùn)行不帶參數(shù)的 umask 命令, 看一下當(dāng)前的掩碼值。響應(yīng)的數(shù)值是0002(0022是另一個(gè)常用值),這個(gè)數(shù)值是掩碼的八進(jìn)制 表示形式。下一步,我們創(chuàng)建文件 foo.txt,并且保留它的權(quán)限。
我們可以看到文件所有者和用戶組都得到讀權(quán)限和寫權(quán)限,而其他人只是得到讀權(quán)限。 其他人沒有得到寫權(quán)限的原因是由掩碼值決定的。重復(fù)我們的實(shí)驗(yàn),這次自己設(shè)置掩碼值:
[me@linuxbox ~]$ rm foo.txt
[me@linuxbox ~]$ umask 0000
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-rw- 1 me me 0 2008-03-06 14:58 foo.txt
當(dāng)掩碼設(shè)置為0000(實(shí)質(zhì)上是關(guān)掉它)之后,我們看到其他人能夠讀寫文件。為了弄明白這是 怎么回事,我們需要看一下掩碼的八進(jìn)制形式。把掩碼展開成二進(jìn)制形式,然后與文件屬性 相比較,看看有什么區(qū)別:
|Original file mode | --- rw- rw- rw-| |Mask | 000 000 000 010| |Result | --- rw- rw- r--|
此刻先忽略掉開頭的三個(gè)零(我們一會(huì)兒再討論),注意掩碼中若出現(xiàn)一個(gè)數(shù)字1,則 刪除文件模式中和這個(gè)1在相同位置的屬性,在這是指其他人的寫權(quán)限。這就是掩碼要完成的 任務(wù)。掩碼的二進(jìn)制形式中,出現(xiàn)數(shù)字1的位置,相應(yīng)地關(guān)掉一個(gè)文件模式屬性。看一下 掩碼0022的作用:
|Original file mode | --- rw- rw- rw-| |Mask | 000 000 010 010| |Result | --- rw- r-- r--|
又一次,二進(jìn)制中數(shù)字1出現(xiàn)的位置,相對(duì)應(yīng)的屬性被刪除。再試一下其它的掩碼值(一些帶數(shù)字7的) ,習(xí)慣于掩碼的工作原理。當(dāng)你實(shí)驗(yàn)完成之后,要記得清理現(xiàn)場(chǎng):
[me@linuxbox ~]$ rm foo.txt; umask 0002
大多數(shù)情況下,你不必修改掩碼值,系統(tǒng)提供的默認(rèn)掩碼值就很好了。然而,在一些高 安全級(jí)別下,你要能控制掩碼值。
一些特殊權(quán)限
雖然我們通??吹揭粋€(gè)八進(jìn)制的權(quán)限掩碼用三位數(shù)字來(lái)表示,但是從技術(shù)層面上來(lái)講, 用四位數(shù)字來(lái)表示它更確切些。為什么呢?因?yàn)?,除了讀取,寫入,和執(zhí)行權(quán)限之外,還有 其它的,較少用到的權(quán)限設(shè)置。
其中之一是 setuid 位(八進(jìn)制4000)。當(dāng)應(yīng)用到一個(gè)可執(zhí)行文件時(shí),它把有效用戶 ID 從真正的用戶(實(shí)際運(yùn)行程序的用戶)設(shè)置成程序所有者的 ID。這種操作通常會(huì)應(yīng)用到 一些由超級(jí)用戶所擁有的程序。當(dāng)一個(gè)普通用戶運(yùn)行一個(gè)程序,這個(gè)程序由根用戶(root) 所有,并且設(shè)置了 setuid 位,這個(gè)程序運(yùn)行時(shí)具有超級(jí)用戶的特權(quán),這樣程序就可以 訪問(wèn)普通用戶禁止訪問(wèn)的文件和目錄。很明顯,因?yàn)檫@會(huì)引起安全方面的問(wèn)題,所有可以 設(shè)置 setuid 位的程序個(gè)數(shù),必須控制在絕對(duì)小的范圍內(nèi)。
第二個(gè)是 setgid 位(八進(jìn)制2000),這個(gè)相似于 setuid 位,把有效用戶組 ID 從真正的 用戶組 ID 更改為文件所有者的組 ID。如果設(shè)置了一個(gè)目錄的 setgid 位,則目錄中新創(chuàng)建的文件 具有這個(gè)目錄用戶組的所有權(quán),而不是文件創(chuàng)建者所屬用戶組的所有權(quán)。對(duì)于共享目錄來(lái)說(shuō), 當(dāng)一個(gè)普通用戶組中的成員,需要訪問(wèn)共享目錄中的所有文件,而不管文件所有者的主用戶組時(shí), 那么設(shè)置 setgid 位很有用處。
第三個(gè)是 sticky 位(八進(jìn)制1000)。這個(gè)繼承于 Unix,在 Unix 中,它可能把一個(gè)可執(zhí)行文件 標(biāo)志為“不可交換的”。在 Linux 中,會(huì)忽略文件的 sticky 位,但是如果一個(gè)目錄設(shè)置了 sticky 位, 那么它能阻止用戶刪除或重命名文件,除非用戶是這個(gè)目錄的所有者,或者是文件所有者,或是 超級(jí)用戶。這個(gè)經(jīng)常用來(lái)控制訪問(wèn)共享目錄,比方說(shuō)/tmp。
這里有一些例子,使用 chmod 命令和符號(hào)表示法,來(lái)設(shè)置這些特殊的權(quán)限。首先, 授予一個(gè)程序 setuid 權(quán)限。
chmod u+s program
下一步,授予一個(gè)目錄 setgid 權(quán)限:
chmod g+s dir
最后,授予一個(gè)目錄 sticky 權(quán)限:
chmod +t dir
當(dāng)瀏覽 ls 命令的輸出結(jié)果時(shí),你可以確認(rèn)這些特殊權(quán)限。這里有一些例子。首先,一個(gè)程序被設(shè)置為setuid屬性:
-rwsr-xr-x
具有 setgid 屬性的目錄:
drwxrwsr-x
設(shè)置了 sticky 位的目錄:
drwxrwxrwt
在不同的時(shí)候,我們會(huì)發(fā)現(xiàn)很有必要具有另一個(gè)用戶的身份。經(jīng)常地,我們想要得到超級(jí) 用戶特權(quán),來(lái)執(zhí)行一些管理任務(wù),但是也有可能"變?yōu)?quot;另一個(gè)普通用戶,比如說(shuō)測(cè)試一個(gè)帳號(hào)。 有三種方式,可以擁有多重身份:
注銷系統(tǒng)并以其他用戶身份重新登錄系統(tǒng)。
使用 su 命令。
我們將跳過(guò)第一種方法,因?yàn)槲覀冎涝鯓邮褂盟⑶宜狈ζ渌鼉煞N方法的方便性。 在我們自己的 shell 會(huì)話中,su 命令允許你,假定為另一個(gè)用戶的身份,以這個(gè)用戶的 ID 啟動(dòng)一個(gè)新的 shell 會(huì)話,或者是以這個(gè)用戶的身份來(lái)發(fā)布一個(gè)命令。sudo 命令允許一個(gè)管理員 設(shè)置一個(gè)叫做/etc/sudoers 的配置文件,并且定義了一些具體命令,在假定的身份下,特殊用戶 可以執(zhí)行這些命令。選擇使用哪個(gè)命令,很大程度上是由你使用的 Linux 發(fā)行版來(lái)決定的。 你的發(fā)行版可能這兩個(gè)命令都包含,但系統(tǒng)配置可能會(huì)偏袒其中之一。我們先介紹 su 命令。
su 命令用來(lái)以另一個(gè)用戶的身份來(lái)啟動(dòng) shell。這個(gè)命令語(yǔ)法看起來(lái)像這樣:
su [-[l]] [user]
如果包含"-l"選項(xiàng),那么會(huì)為指定用戶啟動(dòng)一個(gè)需要登錄的 shell。這意味著會(huì)加載此用戶的 shell 環(huán)境, 并且工作目錄會(huì)更改到這個(gè)用戶的家目錄。這通常是我們所需要的。如果不指定用戶,那么就假定是 超級(jí)用戶。注意(不可思議地),選項(xiàng)"-l"可以縮寫為"-",這是經(jīng)常用到的形式。啟動(dòng)超級(jí)用戶的 shell, 我們可以這樣做:
[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]#
按下回車符之后,shell 提示我們輸入超級(jí)用戶的密碼。如果密碼輸入正確,出現(xiàn)一個(gè)新的 shell 提示符, 這表明這個(gè) shell 具有超級(jí)用戶特權(quán)(提示符的末尾字符是"#"而不是"$"),并且當(dāng)前工作目錄是超級(jí)用戶的家目錄 (通常是/root)。一旦進(jìn)入一個(gè)新的 shell,我們能執(zhí)行超級(jí)用戶所使用的命令。當(dāng)工作完成后, 輸入"exit",則返回到原來(lái)的 shell:
[root@linuxbox ~]# exit
[me@linuxbox ~]$
以這樣的方式使用 su 命令,也可以只執(zhí)行單個(gè)命令,而不是啟動(dòng)一個(gè)新的可交互的 shell:
su -c 'command'
使用這種模式,命令傳遞到一個(gè)新 shell 中執(zhí)行。把命令用單引號(hào)引起來(lái)很重要,因?yàn)槲覀儾幌?命令在我們的 shell 中展開,但需要在新 shell 中展開。
[me@linuxbox ~]$ su -c 'ls -l /root/*'
Password:
-rw------- 1 root root 754 2007-08-11 03:19 /root/anaconda-ks.cfg
/root/Mail:
total 0
[me@linuxbox ~]$
sudo 命令在很多方面都相似于 su 命令,但是 sudo 還有一些非常重要的功能。管理員能夠配置 sudo 命令,從而允許一個(gè)普通用戶以不同的身份(通常是超級(jí)用戶),通過(guò)一種非??煽氐姆绞?來(lái)執(zhí)行命令。尤其是,只有一個(gè)用戶可以執(zhí)行一個(gè)或多個(gè)特殊命令時(shí),(更體現(xiàn)了 sudo 命令的方便性)。 另一個(gè)重要差異是 sudo 命令不要求超級(jí)用戶的密碼。使用 sudo 命令時(shí),用戶使用他/她自己的密碼 來(lái)認(rèn)證。比如說(shuō),例如,sudo 命令經(jīng)過(guò)配置,允許我們運(yùn)行一個(gè)虛構(gòu)的備份程序,叫做"backup_script", 這個(gè)程序要求超級(jí)用戶權(quán)限。通過(guò) sudo 命令,這個(gè)程序會(huì)像這樣運(yùn)行:
[me@linuxbox ~]$ sudo backup_script
Password:
System Backup Starting...
按下回車鍵之后,shell 提示我們輸入我們的密碼(不是超級(jí)用戶的)。一旦認(rèn)證完成,則執(zhí)行 具體的命令。su 和 sudo 之間的一個(gè)重要區(qū)別是 sudo 不會(huì)重新啟動(dòng)一個(gè) shell,也不會(huì)加載另一個(gè) 用戶的 shell 運(yùn)行環(huán)境。這意味者命令不必用單引號(hào)引起來(lái)。注意通過(guò)指定各種各樣的選項(xiàng),這 種行為可以被推翻。詳細(xì)信息,閱讀 sudo 手冊(cè)頁(yè)。
想知道 sudo 命令可以授予哪些權(quán)限,使用"-l"選項(xiàng),列出所有權(quán)限:
[me@linuxbox ~]$ sudo -l
User me may run the following commands on this host:
(ALL) ALL
Ubuntu 與 sudo
普通用戶經(jīng)常會(huì)遇到這樣的問(wèn)題,怎樣完成某些需要超級(jí)用戶權(quán)限的任務(wù)。這些任務(wù) 包括安裝和更新軟件,編輯系統(tǒng)配置文件,和訪問(wèn)設(shè)備。在 Windows 世界里,這些任務(wù)是 通過(guò)授予用戶管理員權(quán)限來(lái)完成的。這允許用戶執(zhí)行這些任務(wù)。然而,這也會(huì)導(dǎo)致用戶所 執(zhí)行的程序擁有同樣的能力。在大多數(shù)情況下,這是我們所期望的,但是它也允許 malware (惡意軟件),比方說(shuō)電腦病毒,自由地支配計(jì)算機(jī)。
在 Unix 世界中,由于 Unix 是多用戶系統(tǒng),所以在普通用戶和管理員之間總是存在很大的 差別。Unix 采取的方法是只有在需要的時(shí)候,才授予普通用戶超級(jí)用戶權(quán)限。這樣,普遍會(huì) 用到 su 和 sudo 命令。
幾年前,大多數(shù)的 Linux 發(fā)行版都依賴于 su 命令,來(lái)達(dá)到目的。su 命令不需要 sudo 命令 所要求的配置,su 命令擁有一個(gè) root 帳號(hào),是 Unix 中的傳統(tǒng)。但這會(huì)引起問(wèn)題。所有用戶 會(huì)企圖以 root 用戶帳號(hào)來(lái)操縱系統(tǒng)。事實(shí)上,一些用戶專門以 root 用戶帳號(hào)來(lái)操作系統(tǒng), 因?yàn)檫@樣做,的確消除了所有那些討厭的“權(quán)限被拒絕”的消息。相比于 Windows 系統(tǒng)安全性而言, 這樣做,你就削弱了 Linux 系統(tǒng)安全性能。不是一個(gè)好主意。
當(dāng)引進(jìn) Ubuntu 的時(shí)候,它的創(chuàng)作者們采取了不同的策略。默認(rèn)情況下,Ubuntu 不允許用戶登錄 到 root 帳號(hào)(因?yàn)椴荒転?root 帳號(hào)設(shè)置密碼),而是使用 sudo 命令授予普通用戶超級(jí)用戶權(quán)限。 通過(guò) sudo 命令,最初的用戶可以擁有超級(jí)用戶權(quán)限,也可以授予隨后的用戶帳號(hào)相似的權(quán)力。
chown 命令被用來(lái)更改文件或目錄的所有者和用戶組。使用這個(gè)命令需要超級(jí)用戶權(quán)限。chown 命令 的語(yǔ)法看起來(lái)像這樣:
chown [owner][:[group]] file...
chown 命令可以更改文件所有者和/或文件用戶組,依據(jù)于這個(gè)命令的第一個(gè)參數(shù)。這里有 一些例子:
| 參數(shù) | 結(jié)果 |
|---|---|
| bob | 把文件所有者從當(dāng)前屬主更改為用戶 bob。 |
| bob:users | 把文件所有者改為用戶 bob,文件用戶組改為用戶組 users。 |
| :admins | 把文件用戶組改為組 admins,文件所有者不變。 |
| bob: | 文件所有者改為用戶 bob,文件用戶組改為,用戶 bob 登錄系統(tǒng)時(shí),所屬的用戶組。 |
比方說(shuō),我們有兩個(gè)用戶,janet,擁有超級(jí)用戶訪問(wèn)權(quán)限,而 tony 沒有。用戶 jant 想要從 她的家目錄復(fù)制一個(gè)文件到用戶 tony 的家目錄。因?yàn)橛脩?jant 想要 tony 能夠編輯這個(gè)文件, janet 把這個(gè)文件的所有者更改為 tony:
[janet@linuxbox ~]$ sudo cp myfile.txt ~tony
Password:
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r--r-- 1 root root 8031 2008-03-20 14:30 /home/tony/myfile.txt
[janet@linuxbox ~]$ sudo chown tony: ~tony/myfile.txt
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r--r-- 1 tony tony 8031 2008-03-20 14:30 /home/tony/myfile.txt
這里,我們看到用戶 janet 把文件從她的目錄復(fù)制到 tony 的家目錄。下一步,janet 把文件所有者 從 root(使用 sudo 命令的原因)改到 tony。通過(guò)在第一個(gè)參數(shù)中使用末尾的":"字符,janet 同時(shí)把 文件用戶組改為 tony 登錄系統(tǒng)時(shí),所屬的用戶組,碰巧是用戶組 tony。
注意,第一次使用 sudo 命令之后,為什么(shell)沒有提示 janet 輸入她的密碼?這是因?yàn)?,?大多數(shù)的配置中,sudo 命令會(huì)相信你幾分鐘,直到計(jì)時(shí)結(jié)束。
在舊版 Unix 系統(tǒng)中,chown 命令只能更改文件所有權(quán),而不是用戶組所有權(quán)。為了達(dá)到目的, 使用一個(gè)獨(dú)立的命令,chgrp 來(lái)完成。除了限制多一點(diǎn)之外,chgrp 命令與 chown 命令使用起來(lái)很相似。
到目前為止,我們已經(jīng)知道了,權(quán)限這類東西是怎樣工作的,現(xiàn)在是時(shí)候炫耀一下了。我們 將展示一個(gè)常見問(wèn)題的解決方案,這個(gè)問(wèn)題是如何設(shè)置一個(gè)共享目錄。假想我們有兩個(gè)用戶, 他們分別是 "bill" 和 "karen"。他們都有音樂 CD 收藏品,也愿意設(shè)置一個(gè)共享目錄,在這個(gè) 共享目錄中,他們分別以 Ogg Vorbis 或 MP3 的格式來(lái)存儲(chǔ)他們的音樂文件。通過(guò) sudo 命令, 用戶 bill 具有超級(jí)用戶訪問(wèn)權(quán)限。
我們需要做的第一件事,是創(chuàng)建一個(gè)以 bill 和 karen 為成員的用戶組。使用圖形化的用戶管理工具, bill 創(chuàng)建了一個(gè)叫做 music 的用戶組,并且把用戶 bill 和 karen 添加到用戶組 music 中:
\
圖 3: 用 GNOME 創(chuàng)建一個(gè)新的用戶組
{: .figure}
下一步,bill 創(chuàng)建了存儲(chǔ)音樂文件的目錄:
[bill@linuxbox ~]$ sudo mkdir /usr/local/share/Music
password:
因?yàn)?bill 正在他的家目錄之外操作文件,所以需要超級(jí)用戶權(quán)限。這個(gè)目錄創(chuàng)建之后,它具有 以下所有權(quán)和權(quán)限:
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxr-xr-x 2 root root 4096 2008-03-21 18:05 /usr/local/share/Music
正如我們所見到的,這個(gè)目錄由 root 用戶擁有,并且具有權(quán)限755。為了使這個(gè)目錄共享,允許(用戶 karen)寫入,bill 需要更改目錄用戶組所有權(quán)和權(quán)限:
[bill@linuxbox ~]$ sudo chown :music /usr/local/share/Music
[bill@linuxbox ~]$ sudo chmod 775 /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwxr-x 2 root music 4096 2008-03-21 18:05 /usr/local/share/Music
那么這是什么意思呢? 它的意思是,現(xiàn)在我們擁有一個(gè)目錄,/usr/local/share/Music,這個(gè)目錄由 root 用戶擁有,并且 允許用戶組 music 讀取和寫入。用戶組 music 有兩個(gè)成員 bill 和 karen,這樣 bill 和 karen 能夠在目錄 /usr/local/share/Music 中創(chuàng)建文件。其他用戶能夠列出目錄中的內(nèi)容,但是不能在其中創(chuàng)建文件。
但是我們?nèi)匀粫?huì)遇到問(wèn)題。通過(guò)我們目前所擁有的權(quán)限,在 Music 目錄中創(chuàng)建的文件,只具有用戶 bill 和 karen 的普通權(quán)限:
[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
-rw-r--r-- 1 bill bill 0 2008-03-24 20:03 test_file
實(shí)際上,存在兩個(gè)問(wèn)題。第一個(gè),系統(tǒng)中默認(rèn)的掩碼值是0022,這會(huì)禁止用戶組成員編輯屬于同 組成員的文件。如果共享目錄中只包含文件,這就不是個(gè)問(wèn)題,但是因?yàn)檫@個(gè)目錄將會(huì)存儲(chǔ)音樂, 通常音樂會(huì)按照藝術(shù)家和唱片的層次結(jié)構(gòu)來(lái)組織分類。所以用戶組成員需要在同組其他成員創(chuàng)建的 目錄中創(chuàng)建文件和目錄。我們將把用戶 bill 和 karen 使用的掩碼值改為0002。
第二個(gè)問(wèn)題是,用戶組成員創(chuàng)建的文件和目錄的用戶組,將會(huì)設(shè)置為用戶的主要組,而不是用戶組 music。 通過(guò)設(shè)置此目錄的 setgid 位來(lái)解決這個(gè)問(wèn)題:
[bill@linuxbox ~]$ sudo chmod g+s /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwsr-x 2 root music 4096 2008-03-24 20:03 /usr/local/share/Music
現(xiàn)在測(cè)試一下,看看是否新的權(quán)限解決了這個(gè)問(wèn)題。bill 把他的掩碼值設(shè)為0002,刪除 先前的測(cè)試文件,并創(chuàng)建了一個(gè)新的測(cè)試文件和目錄:
[bill@linuxbox ~]$ umask 0002
[bill@linuxbox ~]$ rm /usr/local/share/Music/test_file
[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ mkdir /usr/local/share/Music/test_dir
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
drwxrwsr-x 2 bill music 4096 2008-03-24 20:24 test_dir
-rw-rw-r-- 1 bill music 0 2008-03-24 20:22 test_file
[bill@linuxbox ~]$
現(xiàn)在,創(chuàng)建的文件和目錄都具有正確的權(quán)限,允許用戶組 music 的所有成員在目錄 Music 中創(chuàng)建 文件和目錄。
剩下一個(gè)問(wèn)題是關(guān)于 umask 命令的。umask 命令設(shè)置的掩碼值只能在當(dāng)前 shell 會(huì)話中生效,若當(dāng)前 shell 會(huì)話結(jié)束后,則必須重新設(shè)置。在這本書的第三部分,我們將看一下,怎樣使掩碼值永久生效。
這一章最后一個(gè)話題,我們將討論自己帳號(hào)的密碼(和其他人的密碼,如果你具有超級(jí)用戶權(quán)限)。 使用 passwd 命令,來(lái)設(shè)置或更改用戶密碼。命令語(yǔ)法如下所示:
passwd [user]
只要輸入 passwd 命令,就能更改你的密碼。shell 會(huì)提示你輸入你的舊密碼和你的新密碼:
[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:
passwd 命令將會(huì)試著強(qiáng)迫你使用“強(qiáng)”密碼。這意味著,它會(huì)拒絕接受太短的密碼,與先前相似的密碼, 字典中的單詞作為密碼,或者是太容易猜到的密碼:
[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:
BAD PASSWORD: is too similar to the old one
New UNIX password:
BAD PASSWORD: it is WAY too short
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
如果你具有超級(jí)用戶權(quán)限,你可以指定一個(gè)用戶名作為 passwd 命令的參數(shù),這樣可以設(shè)置另一個(gè) 用戶的密碼。還有其它的 passwd 命令選項(xiàng)對(duì)超級(jí)用戶有效,允許帳號(hào)鎖定,密碼失效,等等。 詳細(xì)內(nèi)容,參考 passwd 命令的手冊(cè)頁(yè)。
Wikipedia 上面有一篇關(guān)于 malware(惡意軟件)好文章:
還有一系列的命令行程序,可以用來(lái)創(chuàng)建和維護(hù)用戶和用戶組。更多信息,查看以下命令的手冊(cè)頁(yè):
adduser
useradd