我在为多个用户访问同一组文件设置系统时遇到了麻烦。我读过教程和文档,也尝试过 ACL,但还没有成功。
我的情况:
有多个用户,例如user1
和user2
,它们属于名为 的组sharedusers
。他们必须拥有所有写对同一组文件和目录的权限,比如说底层的/userdata/sharing/
。
我已将文件夹的组设置为sharedusers
,并将 SGID 内所有新创建的文件/目录设置为同一组。
ubuntu@home:/userdata$ ll
drwxr-sr-x 2 ubuntu sharedusers 4096 Nov 24 03:51 sharing/
我为这个目录设置了 ACL,这样我就可以从其父目录继承子目录/文件的权限。
ubuntu@home:/userdata$ setfacl -m group:sharedusers:rwx sharing/
ubuntu@home:/userdata$ setfacl -d -m group:sharedusers:rwx sharing/
以下是我得到的信息:
ubuntu@home:/userdata$ getfacl sharing/
# file: sharing/
# owner: ubuntu
# group: sharedusers
# flags: -s-
user::rwx
group::r-x
group:sharedusers:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:sharedusers:rwx
default:mask::rwx
default:other::r-x
似乎没问题,因为当我创建包含新文件的新文件夹时,权限是正确的。
ubuntu@home:/userdata/sharing$ mkdir a && cd a
ubuntu@home:/userdata/sharing/a$ touch a_test
ubuntu@home:/userdata/sharing/a$ getfacl a_test
# file: a_test
# owner: ubuntu
# group: sharedusers
user::rw-
group::r-x #effective:r--
group:sharedusers:rwx #effective:rw-
mask::rw-
other::r--
可以看到,该sharedusers
群组拥有有效的权限rw-
。
但是,如果我有一个 zip 文件,并使用unzip -q
命令解压文件夹内的文件sharing
,则提取的文件夹没有集体写作权限。因此,该组中的用户sharedusers
无法修改这些解压文件夹下的文件。
ubuntu@home:/userdata/sharing$ unzip -q Joomla_3.0.2-Stable-Full_Package.zip
ubuntu@home:/userdata/sharing$ ll
drwxrwsr-x+ 2 ubuntu sharedusers 4096 Nov 24 04:00 a/
drwxr-xr-x+ 10 ubuntu sharedusers 4096 Nov 7 01:52 administrator/
drwxr-xr-x+ 13 ubuntu sharedusers 4096 Nov 7 01:52 components/
a
您可以发现文件夹(之前创建的)与administrator
提取的文件夹之间的权限差异unzip
。 以及 内部文件的 ACL administrator
:
ubuntu@home:/userdata/sharing$ getfacl administrator/index.php
# file: administrator/index.php
# owner: ubuntu
# group: ubuntu
user::rw-
group::r-x #effective:r--
group:sharedusers:rwx #effective:r--
mask::r--
other::r--
它也有ubuntu
组,而不是sharedusers
预期的组。
有人能解释一下这个问题并给我建议吗?提前谢谢了!
答案1
此行为是 ACL_MASK 在起作用。查看文件index.php
,它理论上确实获得了预期的权限group:sharedusers:rwx
,但实际上获得了另一个权限#effective:r--
。这是因为理论值与进行了异或以mask::r--
得出有效值,即您看到的ls -l
(或ll
)。
现在的 ACL_MASKmask::r--
实际上是 ACL 的一个安全特性,它可以阻止您授予不想要的访问权限:当添加一个现有文件(而不是创建一个新文件)时,ACL 会将 ACL_MASK 设置为文件的先前值,在本例中为r--
。
这不仅限于 unzip。这适用于以下情况:添加文件而不是创造它。您可以尝试cp
或tar
例如,并最终得到相同的结果。
事实上,文献(man 5 acl
)在段落中指出对象创建和默认 ACL这些default
值仅适用于使用以下任何系统调用创建的对象:创建(),创建目录(),mknod(),mkfifo(), 或者打开()。
因此我无法给您一个好的解决方案,因为您将无法使用 ACL 默认机制来执行您正在执行的操作。