linux – 为什么嵌套目录的默认setfacl失败?

我正在使用带有内部sftp的sftp用于debian.
我想要实现的是将所有用户监禁到一个工作正常的特定文件夹.我还需要一个在sftp上具有“admin”权限但不是root用户的用户. admin用户将把文件放在sftp用户目录中,这样他们就可以访问它们了.
管理员用户将是使用winscp或其他客户端执行操作的“非技术”人员.我无法强迫他使用bash.

我提出了以下解决方案:

> 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组中.

>目录设置

目录设置如下:

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

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

>添加用户$U:

useradd -d / -g 1000 -M -N -s /usr/sbin/nologin $U

>设置用户$U密码

echo "$U:$P" | chpasswd

>创建目录/ home / admin / sftp / $U.

mkdir $SFTP_PATH/$U

>设置所有权

chown $U:sftponly $SFTP_PATH/$U

>设置权限

chmod u=rx,go= -R $SFTP_PATH/$U
chmod g+s $SFTP_PATH/$U

>设置ACL

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::---

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

这里有什么我想念的吗?
我知道proftpd和pureftp,但如果可能的话我想使用ssh方式.如果没有办法以这种方式这样做,我将很高兴指出我正确的方向,并推荐能够开箱即用的软件.

请注意:用户admin在/ home / admin / sharedfiles /下有自己的目录,在那里他存储随后与sftp用户共享的文件.使用文件夹中的硬链接共享文件.例如,如果管理员希望与3个用户共享文件(文件非常大,如500GB),他只需将文件夹中的硬链接放到这些文件中即可下载,而无需将大文件复制到每个用户的文件夹中.

当管理员希望将不同类别的共享放在用户的不同文件夹中时,会出现此问题.

编辑:

我注意到,如果我将新创建的文件夹的所有权更改为“tester”,则可以为admin用户创建嵌套目录.但是,我仍然需要更改嵌套目录的所有权以允许进一步的目录嵌套.

# 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嵌套,然后作为用户admin我可以创建deepdir目录.

请注意,ACL是继承的,理论上用户admin对第一个文件夹下的所有文件和目录都具有rwx权限,即subdir.

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

解决方法:

创建subdir时组不同:

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

嵌套目录创建可能受subdir的distinct组限制.

上一篇:linux – mkdir权限与umask不对应(根据位置而变化)


下一篇:Error: EACCES: permission denied, mkdir