在 Linux 系統管理中,精確控制檔案和目錄的存取許可權至關重要。除了基本許可權設定外,SUID、SGID 和 ACL 提供了更進階的控制機制。本文將逐步說明如何使用 find 指令搭配 -exec 引數操作檔案,並探討 ACL 的設定、繼承、移除以及備份與還原,以確保系統安全並滿足複雜的許可權需求。理解這些技術對於提升系統安全性和管理效率至關重要,特別是在多使用者環境下。

檔案與目錄的存取控制技術

在前面的章節中,我們已經探討瞭如何為檔案和目錄設定所有權和許可權。現在,我們將進一步討論如何利用SUID和SGID來提升系統的安全性,以及如何使用擴充套件的檔案屬性來增強檔案的安全性。

使用find指令搜尋特設定檔案

在開始之前,我們先來看看如何使用find指令來搜尋特定的檔案。例如,如果我們想要在整個檔案系統中搜尋所有的.conf檔案,可以使用以下指令:

sudo find / -iname '*.conf'

這個指令會在整個根目錄下進行大小寫不敏感的搜尋,找到所有的.conf檔案。

使用-exec引數執行特定指令

接下來,我們可以使用-exec引數來對找到的檔案執行特定的指令。例如,如果我們想要將所有.conf檔案的許可權設定為600,可以使用以下指令:

sudo find / -iname '*.conf' -exec chmod 600 {} \;

這個指令會自動對找到的每個.conf檔案執行chmod 600指令,而不需要使用者確認。

內容解密:

  • sudo find / -iname '*.conf':在整個根目錄下搜尋所有的.conf檔案。
  • -exec:對找到的每個檔案執行特定的指令。
  • chmod 600 {}:將找到的檔案的許可權設定為600,其中{}代表找到的檔案名稱。
  • \;:表示-exec指令的結束,需要使用反斜線來跳脫分號。

測試與驗證

在執行上述指令後,我們需要測試系統是否仍然正常運作。例如,我們可以嘗試ping一個網際網路網站:

ping www.civicsandpolitics.com

如果出現錯誤訊息,可能是因為/etc/resolv.conf檔案的許可權設定不正確。我們可以將其許可權設定回644:

sudo chmod 644 /etc/resolv.conf

然後再次嘗試ping網際網路網站。

重點回顧

在本章中,我們複習瞭如何設定檔案和目錄的所有權和許可權,以及如何使用SUID和SGID來提升系統的安全性。我們還討論瞭如何使用擴充套件的檔案屬性來增強檔案的安全性,並且介紹了一個使用find指令來移除系統組態檔的世界可讀許可權的技巧。

測驗題

  1. 以下哪個分割區掛載選項可以防止在檔案上設定SUID和SGID許可權?

    • A. nosgid
    • B. noexec
    • C. nosuid
    • D. nouser
  2. 以下哪個代表一個檔案的使用者和群組具有讀寫許可權,其他人具有唯讀許可權?

    • A. 775
    • B. 554
    • C. 660
    • D. 664
  3. 您想要將somefile.txt檔案的所有權和群組關聯變更為Maggie。以下哪個指令可以做到這一點?

    • A. sudo chown maggie somefile.txt
    • B. sudo chown :maggie somefile.txt
    • C. sudo chown maggie: somefile.txt
    • D. sudo chown :maggie: somefile.txt
  4. 以下哪個是SGID許可權的數值?

    • A. 6000
    • B. 2000
    • C. 4000
    • D. 1000
  5. 您會使用哪個指令來檢視檔案的擴充套件屬性?

    • A. lsattr
    • B. ls -a
    • C. ls -l
    • D. chattr
  6. 以下哪個指令會在整個檔案系統中搜尋具有SUID或SGID許可權設定的常規檔案?

    • A. sudo find / -type f -perm \6000
    • B. sudo find / \( -perm -4000 -o -perm -2000 \)
    • C. sudo find / -type f -perm -6000
    • D. sudo find / -type r -perm \6000
  7. 以下哪個陳述是正確的?

    • A. 使用符號方法設定許可權是所有情況下的最佳方法。
    • B. 使用符號方法設定許可權是在shell指令碼中使用的最佳方法。
    • C. 使用數值方法設定許可權是在shell指令碼中使用的最佳方法。
    • D. 使用哪種方法設定許可權都無所謂。
  8. 以下哪個指令會將SUID許可權設定在一個具有讀/寫/執行許可權給使用者和群組,以及讀/執行許可權給其他人的檔案上?

    • A. sudo chmod 2775 somefile
    • B. sudo chown 2775 somefile
    • C. sudo chmod 1775 somefile

使用ACL精細控制Linux檔案存取許可權

在前一章中,我們回顧了自主存取控制(Discretionary Access Control, DAC)的基本概念。一般的Linux檔案和目錄許可權設定並不夠精細。透過存取控制清單(Access Control List, ACL),我們可以更精確地調整許可權設定,實作對檔案和目錄的精細控制。同時,我們也能利用ACL來管理分享目錄中的檔案存取。

