我正在尝试寻找将文件从一台服务器传输到另一台服务器的最安全的方法。
我有以下架构:
目前我正在使用主用户salamis
来挂载目录。
原始目录中的文件是通过 PHP 文件管理器创建的elfinder
。
不幸的是,我无法通过 PHPmove
执行rename
或delete
挂载目录中的任何文件。我被拒绝了权限。
1)是不是因为我使用salamis
而不是 来挂载文件系统www-data
?
2) 将文件系统挂载Server 2
为是否安全www-data
?如果是,我该如何实现?www-data
没有密码,我无法使用 登录su -m www-data
。我得到authentication failure
。
3)你能想到更好的架构吗?
答案1
SSHFS 是保险丝文件系统。这些由以挂载文件系统的用户身份运行的用户级进程管理:sshfs
您运行的进程兼作文件系统驱动程序。默认情况下,大多数 FUSE 文件系统仅允许挂载用户访问内部文件。
为了能够通过 sshfs 访问文件,您需要三样东西:
- 在 server1 上通过 ssh 身份验证的用户必须能够访问这些文件。
- 尝试访问 server2 上的 sshfs 文件系统的用户必须具有必要的访问权限。
- 必须允许尝试访问 server2 上的 sshfs 文件系统的用户访问该文件系统。
正如我上面所写的,只有挂载用户才拥有最后一项权限。您可以通过在命令行-o allow_user
中添加内容来放宽此sshfs
限制,但这并不能解决其他两个问题。请注意,只有当包含或您以 root 身份运行-o allow_user
时才会生效。/etc/fuse.conf
user_allow_user
sshfs
在 上server2
,您需要sshfs
以www-data
用户身份运行(您必须授予该用户访问 SSH 私钥的权限),或者启用allow_user
并安排本地用户www-data
访问其所需的文件。有几种方法可以做到这一点:通过选项uid
,或者通过传递-o default_permissions
,或者通过传递-o umask 770,gid=www-data
。如果启用allow_user
,请确保您最终不会允许www-data
访问超过应有的文件,并且您最终不会允许其他用户查看或修改他们不应该查看或修改的内容。sshfs
以用户身份运行www-data
的优势在于简单,您更有可能不会意外地过于宽容。
对于问题 #1,您需要通过 ssh 进入www-data
上的帐户server1
,或允许您使用的帐户访问这些文件。不允许远程登录系统帐户(例如)有一些好处www-data
,因为这些帐户会导致审计不力(您无法知道谁实际使用了该帐户)。但是,这并非不可能,而且设置起来更容易一些。如果您不想允许远程登录帐户www-data
,请将salamis
¹ 添加到www-data
组,确保 上的文件系统server1
使用选项挂载acl
(如果需要,将其添加到 中的相关条目/etc/fstab
),然后添加访问控制列表到www-data
的文件:
setfacl -d -m group:www-data:rwx -R /path/to/www-root
setfacl -m group:www-data:rwx -R /path/to/www-root
¹如果这是您在 上的帐户server1
,那么从您的问题中我无法理解是否salamis
是 上的用户server1
,还是 上的用户,server2
或者两者兼而有之。
答案2
1) 是的,就像 Gilles 回答的那样,您使用的登录 ID 是所创建文件的默认所有者。对于大多数协议来说都是如此。
2) 确实,www-data 用户没有密码。但是,您可以为 www-data 提供一个临时密码,并使用命令 ssh-copy 将 salamis 证书复制到 www-data。完成此操作后,salami 可以登录并以 www-data 身份挂载,而无需输入任何密码。(您必须拥有使用 ssh-keygen 构建的证书。)
3) 另一个可能的解决方案是在两个服务器之间 rsync 文件。Rsync 使用与 ssh/sftp/sshfs 相同的安全基础架构,您可以像在 2 中一样使用 ssh-copy。使用 rsync,您可以让 www-data 从 salami 获取文件。使用 ssh-copy 让您有机会编写同步脚本,/etc/cron.[dayly|hourly] 中的一行代码在大多数情况下就足够了。Rsync 非常强大,如果 salamis 服务器出现任何问题,您的应用程序仍可以使用您同步的最后文件,您的应用程序不会因网络而变慢,但 salamis 目录中的文件和服务器上的文件更改之间存在延迟。您还可以考虑使用 VCS,例如 bzr,并从存储库中获取文件。这为您提供了对源代码的良好修订控制。