在 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指令來移除系統組態檔的世界可讀許可權的技巧。
測驗題
以下哪個分割區掛載選項可以防止在檔案上設定SUID和SGID許可權?
- A. nosgid
- B. noexec
- C. nosuid
- D. nouser
以下哪個代表一個檔案的使用者和群組具有讀寫許可權,其他人具有唯讀許可權?
- A. 775
- B. 554
- C. 660
- D. 664
您想要將
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
- A.
以下哪個是SGID許可權的數值?
- A. 6000
- B. 2000
- C. 4000
- D. 1000
您會使用哪個指令來檢視檔案的擴充套件屬性?
- A. lsattr
- B. ls -a
- C. ls -l
- D. chattr
以下哪個指令會在整個檔案系統中搜尋具有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
- A.
以下哪個陳述是正確的?
- A. 使用符號方法設定許可權是所有情況下的最佳方法。
- B. 使用符號方法設定許可權是在shell指令碼中使用的最佳方法。
- C. 使用數值方法設定許可權是在shell指令碼中使用的最佳方法。
- D. 使用哪種方法設定許可權都無所謂。
以下哪個指令會將SUID許可權設定在一個具有讀/寫/執行許可權給使用者和群組,以及讀/執行許可權給其他人的檔案上?
- A.
sudo chmod 2775 somefile - B.
sudo chown 2775 somefile - C.
sudo chmod 1775 somefile
- A.
使用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
#### 內容解密:
此段落程式碼展示瞭如何使用 getfacl 和 setfacl 命令來管理和檢視 ACL 設定。
getfacl用於檢視檔案或目錄的 ACL 設定。setfacl -m用於修改或新增 ACL 設定。u:username:permissions用於為特定使用者設定 ACL。g:groupname:permissions用於為特定群組設定 ACL。
- 設定 ACL 前,先使用
chmod將檔案許可權設為600,以避免不必要的存取許可權。 - 在
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::
---
內容解密:
user::rw-:表示檔案擁有者donnie對檔案具有讀寫許可權。user:frank:r--:表示使用者frank對檔案具有讀取許可權,但由於 mask 的限制,實際上無法讀取。group::rwx:表示檔案所屬群組對檔案具有讀、寫和執行的許可權,但同樣由於 mask 的限制,這些許可權無法生效。- `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::
---
內容解密:
user::rw-:表示檔案擁有者具有讀寫許可權。user:frank:rw- #effective:r--:表示使用者 frank 被設定為讀寫許可權,但由於 mask 的限制,實際上只有讀取許可權。- `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 資訊被正確地備份和還原。