全面介紹 Linux 許可權
了解 Linux 許可權以及如何控制哪些用戶可以訪問文件是系統管理的一項基本技能。
本文將介紹標準 Linux 文件系統許可權,並進一步研究特殊許可權,以及使用 umask
來解釋默認許可權作為文章的結束。
理解 ls 命令的輸出
在討論如何修改許可權之前,我們需要知道如何查看許可權。通過 ls
命令的長列表參數(-l
)為我們提供了有關文件的許多信息。
$ ls -lAh
total 20K
-rwxr-xr--+ 1 root root 0 Mar 4 19:39 file1
-rw-rw-rw-. 1 root root 0 Mar 4 19:39 file10
-rwxrwxr--+ 1 root root 0 Mar 4 19:39 file2
-rw-rw-rw-. 1 root root 0 Mar 4 19:39 file8
-rw-rw-rw-. 1 root root 0 Mar 4 19:39 file9
drwxrwxrwx. 2 root root 4.0K Mar 4 20:04 testdir
為了理解這些是什麼意思,讓我們將關於許可權的輸出分解為各個部分。單獨理解每個部分會更容易。
讓我們看看在上面的輸出中的最後一行的每個組件:
drwxrwxrwx. 2 root root 4.0K Mar 4 20:04 testdir
第 1 節 | 第 2 節 | 第 3 節 | 第 4 節 | 第 5 節 | 第 6 節 | 第 7 節 |
---|---|---|---|---|---|---|
d |
rwx |
rwx |
rwx |
. |
root |
root |
第 1 節(左側)顯示文件的類型。
符號 | 類型 |
---|---|
d |
目錄 |
- |
常規文件 |
l |
軟鏈接 |
ls
的 info 頁面完整列出了不同的文件類型。
每個文件都有三種訪問方式:
- 屬主
- 組
- 所有其他人 第 2、3 和 4 節涉及用戶(屬主)、組和「其他用戶」許可權。每個部分都可以包含
r
(讀取)、w
(寫入)和x
(執行)許可權的組合。
每個許可權還分配了一個數值,這在以八進位表示形式討論許可權時很重要。
許可權 | 八進位值 |
---|---|
r |
4 |
w |
2 |
x |
1 |
第 5 節描述了其他替代訪問方法,例如 SELinux 或文件訪問控制列表(FACL)。
訪問方法 | 字元 |
---|---|
沒有其它訪問方法 | - |
SELinux | . |
FACL | + |
各種方法的組合 | + |
第 6 節和第 7 節分別是屬主和組的名稱。
使用 chown 和 chmod
chown 命令
chown
(更改所有權)命令用於更改文件的用戶和組的所有權。
要將文件 foo
的用戶和組的所有權更改為 root
,我們可以使用以下命令:
$ chown root:root foo
$ chown root: foo
在用戶名後跟冒號(:
)運行該命令將同時設置用戶和組所有權。
要僅將文件 foo
的用戶所有權設置為 root
用戶,請輸入:
$ chown root foo
要僅更改文件 foo
的組所有權,請在組之前加冒號:
$ chown :root foo
chmod 命令
chmod
(更改模式)命令控制屬主、組以及既不是屬主也不屬於與文件關聯的組的所有其他用戶的文件許可權。
chmod
命令可以以八進位(例如 755
、644
等)和符號(例如 u+rwx
、g-rwx
、o=rw
)格式設置許可權。
八進位表示法將 4 個「點」分配給「讀取」,將 2 個「點」分配給「寫入」,將 1 個點分配給「執行」。如果要給用戶(屬主)分配「讀取」許可權,則將 4 分配給第一個插槽,但是如果要添加「寫入」許可權,則必須添加 2。如果要添加「執行」,則要添加 1。我們對每種許可權類型執行此操作:屬主、組和其他。
例如,如果我們想將「讀取」、「寫入」和「執行」分配給文件的屬主,但僅將「讀取」和「執行」分配給組成員和所有其他用戶,則我們應使用 755
(八進位格式)。這是屬主的所有許可權位(4+2+1
),但組和其他許可權的所有許可權位只有 4
和 1
(4+1
)。
細分為:4+2+1=7,4+1=5 和 4+1=5。
如果我們想將「讀取」和「寫入」分配給文件的屬主,而只將「讀取」分配給組的成員和所有其他用戶,則可以如下使用 chmod
:
$ chmod 644 foo_file
在下面的示例中,我們在不同的分組中使用符號表示法。注意字母 u
、g
和 o
分別代表「用戶」(屬主)、「組」和「其他」。我們將 u
、g
和 o
與 +
、-
或 =
結合使用來添加、刪除或設置許可權位。
要將「執行」位添加到所有權許可權集中:
$ chmod u+x foo_file
要從組成員中刪除「讀取」、「寫入」和「執行」:
$ chmod g-rwx foo_file
要將所有其他用戶的所有權設置為「讀取」和「寫入」:
$ chmod o=rw
特殊位:設置 UID、設置 GID 和粘滯位
除了標準許可權外,還有一些特殊的許可權位,它們具有一些別的用處。
設置用戶 ID(suid)
當在文件上設置 suid
時,將以文件的屬主的身份而不是運行該文件的用戶身份執行操作。一個好的例子是 passwd
命令。它需要設置 suid
位,以便更改密碼的操作具有 root 許可權。
$ ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd
設置 suid
位的示例:
$ chmod u+s /bin/foo_file_name
設置組 ID(sgid)
sgid
位與 suid
位類似,操作是在目錄的組所有權下完成的,而不是以運行命令的用戶身份。
一個使用 sgid
的例子是,如果多個用戶正在同一個目錄中工作,並且目錄中創建的每個文件都需要具有相同的組許可權。下面的示例創建一個名為 collab_dir
的目錄,設置 sgid
位,並將組所有權更改為 webdev
。
$ mkdir collab_dir
$ chmod g+s collab_dir
$ chown :webdev collab_dir
現在,在該目錄中創建的任何文件都將具有 webdev
的組所有權,而不是創建該文件的用戶的組。
$ cd collab_dir
$ touch file-sgid
$ ls -lah file-sgid
-rw-r--r--. 1 root webdev 0 Jun 12 06:04 file-sgid
「粘滯」位
粘滯位表示,只有文件所有者才能刪除該文件,即使組許可權允許該文件可以刪除。通常,在 /tmp
這樣的通用或協作目錄上,此設置最有意義。在下面的示例中,「所有其他人」許可權集的「執行」列中的 t
表示已應用粘滯位。
$ ls -ld /tmp
drwxrwxrwt. 8 root root 4096 Jun 12 06:07 /tmp/
請記住,這不會阻止某個人編輯該文件,它只是阻止他們刪除該目錄的內容(LCTT 譯註:即刪除目錄下文件)。
我們將粘滯位設置為:
$ chmod o+t foo_dir
你可以自己嘗試在目錄上設置粘滯位並賦予其完整的組許可權,以便多個屬於同一組的用戶可以在目錄上進行讀取、寫入和執行。
接著,以每個用戶的身份創建文件,然後嘗試以另一個用戶的身份刪除它們。
如果一切配置正確,則一個用戶應該不能從另一用戶那裡刪除文件。
請注意,這些位中的每個位也可以用八進位格式設置:SUID = 4、SGID = 2 和 粘滯位 = 1。(LCTT 譯註:這裡是四位八進位數字)
$ chmod 4744
$ chmod 2644
$ chmod 1755
大寫還是小寫?
如果要設置特殊位時看到大寫的 S
或 T
而不是小寫的字元(如我們之前所見),那是因為不存在(對應的)底層的執行位。為了說明這一點,下面的示例創建一個設置了粘滯位的文件。然後,我們可以添加和刪除執行位以演示大小寫更改。
$ touch file cap-ST-demo
$ chmod 1755 cap-ST-demo
$ ls -l cap-ST-demo
-rwxr-xr-t. 1 root root 0 Jun 12 06:16 cap-ST-demo
$ chmod o-x cap-X-demo
$ ls -l cap-X-demo
-rwxr-xr-T. 1 root root 0 Jun 12 06:16 cap-ST-demo
有條件地設置執行位
至此,我們使用小寫的 x
設置了執行位,而無需詢問任何問題即可對其進行設置。我們還有另一種選擇:使用大寫的 X
而不是小寫的,它將僅在許可權組中某個位置已經有執行位時才設置執行位。這可能是一個很難解釋的概念,但是下面的演示將幫助說明它。請注意,在嘗試將執行位添加到組特權之後,該位沒有被設置上。
$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+X cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
在這個類似的例子中,我們首先使用小寫的 x
將執行位添加到組許可權,然後使用大寫的 X
為所有其他用戶添加許可權。這次,大寫的 X
設置了該許可權。
$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+x cap-X-file
$ ls -l cap-X-file
-rw-r-xr--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod o+X cap-X-file
ls -l cap-X-file
-rw-r-xr-x. 1 root root 0 Jun 12 06:31 cap-X-file
理解 umask
umask
會屏蔽(或「阻止」)默認許可權集中的位,以定義文件或目錄的許可權。例如,umask
輸出中的 2
表示它至少在默認情況下阻止了文件的「寫入」位。
使用不帶任何參數的 umask
命令可以使我們看到當前的 umask
設置。共有四列:第一列為特殊的suid
、sgid
或粘滯位而保留,其餘三列代表屬主、組和其他人的許可權。
$ umask
0022
為了理解這意味著什麼,我們可以用 -S
標誌來執行 umask
(如下所示)以解釋屏蔽位的結果。例如,由於第三列中的值為 2
,因此將「寫入」位從組和其他部分中屏蔽掉了;只能為它們分配「讀取」和「執行」。
$ umask -S
u=rwx,g=rx,o=rx
要查看文件和目錄的默認許可權集是什麼,讓我們將 umask
設置為全零。這意味著我們在創建文件時不會掩蓋任何位。
$ umask 000
$ umask -S
u=rwx,g=rwx,o=rwx
$ touch file-umask-000
$ ls -l file-umask-000
-rw-rw-rw-. 1 root root 0 Jul 17 22:03 file-umask-000
現在,當我們創建文件時,我們看到所有部分的默認許可權分別為「讀取」(4
)和「寫入」(2
),相當於八進位表示 666
。
我們可以對目錄執行相同的操作,並看到其默認許可權為 777
。我們需要在目錄上使用「執行」位,以便可以遍歷它們。
$ mkdir dir-umask-000
$ ls -ld dir-umask-000
drwxrwxrwx. 2 root root 4096 Jul 17 22:03 dir-umask-000/
總結
管理員還有許多其他方法可以控制對系統文件的訪問。這些許可權是 Linux 的基本許可權,我們可以在這些基礎上進行構建。如果你的工作為你引入了 FACL 或 SELinux,你會發現它們也建立在這些文件訪問的首要規則之上。
via: https://opensource.com/article/19/8/linux-permissions-101
作者:Alex Juarez 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive