在Linux中使用ACL(訪問控制列表)安全文件/目錄

作為一名系統管理員,我們的首要任務將是保護和確保數據不受未經授權的訪問。我們都知道使用一些有用的Linux命令來設置權限,比如chmod,chown,chgrp等。然而,這些默認權限設置有一些限制,有時可能無法滿足我們的需求。例如,我們無法在同一目錄或文件上為不同用戶設置不同的權限設置。因此,實施了存取控制列表ACLs)。

Linux Access Control Lists

假設你有三個用戶,’tecmint1’,’tecmint2’和’tecmint3’。每個用戶都有一個共同的組,比如’acl’。用戶’tecmint1’希望只有用戶’tecmint2’可以讀取並存取由’tecmint1’所有的文件,其他人都不能有任何訪問權限。

ACL存取控制列表)允許我們執行相同的設置。這些ACL允許我們為用戶、組和不在用戶群組列表中的任何用戶組設置權限。

注意:根據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之前,請確保已安裝所需的套件。以下是需要使用yumapt-get安裝的所需套件。

[root@linux ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[tecmint@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選項,因為對於最近的系統,它可能已與默認掛載選項集成。

[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伺服器上,如果由NFS伺服器導出的文件系統支持ACL並且ACL可以被NFS客戶端讀取,則客戶端系統將使用ACL。

要禁用NFS共享上的ACL,您必须在NFS服务器的“/etc/exportfs”文件中添加选项“no_acl”。要在NSF客户端端再次禁用它,请在挂载时使用“no_acl”选项。

如何在Linux系统中实现ACL支持

有两种ACLs

  1. 访问ACLs:访问ACLs用于授予任何文件或目录的权限。
  2. 默认ACLs:默认ACLs用于仅在特定目录上授予/设置访问控制列表。

访问ACL和默认ACL之间的区别:

  1. 默认ACL只能用于目录级别。
  2. 在该目录中创建的任何子目录或文件将继承其父目录的ACLs。另一方面,文件将继承默认ACLs作为其访问ACLs。
  3. 我们使用“-d”来设置默认ACLs,而默认ACLs是可选的。
设置默认ACLs之前

要确定特定文件或目录的默认ACLs,请使用“getfacl”命令。在下面的示例中,“getfacl”用于获取文件夹“Music”的默认ACLs。

[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-
设置默认ACLs后

要为特定文件或目录设置默认ACLs,请使用“setfacl”命令。在下面的示例中,“setfacl”命令将在文件夹“Music”上设置新的ACLs(读取执行)。

[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

如何設定新的 ACLs

使用“setfacl”命令對任何文件或目錄進行設置或修改。例如,給用戶“tecmint1”設置讀取和寫入權限。

# setfacl -m u:tecmint1:rw /tecmint1/example

如何查看 ACLs

使用“getfacl”命令查看任何文件或目錄上的 ACL。例如,查看“/tecmint1/example”的 ACL,請使用以下命令。

# getfacl /tecmint1/example

# file: tecmint1/example/
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

如何刪除 ACLs

要從任何文件/目錄中刪除 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

讓我們在以下情況下實施 ACL。

兩個用戶(tecmint1tecmint2),都有一個名為“acl”的共同次要組。我們將創建一個由“tecmint1”擁有的目錄,並將允許用戶“tecmint2”對該目錄進行讀取和執行權限。

步驟1:創建兩個用戶並從兩者中刪除密碼

[root@linux ~]# for user in tecmint1 tecmint2

> do
> useradd $user
> passwd -d $user
> done
Removing password for user tecmint1.
passwd: Success
Removing password for user tecmint2.
passwd: Success

步驟2:創建一個組和將用戶添加到次要組中。

[root@linux ~]# groupadd acl
[root@linux ~]# usermod -G acl tecmint1
[root@linux ~]# usermod -G acl tecmint2

步驟3:創建一個目錄 /tecmint 並更改所有者為 tecmint1

[root@linux ~]# mkdir /tecmint1
[root@linux ~]# chown tecmint1 /tecmint1/
[root@linux ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[root@linux ~]# getfacl /tecmint1

getfacl: Removing leading '/' from absolute path names
# file: tecmint1
# owner: tecmint1
# group: root
user::rwx
group::r-x
other::r-x

步驟4:使用 tecmint1 登錄並在 /tecmint 文件夾中創建一個目錄。

[tecmint@linux ~]$ su - tecmint1

Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
[tecmint1@linux ~]$ cd /tecmint1/
[tecmint1@linux tecmint1]$ mkdir example
[tecmint1@linux tecmint1]$ ll

total 4
drwxrwxr-x 2 tecmint1 tecmint1 4096 Apr 17 14:50 example
[tecmint1@linux tecmint1]$ whoami 
tecmint1

步驟5:現在使用『setfacl』設置ACL,以便『tecmint1』擁有所有rwx權限,『tecmint2』只能對『example』文件夾擁有讀取權限,其他用戶則無權限。

$ setfacl -m u:tecmint1:rwx example/
$ setfacl -m u:tecmint2:r-- example/
$ setfacl -m  other:--- example/
$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::r-x
mask::rwx
other::---

步驟6:現在使用另一個用戶,即『tecmint2』,在另一個終端登錄並切換目錄到『/tecmint1』。現在嘗試使用『ls』命令查看內容,然後嘗試變更目錄以查看以下區別。

[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ ls -lR example/
example/:
total 0
[tecmint2@linux tecmint1]$ cd example/

-bash: cd: example/: Permission denied
[tecmint2@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

步驟7:現在給予『tecmint2』在『example』文件夾的『執行』權限,然後使用‘cd’命令查看效果。現在,『tecmint2』有權查看和更改目錄,但沒有寫入任何東西的權限。

[tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/
[tecmint1@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r-x
group::rwx
mask::rwx
other::---
[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ cd example/
[tecmint2@linux example]$ getfacl .
[tecmint2@linux example]$ mkdir test

mkdir: cannot create directory ‘test’: Permission denied
[tecmint2@linux example]$ touch test

touch: cannot touch ‘test’: Permission denied

注意:實施ACL後,您將在『ls -l』輸出中看到額外的『+』符號如下。

[root@linux tecmint1]# ll

total 4
drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

參考鏈接

ACL 文檔

Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/