Linux 入門記錄:十三、Linux 延伸權限,linux許可權
一、預設許可權
每一個終端都有一個 umask 屬性,是用來確定建立檔案或目錄的預設許可權的許可權“掩碼”(mask 有“掩碼”的含義,至於 u,後面說)。
Linux 中一般有預設的許可權掩碼,使用命令 umask 用以查看或設定:
umask 查看預設掩碼umask 0022 設定預設掩碼
一般地,普通使用者(uid 為 500 以上)的許可權掩碼預設為 0002,root 使用者(uid 為 0)的許可權掩碼預設為 0022。
如果建立了一個檔案或目錄,那麼這個檔案或目錄的預設許可權等於 檔案或目錄的預設最高許可權 & (~ umask) 。
那麼,“檔案或目錄的預設最高許可權”是多少呢?一般來說,目錄的預設最高許可權是 0777,檔案的預設最高許可權為 0666(去掉了 x 許可權,禁止執行,安全考慮)。注意:Linux 的許可權值是八進位的!所以,網上的某些所謂十進位減法運算來計算建立檔案或目錄預設許可權的邏輯是錯誤的。還有什麼分情況討論的,在我看來實在麻煩。用電腦思維來理解電腦,這是我認為最合理、最準確且最簡單的思維方式。
怎麼記憶和理解這個運算邏輯?
umask,我把它的中文全稱記為用於“位取反的許可權掩碼”。“位取反” 來自 "u",“掩碼” 來自 "mask" 。拿這個位取反的許可權掩碼(~ umask)跟預設最高許可權相與 "&",就得到了建立檔案(或目錄)的預設許可權。
怎麼理解?
這裡主要是“掩碼”:掩碼是用來和目標數進行邏輯與 "&" 運算,取得目標數裡跟掩碼的位均為 1 的位組合,並將跟掩碼中位為 0 的對應位全部丟棄。掩碼的原理是邏輯與的原理,任何數和 1 相與都是它本身,任何數和 0 相與都是 0。而一個數跟掩碼的反碼(位取反)進行邏輯與,得到結果恰恰相反,結果是保留這個數裡跟掩碼裡位為 0 相對應的位,丟棄跟掩碼裡位為1 相對應的位。
這裡的 umask 就是這個作用,用預設最高許可權跟取反的 umask 相與,就從預設最高許可權裡丟棄了 umask 不允許的許可權。所以並不是簡單的十進位減法運算,例如 umask 值為 0022 和 0033 的時候,普通使用者建立檔案的預設許可權都是 0644(因為 0666 & (~ 0022) 和 0666 & (~ 0033) 的運算結果是一樣的),用 rwx 符號表示就是 -rw-r--r-- 。
二、特殊許可權
除了普通許可權外,還有三個特殊許可權:
| 許可權 |
對檔案的影響 |
對目錄的影響 |
| suid |
以檔案的所屬使用者身份執行, 而非執行檔案的使用者 |
無 |
| sgid |
以檔案所屬組身份執行 |
在該目錄中建立的任意新檔案的 所屬組與該目錄的所屬組相同, 即子檔案自動繼承該目錄的所屬組 |
| sticky |
無 |
對目錄擁有寫入許可權的使用者僅可以 刪除其擁有的檔案,無法刪除其他 使用者所擁有的檔案 |
擁有suid許可權的passwd命令
Linux 中普通使用者的密碼口令都儲存在 /etc/shadow 檔案裡,這個檔案的許可權是只有root使用者和root組才可以訪問的。那麼普通使用者使怎麼修改自己密碼的呢?Linux 提供了 passwd 命令普通使用者使用來實現自己的密碼:
我們看到,這個 passwd 的 U 許可權裡有個 "s" 佔用了原來的 "x"位,這表示執行該命令的使用者擁有 "suid" 許可權,以 root 使用者身份來運行,所以普通使用者可以通過執行 passwd 命令的來修改自己的密碼,並將它寫到 /etc/shadow 檔案裡。
三、設定特殊許可權
設定 suid:
chmod u+s filename
設定 sgid:
chmod g+s filename
設定 sticky:
chmod o+t filename
其中,設定 sgid 許可權會使 "s" 佔用 G 許可權的 "x" 位,例如:"-rwxr-s---";設定 sticky 許可權會使 "t" 佔用 O 許可權的 "x" 位,例如:"drwxr-xr-t"。這裡我所說的 G 許可權、O 許可權是基於 UGO 模型的 Linux 許可權。
一般來說,我們使用 sgid 來設定目錄的許可權,它允許了目錄的子檔案(或目錄)自動繼承該目錄的所屬組,常見的情況例如市場部目錄的員工目錄自動屬於市場部使用者組。經常使用 sticky 來設定目錄下的使用者可以刪除自己的檔案,但不能刪除別人的檔案,例如營銷部目錄的員工檔案可以被員工刪除,但不能刪除同事的檔案。
與普通許可權一樣,特殊許可權也可以用八位元值表示:
suid = 4 (2 ^ 2)sgid = 2 (2 ^ 1)sticky = 2 (2 ^ 0)
所以,我們也可以通過以下命令設定:
chmod 4755 filename 普通許可權755,所屬使用者可讀可寫可執行,所屬組和其他使用者不可寫,特殊許可權允許以所屬使用者身份執行