Linux中國

使用 ACL 設置用戶訪問指定文件/目錄的許可權

當提到文件和目錄的許可權時,你的第一反應可能是「屬主/群組/其它」許可權。 這些許可權可以通過 chmodchown 等命令來修改。

文件和目錄都有屬主 (文件所有者 )、群組 (所屬組) 以及其它許可權,這些許可權構成一個集合。 然而這些許可權集合有它的局限性,無法做到為不同的用戶設置不同的許可權。

Linux 對文件和目錄有以下默認許可權。

  • 文件 -> 644 -> -rw-r-r- (所有者有讀寫許可權,組成員有隻讀許可權, 其他人也只有讀許可權)
  • 目錄 -> 755 -> drwxr-xr-x (所有者有讀、寫和執行許可權,組成員有讀和執行的許可權,其他人也有讀和執行的許可權)

比如: 默認情況下,所有者可以訪問和編輯他們自己主目錄中的文件, 也可以訪問相關同組人的文件,但他們不能修改這些文件,因為組成員沒有寫許可權,而且讓組成員有寫許可權也是不明智的。 基於同樣的原因,他/她也不能修改其他人的文件。 然而在某些情況下,多個用戶想要修改同一個文件, 那該怎麼辦呢?

假設有個名叫 magi 的用戶,他想要修改 httpd.conf 文件怎麼辦呢? 這個文件是歸 root 用戶所有的,這樣如何授權呢? 為了解決這種情況, 訪問控制列表 Access Control List ACL)誕生了。

什麼是 ACL

ACL 表示 訪問控制列表 Access Control List (ACL),它為文件系統提供了附加的、更具有彈性的許可權機制。 它被設計來為補充 UNIX 文件許可權機制。 ACL 允許你賦予任何某用戶/組訪問某項資源的許可權。 setfaclgetfacl 命令會幫助你管理 ACL 而不會有任何麻煩。

什麼是 setfacl

setfacl 用於設置文件和目錄的 ACL。

什麼 getfacl

getfacl - 獲取文件的 ACL 。對於每個文件, getfacl 都會顯示文件名、文件所有者、所屬組以及ACL。 如果目錄有默認 ACL, getfacl 也會顯示這個默認的 ACL。

如何確認是否啟用了 ACL?

運行 tune2fs 命令來檢查是否啟用了 ACL。

# tune2fs -l /dev/sdb1 | grep options
Default mount options: (none)

上面的輸出很明顯第說明 /dev/sdb1 分區沒有啟用 ACL。

如果結果中沒有列出 acl,則你需要在掛載選項中加上 acl。 為了讓它永久生效, 修改 /etc/fstab/app 這一行成這樣:

# more /etc/fstab

UUID=f304277d-1063-40a2-b9dc-8bcf30466a03 / ext4 defaults 1 1
/dev/sdb1        /app ext4 defaults,acl 1 1

或者,你也可以使用下面命令將其添加道文件系統的超級塊中:

# tune2fs -o +acl /dev/sdb1

現在,通過運行以下命令來動態修改選項:

# mount -o remount,acl /app

再次運行 tune2fs 命令來看選項中是否有 acl 了:

# tune2fs -l /dev/sdb1 | grep options
Default mount options: acl

嗯,現在 /dev/sdb1 分區中有 ACL 選項了。

如何查看默認的 ACL 值

要查看文件和目錄默認的 ACL 值,可以使用 getfacl 命令後面加上文件路徑或者目錄路徑。 注意, 當你對非 ACL 文件/目錄運行 getfacl 命令時, 則不會顯示附加的 usermask 參數值。

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
group::r--
other::r--

如何為文件設置 ACL

以下面格式運行 setfacl 命令可以為指定文件設置 ACL。在下面的例子中,我們會給 magi 用戶對 /etc/apache2/apache2.conf 文件 rwx 的許可權。

# setfacl -m u:magi:rwx /etc/apache2/apache2.conf

仔細分析起來:

  • setfacl: 命令
  • -m: 修改文件的當前 ACL
  • u: 指明用戶
  • magi: 用戶名
  • rwx: 要設置的許可權
  • /etc/apache2/apache2.conf: 文件名稱

再查看一次新的 ACL 值:

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
user:magi:rwx
group::r--
mask::rwx
other::r--

注意: 若你發現文件或目錄許可權後面有一個加號(+),就表示設置了 ACL。

# ls -lh /etc/apache2/apache2.conf
-rw-rwxr--+ 1 root root 7.1K Sep 19 14:58 /etc/apache2/apache2.conf

如何為目錄設置 ACL

以下面格式運行 setfacl 命令可以遞歸地為指定目錄設置 ACL。在下面的例子中,我們會將 /etc/apache2/sites-available/ 目錄中的 rwx 許可權賦予 magi 用戶。

# setfacl -Rm u:magi:rwx /etc/apache2/sites-available/

其中:

  • -R: 遞歸到子目錄中

再次查看一下新的 ACL 值。

# getfacl /etc/apache2/sites-available/

# file: etc/apache2/sites-available/
# owner: root
# group: root
user::rwx
user:magi:rwx
group::r-x
mask::rwx
other::r-x

現在 /etc/apache2/sites-available/ 中的文件和目錄都設置了 ACL。

# ls -lh /etc/apache2/sites-available/
total 20K
-rw-rwxr--+ 1 root root 1.4K Sep 19 14:56 000-default.conf
-rw-rwxr--+ 1 root root 6.2K Sep 19 14:56 default-ssl.conf
-rw-rwxr--+ 1 root root 1.4K Dec 8 02:57 mywebpage.com.conf
-rw-rwxr--+ 1 root root 1.4K Dec 7 19:07 testpage.com.conf

如何為組設置 ACL

以下面格式為指定文件運行 setfacl 命令。在下面的例子中,我們會給 appdev 組賦予 /etc/apache2/apache2.conf 文件的 rwx 許可權。

# setfacl -m g:appdev:rwx /etc/apache2/apache2.conf

其中:

  • g: 指明一個組

對多個用戶和組授權,只需要用 逗號 區分開,就像下面這樣。

# setfacl -m u:magi:rwx,g:appdev:rwx /etc/apache2/apache2.conf

如何刪除 ACL

以下面格式運行 setfacl 命令會刪除文件對指定用戶的 ACL。這隻會刪除用戶許可權而保留 mask 的值為只讀。

# setfacl -x u:magi /etc/apache2/apache2.conf

其中:

  • -x: 從文件的 ACL 中刪除

再次查看 ACL 值。在下面的輸出中我們可以看到 mask 的值是讀。

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

使用 -b 來刪除文件中所有的 ACL。

# setfacl -b /etc/apache2/apache2.conf

其中:

  • -b: 刪除所有的 ACL 條目

再次查看刪掉後的 ACl 值就會發現所有的東西都不見了,包括 mask 的值也不見了。

# getfacl /etc/apache2/apache2.conf

# file: etc/apache2/apache2.conf
# owner: root
# group: root
user::rw-
group::r--
other::r--

如何備份並還原 ACL

下面命令可以備份和還原 ACL 的值。要製作備份, 需要進入對應的目錄然後這樣做(假設我們要備份 sites-available 目錄中的 ACL 值)。

# cd /etc/apache2/sites-available/
# getfacl -R * > acl_backup_for_folder

還原的話,則運行下面命令:

# setfacl --restore=/etc/apache2/sites-available/acl_backup_for_folder

via: https://www.2daygeek.com/how-to-configure-access-control-lists-acls-setfacl-getfacl-linux/

作者:Magesh Maruthamuthu 譯者:lujun9972 校對:wxy

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國