linux許可權詳解

dawn009發表於2015-02-05

一個使用者、一個組
我們來看一看 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 數字模式許可權設定的含義。

轉載於:http://blog.csdn.net/fan_zhen_hua/article/details/2050009

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1426990/,如需轉載,請註明出處,否則將追究法律責任。

相關文章