我的 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/