稍早在這個章節中,當您試著要轉換到 root 的登入目錄,您收到下列的訊息:
cd /root bash: /root: Permission denied |
那就是 Linux 之安全性特色的一個示範。 Linux 就像 UNIX 一樣是一種多使用者的系統,而檔案的權限設定是一種用來保護系統以避免惡意的竄改。
當您被權限拒絕時,一個取得存取權的方法就是您之前所學的 su 到 root。 這是因為不管誰知道 root 的密碼,就能夠擁有完全的存取權限。
不過轉換為 superuser 並不總是那麼方便或一個好主意,因為這樣會很容易因為犯錯而更改了重要的設定檔案。
所有檔案與目錄都屬於建立它們的使用者所 "擁有"。 您建立 sneakers.txt 檔案 (請看 菴 13.9.1 節) 在您的登入目錄,所以 sneakers.txt 是 "屬於" 您的。
這表示您可以指定誰能讀取、寫入甚至執行這個檔案(如果該檔案是一個應用程式的話)。
讀取、寫入以及執行是三種主要的權限設定。 因為當建立使用者的帳號時,使用者被放置在群組中,您也可以指定是否某些群組可以讀取、寫入或執行檔案。
請使用 ls 指令加上參數 -l(請看 圖形 13-11)來更仔細的看看 sneakers.txt 檔案。
這裡提供了很多的資訊。 您可以看到誰可以讀取(r)、誰可以寫入(w) 這個檔案, 以及誰建立這個檔案(sam),還有擁有者屬於哪一個群組(sam)。 還記得嗎,您所屬群組的名稱是與您的登入名稱相同的。
其他在群組右邊的資訊包括大小以及檔案建立的日期與時間,還有檔名。
第一列顯示出目前的權限設定; 總共有十個位置。 第一個位置代表檔案的類型。 其餘的九個位置實際上是給三個不同類型使用者的三組權限設定。
舉例來說:
-rw-rw-r-- |
這三組是這個檔案的擁有者、這個檔案所屬的群組以及 "其他人" (代表系統上的其他使用者)。
- (rw-) (rw-) (r--) 1 sam sam | | | | type owner group others |
用來指定檔案類型的第一個項目,會顯示下列的其中之一:
d — 一個目錄
-(破折號) — 一個一般的檔案(而不是目錄或連結)
l — 一個符號連結到系統中的另一個程式或檔案
在第一個項目之後的三組設定中,您將會看到下列的其中之一:
r — 可以讀取的檔案
w — 可以寫入的檔案
x — 可以被執行的檔案(假如它是一個程式的話)
假如您在擁有者、群組或其他人的權限設定有看到一個破折號,這表示該權限不被允許。 再看一次 sneakers.txt 檔案的第一列來指出它的權限。
ls -l sneakers.txt -rw-rw-r-- 1 sam sam 130 3月 12 23:16 sneakers.txt |
這個檔案的擁有者(在此為 sam)有讀寫這個檔案的權限。 這個群組 (sam) 也有讀寫 sneakers.txt 檔案的權限。 因為它不是一個程式,所以擁有者或群組都沒有執行它的權限。
可以使用 chmod 指令來輕易地更改權限設定。 這個例子顯示如何使用 chmod 指令來更改 sneakers.txt 檔案的權限設定。
原本的檔案看起來就像是這樣,它的初始權限設定是:
-rw-rw-r-- 1 sam sam 130 3月 12 23:16 sneakers.txt |
假如您是這個檔案的擁有者或您是以 root 帳號登入,您可以更改擁有者, 群組以及其他人的權限設定。
現在,擁有者與所屬群組可以讀取與寫入這個檔案。 在這個群組之外的其他人只可以讀取這個檔案 (r--)。
警告 | |
---|---|
請記得檔案的權限是一種安全的象徵。 每當您允許任何人來讀取、寫入與執行檔案,您正在增加檔案有可能被竄改、變更甚至刪除的風險。 原則上,您只應該允許讀寫權限給真正需要它們的人。 |
在下列的例子中,您想要允許所有人來寫入這個檔案,所以他們可以讀取、寫入並儲存它。 這表示您必須要更改檔案權限中 "其他人" 的部份。
讓我們先看一下這個檔案。 在 shell 提示符號下輸入:
ls -l sneakers.txt |
前面這個指令顯示了檔案的資訊:
-rw-rw-r-- 1 sam sam 130 3月 12 23:16 sneakers.txt |
現在,再輸入下列的指令:
chmod o+w sneakers.txt |
這個 o+w 指令告訴系統您想要給予其他人寫入 sneakers.txt 檔案的權限。 如要檢查結果,再將這個檔案的資訊列出。 此時,這個檔案應該就像這樣:
-rw-rw-rw- 1 sam sam 130 3月 12 23:16 sneakers.txt |
現在,所有人都可以讀寫這個檔案了。
如要從 sneakers.txt 移除讀寫的權限,可以使用 chmod 指令來一併拿走讀取與寫入的權限。
chmod go-rw sneakers.txt |
藉由輸入 go-rw,您正在告訴系統從 sneakers.txt 移除群組與其他人的讀取與寫入權限。
結果看起來會像:
-rw------- 1 sam sam 130 3月 12 23:16 sneakers.txt |
當您要使用 chmod 指令來更改權限設定時,您可以將這些設定當作一種簡略的表達方式,因為您所要做的事就是記得一些符號與字母來使用 chmod 指令。
這裡是這些簡略表達方式所代表意思的清單:
u — 擁有這個檔案的使用者(就是擁有者)
g — 該使用者所屬的群組
o — 其他人(非擁有者或擁有者所屬的群組)
a — 所有人或全部 (u, g 與 o)
r — 讀取權限
w — 寫入權限
x — 執行權限
+ — 增加權限
- — 移除權限
= — 使之成為唯一的權限
想要測試您的權限設定技術嗎? 從 sneakers.txt 移除所有人的權限。
chmod a-rwx sneakers.txt |
現在,看看是否您可以使用 cat sneakers.txt 指令來讀取這個檔案,您應該可以看到以下的輸出:
cat: sneakers.txt: 拒絕不符權限的操作 |
移除掉包括您自己的所有權限將會成功的鎖定該檔案。 不過因為這個檔案屬於您的,您總是可以使用下列的指令將它的權限設回來:
chmod u+rw sneakers.txt |
請使用 cat sneakers.txt 指令來確認您(檔案的擁有者)可以再次的讀取這個檔案。
這裡是一些可使用在 chmod 的一般設定的例子:
g+w — 增加寫入的使用權給這個群組
o-rwx — 移除其他人的所有權限
u+x — 允許檔案的擁有者執行這個檔案
a+rw — 允許所有人來讀寫這個檔案
ug+r — 允許擁有者與所屬群組來讀取這個檔案
g=rx — 只讓這個群組讀取與執行(無法寫入)
藉由增加 -R 參數,您可以更改整個目錄樹的權限設定。
因為您不能真正 "執行" 一個目錄(像是在執行一個應用程式一樣),當您從一個目錄新增或移除執行權限時,您是在允許(或拒絕)搜尋這個目錄的權限。
假如您沒有允許其他人在目錄 tigger 有執行的權限,誰有讀取或寫入的權限將不重要。 沒有人可以進入這個目錄除非他們知道他們想要的確切檔案名稱。
例如,輸入:
chmod a-x tigger |
來移除所有人的執行權限。
當您試著要 cd 到 tigger 目錄時, 會發生此種情況:
bash: tigger: 拒絕不符權限的操作 |
再來,回復您自己與所屬群組的權限:
chmod ug+x tigger |
現在,假如您使用 ls -l 檢查您的工作,您將會看到只有其他人被拒絕存取 tigger 目錄。
記得 chmod 速記方法的參考嗎? 這裡有 另一種方式來更改權限,雖然一開始看起來有點複雜。
讓我們回到 sneakers.txt 原本的權限設定:
-rw-rw-r-- 1 sam sam 130 3月 12 23:16 sneakers.txt |
每一種權限設定都可以一個數值來代表:
r = 4
w = 2
x = 1
- = 0
當這些數值加在一起時,總和被使用來設定特定的權限。 例如,如果您想要讀取與寫入的權限,您將會有數值 6; 4(讀取)+ 2(寫入) = 6。
至於 sneakers.txt,這裡是它的數值權限設定:
- (rw-) (rw-) (r--) | | | 4+2+0 4+2+0 4+0+0 |
使用者的總和是 6,群組的總和是 6,以及其他人的總和是 4。 這個權限設定被解讀為 664。
假如您想更改 sneakers.txt 的權限設定,讓您所屬群組沒有寫入的權限,但仍可以讀取這個檔案,您可以從該組號碼中減掉 2 來移除這個權限。
這個數值將成為 644。
要實作這個新的設定,請輸入:
chmod 644 sneakers.txt |
現在將檔案列出來確認這個變更。 請輸入:
ls -l sneakers.txt |
輸出應該為:
-rw-r--r-- 1 sam sam 130 3月 12 23:16 sneakers.txt |
現在,所屬群組與其他人都沒有寫入 sneakers.txt 檔案 的權限。 如要回復所屬群組的寫入權限,增加寫入 (w) 的數值 2 到第二組的權限數值即可。
chmod 664 sneakers.txt |
警告 | |
---|---|
設定權限為 666 將允許所有人讀寫一個檔案或目錄。 設定權限為 777 將給予所有人讀寫以及執行的權限。 這些權限設定將允許竄改一些重要檔案,所以大體上來說,使用這些設定並不是個好主意。 |
這裡有一些一般的設定, 數值以及它們的含意:
-rw------- (600) — 只有擁有者有讀寫的權限。
-rw-r--r-- (644) — 只有擁有者有讀寫的權限; 而群組與其他人只能讀取。
-rwx------ (700) — 只有擁有者有讀寫以及執行的權限。
-rwxr-xr-x (755) — 擁有者有讀寫以及執行的權限; 而群組與其他人只能讀取與執行。
-rwx--x--x (711) — 擁有者有讀寫以及執行的權限; 而群組與其他人只能執行。
-rw-rw-rw- (666) — 所有人都可以讀寫這個檔案。(請特別小心這些權限。)
-rwxrwxrwx (777) — 所有人都可以讀寫與執行這個檔案。(再次叮嚀,這種權限設定是很危險的。)
這裡有一些目錄的一般設定:
drwx------ (700) — 只有使用者可以讀取與寫入這個目錄。
drwxr-xr-x (755) — 每個人都可以讀取這個目錄,但使用者與其群組有讀取與執行的權限。