为什么默认 setfacl 对于嵌套目录失败?

为什么默认 setfacl 对于嵌套目录失败?

我将 sftp 与 debian 的内部 sftp 一起使用。我想要完成的是将所有用户监禁到工作正常的特定文件夹中。我还需要一个对 sftp 具有“管理员”权限但不是 root 用户的用户。管理员用户会将文件放入 sftp 用户目录中,以便他们能够访问它们。管理员用户将是使用 winscp 或其他客户端执行操作的“非技术”人员。我没办法强迫他使用bash。

我想出了以下解决方案:

  1. SFTP配置

使用 sshd_config 我进行了这样的设置:

Match group users
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp -d %u

Match group sftponly
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp -d admin/sftp/%u

所以我的“admin”用户拥有他家中的所有 sftp 用户。 “admin”也在用户组中。所有其他用户均在 sftponly 组中创建。 “admin”也在 sftponly 组中。

  1. 目录设置

目录设置如下:

-/
 -home
  -admin
   -sftp
    -user1
    -user2

我创建了一个脚本来创建执行以下操作的 sftp 用户:

  1. 添加用户$U:

    useradd -d / -g 1000 -M -N -s /usr/sbin/nologin $U
    
  2. 设置用户$U密码

    echo "$U:$P" | chpasswd
    
  3. 创建目录 /home/admin/sftp/$U

    mkdir $SFTP_PATH/$U
    
  4. 设置所有权

    chown $U:sftponly $SFTP_PATH/$U
    
  5. 设置权限

    chmod u=rx,go= -R $SFTP_PATH/$U
    chmod g+s $SFTP_PATH/$U
    
  6. 设置访问控制列表

    setfacl -Rm u:admin:rwx,u:$U:r-x,g::--- $SFTP_PATH/$U
    setfacl -d -Rm u:admin:rwx,u:$U:r-x,g::--- $SFTP_PATH/$U
    

到目前为止,一切都很好。现在我不想在第 6 点中进行设置,该设置将允许用户管理员在$SFTP_PATH/$U$U 本身可以访问的 中创建一个子目录。这对于创建的第一个目录(用户测试员):

# pwd
/home/admin/sftp/tester
# ls -alh
dr-xrwx---+  2 tester          sftponly 4.0K Oct 22 16:06 tester
# su admin
$ cd /home/admin/sftp/tester
$ mkdir subdir
$ ls -alh
admin@server:/home/admin/sftp/tester$ ls -alh
total 20K
dr-xrwx---+  3 tester   sftponly 4.0K Oct 22 22:41 .
drwxrwx---+ 28 admin sftponly 4.0K Oct 22 15:19 ..
dr-xrwx---+  2 admin users    4.0K Oct 22 22:41 subdir
$ cd subdir
admin@storage:/home/admin/sftp/tester/subdir$ mkdir nesteddir
mkdir: cannot create directory ‘nesteddir’: Permission denied

当我测试 acl 时,我得到:

admin@storage:/home/admin/sftp/tester$ getfacl subdir/
# file: subdir/
# owner: admin
# group: users
user::r-x
user:admin:rwx
user:tester:r-x
group::---
mask::rwx
other::---
default:user::r-x
default:user:admin:rwx
default:user:tester:r-x
default:group::---
default:mask::rwx
default:other::---

所以我的问题是:作为管理员并且将管理员的 setfacl 设置为 rwx,为什么我可以创建目录子目录但无法创建目录嵌套的

我在这里缺少什么吗?我知道 proftpd 和 pureftp 但如果可能的话我想使用ssh方式。如果没有办法做到这一点,我很乐意为我指明正确的方向,并推荐能够实现开箱即用的设置的软件。

请注意:用户 admin 在 /home/admin/sharedfiles/ 下有自己的目录,他在其中存储随后与 sftp 用户共享的文件。文件通过其文件夹中的硬链接进行共享。例如,如果管理员想要与 3 个用户共享一个文件(文件非常大,如 500GB),他只需将硬链接放入这些文件的文件夹中,然后就可以下载它们,而无需将大文件复制到每个用户的文件夹中。

当管理员想要将不同类别的共享放入用户的不同文件夹中时,就会出现此问题。

编辑:

我注意到,如果我将新创建的文件夹的所有权更改为“tester” - 那么管理员用户就可以创建嵌套目录。但是,我仍然必须更改嵌套目录的所有权以允许进一步的目录嵌套。

# chown tester:sftponly subdir
# su admin
$ cd /home/admin/sftp/tester/subdir
$ mkdir nested                            # <----- works fine
$ cd nested
$ mkdir deepdir
mkdir: cannot create directory ‘deepdir’: Permission denied

因此,如果我想创建下一个嵌套目录,那么我必须这样做chown tester:sftponly nested,然后作为用户管理员我可以创建该deepdir目录。

请注意,ACL 是继承的,理论上用户 admin 对第一个文件夹(即subdir.

也许这有助于找到 setfacl 失败的原因?

答案1

创建子目录时组会有所不同:

drwxrwx---+ 28 admin sftponly 4.0K Oct 22 15:19 ..
dr-xrwx---+  2 admin *users* 4.0K Oct 22 22:41 subdir

嵌套目录的创建可能受到子目录的不同组的限制。

答案2

看来还必须设置默认组 ACL,以便它不会分配组的原始所有权。

getfacl subdir/
# file: subdir/
# owner: admin
# group: users (It appears to then default to this)
user::r-x
user:admin:rwx
user:tester:r-x
group::--- (this is not set)
mask::rwx
other::---
default:user::r-x
default:user:admin:rwx
default:user:tester:r-x
default:group::---(this is not set)
default:mask::rwx
default:other::---

相关内容