本文介绍不再受支持的 Ubuntu 版本。如果您当前运行的服务器运行 Ubuntu 12.04,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
-
升级到Ubuntu 14.04.
- 从 Ubuntu 14.04 升级到 Ubuntu 16.04
- 将服务器数据迁移到支持的版本
Reason:
Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL)并且不再接收安全补丁或更新。本指南不再维护。
请参阅:本指南可能仍然可以作为参考,但可能不适用于其他 Ubuntu 版本。如果有的话,我们强烈建议您使用针对您所使用的 Ubuntu 版本编写的指南。您可以使用页面顶部的搜索功能来查找更新的版本。
WordPress 是当今互联网上最流行的 CMS(内容管理系统)。虽然许多人使用它是因为它功能强大且简单,但有时人们会为了方便而牺牲安全性。
您选择如何分配目录所有权和权限以及如何选择执行升级就是这种情况。有多种不同的方法可以做到这一点。我们将选择我们认为相对安全的方式来升级和安装主题和插件。
在本指南中,我们假设您已经了解了初始服务器设置。您还需要在您的 VPS 上安装 LAMP 堆栈.
我们还假设您已在 Ubuntu 12.04 上安装了 WordPress。您可以按照我们的指南进行操作如何在 Ubuntu 12.04 上安装 WordPress here.
一旦您拥有用户和所需的软件,您就可以开始遵循本指南。
如果您没有配置基于密钥的更新和安装,则每当您尝试执行其中任一任务时,您都会收到连接信息提示。
它将要求您提供 FTP 凭据,例如主机名、FTP 用户名和 FTP 密码:
FTP 本质上是一种不安全的协议,因此我们在大多数情况下不建议您使用它。我们将配置我们的安装以使用安全的替代方案。
如果您按照上面安装 WordPress 的指南进行操作,您会注意到您已向 Apache Web 用户授予了 Web 目录的权限。这是一种非常快速的入门方法,但可能存在潜在的安全风险。在理想情况下,您可以将内容所有者与 Web 流程分开。我们将这样做作为允许 SSH 更新准备工作的一部分。
我们将创建一个名为wp-user
拥有我们的 WordPress 安装。
sudo adduser wp-user
您会被问到很多问题,包括您要设置的密码。我们不想设置密码,因此在所有提示中都按“ENTER”键,包括重复的密码问题。
接下来,更改为/var/www/html
目录,我们的 WordPress 文件在其中提供。
cd /var/www/html
我们将授予新用户对此目录下所有内容的所有权,将其从www-data
我们在安装过程中配置的 Apache Web 用户。
sudo chown -R wp-user:wp-user /var/www/html
我们现在需要为 WordPress 用户创建 SSH 密钥对。通过发出以下命令登录 WordPress 用户:
sudo su - wp-user
我们将创建一个密钥对ssh-keygen
命令:
ssh-keygen -t rsa -b 4096
系统会询问您在哪里存储钥匙以及如何称呼它们。选择/home/wp-user/wp_rsa
。您还将被要求选择一个密码。根据提示按“ENTER”即可创建无需密码验证的密钥。
退出到您的普通用户帐户:
exit
我们需要做一些维护来确保权限安全。我们想要授予 WordPress 用户所有权,但设置www-data
组作为组所有者。然后我们要锁定其他访问:
sudo chown wp-user:www-data /home/wp-user/wp_rsa*
sudo chmod 0640 /home/wp-user/wp_rsa*
您需要创建~/.ssh
目录并为其提供适当的权限和所有权,以便 Web 进程可以登录。
sudo mkdir /home/wp-user/.ssh
sudo chown wp-user:wp-user /home/wp-user/.ssh/
sudo chmod 0700 /home/wp-user/.ssh/
现在,我们可以将公钥输入到授权密钥文件中,以便用户可以使用这些凭据登录。由于我们还没有这个文件,我们可以简单地复制公钥。
sudo cp /home/wp-user/wp_rsa.pub /home/wp-user/.ssh/authorized_keys
同样,我们需要调整这些文件的权限和所有权,以确保它们可以被访问,同时保持安全:
sudo chown wp-user:wp-user /home/wp-user/.ssh/authorized_keys
sudo chmod 0644 /home/wp-user/.ssh/authorized_keys
由于这些密钥仅用于从同一台计算机上的 WordPress 站点内登录,因此我们可以限制对此服务器的登录:
sudo nano /home/wp-user/.ssh/authorized_keys
在文件的最开头,在任何其他文本之前,添加红色部分以限制本地计算机的密钥使用:
from=“127.0.0.1” ssh-rsa...
前>
保存并关闭文件。
现在,我们可以安装 WordPress 所需的软件包来验证 SSH 登录:
sudo apt-get update
sudo apt-get install php5-dev libssh2-1-dev libssh2-php
现在我们有了实用程序,我们可以编辑配置文件并设置我们配置的值。
sudo nano /var/www/html/wp-config.php
在文件末尾添加以下行:
define('FTP_PUBKEY','/home/wp-user/wp_rsa.pub');
define('FTP_PRIKEY','/home/wp-user/wp_rsa');
define('FTP_USER','wp-user');
define('FTP_PASS','');
define('FTP_HOST','127.0.0.1:22');
保存并关闭文件。
现在,我们应该重新启动 Apache 以利用新的更新过程:
sudo service apache2 restart
现在,我们可以测试一下我们的配置是否正确。通过在浏览器中访问以下 URL 的站点,以管理员身份登录到您的 WordPress 站点:
your_domain.com/wp-admin
前>
我们可以通过尝试安装新主题来检查我们的设置是否配置正确。单击“外观”,然后单击“主题”。
在顶部,单击“安装主题”:
搜索主题或单击“精选”主题。单击“安装”在您的网站上安装主题。它应该使用您指定的密钥文件成功登录、下载并安装您的软件包:
您可以点击“激活”切换到新主题,然后点击“访问站点”查看结果。
如果 SSH 密钥配置不正确,您可能会遇到一些问题。
尝试通过 Web 界面推送更改时,您可能会看到的一个常见错误是:
用户的公钥和私钥不正确
前>
令人沮丧的是,这个错误是不具体的。它可能由多种原因引起,其中一些原因是:
-
对公钥、私钥以及包含它们的目录的权限不当。
Web 进程需要能够读取每个文件,因此如果 Web 服务器组是所有者,则每个文件需要至少有 640 个权限。
另一方面,~.ssh
目录只需要登录的用户可以访问。这意味着wp-user
在我们的示例中的用户。该目录的内容同样应归该用户所有,并且其他任何人都不可写入。
-
文件所有权不当。这些相同的密钥需要由正确的各方拥有。在所有者和组所有者之间,这通常是登录用户和 Web 进程用户的混合体。
在我们的示例中,wp-user
拥有私钥和公钥,而 www-data 组是组所有者。这使我们能够将它们与正确的用户关联起来,同时允许服务器读取文件。
-
文件格式不正确。如果您的公钥或私钥存在格式问题,WordPress 将拒绝该密钥并拒绝使用它。这同样适用于~/.ssh/authorized_keys
file.
您添加到authorized_keys 文件中的部分,from="127.0.0.1" ...
不应存在于公钥中。即使 SSH 会将其视为有效文件,WordPress 也会在将尝试发送到 SSH 守护程序之前将其视为无效而拒绝。
更新或安装主题和插件过程中的另一个常见错误是:
Could not create directory...
这通常是由于 Web 目录所有权不正确而导致的问题。如果您要使用以下命令更新文件wp-user
帐户,上传目录也需要由该用户拥有和访问。
这意味着您需要提供以下文件和文件夹/var/www/html
目录到wp-user
帐户。如果您按照上述说明操作后仍然遇到问题,请确保您通过了-R
的选项chown
命令。
另一件需要检查的事情是上传目录是否具有 WordPress 用户的写入权限。更改为文档根目录:
cd /var/www/html
如果我们检查此文件夹中文件的权限,我们应该看到所有者(第一列)的写入权限,但看不到第二列或第三列:
ls -l
total 180
-rw-r--r-- 1 wp-user wp-user 177 Nov 18 15:21 index.html
-rw-r--r-- 1 wp-user wp-user 418 Sep 24 20:18 index.php
-rw-r--r-- 1 wp-user wp-user 20 Nov 18 15:24 info.php
-rw-r--r-- 1 wp-user wp-user 19929 Jan 18 2013 license.txt
-rw-r--r-- 1 wp-user wp-user 7128 Oct 23 16:08 readme.html
-rw-r--r-- 1 wp-user wp-user 4892 Oct 4 10:12 wp-activate.php
drwxr-xr-x 9 wp-user wp-user 4096 Oct 29 16:08 wp-admin/
-rw-r--r-- 1 wp-user wp-user 271 Jan 8 2012 wp-blog-header.php
-rw-r--r-- 1 wp-user wp-user 4795 Sep 5 21:38 wp-comments-post.php
-rw-r--r-- 1 wp-user wp-user 3350 Nov 19 12:23 wp-config.php
-rw-r--r-- 1 wp-user wp-user 3177 Nov 1 2010 wp-config-sample.php
drwxr-xr-x 5 wp-user wp-user 4096 Nov 19 12:25 wp-content/
. . .
可以看到,读取的文件权限-rw-r--r--
以及读取的目录权限drwxr-xr-x
表明wp-user
,拥有文件和目录的人具有写入权限,而其他人则没有。
类似的检查wp-content
目录,其中包含主题、插件等,将向我们显示这些目录是否属于该目录并由该目录可写wp-user
user.
cd /var/www/html/wp-content
ls -l
total 16
-rw-r--r-- 1 wp-user wp-user 28 Jan 8 2012 index.php
drwxr-xr-x 3 wp-user wp-user 4096 Oct 29 16:08 plugins
drwxr-xr-x 6 wp-user wp-user 4096 Nov 19 13:10 themes
drwxr-xr-x 2 wp-user wp-user 4096 Nov 19 13:10 upgrade
这些目录配置正确。
虽然 WordPress 很方便并且配置和管理相对容易,但这并不意味着安全性不应该成为您网站的主要关注点。
像更新安装这样简单的事情应该在任何安全发布后立即完成,应该很简单。它也不应该是一个强迫您使用不安全协议或设置不安全目录权限的过程。
保护更新过程和正确的目录权限是一项简单的任务,可以防止相当大的安全问题。
作者:Justin Ellingwood