ACL保護文件目錄?
ACl (Access Control List),主要目的是提供傳統的 owner、group、others 的 read、write、execute 權限之外的特殊權限需求設置。ACL 可以針對單一使用者、單一文件或目錄來進行 r、w、x 的權限規范,對于需要特殊權限的使用狀況非常有幫助
ACl 主要針對以下方面來控制權限:
使用者 user
群組 group
默認屬性 mask:針對在該目錄下在建立新文件/目錄時,規范新數據的默認權限
有一個目錄,給一堆人使用,每個人或每個群組所需要的權限并不相同,使用傳統 Linux 三種身份的三種權限是無法達到的,因此基本上,傳統的 Linux 權限只能針對一個用戶、一個群組以及非此群組的其他人設置權限。無法針對單一用戶或個人來設計權限。
Note:根據 Redhat 產品文檔,它為 ext3 文件系統和 NFS 導出文件系統提供 ACL 支持。
如何檢查 Linux 系統中的 ACL 支持
在繼續之前,你應該在當前內核和掛載的文件系統上支持 ACL。
1. 檢查內核是否支持 ACL
運行以下命令檢查文件系統的 ACL 支持和 POSIX_ACL=Y 選項(如果有 N 代替 Y,則表示內核不支持ACL,需要重新編譯)。
[root@linux ~]# grep -i acl /boot/config* CONFIG_`EXT4_FS_POSIX_ACL=y` CONFIG_`REISERFS_FS_POSIX_ACL=y` CONFIG_JFS_POSIX_ACL=y CONFIG_XFS_POSIX_ACL=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y CONFIG_GENERIC_ACL=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_NFS_V3_ACL=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3_ACL=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_CIFS_ACL=y CONFIG_9P_FS_POSIX_ACL=y
2.檢查所需的包
在開始使用 ACL 之前,請確保你已安裝所需的軟件包。以下是需要使用安裝的必需軟件包yum 或者 apt-get.
[root@linux ~]# yum install nfs4-acl-tools acl libacl [on `RedHat` based systems] [rumenz@linux ~]$ sudo apt-get install nfs4-acl-tools acl [on `Debian` based systems]
3. 檢查掛載的文件系統是否支持 ACL
現在,檢查掛載的文件系統是否使用 ACL 選項掛載。我們可以用mount 用于檢查相同的命令,如下所示。
[root@linux ~]# mount | grep -i root /dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)
但在我們的例子中,它默認不顯示 acl。因此,接下來我們可以選擇使用 acl 選項再次重新掛載已安裝的分區。但是,在繼續之前,我們有另一個選項來確保分區是否使用 acl 選項掛載,因為對于最近的系統,它可能與默認掛載選項集成。
[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl Default mount options: user_xattr acl
在上面的輸出中,你可以看到默認掛載選項已經支持 acl。另一種選擇是重新掛載分區,如下所示。
[root@linux ~]# mount -o remount,acl /
接下來,將以下條目添加到/etc/fstab文件中以使其永久化。
/dev/mapper/fedora-root / ext4 defaults,acl 1 1
再次,重新掛載分區。
[root@linux ~]# mount -o remount /
4.對于NFS服務器
在 NFS 服務器上,如果 NSF 服務器導出的文件系統支持 ACL,并且 NFS 客戶端可以讀取 ACL,那么客戶端系統就會使用 ACL。
要禁用 NFS 共享上的 ACL,你必須添加選項no_acl 在 /etc/exportfs NFS 服務器上的文件。要再次在 NSF 客戶端禁用它,請使用no_acl 掛載時間的選項。
如何在 Linux 系統中實現 ACL 支持
有兩種類型 ACLs:
Access ACLs:訪問 ACL 用于授予對任何文件或目錄的權限。
Default ACLs:默認 ACL 僅用于在特定目錄上授予/設置訪問控制列表。
訪問 ACL 和默認 ACL 的區別:
默認 ACL 只能在目錄級別使用。
在該目錄中創建的任何子目錄或文件都將從其父目錄繼承 ACL。另一方面,文件繼承默認 ACL 作為其訪問 ACL。
我們利用–d用于設置默認 ACL,默認 ACL 是可選的。
設置默認 ACL 之前
要確定特定文件或目錄的默認 ACL,請使用 getfacl 命令。在下面的例子中,getfacl 用于獲取文件夾的默認 ACL Music。
[root@linux ~]# getfacl Music/ # file: Music/ # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:group::r-x default:other::rw-
設置默認 ACL 后
要為特定文件或目錄設置默認 ACL,請使用 setfacl 命令。在下面的例子中,setfacl 命令將設置一個新的 ACL(read 和 execute) 給文件夾 Music.
[root@linux ~]# setfacl -m d:o:rx Music/ [root@linux ~]# getfacl Music/ # file: Music/ # owner: root # group: root user::rwx group::r-x other::r-x `default:user::rwx default:group::r-x default:other::r-x`
如何設置新的 ACL
使用 setfacl用于設置或修改任何文件或目錄的命令。例如,rumenz1用戶賦予read和 write 的權限。
# setfacl -m u:rumenz1:rw /rumenz1/example
如何查看 ACL
使用 getfacl 用于查看任何文件或目錄上的 ACL 的命令。例如,要查看 上的 ACL/rumenz1/example 使用下面的命令。
# getfacl /rumenz1/example # file: rumenz1/example/ # owner: rumenz1 # group: rumenz1 user::rwx user:rumenz1:rwx user:rumenz2:r-- group::rwx mask::rwx other::---
如何刪除 ACL
為了從任何文件/目錄中刪除 ACL,我們使用 x 和 b 選項
# setfacl -x ACL file/directory # remove only specified ACL from file/directory. # setfacl -b file/directory #removing all ACL from file/direcoty
兩個用戶(rumenz1 和 rumenz2),兩者都有名為的共同次要組acl。我們將創建一個所有者是rumenz1的目錄, 并將該目錄的 read 和 execute 授權給用戶 rumenz2。
Step 1: 創建兩個用戶并從兩者中刪除密碼[root@linux ~]# for user in rumenz1 rumenz2 > do > useradd $user > passwd -d $user > done Removing password for user rumenz passwd: Success Removing password for user rumenz passwd: Success
Step 2: 創建一個組和用戶到次要組。[root@linux ~]# groupadd acl [root@linux ~]# usermod -G acl rumenz1 [root@linux ~]# usermod -G acl rumenz2
Step 3:創建目錄/rumenz并將所有權更改為rumenz1`.
[root@linux ~]# mkdir /rumenz1 [root@linux ~]# chown rumenz1 /rumenz1/ [root@linux ~]# ls -ld /rumenz1/ drwxr-xr-x 2 rumenz1 root 4096 Apr 17 14:46 /rumenz1/ [root@linux ~]# getfacl /rumenz1 `getfacl: Removing leading '/' from absolute path names` # file: rumenz1 # owner: rumenz1 # group: root user::rwx group::r-x other::r-x
Step 4:登錄rumenz1并在其中創建一個目錄。
[rumenz@linux ~]$ su - rumenz1 Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4 [rumenz1@linux ~]$ cd /rumenz1/ [rumenz1@linux rumenz1]$ mkdir example [rumenz1@linux rumenz1]$ ll total 4 drwxrwxr-x 2 rumenz1 rumenz1 4096 Apr 17 14:50 example [rumenz1@linux rumenz1]$ whoami rumenz1
Step 5: 現在使用設置ACLsetfacl,rumenz1將擁有所有rwx權限,rumenz2將只有read的權限,example文件夾和其他文件夾將沒有權限。
$ setfacl -m u:rumenz1:rwx example/ $ setfacl -m u:rumenz2:r-- example/ $ setfacl -m other:--- example/ $ getfacl example/ # file: example # owner: rumenz1 # group: rumenz1 user::rwx user:rumenz1:rwx user:rumenz2:r-- group::r-x mask::rwx other::---
Step 6:rumenz2在另一個終端上并將目錄更改為/rumenz1。現在嘗試使用ls命令 查看內容,然后嘗試更改目錄并查看如下差異。
[rumenz@linux ~]$ su - rumenz2 Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5 [rumenz2@linux ~]$ cd /rumenz1/ [rumenz2@linux rumenz1]$ ls -lR example/ example/: total 0 [rumenz2@linux rumenz1]$ cd example/ -bash: cd: example/: Permission denied [rumenz2@linux rumenz1]$ getfacl example/ # file: example # owner: rumenz1 # group: rumenz1 user::rwx user:rumenz1:rwx user:rumenz2:r-- group::rwx mask::rwx other::---
Step 7:現在給execute許可rumenz2在example文件夾,然后使用cd命令查看效果。現在rumenz2具有查看和更改目錄的權限,但沒有寫入任何內容的權限。
[rumenz1@linux rumenz1]$ setfacl -m u:rumenz2:r-x example/ [rumenz1@linux rumenz1]$ getfacl example/ # file: example # owner: rumenz1 # group: rumenz1 user::rwx user:rumenz1:rwx user:rumenz2:r-x group::rwx mask::rwx other::--- [rumenz@linux ~]$ su - rumenz2 Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5 [rumenz2@linux ~]$ cd /rumenz1/ [rumenz2@linux rumenz1]$ cd example/ [rumenz2@linux example]$ getfacl . [rumenz2@linux example]$ mkdir test mkdir: cannot create directory test: Permission denied [rumenz2@linux example]$ touch test touch: cannot touch test: Permission denied
Note: 執行 ACL 后,你將看到一個額外的+符號為 ls –l 輸出如下。
[root@linux rumenz1]# ll total 4 drwxrwx---+ 2 rumenz1 rumenz1 4096 Apr 17 17:01 example