译者 | 布加迪
审校 | 重楼
本文介绍了Linux访问控制列表(ACL),它相比标准的Linux权限提供了更大的灵活性。
经常在Linux与微软Windows之间快速切换的一些人认识到两者之间根本性的区别。其中一个区别是权限。标准的Linux权限非常简单:指定一个用户、一个用户组,然后指定其他任何用户或用户组(称为“others”),并根据需要授予读取、写入和执行等权限。Windows的权限则要复杂得多,有嵌套、更多的访问级别和共享(Share)权限组合。然而从许多方面来看,Windows权限在大规模环境下更灵活、更实用。
本文介绍Linux访问控制列表(ACL),它相比标准的Linux权限提供了更大的灵活性。我将讨论为多个独立用户和多个用户组查看和配置ACL。你选择的Linux发行版很可能已经启用了ACL(ACL实际上是文件系统的一项功能)。
简要回顾标准的Linux权限
你可以使用chmod命令来配置标准的Linux权限。该命令可以设置以下三种访问级别的任意组合:读取、写入和执行。你可以将这些访问级别授予三种身份:
- 用户(所有者):拥有文件的一个用户帐户(默认情况下,这是文件创建者)。
- 用户组:在/etc/group文件中显示的一组用户。
- 其他:不是用户或指定组成员的任何人。
图1:ls -l命令显示标准权限、所有权和组关联
对于用户和用户组较少的独立系统而言,这种方法绰绰有余。然而,在共享系统、启用了文件共享功能的系统或SSH远程访问频繁的设备上,这种方法却变得非常麻烦又笨拙。
这时候文件系统ACL功能就能派上用场。它允许你配置具有不同访问级别的多个用户及/或用户组。
ACL如何提供帮助?
ACL允许你指定多个用户帐户,并为它们提供不同的访问级别。这也意味着你不必将文件的所有权授予其中一个用户。它为用户组提供了同样的灵活性。
ACL仍然可以识别读取、写入和执行这三个标准访问级别,因此你不必重新学习已经了解的关于Linux权限的所有知识。实际上,ACL与标准权限协同工作,因此你仍将使用基本的用户(u)、用户组(g)和其他(o)等身份。你是在补充常规权限,而不是替换常规权限。
验证你的发行版支持ACL
今天的现代Linux发行版通常默认情况下支持ACL。ACL是文件系统的一项功能。标准的文件系统是ext4、XFS和Btrfs。它们都支持ACL。
你可能不需要检查自己的Linux发行版是否支持ACL,但是如果你想确认,可以使用以下命令:
tune2fs -l /dev/sda1 | grep -i "Default mount options"
预计输出中会看到列出的acl。
图2:tune2fs命令显示文件系统设置,包括是否启用了ACL
注意,如果针对资源配置了ACL,ls -l输出将显示+字符。在下面这个例子中,ACL被应用到file1.txt。
图3:注意file1.txt的权限字符串末尾的+字符,表示应用了ACL
使用setfacl命令
ACL配置命令是setfacl。它依赖标准的Linux命令语法:
command -options argument
参数将是你应用访问控制的那个文件或目录。
setfacl命令有很多选项。以下列表含有一些最常见的选项:
- -m:修改指定的ACL。
- -x:从ACL中删除条目。
- -b:从ACL中删除所有条目。
- -d:为特定的目录配置默认ACL。
- -R:对所有目录内容递归应用ACL。
然而,setfacl还依赖其他参数来定义新的访问控制是否应用于用户或用户组。
u:<username>
g:<groupname>
如果结合起来,这些设置允许管理员实现极其可靠而实用的权限配置。
下面的命令示例简要介绍了如何使用setfacl。后面会介绍更具体的示例。
如果为用户django配置ACL,将读取(r)权限授予sample.txt资源,请输入:
setfacl -m u:django:r sample.txt
针对用户组engineering的类似示例,如下所示:
setfacl -m g:engineering:r sample.txt
一旦你配置了ACL设置,需要检查它们以确保它们是正确的。这时候getfacl命令就有了用武之地。
使用getfacl命令
用于管理ACL的另一个相关命令是getfacl,它可以显示当前的ACL设置。
基本语法是getfacl和你想要查看的那个文件或目录名:
getfacl / dev-projects
然而与大多数Linux命令一样,getfacl支持许多有用的选项来修改输出。这些包括:
- -c:只显示ACL条目,并丢弃额外的头信息。
- -R:递归显示目录内容。
- -t:以更可读的表格格式显示输出。
在审计或配置访问控制时,使用getfacl检查ACL设置。
图4:getfacl命令显示标准设置和ACL设置
ACL用例
下面你将看到ACL的两个用例,包括场景和相关命令。考虑一下在你的环境中类似的情况会如何发生。
场景1
我将从一个简单的示例开始入手:sales组对于/sales目录需要拥有rwx权限,marketing组应该只有r-x权限。其他人不需要访问。(请记住,这些组需要执行权限才能cd到目录中。)
先向销售组授予标准的rwx权限:
chown –R : sales /sales
chmod – r 770 /sales
接下来,为marketing组设置ACL:
setfacl -m g:marketing:r-x /sales
使用getfacl /sales确认设置。
请记住,ACL与标准权限协同工作,因此不要忘记使用ls -l命令用于这两个系统。除了显示ACL条目外,getfacl命令还显示标准权限。
场景2
想象另一种情况,你需要为不同的用户和组授予不同的访问级别。假设你有一个/dev-projects目录,需要满足以下要求:
- 所有者:拥有全面访问权限(rwx)的root。
- 用户组:拥有全面访问权限(rwx)的developers。
- 额外用户:拥有只读取访问权限(r-x)的alex(代码审阅者)。
- 额外用户:具有只读取访问权限(r-x)的silas(项目经理)。
- 额外用户组:拥有只读取访问权限(r-x)的contract-dev-team。
标准权限无法满足这类需求,但ACL可以轻松满足。
先设置标准权限:
chown -R root:developers /dev-projects
chmod - R 770 /dev-projects
接下来,为额外用户和用户组配置ACL条目:
setfacl -R u:alex:r-x /dev-projects
setfacl -R u:silas:r-x /dev/projects
setfacl -R g:contract-dev-team:r-x /dev/projects
通过使用getfacl和ls -l显示设置来检查结果。
结语
访问控制列表(ACL)扩展了Linux权限的功能,允许对不同的用户和用户组授予不同的访问级别。虽然这使故障排查起来变得更复杂了,但为了增强灵活性是值得的。
ACL功能是文件系统的一项功能。今天的现代文件系统支持ACL,可能已经启用了它。确保创建一种根据访问需求组织资源、从而有效地利用ACL的目录基础设施。一般来说,销售团队所需的一切资源都应该存在于一个父目录中,营销团队所需的一切资源都存在于另一个父目录中。
ACL在大型部署环境中变得尤为重要,比如支持访问需求各异的许多用户和资源的主要文件服务器。现在仔细检查你的大型部署环境,看看ACL是否有助于更有效地控制资源访问。在排查看似神秘的访问问题时,别忘了考虑ACL。
原文标题:A Guide to Linux Access Control Lists,作者:Damon M. Garn