タグ: wordpress

WordPressの設定変更:Confファイルによるセキュリティ設定

apacheのバーチャルファイルにセキュリティ設定を追加します。

バーチャルサイトの設定ファイルバックアップ

  • バックアップ
sudo cp -pi /etc/apache2/sites-avaiable/wordpress.conf /path/to/backup/directory/wordpress.conf.$(date +%Y%m%d)

ファイル及びバックアップディレクトリは自分の環境に合わせます。

  • diffによる差分確認
diff -u /path/to/backup/directory/wordpress.conf.$(date +%Y%m%d) /etc/apache2/sites-avaiable/wordpress.conf

エラーがなければバックアップは成功です。

バーチャルサイトの設定ファイル編集

DocumentRootの項目に、以下のように編集します。/home/www-data/wordpressの部分は自分の環境に合わせます。

ここでは、サーバのリソースを食い潰し、robots.txtを無視するクローラーを止めることにしています。

また、こういったクローラーであることを隠し、ユーザーエージェントを偽装するIPもレンジでブロックしています。

    DocumentRoot /home/www-data/wordpress
    <Directory /home/www-data/wordpress>
        Options -Indexes
        Options FollowSymLinks
        AllowOverride All
        ## スパムクローラーを拒否
        SetEnvIfNoCase User-Agent "facebookexternalhit/1.1" spam_crawler
        SetEnvIfNoCase User-Agent "SemrushBot/7~bl" spam_crawler
        SetEnvIfNoCase User-Agent "AhrefsBot" spam_crawler
        SetEnvIfNoCase User-Agent "MJ12bot" spam_crawler
        SetEnvIfNoCase User-Agent "DotBot" spam_crawler
        SetEnvIfNoCase User-Agent "Baiduspider" spam_crawler
        SetEnvIfNoCase User-Agent "YandexBot" spam_crawler
        SetEnvIfNoCase User-Agent "Sogou web spider" spam_crawler
        SetEnvIfNoCase User-Agent "Exabot" spam_crawler
        SetEnvIfNoCase User-Agent "MegaIndex.ru" spam_crawler
        SetEnvIfNoCase User-Agent "SeznamBot" spam_crawler
        SetEnvIfNoCase User-Agent "BLEXBot" spam_crawler
        SetEnvIfNoCase User-Agent "Bytespider" spam_crawler
        SetEnvIfNoCase User-Agent "DataForSeoBot" spam_crawler
        SetEnvIfNoCase User-Agent "serpstatbot" spam_crawler
        SetEnvIfNoCase User-Agent "SeekportBot" spam_crawler
        SetEnvIfNoCase User-Agent "index.community crawler" spam_crawler
        SetEnvIfNoCase User-Agent "PetalBot" spam_crawler
     <RequireAll>
      Require all granted
      ##スパムクローラーを拒否
      Require not env spam_crawler
        #偽装エージェントを拒否
        Require not ip 190.92.0.0/16
        Require not ip 159.138.0.0/16
        Require not ip 166.108.0.0/16
        Require not ip 124.243.0.0/16
        Require not ip 114.119.0.0/16
        Require not ip 119.8.0.0/16
        Require not ip 110.238.0.0/16
        Require not ip 217.113.194.0/24
        Require not ip 34.123.0.0/16
     </RequireAll>
    ## 設定ファイルのアクセス拒否
     <Files wp-config.php>
      Require all denied
     </Files>
     <Files xmlrpc.php>
      Require all denied
     </Files>
     ## キャッシュを有効
     ExpiresActive On
     ExpiresByType image/jpg "access plus 1 year"
     ExpiresByType image/jpeg "access plus 1 year"
     ExpiresByType image/gif "access plus 1 year"
     ExpiresByType image/png "access plus 1 year"
     ExpiresByType text/css "access plus 1 month"
     ExpiresByType application/pdf "access plus 1 month"
     ExpiresByType text/x-javascript "access plus 1 month"
     ExpiresByType application/x-shockwave-flash "access plus 1 month"
     ExpiresByType image/x-icon "access plus 1 year"
     ExpiresDefault "access plus 2 days"
    </Directory>
     <Files xmlrpc.php>
      Require all denied
     </Files>

は運用に合わせて無効化の可否を決めてください。

  1. モバイルアプリからのリモート投稿ができなくなります。
  2. ピンバックとトラックバックを受け付けることができなくなります。
  3. Jetpackの一部機能が動作しなくなります。
  4. その他、リモート投稿や自動投稿のプラグインが影響を受けます。

編集後、

diff -u /path/to/backup/directory/wordpress.conf.$(date +%Y%m%d) /etc/apache2/sites-avaiable/wordpress.conf

として、上記の差分が出ることを確認します。

設定反映

  • 設定有効
sudo a2ensite wordpress.conf

→ 一時的に無効にしている場合

  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Apache2再起動
sudo systemctl restart apache2.service

その後、Wordpressが正常に閲覧できることを確認します。

確認後、追加のセキュリティ設定を行わないのであれば、

sudo a2dissite wordpress.conf
sudo systemctl restart apache2.service

として、無用な攻撃を防ぎます。

