我已经弄清楚如何使用 SFTP 完成“创建但不修改”权限方案。但它仅适用于文件;我想将其扩展到目录。
背景:
我有一个 SFTP 服务器(基于 OpenSSH),它将特定的用户组限制为公共的chroot监狱目录。配置类似于这对话。
我希望该组中的用户能够创建文件和目录,但创建后不能修改或删除它们。我无法直接执行此操作,因为标准 Linux 权限不区分“写入”和“修改”权限。
我可以通过将 SFTP 根目录权限与 SFTP 服务器配置中的 umask 选项相结合来使其工作。
权限:
drwxr-xr-x root root /sftproot
drwxrwxr-x root sftpgroup /sftproot/upload_directory
/etc/ssh/sshd_config:
Subsystem sftp internal-sftp
Match Group sftponly
ChrootDirectory /sftproot
ForceCommand internal-sftp -d /upload_directory -u 0222
注意-u 0222
开关。这适用于掩码到新创建的文件,这会删除特定权限。
结果:
当 sftponly 组中的用户上传新文件时,由于组写入目录权限,因此允许上传新文件。然后 umask 选项清除“w”位,使文件不可修改。该文件最终看起来像这样:
-r--r--r-- {user} sftponly /sftproot/upload_directory/filename
伟大的!这正是我想要的。
问题:
用户还可以创建目录,这也是我想要的。但是,新创建的目录也会清除其“w”位,这会阻止在其中写入任何新文件。
问题:
如何让 SFTP 创建的目录保持可写但文件保持只读?
有什么巧妙的想法吗?
答案1
根据sftp-server (5)
联机帮助页,您可以使用-u umask
命令行选项来覆盖用户的 umask:
-u umask
Sets an explicit umask(2) to be applied to newly-created files and directories, instead of
the user's default mask.
所以,只要这样设置umask,这样用户就不再有写权限了。
要设置此项,请参阅sshd_config(5)
联机帮助页中提到的联机sftp-server
帮助页:
Command-line flags to sftp-server should be specified in the Subsystem declaration. See
sshd_config(5) for more information.