wordpressを無理やりSSL化した話

テーマに埋まってるhttpの部分もあるため当ブログでは

  • wp-includes/functions.php

上記ファイルに無理やりフィルターをかませてhttps化と同時にstatic系ファイルをs3のURLに書き換えている。

具体的には下記(文書に埋まっているURLにも効果が及ぶためあえてスペースを入れて引っかからないようにしている。

function replace_content_url() {
 ob_start('replace_static_url');
}
function replace_static_url($html) {
 if(!is_admin()) {
 $html = str_replace('http ://www.null-engineer.ml/wp-includes/css', 'https://static.null-engineer.ml/wp-includes/css', $html);
 $html = str_replace('http ://www.null-engineer.ml/wp-includes/js', 'https://static.null-engineer.ml/wp-includes/js', $html);
 $html = str_replace('http ://www.null-engineer.ml/wp-content/', 'https://static.null-engineer.ml/wp-content/', $html);
 $html = str_replace('http ://www.null-engineer.ml', 'https://www.null-engineer.ml', $html);
 $html = str_replace('http ://0.gravatar.com', 'https://0.gravatar.com', $html);
 $html = str_replace('http :\/\/', 'https:\/\/', $html);
 }
 return $html;
}

wp_loadedをフックして動的生成じゃない部分のURLをS3のURLに置換し、埋まっている残りのhttpをhttpsに置換している。もっと賢いやり方もありそうだけど面倒なのでこれはこれでありかもしれない。

WordPressをインストールした後に真っ先に行ったこと

内容に関しては掲題のとおり。
WordPressをインストールして真っ先にinstall系のファイルを消した。
理由はこれを悪用して不正なアクセスによりサイトを改ざんされるのを防ぐため。

$ sudo rm wp-admin/install.php wp-admin/install-helper.php

また、/wp-adminへのアクセス制限もかけた。
ただしawsで構築しelbを挟んでる関係で通常の書き方ではリモートIPを取ることが出来ない。
そのため例として下記のようにenvを介して制限をかけた

SetEnvIf X-Forwarded-For "^000\.000\.000\.000$" allowed_access
<Location "/wp-admin">
order deny,allow
deny from all
allow from env=allowed_access
</Location>

ただしこの方法、一つ問題があって悪意ある攻撃者がX-Forwarded-Forに我が家のIPを入れて送ってくると管理画面が表示できる。
が、そもそも我が家のIPを知る方法がないだろうから問題ないと思われる。
企業が公開しているサービスなんかだと企業のIPで試行して攻撃できると思うので過信は禁物。