全面介紹 Linux 權限

知道如何控制用戶對文件的訪問是一項基本的系統管理技能。html

瞭解 Linux 權限以及如何控制哪些用戶能夠訪問文件是系統管理的一項基本技能。linux

本文將介紹標準 Linux 文件系統權限,並進一步研究特殊權限,以及使用 umask 來解釋默認權限做爲文章的結束。git

理解 ls 命令的輸出

在討論如何修改權限以前,咱們須要知道如何查看權限。經過 ls 命令的長列表參數(-l)爲咱們提供了有關文件的許多信息。github

$ 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
複製代碼

爲了理解這些是什麼意思,讓咱們將關於權限的輸出分解爲各個部分。單獨理解每一個部分會更容易。web

讓咱們看看在上面的輸出中的最後一行的每一個組件:bash

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 節(左側)顯示文件的類型。ui

符號 類型
d 目錄
- 常規文件
l 軟連接

lsinfo 頁面完整列出了不一樣的文件類型。spa

每一個文件都有三種訪問方式:code

  • 屬主
  • 全部其餘人    第 二、3 和 4 節涉及用戶(屬主)、組和「其餘用戶」權限。每一個部分均可以包含 r(讀取)、w(寫入)和 x(執行)權限的組合。

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

權限 八進制值
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 命令能夠以八進制(例如 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 /tmp
drwxrwxrwt. 8 root root 4096 Jun 12 06:07 /tmp/
複製代碼

請記住,這不會阻止某我的編輯該文件,它只是阻止他們刪除該目錄的內容(LCTT 譯註:即刪除目錄下文件)。

咱們將粘滯位設置爲:

$ chmod o+t foo_dir
複製代碼

你能夠本身嘗試在目錄上設置粘滯位並賦予其完整的組權限,以便多個屬於同一組的用戶能夠在目錄上進行讀取、寫入和執行。

接着,以每一個用戶的身份建立文件,而後嘗試以另外一個用戶的身份刪除它們。

若是一切配置正確,則一個用戶應該不能從另外一用戶那裏刪除文件。

請注意,這些位中的每一個位也能夠用八進制格式設置:SUID = 四、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-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 設置。共有四列:第一列爲特殊的suidsgid 或粘滯位而保留,其他三列表明屬主、組和其餘人的權限。

$ 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: opensource.com/article/19/…

做者:Alex Juarez 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章
相關標籤/搜索