我将 sftp 与 debian 的内部 sftp 一起使用。我想要完成的是将所有用户监禁到工作正常的特定文件夹中。我还需要一个对 sftp 具有“管理员”权限但不是 root 用户的用户。管理员用户会将文件放入 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
设置访问控制列表
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::---