如何用Linux的setfacl限制用户不得离开/home目录并设置权限例外?
实现用户目录访问限制的ACL配置方案
首先明确核心逻辑:用户要切换到某个目录,必须拥有该目录的执行权限(x)。我们的目标就是通过ACL精准控制不同组用户对/home以外目录的访问权限,同时保证必要的命令执行能力。
方案一:限制share组用户不得离开/home
这个方案的核心是:让share组用户仅能访问/home及其子目录,无法进入/home以外的非必要目录,同时保留基本命令的执行能力。
步骤1:配置根目录/的权限
给share组仅分配执行权限(无读权限),这样用户可以通过/路径访问到/home,但无法列出根目录下的内容,也不能随意切换到其他一级目录:
sudo setfacl -m g:share:--x /
步骤2:限制/home以外的非命令目录
对/etc、/root、/var等不需要访问的一级目录,移除share组的所有权限:
# 按需添加其他目录,比如 /opt、/srv 等 sudo setfacl -m g:share:--- /etc /root /var
步骤3:保留命令目录的执行权限
为了让用户能执行基本命令(如ls、cd),需要给命令存放目录分配执行权限(无需读权限,只要能定位到命令文件即可):
sudo setfacl -m g:share:--x /bin /usr/bin /usr/sbin
步骤4:确保/home及其子目录的访问权限
保证share组能正常访问/home和目标子目录(比如/home/share):
# 给 /home 分配读+执行权限(如果需要创建文件则用 rwx) sudo setfacl -m g:share:r-x /home # 给共享目录分配完整权限 sudo setfacl -m g:share:rwx /home/share # 可选:设置默认ACL,让 /home 下新创建的子目录自动继承权限 sudo setfacl -d -m g:share:rwx /home
测试验证
用share组的用户登录后:
- 尝试
cd /etc会提示权限拒绝 cd /home/share可以正常进入ls /会提示权限不足(因为没有根目录的读权限)- 基本命令如
ls、pwd可以正常执行
方案二:允许adm组用户离开/home,限制share组
这个方案是在方案一的基础上,给adm组开例外,让他们拥有正常的系统访问权限。
步骤1:先完成方案一的所有配置
先按照方案一限制share组的权限,确保基础限制生效。
步骤2:给adm组分配正常访问权限
对根目录和其他一级目录,给adm组分配读+执行权限,让他们可以自由切换和访问:
sudo setfacl -m g:adm:r-x / sudo setfacl -m g:adm:r-x /etc /root /var /bin /usr/bin
原理说明
Linux ACL的权限优先级是:用户自身权限 > 用户所在组的ACL权限 > 基本组权限 > 其他权限。所以adm组的用户会优先匹配我们设置的g:adm:r-x权限,覆盖掉对share组的限制(如果用户同时属于两个组的话)。
注意事项
- 避免误锁必要目录:一定要确保命令目录(
/bin、/usr/bin等)的执行权限,否则用户会无法执行任何命令。 - 测试所有场景:用目标组的用户登录,逐一测试切换目录、执行命令、访问共享目录的场景,确保符合预期。
- 与基础权限配合:ACL是对基础权限的补充,不要忽略系统默认的权限设置(比如
/home的基础权限通常是drwxr-xr-x)。
内容的提问来源于stack exchange,提问作者Lucas Aimaretto




