在备用端口上保护 Wordpress 管理界面

在备用端口上保护 Wordpress 管理界面

我有一个自托管的 Wordpress 博客。只要有可能,我就会尝试使用 SSL 和 X.509 客户端证书身份验证来保护 Web 应用程序的管理界面。对于 phpMyAdmin 等程序,我已让所有这些程序正常运行,因此 Web 服务器的技术部分都已到位。

我的托管设置是:

  • nginx 0.7.x
  • 带有 fpm 补丁的 PHP 5.2.10
  • MySQL 5.x

我在 VPS 上运行所有这些,因此我只有一个外部 IP。我在机器上运行了其他几个 SSL 网站:一个在默认端口上,其他所有网站都在备用端口上(这样每个网站都可以拥有与其主机名匹配的不同证书)。

我的意图是拥有两个服务器配置块:

  1. 一个服务 blog.domain.com 端口 80,如果你尝试访问 /wp-admin 下的任何内容,则会返回 404
  2. 另一个在端口 8443 上运行,使用 SSL,没有 URL 限制,但要求提供有效的 X.509 客户端证书。

我面临的问题是 Wordpress 不喜欢在两个不同的端口上访问。每当我尝试访问https://blog.domain.com:8443,它将我重定向到https://blog.domain.com,这是一个完全不同的虚拟主机(服务器上的主站点,在默认端口上运行)。然后我在浏览器中收到证书名称错误,即使我忽略了警告,我也不再与 wordpress 站点通信。

博客的主 URL 存储在 wp_options 表中:

mysql> select option_value from wp_options where option_name = 'siteurl';
+------------------------------+
| option_value                 |
+------------------------------+
| http://blog.domain.com       |
+------------------------------+
1 row in set (0.00 sec)

mysql>

所以我不能直接复制博客文件并将主 URL 设置为https://blog.domain.com:8443并以此方式访问管理界面。

有任何想法吗?

更新

在尝试了一段时间的建议答案后,我得出结论,这不可能完全实现我想要的效果。在 wordpress 中启用这些功能会导致用户向 /wp-(admin|login|register) 发出 SSL 请求,如果我在 SSL 端需要 X.509 客户端证书,他们就无法这样做。

我想到的最好解决方案是设置一个带有证书身份验证的 SSL 前端,该前端将请求代理回非 SSL nginx。即便如此,我也无法完全切断对 /wp-admin 的非 SSL 访问,因为用户注册和配置文件管理中使用的大部分 CSS 和 Javascript 都来自该目录。

我可以允许通过 HTTP 访问 /wp-admin 下的 CSS、图像和 Javascript,而只要求 PHP 脚本具有 SSL 访问权限,但用户无法修改他们的配置文件(颜色方案、显示名称等)。下一步是确定普通用户所需的 PHP 脚本子集,并让这些脚本通过 HTTP 传递,同时拒绝其余脚本,但如果他们重新组织一切,那么我就是 wordpress 开发团队的奴隶了。

我想这归结为训练自己只通过 SSL 管理博客,即使服务器允许我通过纯 HTTP 进行管理。

答案1

这可能会对您有所帮助,从 wordpress 2.6 开始,您可以强制管理员和登录区域使用 ssled。

http://codex.wordpress.org/Administration_Over_SSL

  define('FORCE_SSL_LOGIN', true);
  define('FORCE_SSL_ADMIN', true);

有时,您希望整个 wp-admin 使用 https 协议通过安全连接运行。从概念上讲,该过程的工作原理如下:

设置两个具有相同 URL(博客 URL)的虚拟主机,一个是安全的,另一个不是。在安全的虚拟主机上,设置一条重写规则,将所有非 wp-admin 流量传送到不安全的站点。在不安全的虚拟主机上,设置一条重写规则,将所有到 wp-admin 的流量传送到安全主机。放入一个过滤器(通过插件),过滤 wp-admin 中的链接,这样一旦激活,管理链接就会被重写为使用 https,并编辑 cookie 以仅通过加密连接工作。

他们提到的插件叫做管理员 SSL

答案2

我遇到了类似的问题,我使用 wordpress 已经很长时间了,并且想强制 /wp-admin/ 通过 SSL 工作。

所以我做了 :

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/(wp-login.php|wp-admin/) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

这几乎已经奏效了。当我去http://网站/wp-admin/我通过 SSL 重定向到 wp-login.php 但在登录过程之后我被重定向到https://website/http://website/wp-admin/(这不是打字错误)因为 wordpress 使用内部重定向,与重写规则配合不佳。
通过加载http://网站/wp-admin/我又被重定向到https://website/wp-admin/一切运行良好。

但在最近的 Wordpress 发布之前,还存在另一个问题,在 wp-login.php 页面上,登录表单操作设置为http://website/wp-login.php。因此登录信息以明文形式发送。(因此需要修补 wp-login.php)

最近(自 2.6.0 版)的 Wordpress 版本添加了一个FORCE_SSL_LOGIN设置。define ('FORCE_SSL_LOGIN','true');在 wp-config.php 中输入此设置将使 wp-login.php 上的表单操作https://website/wp-login.php(只需对 wp-login.php 进行一点更改,您就可以添加:8443)

因此,使用“FORCE_SSL_LOGIN + rewrite”是安全的,但我仍然必须在登录过程后重新加载 wp-admin url。

2.6.0 也添加了FORCE_SSL_ADMIN,但是当我将其设置为 true 时(使用或配置了我的重写),我无限期地重定向到http://网站/wp-admin/ 因此,您可以尝试将 FORCE_SSL_LOGIN 设置为 true,并修补 wp-login.php 以使用端口 8443,您也可以尝试 FORCE_SSL_ADMIN(我还不知道为什么它对我不起作用,但对您来说可能有效)

答案3

嗯...我怀疑这需要破坏 wordpress 以将 wp-admin 部分与主站点分开,但据我所知,它的设计并不是这样的。

您能否设置一个安全的 SSL vhost(具有相同的文档根目录),然后通过 .htaccess magic(我以前做过)强制所有 /wp-admin 请求通过 https 而不是 http 进行?

这显然并没有将整个管理部分分开,但至少意味着未加密的流量被停止了。

相关内容