Ubuntu 24.04にWordPressをインストール。

概要

CMSの代名詞、Wordpressをきちんとした手順で書いていなかったのでこの機会にメモを残します。

手順が比較的簡単なだけに狙われやすいのも納得。

なので、ここではインストールだけではなく、セキュリティ対策を含めて実施します。

環境

  • Ubuntu 24.04
  • Apache 2.4
  • MySQL
  • PHP 8.3

前提

  • Apacheの初期設定は完了しています。
  • mod_securityが稼働しています。
  • 適切に名前解決できることが条件です。(DNS設定済み)
  • 証明書は適切なものを準備済みです。

さっくりとした手順

  1. WordPress用のデータベースを作成します。
  2. WordPressのプログラムを配置します。
  3. WordPressをWebサービスで動かす設定を行います。
  4. WordPressをブラウザでインストールします。
  5. インストール後、一度、設定を解除します。

※Wordpressは非常に狙われやすいWebアプリです。そのため、安定稼働するまでは設定をするたびにWebサービスから切り離します。

DB作成

  • MySQLログイン
mysql -u root -p
  • DB作成
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

DB名(mt)は自分の環境に合わせます。

  • ユーザー作成
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'your_password';

ユーザー(wpuser)やパスワードは自分の環境に合わせます。適正なパスワードを設定してください。

  • 権限委譲
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
  • 設定反映、MySQLログアウト
FLUSH PRIVILEGES;
exit

作成したDB確認

  • MovableTypeのユーザーでログイン
mysql -u wpuser -p
  • DB確認
SHOW DATABASES;

WordPressのDBがあることを確認します。

  • DB切り替え
use wordpress;
  • DBの文字コード確認
SHOW VARIABLES LIKE 'character_set_database';

Valueutf8mb4であることを確認

  • DBの照合順序確認
SHOW VARIABLES LIKE 'collation_database';

Valueutf8mb4_binであることを確認

exit

WordPress取得

  • 作業ディレクトリに移動
cd /hoge && pwd

任意のディレクトリを指定します。

  • wget
wget https://wordpress.org/latest.tar.gz
  • ファイルの解凍
tar -xzvf latest.tar.gz
  • ファイルの所有権変更
sudo chown -R www-data:www-data wordpress
  • www-dataディレクトリに移動
sudo mv wordpress /home/www-data/wordpress

自分の環境に合わせます。

WordPressWebサイト設定編集

ログ格納用のディレクトリ作成

  • ログ格納ディレクトリ作成
sudo mkdir -p /var/log/wordpress
  • ログ格納ディレクトリの所有者変更
sudo chown www-data:www-data /var/log/wordpress

WordPressのバーチャルサイト作成

  • /etc/apache2/site-available配下に、wordpress.confを管理者権限で作成し、以下のように編集していきます。
<VirtualHost *:80>
    # ドメイン名を指定します
    servername hoge.example.com
    # HTTPアクセスを強制的にHTTPSにリダイレクトします
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
    # ドメイン名を指定します
    ServerName hoge.example.com
    CustomLog /var/log/wordpress/wp_access.log combined
    ErrorLog /var/log/wordpress/wp_error.log


    # WordPressを配置したディレクトリを指定します。
    DocumentRoot /home/www-data/wordpress
    <Directory /home/www-data/wordpress>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    #セキュリティヘッダー付与

    Header always set Strict-Transport-Security "max-age=63072000"
    Header set X-Content-Type-Options "nosniff"
    Header always append X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"


#SSL設定
  SSLEngine on
    Protocols h2 http/1.1
    SSLCertificateFile /path/to/ssl/certificate.crt
    SSLCertificateKeyFile /path/to/ssl/private.key
   # 証明書と秘密鍵のパスを指定します

    # Mod_Security設定
    SecRuleEngine DetectionOnly
    # Webでインストールを行うため、最初は検知モードに設定します。
    ## ファイルのアップロードをできるようにします。
    SecRequestBodyInMemoryLimit 524288000
    SecRequestBodyLimit 524288000

    ## テスト用の検知パラメーター
    SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"


</VirtualHost>

# これらのセクションはSSL暗号化強度を高めるための記述です
# </VirtualHost>の外側に書くことにご注意ください

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

設定ファイル有効化

  • コンフィグ読み込み
sudo a2ensite wordpress.conf
  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Webサービス再起動
sudo systemctl restart apache2.service
  • Webサービス再起動確認
systemctl status apache2.service

ブラウザから確認

ブラウザで設定したURLにログインします。

インストール画面が出てきます。言語を選びContinueをクリックします。

ボタンをクリックします。

設定したDB名、ユーザー、パスワードを入力します。

DBと接続されると、以下が表示されます。インストール実行をクリックします。

サイト名などを入れていきます。

ここまで出たらOKです。

インストール後の処理(一時停止)

圧倒的なシェアを誇るWordpressは攻撃者が真っ先に狙うサービスです。
そのため、安定稼働するまでは確認後に一度停止して、物理的なアクセスを防ぎます。

  • バーチャルサイトの設定ファイル無効化
sudo a2dissite wordpress.conf
  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Webサービス再起動
