linux权限详解
linux權限詳解
?
一個用戶、一個組
我們來看一看 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 數字模式權限設置的含義。
轉載于:https://blog.51cto.com/laokaddk/471598
總結
- 上一篇: JavaEE基础(06):Servlet
- 下一篇: 保定linux第一版PPT-SVN fo