移动安全 安全管理 应用案例 网络威胁系统安全 应用安全 数据安全 云安全
当前位置: 主页 > 信息安全 > 系统安全 >

在Linux中使用访问控制列表(ACL)保护文件/目录

时间:2014-06-04 13:23来源:TuZhiJiaMi企业信息安全专家 点击:
作为系统管理员,我们的首要任务就是切实保护数据的安全,以免被未授权的人访问。我们都很清楚使用一些大有帮助的Linux命令设置的权限,比如chmod、chown和chgrp等命令,可是这些默认的权限
Tags系统安全(735)Linux(46)ACL(5)  

  作为系统管理员,我们的首要任务就是切实保护数据的安全,以免被未授权的人访问。我们都很清楚使用一些大有帮助的Linux命令设置的权限,比如chmod、chown和chgrp等命令,可是这些默认的权限集有一定的局限性,有时可能还满足不了我们的要求。比如说,我们就无法针对同一目录或文件为不同用户设置不同的权限集。因而,访问控制列表(ACL)应运而生。

在Linux中使用访问控制列表(ACL)保护文件/目录

  Linux访问控制列表

  比如说,你有三个用户,分别是“tecmint1”、“tecmint2”和“tecmint3”。每个用户都有一个共同的用户组,比如说“acl”。用户“tecmint1”希望,只有“tecmint2”用户才能读取和访问归“tecmint1”用户所有的文件,其他人都无权访问该文件。

  访问控制列表(ACL)让我们可以做到同样这点。这些ACL让我们可以为某个用户、用户组或不在用户组列表中的任何用户的任何组授予权限。

  注意:按照红帽产品说明文档,它为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=yCONFIG_REISERFS_FS_POSIX_ACL=yCONFIG_JFS_POSIX_ACL=yCONFIG_XFS_POSIX_ACL=yCONFIG_BTRFS_FS_POSIX_ACL=yCONFIG_FS_POSIX_ACL=yCONFIG_GENERIC_ACL=yCONFIG_TMPFS_POSIX_ACL=yCONFIG_NFS_V3_ACL=yCONFIG_NFSD_V2_ACL=yCONFIG_NFSD_V3_ACL=yCONFIG_NFS_ACL_SUPPORT=mCONFIG_CIFS_ACL=yCONFIG_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 aclDefault 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支持?

  ACL有两种类型:

  ◦访问ACL:访问ACL用于授予针对任何文件或目录的权限。

  ◦默认ACL:默认ACL用于授予/设置只针对特定目录的访问控制列表。

  访问ACL与默认ACL之间的区别如下:

  ◦默认ACL只能用在目录级别。

  ◦在该目录里面创建的任何子目录或文件将从父目录那里继承ACL。另一方面,文件继承默认ACL作为其访问ACL。

  ◦我们使用“–d”来设置默认ACL,默认ACL是可选的。

  在设置默认ACL之前

  想为特定的文件或目录设置默认ACL,可以使用“getfacl”命令。在下面这个例子中,getfacl用于为文件夹“Music”获得默认ACL。

  [root@linux ~]# getfacl Music/# 文件:Music/# 所有者:root# 用户组:rootuser::rwxgroup::r-xother::r-xdefault:user::rwxdefault:group::r-xdefault:other::rw-

  设置默认ACL之后

  想为特定的文件或目录设置默认ACL,使用“setfacl”命令。在下面这个例子中,setfacl命令将为文件夹“Music”设置新的ACL(读取和执行)。

  [root@linux ~]# setfacl -m d:o:rx Music/[root@linux ~]# getfacl Music/# 文件:Music/# 所有者:root# 用户组:rootuser::rwxgroup::r-xother::r-xdefault:user::rwxdefault:group::r-xdefault:other::r-x

  如何设置新的ACL

  使用“setfacl”命令用于设置或修改任何文件或目录。比如说,想为用户“tecmint1”授予读取和写入权限。

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

  如何查看ACL

  使用“getfacl”命令用于查看任何文件或目录的ACL。比如说,想查看“/tecmint1/example”上的ACL,使用下面这个命令。

  # getfacl /tecmint1/example# 文件:tecmint1/example/# 所有者:tecmint1# 用户组:tecmint1user::rwxuser:tecmint1:rwxuser:tecmint2:r--group::rwxmask::rwxother::---

  如何删除ACL

  想删除任何文件/目录的ACL,我们可以使用x和b这两个选项,如下所示。

  # setfacl -x ACL file/directory # 只删除文件/目录的指定ACL

  # setfacl -b file/directory # 删除文件/目录的所有ACL

  不妨将ACL实现到下列场景。

  两个用户(tecmint1和tecmint2)都有共同的辅助组,名为“acl”。我们将创建归“tecmint1”用户所有的一个目录,并为用户“tecmint2”提供针对该目录的读取和执行权限。

  第1步:创建两个用户,并清除两个用户的密码。

  [root@linux ~]# for user in tecmint1 tecmint2> do> useradd $user> passwd -d $user> doneRemoving password for user tecmint1.passwd: SuccessRemoving 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 /tecmint1getfacl: Removing leading '/' from absolute path names# 文件:tecmint1# 所有者:tecmint1# 用户组:rootuser::rwxgroup::r-xother::r-x

  第4步:以tecmint1身份登录,在/tecmint文件夹下创建一个目录。

  [tecmint@linux ~]$ su - tecmint1Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4[tecmint1@linux ~]$ cd /tecmint1/[tecmint1@linux tecmint1]$ mkdir example[tecmint1@linux tecmint1]$ lltotal 4drwxrwxr-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/# 文件:example# 所有者:tecmint1# 用户组:tecmint1user::rwxuser:tecmint1:rwxuser:tecmint2:r--group::r-xmask::rwxother::---

  第6步:现在以另一用户(即“tecmint2”)的身份在另一个终端上登录,将目录改为“/tecmint1”。现在试着使用“ls”命令,查看内容,然后试着更改目录,看看有什么区别,如下所示。

  [tecmint@linux ~]$ su - tecmint2Last 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/# 文件:example# 所有者:tecmint1# 用户组:tecmint1user::rwxuser:tecmint1:rwxuser:tecmint2:r--group::rwxmask::rwxother::---

  第7步:现在为“tecmint2”用户授予针对“example”文件夹的“执行”权限,然后使用“cd”命令看看有什么效果。现在,“tecmint2”用户拥有查看和更改目录的权限,但没有写入任何内容的权限。

  [tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/[tecmint1@linux tecmint1]$ getfacl example/# 文件:example# 所有者:tecmint1# 用户组:tecmint1user::rwxuser:tecmint1:rwxuser:tecmint2:r-xgroup::rwxmask::rwxother::---[tecmint@linux ~]$ su - tecmint2Last 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 testmkdir: cannot create directory 'test': Permission denied[tecmint2@linux example]$ touch testtouch: cannot touch 'test': Permission denied

  注意:实现ACL后,你会看到“ls –l”输出有一个额外的“+”符号,如下所示。

  [root@linux tecmint1]# lltotal 4drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

------分隔线----------------------------

推荐内容