linux权限详解
linux權(quán)限詳解
?
一個(gè)用戶、一個(gè)組
我們來看一看 Linux 權(quán)限和所有權(quán)模型。我們已經(jīng)看到每個(gè)文件屬于一個(gè)用戶和一個(gè)組。這正是 Linux 中權(quán)限模型的核心。您可以在 ls -l 清單中查看用戶和組:
$ ls -l /bin/bash
?
-rwxr-xr-x??? 1 root???? wheel????? 430540 Dec 23 18:27 /bin/bash
在這個(gè)特殊的示例中,/bin/bash 可執(zhí)行文件屬于 root 用戶,并且在 wheel 組中。Linux 權(quán)限模型通過允許給每個(gè)文件系統(tǒng)對(duì)象設(shè)置三種獨(dú)立的權(quán)限級(jí)別來工作 — 它們?yōu)槲募乃姓摺⑽募慕M以及所有其他用戶。
理解“l(fā)s -l”
我們來看一看我們的 ls -l 輸出,檢查一下這個(gè)清單的第一欄:
$ ls -l /bin/bash
-rwxr-xr-x??? 1 root???? wheel????? 430540 Dec 23 18:27 /bin/bash
第一個(gè)字段 -rwxr-xr-x 包含該特殊文件的權(quán)限的符號(hào)表示。該字段中的首字符(-)指定該文件的類型,本例中它是一個(gè)常規(guī)文件。其它可能的首字符還有:
“d”目錄
“l(fā)”符號(hào)鏈接
“c”字符專門設(shè)備文件
“b”塊專門設(shè)備文件
“p”先進(jìn)先出
“s”套接字
三個(gè)三元組
$ ls -l /bin/bash
-rwxr-xr-x??? 1 root???? wheel????? 430540 Dec 23 18:27 /bin/bash
該字段的其余部分由三個(gè)三元組字符組成。第一個(gè)三元字符組代表文件所有者的權(quán)限,第二個(gè)代表文件的組的權(quán)限,第三個(gè)代表所有其他用戶的權(quán)限:
"rwx"
"r-x"
"r-x"
上面,r 表示允許讀(查看文件中的數(shù)據(jù)),w 表示允許寫(修改文件以及刪除),x 表示允許“執(zhí)行”(運(yùn)行程序)。將所有這些信息放在一起,我們可以發(fā)現(xiàn)每個(gè)人都能夠讀該文件的內(nèi)容和執(zhí)行該文件,但是只允許文件所有者(root 用戶)可以以任何方式修改該文件。因此,雖然一般用戶可以復(fù)制該文件,但是只允許 root 用戶更新或刪除它。
我是誰?
在我們看怎樣改變文件的用戶所有權(quán)和組所有權(quán)之前,我們首先來看一看怎樣得知您當(dāng)前的用戶標(biāo)識(shí)和組成員資格。除非最近您使用過 su 命令,否則您當(dāng)前的用戶標(biāo)識(shí)是您用來登錄系統(tǒng)的用戶標(biāo)識(shí)。但是,如果您經(jīng)常使用 su,您可能不記得您當(dāng)前有效的用戶標(biāo)識(shí)。要查看用戶標(biāo)識(shí),輸入 whoami:
# whoami
root
# su drobbins
$ whoami
drobbins
我在哪一組?
要看看您屬于哪一組,使用 group 命令:
$ groups
drobbins wheel audio
在上面的示例中,我是 drobbins、wheel 和 audio 組的成員。如果您想看看其他用戶在什么組,指定他們的用戶名作為參數(shù):
$ groups root daemon
root : root bin daemon sys adm disk wheel floppy dialout tape video
daemon : daemon bin adm
改變用戶和組所有權(quán)
為了改變文件或其它文件系統(tǒng)對(duì)象的所有者或組,分別使用 chown 或 chgrp。這兩個(gè)命令都要一個(gè)用戶名或組名作參數(shù),后面跟上一個(gè)或多個(gè)文件名。
# chown root /etc/passwd
# chgrp wheel /etc/passwd
您還可以用 chown 命令的另一種形式同時(shí)設(shè)置所有者和組:
# chown root.wheel /etc/passwd
除非您是超級(jí)用戶,否則您不可以使用 chown,然而任何人都可以使用 chgrp 來將文件的組所有權(quán)改為他們所屬的組。
遞歸的所有權(quán)改變
chown 和 chgrp 都有一個(gè) -R 選項(xiàng),該選項(xiàng)可以用來告訴它們遞歸地將所屬權(quán)和組改變應(yīng)用到整個(gè)目錄樹中。例如:
# chown -R drobbins /home/drobbins
介紹 chmod
chown 和 chgrp 可以用來改變文件系統(tǒng)對(duì)象的所有者和組,而另一個(gè)程序 — 叫做 chmod — 用來改變我們可以在 ls -l 清單中看到的 rwx 權(quán)限。chmod 帶有兩個(gè)或多個(gè)參數(shù):“mode”,描述怎樣改變權(quán)限,后面跟將會(huì)受到影響的文件或文件列表:
$ chmod +x scriptfile.sh
在上面的示例中,我們的“mode”是 +x。您可能會(huì)猜到,+x 模式告訴 chmod,使該特殊文件對(duì)于用戶、組以及其它任何人都是可執(zhí)行的。如果我們想要除去一個(gè)文件的所有執(zhí)行權(quán)限,我們應(yīng)該這樣做:
$ chmod -x scriptfile.sh
用戶/組/其他粒度
到此,我們的 chmod 示例已經(jīng)影響到了所有三個(gè)三元組 — 用戶、組和所有其他用戶。通常,一次只修改一個(gè)或兩個(gè)三元組很方便。要這樣做,只需要在 + 或 - 符號(hào)之前,給您想要修改的特定的三元組指定符號(hào)字符。對(duì)于“用戶”三元組使用 u,對(duì)于“組”三元組使用 g,對(duì)于“其他/每個(gè)人”使用 o:
$ chmod go-w scriptfile.sh
我們剛除去了組和所有其他用戶的寫權(quán)限,而保留“所有者”權(quán)限不動(dòng)。
重新設(shè)置權(quán)限
除了交替打開和關(guān)閉權(quán)限位以外,我們還可以一起重新設(shè)置它們。通過使用 = 操作符,我們可以告訴 chmod 我們要指定權(quán)限和取消別的權(quán)限:
$ chmod =rx scriptfile.sh
上面,我們只設(shè)置了所有的“read”和“execute”位,沒有設(shè)置所有的“write”位。如果您僅僅想重新設(shè)置特定的三元組,您可以像下面這樣,在 = 之前指定該三元組的符號(hào)名:
$ chmod u=rx scriptfile.sh
??????????????????????? 數(shù)字模式
??????????????????????? 直到現(xiàn)在為止,我們使用了叫做“符號(hào)”的模式來用 chmod 指定權(quán)限的改變。然而,指定權(quán)限還有
??????????????????????? 一種普遍使用的方法 — 使用 4 位八進(jìn)制數(shù)。使用叫做數(shù)字權(quán)限語法的語法,每一位代表一個(gè)權(quán)限
??????????????????????? 三元組。例如,在 1777 中,777 設(shè)置本章我們所討論的“owner”、“group”和“other”
??????????????????????? 標(biāo)志。1 用來設(shè)置專門的權(quán)限位,我們將在本章的結(jié)束部分講到。這個(gè)圖表說明了怎樣解釋第二到
??????????????????????? 四位(777):
??????????????????????? 模式 數(shù)字
??????????????????????? rwx 7
??????????????????????? rw- 6
??????????????????????? r-x 5
??????????????????????? r-- 4
??????????????????????? -wx 3
??????????????????????? -w- 2
??????????????????????? --x 1
??????????????????????? --- 0
????????????????????????
??????????????????????? 數(shù)字權(quán)限語法
??????????????????????? 當(dāng)您需要給一個(gè)文件指定所有權(quán)限時(shí),數(shù)字權(quán)限語法特別有用,比如在下面的示例中:
$ chmod 0755 scriptfile.sh
??????????????????????? $ ls -l scriptfile.sh
??????????????????????? -rwxr-xr-x??? 1 drobbins drobbins??????? 0 Jan? 9 17:44 scriptfile.sh
??????????????????????? 在該示例中,我們使用了 0755 模式,它展開為一個(gè)完整的權(quán)限設(shè)置“-rwxr-xr-x”。
??????????????????????? Umask
???????????????????????
當(dāng)進(jìn)程創(chuàng)建了新文件時(shí),它指定新文件應(yīng)該具有的權(quán)限。通常,所請(qǐng)求的模式是 0666(每個(gè)人可讀和可寫),它比我們希望的具有更多的權(quán)限。幸運(yùn)的是,不管什么時(shí)候創(chuàng)建了新文件,Linux 將參考叫做“umask”的東西。系統(tǒng)用 umask 值來將初始指定的權(quán)限降低為更合理、更安全的權(quán)限。您可以通過在命令行中輸入 umask 來查看您當(dāng)前的 umask 設(shè)置:
??????????????????????? $ umask
??????????????????????? 0022
??????????????????????? Linux 系統(tǒng)上,umask 的缺省值一般為 0022,它允許其他人讀您的新文件(如果他們可以得到它們),但是不能進(jìn)行修改。為了在缺省的情況下使新文件更安全,您可以改變 umask 設(shè)置: $ umask 0077umask 將確保組和其他用戶對(duì)于新創(chuàng)建的文件絕對(duì)沒有任何權(quán)限。那么,umask 怎樣工作呢?與文件的“常規(guī)”權(quán)限不同,umask 指定應(yīng)該關(guān)閉哪一個(gè)權(quán)限。我們來參閱一下我們的“模式到數(shù)字”映射表,從而使我們可以理解 0077 的 umask 的意思是什么: 模式 數(shù)字 rwx 7 rw- 6 r-x 5 r-- 4 -wx 3 -w- 2 --x 1 --- 0 使用該表,0077 的最后三位擴(kuò)展為 ---rwxrwx。現(xiàn)在,請(qǐng)記住 umask 告訴系統(tǒng)禁用哪個(gè)權(quán)限。根據(jù)推斷,我們可以看到將關(guān)閉所有“組”和“其他”權(quán)限,而“用戶”權(quán)限將保留不動(dòng)。
介紹 suid 和 sgid
??????????????????????? 當(dāng)您最初登錄時(shí),將啟動(dòng)一個(gè)新的 shell 進(jìn)程。您已經(jīng)知道,但是您可能還不知道這個(gè)新的 shell
???????????????????????? 進(jìn)程(通常是 bash)使用您的用戶標(biāo)識(shí)運(yùn)行。照這樣,bash 程序可以訪問所有屬于您的文件和
??????????????????????? 目錄。事實(shí)上,作為用戶,我們完全依靠其它程序來代表我們執(zhí)行操作。因?yàn)槟鷨?dòng)的程序繼承了
??????????????????????? 您的用戶標(biāo)識(shí),因此它們不能訪問任何不允許您訪問的文件系統(tǒng)對(duì)象。
??????????????????????? 例如,一般用戶不能直接修改 passwd 文件,因?yàn)椤皐rite”標(biāo)志已經(jīng)對(duì)除“root 用戶”以外的每個(gè)用戶關(guān)閉:
$ ls -l /etc/passwd
??????????????????????? -rw-r--r--??? 1 root???? wheel??????? 1355 Nov? 1 21:16 /etc/passwd
??????????????????????? 但是,一般用戶確實(shí)需要在他們需要改變其密碼的任何時(shí)候,能夠修改 /etc/passwd(至少間接地)。但是,如果用戶不能修改該文件,究竟怎樣完成這個(gè)工作呢?
??????????????????????? Suid
??????????????????????? 幸好,Linux 權(quán)限模型有兩個(gè)專門的位,叫做“suid”和“sgid”。當(dāng)設(shè)置了一個(gè)可執(zhí)行程序的“suid”這一位時(shí),它將代表可執(zhí)行文件的所有者運(yùn)行,而不是代表啟動(dòng)程序的人運(yùn)行。現(xiàn)在,回到 /etc/passwd 問題。如果看一看 passwd 可執(zhí)行文件,我們可以看到它屬于 root 用戶:
??????????????????????? $ ls -l /usr/bin/passwd
??????????????????????? -rwsr-xr-x??? 1 root???? wheel?????? 17588 Sep 24 00:53 /usr/bin/passwd
??????????????????????? 您還將注意到,這里有一個(gè) s 取替了用戶權(quán)限三元組中的一個(gè) x。這表明,對(duì)于這個(gè)特殊程序,設(shè)置了 suid 和可執(zhí)行位。由于這個(gè)原因,當(dāng) passwd 運(yùn)行時(shí),它將代表 root 用戶執(zhí)行(具有完全超級(jí)用戶訪問權(quán)),而不是代表運(yùn)行它的用戶運(yùn)行。又因?yàn)?passwd 以 root 用戶訪問權(quán)運(yùn)行,所以能夠修改 /etc/passwd 文件,而沒有什么問題。
??????????????????????? suid/sgid 告誡說明
??????????????????????? 我們看到了 suid 怎樣工作,sgid 以同樣的方式工作。它允許程序繼承程序的組所有權(quán),而不是當(dāng)前用戶的程序所有權(quán)。這里有一些關(guān)于 suid 和 sgid 的其它的但是很重要的信息。首先,suid 和 sgid 占據(jù)與 ls -l 清單中 x 位相同的空間。如果還設(shè)置了 x 位,則相應(yīng)的位表示為 s(小寫)。但是,如果沒有設(shè)置 x 位,它將表示為 S(大寫)。另一個(gè)很重要的提示:在許多環(huán)境中,suid 和 suid 很管用,但是不恰當(dāng)?shù)厥褂眠@些位可能使系統(tǒng)的安全遭到破壞。最好盡可能地少用“suid”程序。passwd 命令是為數(shù)不多的必須使用“suid”的命令之一。
??????????????????????? 改變 suid 和 sgid
??????????????????????? 設(shè)置和除去 suid 與 sgid 位相當(dāng)簡單。這里,我們?cè)O(shè)置 suid 位:
??????????????????????? # chmod u+s /usr/bin/myapp
??????????????????????? 此處,我們從一個(gè)目錄除去 sgid 位。我們將看到 sgid 位怎樣影響下面幾屏中的目錄:
# chmod g-s /home/drobbins
??????????????????????? 權(quán)限和目到此為止,我們從常規(guī)文件的角度來看權(quán)限。當(dāng)從目錄的角度看權(quán)限時(shí),情況有一點(diǎn)不同。目錄使用同樣的權(quán)限標(biāo)志,但是它們被解釋為表示略微不同的含義。 對(duì)于一個(gè)目錄,如果設(shè)置了“read”標(biāo)志,您可以列出目錄的內(nèi)容;“write”表示您可以在目錄中創(chuàng)建文件,“execute”表示您可以進(jìn)入該目錄并訪問內(nèi)部的任何子目錄。沒有“execute”標(biāo)志,目錄內(nèi)的文件系統(tǒng)對(duì)象是不可訪問的。沒有“read”標(biāo)志,目錄內(nèi)的文件系統(tǒng)對(duì)象是不可查看的,但是只要有人知道磁盤上對(duì)象的完整路徑,就仍然可以訪問目錄內(nèi)的對(duì)象。目錄和 sgid如果啟用了目錄的“sgid”標(biāo)志,在目錄內(nèi)創(chuàng)建的任何文件系統(tǒng)對(duì)象將繼承目錄的組。當(dāng)您需要?jiǎng)?chuàng)建一個(gè)屬于同一組的一組人使用的目錄樹時(shí),這種特殊的功能很管用。只需要這樣做:
# mkdir /home/groupspace
??????????????????????? # chgrp mygroup /home/groupspace
??????????????????????? # chmod g+s /home/groupspace
??????????????????????? 現(xiàn)在,mygroup 組中的所有用戶都可以在 /home/groupspace 內(nèi)創(chuàng)建文件或目錄,同樣,他
??????????????????????? 們也將自動(dòng)地分配到 mygroup 的組所有權(quán)。根據(jù)用戶的 umask 設(shè)置,新文件系統(tǒng)對(duì)象對(duì)于
??????????????????????? mygroup 組的其他成員來說,可以或不可以是可讀、可寫或可執(zhí)行的。
??????????????????????? 目錄和刪除
??????????????????????? 缺省情況下,Linux 目錄以一種不是在所有情況下都很理想的方式表現(xiàn)。一般來說,只要對(duì)一個(gè)
??????????????????????? 目錄有寫訪問權(quán),任何人都可以重命名或刪除該目錄中的文件。對(duì)于個(gè)別用戶使用的目錄,這種行
??????????????????????? 為是很合理的。
??????????????????????? 但是,對(duì)于很多用戶使用的目錄來說,尤其是 /tmp 和 /var/tmp,這種行為可能會(huì)產(chǎn)生麻煩。
??????????????????????? 因?yàn)槿魏稳硕伎梢詫戇@些目錄,任何人都可以刪除或重命名任何其他人的文件 — 即使是不屬于
??????????????????????? 他們的!顯然,當(dāng)任何其他用戶在任何時(shí)候都可以輸入“rm -rf /tmp/*”并損壞每個(gè)人的文
??????????????????????? 件時(shí),很難把 /tmp 用于任何有意義的文件。
??????????????????????? 所幸,Linux 有叫做“粘滯位”(sticky bit)的東西。當(dāng)給 /tmp 設(shè)置了粘滯位(用
??????????????????????? chmod +t),唯一能夠刪除或重命名 /tmp 中文件的是該目錄的所有者(通常是 root 用戶)
??????????????????????? 、文件的所有者或 root 用戶。事實(shí)上,所有 Linux 分發(fā)包都缺省地啟用了 /tmp 的粘滯位,
??????????????????????? 而您還可以發(fā)現(xiàn)粘滯位在其它情況下也很管用。
??????????????????????? 難以理解的第一位
??????????????????????? 總結(jié)本章,我們最后來看一看數(shù)字模式的難以理解的第一位數(shù)。您可以看到,這個(gè)第一位數(shù)
??????????????????????? 用來設(shè)置 sticky、suid 和 sgid 位:
??????????????????????? suid sgid sticky 模式數(shù)字 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
??????????????????????? 這里有一個(gè)怎樣用 4 位數(shù)字模式來設(shè)置一個(gè)目錄的權(quán)限的示例,該目錄將由一個(gè)工作組使用:
??????????????????????? # chmod 1775 /home/groupfiles
??????????????????????? 請(qǐng)想一想 1755 數(shù)字模式權(quán)限設(shè)置的含義。
轉(zhuǎn)載于:https://blog.51cto.com/laokaddk/471598
總結(jié)
- 上一篇: JavaEE基础(06):Servlet
- 下一篇: 保定linux第一版PPT-SVN fo