WordPress 的最佳实践、用户的直接自动更新和 SFTP 访问

WordPress 的最佳实践、用户的直接自动更新和 SFTP 访问

我正在尝试在 Debian 8 系统上建立一个安全的 WordPress 网站,其要求如下:

  • 自动核心更新(FS_method“direct”)
  • chrooted SFTP 访问 /wp-content(针对单个用户)

我确信这是一个相当标准的设置。不过,我找不到如何将它们组合在一起的教程。

首先,为了使使用 FS_method“直接”的自动核心更新起作用,WordPress 的大部分内容必须归 www-data 所有,即:

chown -R www-data.www-data /var/www/wordpress

此外,我有一个本地帐户“sftp-wordpress”,我将其放入“www-data”组。

我把 wp-content 和组内的所有内容都设为可写(组是 www-data,见上文),这样 sftp-wordpress 就可以写入,而且 - 为了安全起见 - 我把“wp-content”及其子目录设置为 setgid:

chmod -R g+w /var/www/wordpress/wp-content
find /var/www/wordpress/wp-content -type d -exec chmod g+s {} \;

第一个问题:为了设置 chroot,我将以下内容放入 /etc/ssh/sshd_config 中:

Match User sftp_wordpress
    ChrootDirectory /var/www/wordpress/wp-content
    ForceCommand internal-sftp -u 0002
    AllowTcpForwarding no

这不起作用,因为 OpenSSH 不喜欢 ChrootDirectory 的权限和所有者:

fatal: bad ownership or modes for chroot directory "/var/www/wordpress/wp-content"

因此,我通过禁用 ChrootDirectory 指令暂时取消了 chroot 要求。

此时,我可以将文件上传到 wp-content。文件将显示所有者“sftp-wordpress”(可能是问题用于 WordPress 更新?)和组“www-data”。

另一个问题上传的文件和目录不是可组写的,因此 Apache 进程无法修改它们。如果 WordPress 想要修改它们,这就有问题了。

“umask 0002”不会有帮助,因为(与这里的其他问题不同)它不会执行组写权限。

事实上,上传的文件在服务器上是可组写的,如果它们在客户端上是可组写的 - 这远非解决方案,因为你不能指望 SFTP 会在他们那边解决这个问题。

我想知道是否有针对此 WordPress 设置的一致解决方案。

答案1

为了让 openssh 接受它,chroot 目录需要由 root 拥有,这是出于安全目的。

进一步解释请参见:chroot 目录组件的所有权或模式不正确

Chroot目录
指定验证后 chroot(2) 到的目录的路径名。 路径名的所有组件都必须是根目录拥有的目录,并且任何其他用户或组都无法写入. chroot 之后,sshd(8) 将工作目录更改为用户的主目录。

我认为解决方案可能是将上传位置与 wordpress 可查看的位置分开。

您可以创建一种暂存区,用户可以通过 chrooted 位置的 openssh sftp 服务器上传文件。然后您的系统会有一个 cronjob,它会定期运行一个脚本,该脚本将检查上传位置并对上传的文件执行适当的操作。

它可以发送一封电子邮件请求人工干预,也可以进行一些自动文件检查、病毒扫描,无论你认为什么都行。然后将文件复制或移动到 wordpress 可以处理的位置。

我认为实际上没有一致的解决方案,因为许多情况都非常独特。但使用暂存区来存储上传的文件在许多情况下并不罕见。而且它增加了一定程度的安全性。

答案2

一个可能的答案似乎是这种设置确实是不可能的(没有对各种组件进行重新配置)。

另一种方法是放弃 FS_METHOD“direct”,转而采用“ssh”、“ftpext”或“ftpsocket”等替代方法。这样就不再需要网络服务器能够更改 WordPress 文件。相反,您可以告诉 WordPress 如何通过 FTP 或 SSH 访问和更改自己的文件。

相关内容