sudo systemctl restart apache2.service
  • Webサービス再起動確認
systemctl status apache2.service

無効化後、上記の設定ファイルで指定したURLにアクセスできないことを確認します。

WordPress改修。(プラグインの見直し)

自分のWordpressを見直すことにしました。

やったこと

  • JetPackからの脱却
  • よく読まれている記事セクションの追加
  • 自動TOC作成の改善
  • 問い合わせフォームの追加

JetPackからの脱却

強力な機能であることには間違いないのですが、以下の理由により脱却です。

  • X(Twitter)と連携されなくなった
    • 割と重めのウェイトです。2023年のゴタゴタで更新時に反映されなくなったので、使う理由がほぼなくなりました。
  • アクセス解析がうまくいっている
    • Web解析システムMatomoの導入により、JetPackの解析機能は代替できると判断です。

脱却の手順

先人の知恵に頼りました。

https://iyusuke.net/jetpack-goodbye/

  1. 脱JetPack
  2. SiteGuardプラグインによるセキュリティ強化

を同時に行いました。

よく読まれている記事セクションの追加

これは1ヶ月ほど前から導入。

こちらを入れました。

サイトの右ペインに、人気記事が自動的に表示されるようになりました。

自動TOC作成の改善

記事冒頭に作られる目次作成、前は別のプラグインを使っていたものの、Wordpress自体のバージョンと合わなくなったのかうまく機能しなくなりました。

そこで、こちらに差し替え。今のところうまくいっています。

問い合わせフォームの追加

先ほどの脱JetPackの記事にあったものをそのまま利用。各種設定を行いました。

改修によって

かなり動作が軽くなりました。「ちょっともっさりしているかな?」思っていたWordpressもまだまだチューニングできると思った次第です。

ChatGPTが作成したapacheバーチャルファイル。

2022年12月頃にTwitterで大いに話題となったChatGTP。

https://chat.openai.com/chat

これは文書作成のみならずコードも書けると知ったので早速試してみました。

作成してほしいコード

  • apacheでwordpressを動かすためのコンフィグ。
  • httpアクセスをhttpsにリダイレクトする。
  • アクセスログとwordpressのプログラムの格納場所は指定。

質問した内容

以下の文章をChatGPTに入力しました。

apacheでwordpressを公開するためのバーチャルサイトのコンフィグを作成してください。
サーバはUbuntu22.04です。apacheとmod_sslは導入済みです。
ドメインはweblog.example.comです。
wordpressは/home/www-virtual/wordpressに格納されています。
アクセスログは/var/log/apache2/weblog.example.comを指定します。
httpアクセスを強制的にhttpsにリダイレクトし、TLS1.2のみを有効化します。
wp-adminディレクティブは192.168.1.0/24以外アクセスできないようにします。

返ってきた内容

結論から言って驚きの結果でした。


まず、/etc/apache2/sites-available/weblog.example.com.confという名前のファイルを作成します。 次に、以下の内容を記述します:

<VirtualHost *:80>
    ServerName weblog.example.com
    DocumentRoot /home/www-virtual/wordpress
    ErrorLog /var/log/apache2/weblog.example.com/error.log
    CustomLog /var/log/apache2/weblog.example.com/access.log combined
    <Directory /home/www-virtual/wordpress>
        Require all granted
    </Directory>
</VirtualHost>

次に、SSL用のバーチャルサイトの設定を追加します。

<VirtualHost *:443>
    ServerName weblog.example.com
    DocumentRoot /home/www-virtual/wordpress
    ErrorLog /var/log/apache2/weblog.example.com/ssl-error.log
    CustomLog /var/log/apache2/weblog.example.com/ssl-access.log combined
    SSLEngine on
    SSLCertificateFile /path/to/your/certificate.crt
    SSLCertificateKeyFile /path/to/your/privatekey.key
    SSLProtocol TLSv1.2
    <Directory /home/www-virtual/wordpress>
        Require all granted
    </Directory>
    <Location "/wp-admin/">
        Require ip 192.168.1.0/24
    </Location>
</VirtualHost>

最後に、httpアクセスをhttpsにリダイレクトするために、mod_rewriteモジュールを有効化し、以下の設定を追加します。

<VirtualHost *:80>
    ServerName weblog.example.com
    DocumentRoot /home/www-virtual/wordpress
    ErrorLog /var/log/apache2/weblog.example.com/error.log
    CustomLog /var/log/apache2/weblog.example.com/access.log combined
    <Directory /home/www-virtual/wordpress>
        Require all granted
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </Directory>
</VirtualHost>

これで、バーチャルサイトの設定が完了しました。

注意: 上記の設定は一例であり、適切な設定はサイトの状況や環境によって異なります。また、必要に応じて、この設定をカスタマイズしてください。


注文通りです。想定通りの動きになるのはほぼ間違いないです。(後で検証したいぐらいです)これに付け加えるならば、

sudo a2ensite weblog.example.com.conf
sudo apache2ctl configtest
# Syntax OKを確認します
sudo systemctl restart apache2.service

ぐらいでしょう。

今後の各種サーバ設定に大いに貢献する予感です。

Powered by WordPress & Theme by Anders Norén