本章涵蓋以下主題:

  • 為使用者或群組建立ACL
  • 為目錄建立繼承性ACL
  • 使用ACL遮罩移除特定許可權
  • 使用tar --acls選項防止備份過程中丟失ACL設定
  • 建立使用者群組並新增成員
  • 為群組建立分享目錄並設定適當許可權
  • 在分享目錄上設定SGID位元和黏滯位元
  • 使用ACL允許特定群組成員存取分享目錄中的檔案

為使用者或群組建立ACL

預設的Linux檔案和目錄許可權設定尚可,但不夠精細。透過ACL,我們可以允許特定使用者存取檔案或目錄,或者讓多個使用者以不同的許可權存取同一檔案或目錄。如果某個檔案或目錄對所有人開放,我們可以使用ACL為群組或個人設定不同層級的存取許可權。

要檢視檔案或目錄的ACL,可以使用getfacl命令。以下範例展示瞭如何檢視acl_demo.txt檔案的ACL:

[donnie@localhost ~]$ touch acl_demo.txt
[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
group::rw-
other::r--
[donnie@localhost ~]$

這裡顯示的是標準的許可權設定,表示尚未設定ACL。

設定ACL的第一步

首先,將所有人的許可權設為無,除了檔案擁有者。這是因為預設的許可權設定允許群組成員具有讀寫許可權,而其他人具有讀取許可權。因此,在未移除這些許可權之前設定ACL是沒有意義的。

[donnie@localhost ~]$ chmod 600 acl_demo.txt
[donnie@localhost ~]$ ls -l acl_demo.txt
-rw
---
-
---
. 1 donnie donnie 0 Nov 9 14:37 acl_demo.txt
[donnie@localhost ~]$

使用setfacl設定ACL

使用setfacl命令時,可以為使用者或群組設定讀取、寫入或執行許可權的任意組合。假設我們希望讓Maggie能夠讀取該檔案,但不允許她寫入或執行:

[donnie@localhost ~]$ setfacl -m u:maggie:r acl_demo.txt
[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
user:maggie:r--
group::
---
mask::r--
other::
---
[donnie@localhost ~]$ ls -l acl_demo.txt
-rw-r
---
--+ 1 donnie donnie 0 Nov 9 14:37 acl_demo.txt
[donnie@localhost ~]$

在這個範例中,-m選項表示我們要修改ACL,u:maggie:r表示為使用者Maggie設定讀取許可權。

為多個使用者設定ACL

我們可以為多個使用者設定不同的ACL。例如,讓Frank擁有讀寫許可權:

[donnie@localhost ~]$ setfacl -m u:frank:rw acl_demo.txt
[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
user:maggie:r--
user:frank:rw-
group::
---
mask::rw-
other::
---
[donnie@localhost ~]$ ls -l acl_demo.txt
-rw-rw
---
-+ 1 donnie donnie 0 Nov 9 14:37 acl_demo.txt
[donnie@localhost ~]$

為群組設定ACL

若要為群組設定ACL,只需將u:替換為g:即可:

[donnie@localhost ~]$ getfacl new_file.txt
# file: new_file.txt
# owner: donnie
# group: donnie
user::rw-
group::rw-
other::r--
[donnie@localhost ~]$ chmod 600 new_file.txt
[donnie@localhost ~]$ setfacl -m g:accounting:r new_file.txt

#### 內容解密:

此段落程式碼展示瞭如何使用 getfaclsetfacl 命令來管理和檢視 ACL 設定。

  1. getfacl 用於檢視檔案或目錄的 ACL 設定。
  2. setfacl -m 用於修改或新增 ACL 設定。
    • u:username:permissions 用於為特定使用者設定 ACL。
    • g:groupname:permissions 用於為特定群組設定 ACL。
  3. 設定 ACL 前,先使用 chmod 將檔案許可權設為 600,以避免不必要的存取許可權。
  4. ls -l 的輸出中,若檔案具有 ACL,則會顯示 + 符號,表示該檔案具有額外的 ACL 設定。

ACL 設定流程圖

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Linux檔案目錄存取控制技術

package "Linux Shell 操作" {
    package "檔案操作" {
        component [ls/cd/pwd] as nav
        component [cp/mv/rm] as file
        component [chmod/chown] as perm
    }

    package "文字處理" {
        component [grep] as grep
        component [sed] as sed
        component [awk] as awk
        component [cut/sort/uniq] as text
    }

    package "系統管理" {
        component [ps/top/htop] as process
        component [systemctl] as service
        component [cron] as cron
    }

    package "管線與重導向" {
        component [| 管線] as pipe
        component [> >> 輸出] as redirect
        component [$() 命令替換] as subst
    }
}

nav --> file : 檔案管理
file --> perm : 權限設定
grep --> sed : 過濾處理
sed --> awk : 欄位處理
pipe --> redirect : 串接命令
process --> service : 服務管理

note right of pipe
  命令1 | 命令2
  前者輸出作為後者輸入
end note

@enduml

圖表翻譯:

此圖表展示瞭如何逐步檢查和設定檔案的 ACL。首先檢查檔案是否已設定 ACL,若未設定,則先將許可權設為 600,再使用 setfacl 新增 ACL 設定,最後檢視新的 ACL 設定。

使用 ACL(存取控制列表)管理檔案和目錄許可權

在 Linux 系統中,檔案和目錄的許可權管理是透過傳統的 rwx 許可權模型來實作的。然而,這種模型有其侷限性,尤其是在需要為不同使用者或群組設定複雜許可權時。存取控制列表(Access Control List, ACL)提供了一種更靈活的方式來管理檔案和目錄的許可權。

檢視和設定 ACL

要檢視檔案或目錄的 ACL,可以使用 getfacl 命令。例如:

[donnie@localhost ~]$ getfacl new_file.txt
# file: new_file.txt
# owner: donnie
# group: donnie
user::rw-
group::
---
group:accounting:r--
mask::r--
other::
---

這裡顯示了 new_file.txt 的 ACL 設定,包括擁有者、群組和其他使用者的許可權。

要設定 ACL,可以使用 setfacl 命令。例如,為 frank 使用者設定對 new_perm_dir 目錄的讀取許可權:

[donnie@localhost ~]$ setfacl -m d:u:frank:r new_perm_dir

這裡的 -m 選項表示修改 ACL,d:u:frank:r 表示為 frank 使用者設定預設的讀取許可權。

繼承 ACL

可以為目錄設定繼承 ACL,使得在該目錄下建立的新檔案自動繼承特定的 ACL 設定。例如:

[donnie@localhost ~]$ setfacl -m d:u:frank:r new_perm_dir
[donnie@localhost ~]$ getfacl new_perm_dir
# file: new_perm_dir
# owner: donnie
# group: donnie
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:frank:r--
default:group::rwx
default:mask::rwx
default:other::r-x

在這個例子中,new_perm_dir 目錄被設定了預設 ACL,使得在該目錄下建立的新檔案對 frank 使用者具有讀取許可權。

建立一個 shell 腪本以示範繼承 ACL 的效果

#!/bin/bash
cd new_perm_dir
touch new_file.txt
chmod 600 new_file.txt
exit

執行該指令碼後,可以看到 new_file.txt 檔案的 ACL 設定:

[donnie@localhost new_perm_dir]$ getfacl new_file.txt
# file: new_file.txt
# owner: donnie
# group: donnie
user::rw-
user:frank:r-- #effective:
---
group::rwx #effective:
---
mask::
---
other::
---

內容解密:

  1. user::rw-:表示檔案擁有者 donnie 對檔案具有讀寫許可權。
  2. user:frank:r--:表示使用者 frank 對檔案具有讀取許可權,但由於 mask 的限制,實際上無法讀取。
  3. group::rwx:表示檔案所屬群組對檔案具有讀、寫和執行的許可權,但同樣由於 mask 的限制,這些許可權無法生效。
  4. `mask::

:表示有效的許可權上限為無,也就是說所有額外的許可權都被限制。 5. other::

`:表示其他使用者對檔案無任何許可權。

移除特定許可權

可以使用 setfacl 命令的 -x 選項移除特定的 ACL 設定。例如,移除 maggie 使用者對 acl_demo.txt 檔案的 ACL:

[donnie@localhost ~]$ setfacl -x u:maggie acl_demo.txt

如果需要移除某個使用者的部分許可權,可以使用 mask 來實作。例如,限制 frank 使用者對 acl_demo.txt 檔案的許可權為唯讀:

[donnie@localhost ~]$ setfacl -m m::r acl_demo.txt
[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
user:frank:rw- #effective:r--
group::
---
mask::r--
other::
---

內容解密:

  1. user::rw-:表示檔案擁有者具有讀寫許可權。
  2. user:frank:rw- #effective:r--:表示使用者 frank 被設定為讀寫許可權,但由於 mask 的限制,實際上只有讀取許可權。
  3. `group::

:表示所屬群組無任何許可權。 4. mask::r–:表示有效的許可權上限為讀取。 5. other::

`:表示其他使用者無任何許可權。

使用 tar 的 –acls 選項備份和還原 ACL

在備份檔案或目錄時,預設情況下,tar 不會備份 ACL 資訊。要保留 ACL 資訊,需要在 tar 命令中使用 --acls 選項。例如:

[donnie@localhost ~]$ tar cJvf new_perm_dir_backup.tar.xz new_perm_dir/ --acls

還原備份時,也需要使用 --acls 選項:

[donnie@localhost ~]$ tar xJvf new_perm_dir_backup.tar.xz --acls

這樣可以確保 ACL 資訊被正確地備份和還原。