多个 sftp 用户并访问 /var/www 子目录

多个 sftp 用户并访问 /var/www 子目录

我的 Ubuntu 服务器上有一些用户vsftpd
该服务器用作 Web 服务器,并有一个共享的 sftp 目录,可供公共客户端访问(通过向他们提供用户和密码)。

由于这种架构,我的目标是限制公共客户端用户仅访问其主目录,并限制对其他目录的访问。我使用 ChrootDirectory 实现了这一点,如下所示:

  • 创建公共用户:public_sftp 和主目录:/home/public_sftp/
  • /home/public_sftp归 root 所有
  • 里面/home/public_sftp有两个目录由 public_sftp:www-data 拥有
  • 创建一个组 sftponly
  • 在 sftponly 组中添加 public_sftp
  • 更改/etc/ssh/sshd_config并在末尾添加

    Match group sftponly
        ChrootDirectory %h
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp -u 73
    

除了我需要使用 www-data 用户从另一台服务器运行脚本外,此操作完全正常。当使用 www-data 用户运行将连接到 sftp 服务器的脚本时,我得到以下信息:

Write failed: Broken pipe
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(605) [sender=3.0.9]

我的 www-data 用户的主目录是,/var/www/并且 rsync scrypt 正尝试从中写入子目录/var/www

答案1

POSIX ACL(访问控制列表)对于您描述的情况很有用。与用户:组:其他模型相比,它们允许更细粒度的权限模型。我发现它们更容易在我的脑海中保持清晰,因为我可以更明确,还可以为文件系统的分支设置“默认”行为。

例如,您可以明确指定每个用户的权限:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

或者您可以基于某些共享组来执行此操作:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

也许你想让你的 Web 服务器用户保持只读状态

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

手册页:

http://linux.die.net/man/1/setfacl http://linux.die.net/man/1/getfacl https://websistent.com/linux-acl-tutorial/

相关内容