一個使用者、一個組
我們來看一看 Linux 許可權和所有權模型。我們已經看到每個檔案屬於一個使用者和一個組。這正是 Linux 中許可權模型的核心。您可以在 ls -l 清單中查看使用者和組:
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
在這個特殊的樣本中,/bin/bash 可執行檔屬於 root 使用者,並且在 wheel 組中。Linux 許可權模型通過允許給每個檔案系統對象設定三種獨立的權限等級來工作 — 它們為檔案的所有者、檔案的組以及所有其他使用者。
理解“ls -l”
我們來看一看我們的 ls -l 輸出,檢查一下這個清單的第一欄:
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
第一個欄位 -rwxr-xr-x 包含該特殊檔案的許可權的符號表示。該欄位中的首字元(-)指定該檔案的類型,本例中它是一個常規檔案。其它可能的首字元還有:
“d”目錄
“l”符號連結
“c”字元專門裝置檔案
“b”塊專門裝置檔案
“p”先進先出
“s”通訊端
三個三元組
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
該欄位的其餘部分由三個三元組字元組成。第一個三元字元組代表檔案所有者的許可權,第二個代表檔案的組的許可權,第三個代表所有其他使用者的許可權:
"rwx"
"r-x"
"r-x"
上面,r 表示允許讀(查看檔案中的資料),w 表示允許寫(修改檔案以及刪除),x 表示允許“執行”(運行程式)。將所有這些資訊放在一起,我們可以發現每個人都能夠讀該檔案的內容和執行該檔案,但是只允許檔案所有者(root 使用者)可以以任何方式修改該檔案。因此,雖然一般使用者可以複製該檔案,但是只允許 root 使用者更新或刪除它。
我是誰。
在我們看怎樣改變檔案的使用者所有權和組所有權之前,我們首先來看一看怎樣得知您當前的使用者標識和群組成員資格。除非最近您使用過 su 命令,否則您當前的使用者標識是您用來登入系統的使用者標識。但是,如果您經常使用 su,您可能不記得您當前有效使用者標識。要查看使用者標識,輸入 whoami:
# whoami
root
# su drobbins
$ whoami
drobbins
我在哪一組。
要看看您屬於哪一組,使用 group 命令:
$ groups
drobbins wheel audio
在上面的樣本中,我是 drobbins、wheel 和 audio 組的成員。如果您想看看其他使用者在什麼組,指定他們的使用者名稱作為參數:
$ groups root daemon
root : root bin daemon sys adm disk wheel floppy dialout tape video
daemon : daemon bin adm
改變使用者和組所有權
為了改變檔案或其它檔案系統對象的所有者或組,分別使用 chown 或 chgrp。這兩個命令都要一個使用者名稱或組名作參數,後面跟上一個或多個檔案名稱。
# chown root /etc/passwd
# chgrp wheel /etc/passwd
您還可以用 chown 命令的另一種形式同時設定所有者和組:
# chown root.wheel /etc/passwd
除非您是超級使用者,否則您不可以使用 chown,然而任何人都可以使用 chgrp 來將檔案的組所有權改為他們所屬的組。
遞迴的所有權改變
chown 和 chgrp 都有一個 -R 選項,該選項可以用來告訴它們遞迴地將所屬權和組改變應用到整個分類樹中。例如:
# chown -R drobbins /home/drobbins
介紹 chmod
chown 和 chgrp 可以用來改變檔案系統對象的所有者和組,而另一個程式 — 叫做 chmod — 用來改變我們可以在 ls -l 清單中看到的 rwx 許可權。chmod 帶有兩個或多個參數:“mode”,描述怎樣改變許可權,後面跟將會受到影響的檔案或檔案清單:
$ chmod +x scriptfile.sh
在上面的樣本中,我們的“mode”是 +x。您可能會猜到,+x 模式告訴 chmod,使該特殊檔案對於使用者、組以及其它任何人都是可執行檔。如果我們想要除去一個檔案的所有執行許可權,我們應該這樣做:
$ chmod -x scriptfile.sh
使用者/組/其他粒度
到此,我們的 chmod 樣本已經影響到了所有三個三元組 — 使用者、組和所有其他使用者。通常,一次只修改一個或兩個三元組很方便。要這樣做,只需要在 + 或 - 符號之前,給您想要修改的特定的三元組指定符號字元。對於“使用者”三元組使用 u,對於“組”三元組使用 g,對於“其他/每個人”使用 o:
$ chmod go-w scriptfile.sh
我們剛除去了組和所有其他使用者的寫入權限,而保留“所有者”許可權不動。
重新設定許可權
除了交替開啟和關閉許可權位以外,我們還可以一起重新設定它們。通過使用 = 操作符,我們可以告訴 chmod 我們要指定許可權和取消別的許可權:
$ chmod =rx scriptfile.sh
上面,我們只設定了所有的“read”和“execute”位,沒有設定所有的“write”位。如果您僅僅想重新設定特定的三元組,您可以像下面這樣,在 = 之前指定該三元組的符號名:
$ chmod u=rx scriptfile.sh
數字模式
直到現在為止,我們使用了叫做“符號”的模式來用 chmod 指定許可權的改變。然而,指定許可權還有
一種普遍使用的方法 — 使用 4 位八位元。使用叫做數字許可權文法的文法,每一位代表一個許可權
三元組。例如,在 1777 中,777 設定本章我們所討論的“owner”、“group”和“other”
標誌。1 用來設定專門的許可權位,我們將在本章的結束部分講到。這個圖表說明了怎樣解釋第二到
四位(777):
模式 數字
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0
數字許可權文法
當您需要給一個檔案指定所有許可權時,數字許可權文法特別有用,比如在下面的樣本中:
$ chmod 0755 scriptfile.sh
$ ls -l scriptfile.sh
-rwxr-xr-x 1 drobbins drobbins 0 Jan 9 17:44 scriptfile.sh
在該樣本中,我們使用了 0755 模式,它展開為一個完整的使用權限設定“-rwxr-xr-x”。
Umask
當進程建立了新檔案時,它指定新檔案應該具有的許可權。通常,所請求的模式是 0666(每個人可讀和可寫),它比我們希望的具有更多的許可權。幸運的是,不管什麼時候建立了新檔案,Linux 將參考叫做“umask”的東西。系統用 umask 值來將初始指定的許可權降低為更合理、更安全的許可權。您可以通過在命令列中輸入 umask 來查看您當前的 umask 設定:
$ umask
0022
Linux 系統上,umask 的預設值一般為 0022,它允許其他人讀您的新檔案(如果他們可以得到它們),但是不能進行修改。為了在預設的情況下使新檔案更安全,您可以改變 umask 設定: $ umask 0077umask 將確保組和其他使用者對於新建立的檔案絕對沒有任何許可權。那麼,umask 怎樣工作呢。與檔案的“常規”許可權不同,umask 指定應該關閉哪一個許可權。我們來參閱一下我們的“模式到數字”映射表,從而使我們可以理解 0077 的 umask 的意思是什麼: 模式 數字 rwx 7 rw- 6 r-x 5 r-- 4 -wx 3 -w- 2 --x 1 --- 0 使用該表,0077 的最後三位擴充為 ---rwxrwx。現在,請記住 umask 告訴系統禁用哪個許可權。根據推斷,我們可以看到將關閉所有“組”和“其他”許可權,而“使用者”許可權將保留不動。
介紹 suid 和 sgid
當您最初登入時,將啟動一個新的 shell 進程。您已經知道,但是您可能還不知道這個新的 shell
進程(通常是 bash)使用您的使用者標識運行。照這樣,bash 程式可以訪問所有屬於您的檔案和
目錄。事實上,作為使用者,我們完全依靠其它程式來代表我們執行操作。因為您啟動的程式繼承了
您的使用者標識,因此它們不能訪問任何不允許您訪問的檔案系統對象。
例如,一般使用者不能直接修改 passwd 檔案,因為“write”標誌已經對除“root 使用者”以外的每個使用者關閉:
$ ls -l /etc/passwd
-rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd
但是,一般使用者確實需要在他們需要改變其密碼的任何時候,能夠修改 /etc/passwd(至少間接地)。但是,如果使用者不能修改該檔案,究竟怎樣完成這個工作呢。
Suid
幸好,Linux 許可權模型有兩個專門的位,叫做“suid”和“sgid”。當設定了一個可執行程式的“suid”這一位時,它將代表可執行檔的所有者運行,而不是代表啟動程式的人運行。現在,回到 /etc/passwd 問題。如果看一看 passwd 可執行檔,我們可以看到它屬於 root 使用者:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd
您還將注意到,這裡有一個 s 取替了使用者權限三元組中的一個 x。這表明,對於這個特殊程式,設定了 suid 和可執行位。由於這個原因,當 passwd 運行時,它將代表 root 使用者執行(具有完全超級使用者訪問權),而不是代表運行它的使用者運行。又因為 passwd 以 root 使用者訪問權運行,所以能夠修改 /etc/passwd 檔案,而沒有什麼問題。
suid/sgid 告誡說明
我們看到了 suid 怎樣工作,sgid 以同樣的方式工作。它允許程式繼承程式的組所有權,而不是目前使用者的程式所有權。這裡有一些關於 suid 和 sgid 的其它的但是很重要的資訊。首先,suid 和 sgid 佔據與 ls -l 清單中 x 位相同的空間。如果還設定了 x 位,則相應的位表示為 s(小寫)。但是,如果沒有設定 x 位,它將表示為 S(大寫)。另一個很重要的提示:在許多環境中,suid 和 suid 很管用,但是不恰當地使用這些位可能使系統的安全遭到破壞。最好儘可能地少用“suid”程式。passwd 命令是為數不多的必須使用“suid”的命令之一。
改變 suid 和 sgid
設定和除去 suid 與 sgid 位相當簡單。這裡,我們設定 suid 位:
# chmod u+s /usr/bin/myapp
此處,我們從一個目錄除去 sgid 位。我們將看到 sgid 位怎樣影響下面幾屏中的目錄:
# chmod g-s /home/drobbins
許可權和目到此為止,我們從常規檔案的角度來看許可權。當從目錄的角度看許可權時,情況有一點不同。目錄使用同樣的許可權標誌,但是它們被解釋為表示略微不同的含義。 對於一個目錄,如果設定了“read”標誌,您可以列出目錄的內容;“write”表示您可以在目錄中建立檔案,“execute”表示您可以進入該目錄並訪問內部的任何子目錄。沒有“execute”標誌,目錄內的檔案系統對象是不可訪問的。沒有“read”標誌,目錄內的檔案系統對象是不可查看的,但是只要有人知道磁碟上對象的完整路徑,就仍然可以訪問目錄內的對象。目錄和 sgid如果啟用了目錄的“sgid”標誌,在目錄內建立的任何檔案系統對象將繼承目錄的組。當您需要建立一個屬於同一組的一組人使用的分類樹時,這種特殊的功能很管用。只需要這樣做:
# mkdir /home/groupspace
# chgrp mygroup /home/groupspace
# chmod g+s /home/groupspace
現在,mygroup 組中的所有使用者都可以在 /home/groupspace 內建立檔案或目錄,同樣,他
們也將自動地分配到 mygroup 的組所有權。根據使用者的 umask 設定,新檔案系統對象對於
mygroup 組的其他成員來說,可以或不可以是可讀、可寫或可執行檔。
目錄和刪除
預設情況下,Linux 目錄以一種不是在所有情況下都很理想的方式表現。一般來說,只要對一個
目錄有寫訪問權,任何人都可以重新命名或刪除該目錄中的檔案。對於個別使用者使用的目錄,這種行
為是很合理的。
但是,對於很多使用者使用的目錄來說,尤其是 /tmp 和 /var/tmp,這種行為可能會產生麻煩。
因為任何人都可以寫這些目錄,任何人都可以刪除或重新命名任何其他人的檔案 — 即使是不屬於
他們的。顯然,當任何其他使用者在任何時候都可以輸入“rm -rf /tmp/*”並損壞每個人的文
件時,很難把 /tmp 用於任何有意義的檔案。
所幸,Linux 有叫做“粘滯位”(sticky bit)的東西。當給 /tmp 設定了粘滯位(用
chmod +t),唯一能夠刪除或重新命名 /tmp 中檔案的是該目錄的所有者(通常是 root 使用者)
、檔案的所有者或 root 使用者。事實上,所有 Linux 分發包都預設地啟用了 /tmp 的粘滯位,
而您還可以發現粘滯位在其它情況下也很管用。
難以理解的第一位
總結本章,我們最後來看一看數字模式的難以理解的第一位元。您可以看到,這個第一位元
用來設定 sticky、suid 和 sgid 位:
suid sgid sticky 模式數字 on on on 7 on on off 6 on off on 5 on off off 4 off on on 3 off on off 2 off off on 1 off off off 0
這裡有一個怎樣用 4 位元字模式來設定一個目錄的許可權的樣本,該目錄將由一個工作群組使用:
# chmod 1775 /home/groupfiles
請想一想 1755 數字模式使用權限設定的含義。