在 Linux 中使用 ACL(访问控制列表)保护文件/目录的安全
作为系统管理员,我们的首要任务是保护数据免遭未经授权的访问。我们都知道使用一些有用的 Linux 命令设置的权限,例如 chmod、chown、chgrp... 等。但是,这些默认权限集合有一些限制,有时可能无法满足我们的需要。例如,我们不能为不同的用户对同一个目录或文件设置不同的权限集。因此,实施了访问控制列表(ACL)。
假设您有三个用户:“howtoing1”、“howtoing2”和“howtoing3”。每个具有共同组的人都说“acl”。用户“howtoing1”希望只有“howtoing2”用户可以读取和访问“”拥有的文件howtoing1',其他人不应该有任何访问权限。
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 之前,请确保您已安装所需的软件包。以下是需要使用 yum 或 apt-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 选项再次重新挂载已挂载的分区。但是,在继续之前,我们还有另一个选项来确保分区是否使用 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,并且ACL可以被NFS客户端读取,则ACL被客户端系统使用。
要禁用 NFS 共享上的 ACL,您必须在 NFS 服务器上的“/etc/exportfs”文件中添加选项“no_acl”。要在 NSF 客户端再次禁用它,请在安装时使用“no_acl”选项。
如何在 Linux 系统中实现 ACL 支持
有两种类型的ACL:
- 访问 ACL:访问 ACL 用于授予对任何文件或目录的权限。
- 默认 ACL:默认 ACL 仅用于在特定目录上授予/设置访问控制列表。
访问ACL和默认ACL的区别:
- 默认 ACL 只能在目录级别使用。
- 在该目录中创建的任何子目录或文件都将从其父目录继承 ACL。另一方面,文件继承默认 ACL 作为其访问 ACL。
- 我们使用“-d”来设置默认 ACL,默认 ACL 是可选的。
设置默认 ACL 之前
要确定特定文件或目录的默认 ACL,请使用“getfacl”命令。在下面的示例中,getfacl 用于获取文件夹“Music”的默认 ACL。
[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(读取和执行)强>。
[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”命令对任何文件或目录进行设置或修改。例如,向用户“howtoing1”授予读取和写入权限。
setfacl -m u:tecmint1:rw /tecmint1/example
如何查看 ACL
使用“getfacl”命令查看任何文件或目录的 ACL。例如,要查看“/howtoing1/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::---
如何删除 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
让我们在以下场景中实现 ACL。
两个用户(howtoing1 和 howtoing2),都有名为“acl”的公共辅助组。我们将创建一个由“howtoing1”拥有的目录,并向用户“howtoing2<”提供对该目录的读取和执行权限/强>'。
第 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 步: 创建目录 /howtoing 并将所有权更改为 howtoing1。
[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步:使用howtoing1登录并在/howtoing文件夹中创建一个目录。
[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,以便'howtoing1'将拥有所有rwx权限, “howtoing2”对“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 步: 现在使用其他用户(即另一个终端上的“howtoing2”)登录,并将目录更改为“/howtoing1”。现在尝试使用“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 步: 现在向“example”文件夹上的“howtoing2”授予“执行”权限,然后使用 'cd'命令查看效果。现在“howtoing2”拥有查看和更改目录的权限,但没有写入任何内容的权限。
[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 的文档