全面介紹 Linux 許可權

2019-11-08 23:31:00

知道如何控制使用者對檔案的存取是一項基本的系統管理技能。

了解 Linux 許可權以及如何控制哪些使用者可以存取檔案是系統管理的一項基本技能。

本文將介紹標準 Linux 檔案系統許可權,並進一步研究特殊許可權,以及使用 umask 來解釋預設許可權作為文章的結束。

理解 ls 命令的輸出

在討論如何修改許可權之前,我們需要知道如何檢視許可權。通過 ls 命令的長列表引數(-l)為我們提供了有關檔案的許多資訊。

$ ls -lAhtotal 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 file9drwxrwxrwx. 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 節
drwxrwxrwx.rootroot

第 1 節(左側)顯示檔案的型別。

符號型別
d目錄
-常規檔案
l軟連結

lsinfo 頁面完整列出了不同的檔案型別。

每個檔案都有三種存取方式:

  • 屬主
  • 所有其他人    第 2、3 和 4 節涉及使用者(屬主)、組和“其他使用者”許可權。每個部分都可以包含 r(讀取)、w(寫入)和 x(執行)許可權的組合。

每個許可權還分配了一個數值,這在以八進位制表示形式討論許可權時很重要。

許可權八進位制值
r4
w2
x1

第 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 命令可以以八進位制(例如 755644 等)和符號(例如 u+rwxg-rwxo=rw)格式設定許可權。

八進位制表示法將 4 個“點”分配給“讀取”,將 2 個“點”分配給“寫入”,將 1 個點分配給“執行”。如果要給使用者(屬主)分配“讀取”許可權,則將 4 分配給第一個插槽,但是如果要新增“寫入”許可權,則必須新增 2。如果要新增“執行”,則要新增 1。我們對每種許可權型別執行此操作:屬主、組和其他。

例如,如果我們想將“讀取”、“寫入”和“執行”分配給檔案的屬主,但僅將“讀取”和“執行”分配給組成員和所有其他使用者,則我們應使用 755(八進位制格式)。這是屬主的所有許可權位(4+2+1),但組和其他許可權的所有許可權位只有 414+1)。

細分為:4+2+1=7,4+1=5 和 4+1=5。

如果我們想將“讀取”和“寫入”分配給檔案的屬主,而只將“讀取”分配給組的成員和所有其他使用者,則可以如下使用 chmod

$ chmod 644 foo_file

在下面的範例中,我們在不同的分組中使用符號表示法。注意字母 ugo 分別代表“使用者”(屬主)、“組”和“其他”。我們將 ugo+-= 結合使用來新增、刪除或設定許可權位。

要將“執行”位新增到所有權許可權集中:

$ 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 /tmpdrwxrwxrwt. 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

大寫還是小寫?

如果要設定特殊位時看到大寫的 ST 而不是小寫的字元(如我們之前所見),那是因為不存在(對應的)底層的執行位。為了說明這一點,下面的範例建立一個設定了黏滯位的檔案。然後,我們可以新增和刪除執行位以演示大小寫更改。

$ 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-filels -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 設定。共有四列:第一列為特殊的suidsgid 或黏滯位而保留,其餘三列代表屬主、組和其他人的許可權。

$ umask0022

為了理解這意味著什麼,我們可以用 -S 標誌來執行 umask(如下所示)以解釋遮蔽位的結果。例如,由於第三列中的值為 2,因此將“寫入”位從組和其他部分中遮蔽掉了;只能為它們分配“讀取”和“執行”。

$ umask -Su=rwx,g=rx,o=rx

要檢視檔案和目錄的預設許可權集是什麼,讓我們將 umask 設定為全零。這意味著我們在建立檔案時不會掩蓋任何位。

$ umask 000$ umask -Su=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-000drwxrwxrwx. 2 root root 4096 Jul 17 22:03 dir-umask-000/

總結

管理員還有許多其他方法可以控制對系統檔案的存取。這些許可權是 Linux 的基本許可權,我們可以在這些基礎上進行構建。如果你的工作為你引入了 FACL 或 SELinux,你會發現它們也建立在這些檔案存取的首要規則之上。