「PC」カテゴリーアーカイブ

サーバーダウンの原因はSSHブルートフォース攻撃

本日、またWebサーバがダウンしました。。
WebサーバへのDoS攻撃対策は入れていたのに、落ちてしまっていて原因を探っていましたところ、sshdへのブルートフォース攻撃(総当たり攻撃)っぽいことがわかりました。

現在使用しているインスタンスは、CPUの使用率が連続稼働で5%しか許容できない3.5USDの最弱サーバーなので、攻撃によりCPUの使用制限に引っかかったようです。また、メモリもSwapを4GBにも盛っていたにも関わらず、3GB近辺まで消費していて余力がなくなっていました。以下のように、恐ろしいほどの数のsshdへの不正アクセスログが出てきます。サーバーが落ちた時近辺のログを抜粋。error: maximum authentication attempts… と限界までやられてますね。。

# cat /var/log/secure
-----------------------
.
.
Jan 19 22:21:22 ip-172-26-2-122 sshd[22274]: Invalid user duci from 138.68.52.165 port 54352
Jan 19 22:21:22 ip-172-26-2-122 sshd[22274]: input_userauth_request: invalid user duci [preauth]
Jan 19 22:21:22 ip-172-26-2-122 sshd[22274]: Received disconnect from 138.68.52.165 port 54352:11: Bye Bye [preauth]
Jan 19 22:21:22 ip-172-26-2-122 sshd[22274]: Disconnected from 138.68.52.165 port 54352 [preauth]
Jan 19 22:21:33 ip-172-26-2-122 sshd[22276]: Invalid user maira from 115.68.226.80 port 53362
Jan 19 22:21:33 ip-172-26-2-122 sshd[22276]: input_userauth_request: invalid user maira [preauth]
Jan 19 22:21:33 ip-172-26-2-122 sshd[22276]: Received disconnect from 115.68.226.80 port 53362:11: Bye Bye [preauth]
Jan 19 22:21:33 ip-172-26-2-122 sshd[22276]: Disconnected from 115.68.226.80 port 53362 [preauth]
Jan 19 22:25:33 ip-172-26-2-122 sshd[22288]: Did not receive identification string from 122.114.182.72 port 41403
Jan 19 22:31:34 ip-172-26-2-122 sshd[22518]: Did not receive identification string from 185.54.152.230 port 59533
Jan 19 22:31:50 ip-172-26-2-122 sshd[22519]: Connection closed by 114.88.195.48 port 39790 [preauth]
Jan 19 22:36:44 ip-172-26-2-122 sshd[22524]: Invalid user ftp_user from 156.236.72.23 port 35273
Jan 19 22:36:49 ip-172-26-2-122 sshd[22524]: input_userauth_request: invalid user ftp_user [preauth]
Jan 19 22:36:50 ip-172-26-2-122 sshd[22524]: Received disconnect from 156.236.72.23 port 35273:11: Normal Shutdown, Thank you for playing [preauth]
Jan 19 22:36:51 ip-172-26-2-122 sshd[22524]: Disconnected from 156.236.72.23 port 35273 [preauth]
Jan 19 22:36:51 ip-172-26-2-122 sshd[22526]: error: maximum authentication attempts exceeded for root from 211.179.46.250 port 52180 ssh2 [preauth]
Jan 19 22:36:52 ip-172-26-2-122 sshd[22526]: Disconnecting: Too many authentication failures [preauth]

 

大変お恥ずかしながら、手抜きでSSHポートを標準の22番のままにしていたのでこのような事態になってしまっていました。お作法通り、修正してとりあえず様子を見ます。

# vi /etc/ssh/sshd_config
----------------------------------
.
.
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port ****
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
.
.
----------------------------------
:wq
# semanage port -a -t ssh_port_t -p tcp ****
# systemctl restart sshd
# exit
$ exit

Lightsailのネットワーク設定のほうも、TCP ****番ポートの開放を忘れないように。

Apache2.4へのDoS攻撃(F5アタック)対策

Webサーバが貧弱すぎて、単純なDoS攻撃(F5アタック)でもダメージを受けることがわかりましたので、mod_dosdetecterを使った、連続アクセス防止対策を入れてみました。

1. apxをインストール

サブのhttpdはiusリポジトリから入れているので、apxが含まれるhttpd-develもiusからインストールします。

# yum --disablerepo=base,extras,updates --enablerepo=ius -y install httpd-devel

2. mod_dosdetector.so のインストール

apxのパスがデフォルトと違うので、Makefileを修正してからインストールします。

# cd /usr/local/src/
# git clone https://github.com/stanaka/mod_dosdetector.git
# cd mod_dosdetector/
# vi Makefile
-------------------------------------
.
.
#   the used tools
#APXS=/usr/sbin/apxs
APXS=/bin/apxs
.
.
-------------------------------------
:wq
# make install

3. mod_dosdetector.so のロード

httpd.confを修正して、mod_dosdetector.soをロードします。

# vi /usr/local/httpd2/conf/httpd.conf
-------------------------------------
.
.
LoadModule dosdetector_module /usr/lib64/httpd/modules/mod_dosdetector.so
.
.
------------------------------------
:wq

4. DoS対策するバーチャルホスト設定

DoS対策するバーチャルホスト内に、dosdetectorの設定を追記します。

# vi /usr/local/httpd2/conf/extra/httpd-vhost-https.conf
-------------------------------------
<IfModule mod_ssl.c>
<VirtualHost *:443>
.
.
.
    # for dosdetector
    DoSDetection on
    DoSPeriod 10
    DoSThreshold 30
    DoSBanPeriod 60
    DoSTableSize 100
    RewriteEngine On
    RewriteCond %{ENV:SuspectDoS} =1
    RewriteRule .*  - [R=503,L]
    ErrorDocument 503 "<h1>Sorry, ji0vwl.net is busy.. Please access later.</h1>"
</VirtualHost>
</IfModule>
------------------------------------
:wq
# systemctl reload httpd2

Apache+WordPress サーバーが落ちるので定期的に再起動させてみた

Blog用WebサーバーをLightsailに引っ越しして2週間くらい動かしましたが、メモリリークを起こして度々止まっていることがあります。いままで使っていたさくらのVPS CentOS6+Apache2.2は月に2回SSL証明書の更新処理のついでに再起動するだけで安定稼働していたのですが、今回は1日持たずに落ちていることがあり、どうも不安定です。

根本原因がわからないので、暫定策として以下を実施することにします
・Swapメモリを2GB→4GBに増加
・1時間に1回 httpdのgracefulリロード
・1日に1回 httpdのgracefulリロード後、Swapメモリのクリア、メモリ状況を自分宛にメール

知らなかったのですが、restartとgracefulは動きが違うようで、restartは強制的に再起動、gracefulは現在の処理が終わってから安全に再起動できるということで、毎時gracefulを実行することにしてみました。これでしばらく様子を見てみます。

1. 2GB Swap削除、4GB Swap再作成

$ sudo -i
# swapoff /swapfile
# rm /swapfile
# dd if=/dev/zero of=/swapfile bs=1M count=4096
# mkswap /swapfile
# swapon /swapfile
# chmod 600 /swapfile

2. cronで定時reload(graceful)処理追加

※注:私のhttpd2は reload = gracefulの動作をする設定です。

# vi /etc/cron.d/dailyjobs
-----------------------------------
.
.
# run-parts
00 * * * * root /bin/systemctl reload httpd2
05 3 * * * root /bin/systemctl reload httpd2 && swapoff -a && swapon -a && free -h
.
.
-----------------------------------
:wq
# systemctl restart crond

 

HTTP/2を有効にするためにApache2.4.37のMPMはpreforkではなくworker(なぜかeventが無い・・・要調査)で動かしているのですが、チューニングが必要かもしれません。

おまじないで、mpm_workerの設定をちょっと修正。数値に根拠はありません。

# vi /usr/local/httpd2/conf/extra/httpd-mpm.conf
-----------------------------------
.
.
<IfModule mom_worker_module>
    StartServers             1
    MinSpareThreads         25
    MaxSpareThreads        100
    ThreadsPerChild         25
    MaxRequestWorkers      100
    MaxConnectionsPerChild 2000
</IfModule>
.
.
------------------------------------
:wq
# systemctl reload httpd2

レンタルサーバーみたいにWebサーバーを安定的に維持運用するのって、すごい事なんだなぁ・・・と感じる今日この頃です。

WordPressのサイトURLを強制的に修正する

別URLの開発環境で確認を完了してから、本番URLに差し替えたいときに必ずハマるWordPressのサイトURL問題。ご丁寧にサイトURLをDB内に持っていて、一時的に別URLで動かしてから元に戻したい場合に、なかなかうまくいきません。

やり方をググるとダメな例ばかり引っかかるので、うまくいった例を載せておきます。

ダメな例(defineを使う)

これでも一応動いてログインできますが全ての参照が上書きされるわけではなく、一部DBに保存されているURLも参照されてしまうため、あまりよく無いです。しかも、設定のサイトURLがグレーアウトしてしまい修正できません。

$ vi /var/www/html/wp-config.php
-----------------------------------------------------
.
.
# 一時URL(ダメな例)
define('WP_HOME','https://example.com');
define('WP_SITEURL','https://example.com');

/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
        define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
-----------------------------------------------------
:wq

 

うまくいった例(update_optionを使う)

update_optionを使うと、設定のサイトURLがグレーアウトせずに修正することができました。これはサイトURLを間違えてしまい二度とログインできなくなって困ってしまったときにも有効かと思います。require_onceよりも下、つまりwp-config.phpの一番下に追加してください。

$ vi /var/www/html/wp-config.php
-----------------------------------------------------
.
.
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
        define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

# 一時URL
update_option( 'siteurl','https://example.com');
update_option( 'home','https://example.com');
-----------------------------------------------------
:wq

Apache2.4.37 + OpenSSL1.1.1aをソースからインストール

CentOS7にApache2.4.37+OpenSSL1.1.1a+PHP7.3.0をソースからインストール

そのうちOpenSSL 1.1.1を入れてTLS 1.3に対応したいなぁと思いながらも、OpenSSLはいろいろな環境との結びつきが強すぎて難易度が高く諦めていたのですが、せっかくなのでAWSを使っているメリットを生かし、本番環境のスナップショットからクローンインスタンスを作り、開発環境としていじり倒してみました。今回はSTEP3に挑戦です。

STEP1. OS標準リポジトリからyumで環境を作る
STEP2. IUSやRemi等の拡張リポジトリからyumで環境を作る
STEP3. ソースからビルドして環境を作る

 

最悪いつでも戻せるように、もともと動かしているSTEP2のWebサーバ環境は「httpd」として残しつつつ(これが大事)、STEP3の環境として新たに追加で/usr/local配下に「httpd2」を作ってみることにします。

1. OpenSSL 1.1.1a を /usr/local/ssl にインストール

$ sudo -i
# yum -y groupinstall base
# yum -y groupinstall development
# yum -y update
# yum -y install zlib-devel
# yum -y install perl-core
# cd /usr/local/src/
# wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
# tar xvfz openssl-1.1.1a.tar.gz
# cd openssl-1.1.1a
# ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
# make depend
# make
# make test
# make install
# ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /lib64/libcrypto.so.1.1
# ln -s /usr/local/ssl/lib/libssl.so.1.1 /lib64/libssl.so.1.1
# /usr/local/ssl/bin/openssl version
# echo /usr/local/ssl/lib > /etc/ld.so.conf.d/openssl111a.conf
# ldconfig
# /usr/local/ssl/bin/openssl ciphers -v TLSv1.3

2. Apache 2.4.37 を /usr/local/httpd2 にインストール

aprとapr-utilもソースから入れられますが、今回はyumで入れちゃいます。ついでにnghttp2も入れてHTTP/2にも対応しておきます。

# yum -y install libnghttp2-devel
# yum -y install apr-devel apr-util-devel

–with-ssl=[dir]を指定することで、ApacheとOpenSSLを結びつけます。

# cd /usr/local/src/
# wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.37.tar.gz
# tar xvzf httpd-2.4.37.tar.gz
# cd httpd-2.4.37/
# ./configure \
   --prefix=/usr/local/httpd2 \
   --enable-http2 \
   --enable-ssl \
   --with-ssl=/usr/local/ssl \
   --enable-so \
   --enable-mods-shared=reallyall \
   --enable-mpms-shared=all 
# make
# make install

インストールされたらApacheの設定。httpd.confの該当箇所を有効化、追記・修正します。

# cd /usr/local/httpd2/conf
# vi httpd.conf
-----------------------------------------
# for HTTP/2 MPM worker(なぜかeventが無い・・・)
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
# for HTTPS
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
# for HTTP/2
LoadModule http2_module modules/mod_http2.so
# for VirtualHost
LoadModule vhost_alias_module modules/mod_vhost_alias.so
# for Rewrite
LoadModule rewrite_module modules/mod_rewrite.so
# for php-fpm
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_module modules/mod_proxy.so
.
.
User apache
Group apache
.
.
<IfModule dir_module>
    # index.php追加(WordPressに必要)
    #DirectoryIndex index.html
    DirectoryIndex index.html index.php
</IfModule>
.
.
# php追加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
.
.
Include conf/extra/httpd-mpm.conf
.
.
# Virtual hosts(http用、https用は分けて設定します)
#Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-vhosts-http.conf
Include conf/extra/httpd-vhosts-https.conf
.
.
Include conf/extra/httpd-ssl.conf
-----------------------------------------
:wq

HTTPSの設定。httpd-ssl.confを以下のように追記・修正します。せっかくなのでより安全なTLS 1.2、TLS 1.3だけに対応します。

# cd extra
# vi httpd-ssl.conf
-----------------------------------------
.
.
# 常時SSL
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff
.
.
# 明示的にSSL圧縮をOFF
SSLCompression off
.
.
SSLCipherSuite "TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES256-SHA \
DHE-RSA-AES256-SHA256"

SSLProxyCipherSuite "TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES256-SHA \
DHE-RSA-AES256-SHA256"
.
.
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1
.
.
# for OCSP
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)
.
.
#ServerName www.example.com:443
#ServerAdmin you@example.com
.
.
SSLEngine on
    #Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ji0vwl.net/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/ji0vwl.net/chain.pem
.
.
#SSLCertificateFile "/usr/local/httpd2/conf/server.crt"
.
.
#SSLCertificateKeyFile "/usr/local/httpd2/conf/server.key"
-----------------------------------------
:wq

HTTPバーチャルホストの設定

# vi httpd-vhosts-http.conf
-----------------------------------------
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName test.ji0vwl.net

    <Directory "/var/www/html/">
        Options FollowSymlinks Includes
        AllowOverride All
        AddType text/html .html
        Require all granted
    </Directory>
    
    # HTTPSにリライトする場合はコメントアウト解除
    #RewriteEngine on
    #RewriteCond %{SERVER_NAME} =test.ji0vwl.net
    #RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
-----------------------------------------
:wq

HTTPSバーチャルホストの設定

# vi httpd-vhosts-https.conf
-----------------------------------------
<IfModule mod_ssl.c>
<VirtualHost *:443>
    DocumentRoot /var/www/html
    ServerName test.ji0vwl.net
    
    # HTTP/2有効化(h2追加)
    Protocols h2 http/1.1

    <Directory "/var/www/html/">
        Options FollowSymlinks Includes
        AllowOverride All
        AddType text/html .html
        Require all granted
    </Directory>

    # SSL証明書
    #Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ji0vwl.net/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/ji0vwl.net/chain.pem
</VirtualHost>
</IfModule>
-----------------------------------------
:wq

3. Apache 2.4.37 を httpd2.service に登録

STEP2では「systemctl start httpd」とやって起動していましたが、追加で入れたApache2.4.37も同様に「systemctl start httpd2」で起動できるように、httpd2 という名前のサービスとして登録します。reload=graceful動作です。

 # vi /etc/systemd/system/httpd2.service
-----------------------------------------
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/httpd2/bin/apachectl start
ExecReload=/usr/local/httpd2/bin/apachectl graceful
ExecStop=/usr/local/httpd2/bin/apachectl stop
 
[Install]
WantedBy=multi-user.target
-----------------------------------------
:wq
# systemctl daemon-reload
# systemctl list-unit-files | grep httpd2

4. PHP 7.3.0 を /usr/local/php にインストールする

–with-apxs2=[dir]でPHPとApacheを、–with-openssl=[dir]でPHPとOpenSSLを、–with-mysql-sock=[dir]でPHPとmySQLを結びつけます。じつはOpenSSLよりもPHPの方が他との結合が多く、難関でした。。

# cd /usr/local/src
# yum -y install libxml2-devel systemd-devel libpng-devel
# wget http://jp2.php.net/get/php-7.3.0.tar.gz/from/this/mirror -O /usr/local/src/php-7.3.0.tar.gz
# tar -xvzf php-7.3.0.tar.gz
# cd php-7.3.0
# ./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd2/bin/apxs \
--with-openssl=/usr/local/ssl \
--with-mysql-sock=/var/lib/mysql/mysql.sock \
--with-mysqli \
--with-pdo-mysql \
--enable-mbstring \
--with-gd \
--with-zlib \
--with-fpm-systemd \
--with-fpm-user=apache \
--with-fpm-group=apache \
--enable-fpm
# make
# make install

5. STEP2のhttpdを停止し、今入れたSTEP3のhttpd2を起動して完成!

# systemctl stop httpd
# systemctl disable httpd
# systemctl start httpd2
# systemctl enable httpd2

 

 

httpd2を起動してSSL LabsでHTTPSの検証を行ったところ。まだ開発環境での動作確認レベルですが、Apache 2.4.37/OpenSSL 1.1.1a/PHP 7.3.0の環境にて、今現在最新のTLS 1.3の対応が確認できました!

Apache-OpenSSL-PHPの結びつきが強固すぎて、OpenSSLを入れ替えるとApacheやPHPもビルドし直さなければならず、動作させるのに非常に苦労しました。もう少しいじってみて、安定動作が確認できたら本番環境にも入れてみようかと思います。

今まではVPS1台だったので危ない橋(yum以外のインストール)は渡れませんでしたが、AWSなら好きに開発環境を作って、誤って壊しちゃっても潰して作り直せば良いのでとても気が楽になりました。サーバの勉強には最適ですね。

 


追記

本番環境に反映させる場合は、Let’s EncryptのSSL証明書更新後のreloadをhttpd2に変更するのを忘れずに!

# vi /etc/cron.d/dailyjobs
-------------------------------
.
.
# run-parts
0 3 1 * * root /bin/certbot renew --force-renew --rsa-key-size 4096 --post-hook "systemctl reload httpd2"
.
.
-------------------------------
:wq
# systemctl restart crond

Lightsail にWordPressを入れる(その4)

WordPressのテーマにTwentyFourteenを使用してみましたが、記事の幅が狭いので、子テーマを作って幅を広げてみます。

標準の幅 (Before)

拡張した幅 (After)

1. TwentyFourteenの子テーマを作る

/wp-content/theme/ディレクトリに、子テーマの空フォルダを作ります。

$ cd /var/www/html/wp-content/themes/
$ mkdir twentyfourteen-ji0vwl
$ cd twentyfourteen-ji0vwl

テンプレート: twentyfourteenを引き継いだ、名称: Twenty Fourteen JI0VWLの style.cssを作ります。幅800、ついでにpreの等幅フォント化と、大文字表示しないように修正。

$ vi style.css
--------------------------------
/*
Theme Name: Twenty Fourteen JI0VWL
Template: twentyfourteen
*/

@import url('../twentyfourteen/style.css');

/* pre等幅フォント */
.entry-content pre {
  font: normal 9pt Consolas, Monaco, monospace, "Courier New";
  white-space: pre;
  overflow: auto;
  background-color: #fffffa;
}

/* コンテンツの幅を拡げる 474px->800px */
.site-content .entry-header,
.site-content .entry-content,
.site-content .entry-summary,
.site-content .entry-meta,
.page-content {
max-width: 800px;
}
.post-navigation,
.image-navigation {
max-width: 800px;
}
.archive-header,
.page-header {
max-width: 800px;
}
.contributor-info {
margin: 0 auto;
max-width: 800px;
}
.comments-area {
max-width: 800px;
}
.site-main .mu_register,
.widecolumn > h2,
.widecolumn > form {
max-width: 800px;
}

/* タイトルが大文字にならないようにする */
button,
.button,
input[type="button"],
input[type="reset"],
input[type="submit"] {
  text-transform: none;
}
.site-navigation a {
  text-transform: none;
}
.entry-title {
  text-transform: none;
}
.entry-meta {
  text-transform: none;
}
.cat-links {
  text-transform: none;
}
.entry-meta .tag-links a {
  text-transform: none;
}
.entry-content th,
.comment-content th {
  text-transform: none;
}
.entry-content .edit-link {
  text-transform: none;
}
.page-links {
  text-transform: none;
}
.post-navigation .meta-nav {
  text-transform: none;
}
.paging-navigation .page-numbers {
  text-transform: none;
}
.comment-reply-title,
.comments-title {
  text-transform: none;
}
.comment-list .reply,
.comment-metadata {
  text-transform: none;
}
.no-comments {
  text-transform: none;
}
.comment-navigation {
  text-transform: none;
}
.widget .widget-title {
  text-transform: none;
}
.widget_calendar caption {
  text-transform: none;
}
.widget_twentyfourteen_ephemera .post-format-archive-link {
  text-transform: none;
}
.content-sidebar .widget .widget-title {
  text-transform: none;
}
.featured-content .entry-title {
  text-transform: none;
}
.primary-navigation {
  text-transform: none;
}
--------------------------------
:wq

投稿用エディタの幅も増やすため、/wp-content/themes/twentyfourteen-ji0vwl/ 配下に /css/ディレクトリを作り、中にeditor-style.cssを作ります。

$ mkdir css
$ vi ./css/editor-style.css
--------------------------------
html .mceContentBody {
  max-width: 800px;
}
img {
  max-width: 800px;
}
.wp-caption {
  max-width: 800px;
}
--------------------------------
:wq

2. 子テーマを割り当てる

外観ーテーマに追加した子テーマ(Twenty Fourteen JI0VWL)が追加されているので、選択して有効化します。

これで記事の幅が広がり、とくに<pre>タグでくくってある横に長い文字列が見やすくなりました。

Lightsail にWordPressを入れる(その3)

つづいて、Let’s EncryptのSSL証明書を自動更新できるように設定します。

$ sudo -i
# yum -y install cronie-noanacron
# yum -y remove cronie-anacron

毎月1日、03:00に強制更新

# vi /etc/cron.d/dailyjobs
-------------------------------
# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=xxxx@ji0vwl.com

# run-parts
0 3 1 * * root /bin/certbot renew --force-renew --rsa-key-size 4096 --post-hook "systemctl reload httpd"
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
-------------------------------
:wq


#  systemctl restart crond

cron実行後、メールが来るようにする

# vi /etc/postfix/main.cf
-------------------------------
...
mydomain = ji0vwl.net
...
myorigin = $mydomain
...
mydestination = $mydomain
...
-------------------------------
:wq

# systemctl restart postfix

CentOS6では crontab -e でいけましたが、CentOS7でやり方が変わっていて若干ハマりました。

Lightsail にWordPressを入れる(その2)

続いてSSHログインして、ガシガシと入れていきます。

標準リポジトリからのyumだと古いものしか入らないので、普通に入れてしまうと以下のようになってしまいます。

Linux OS: CentOS 7.6.1810
Webサーバ: Apache 2.4.6
データベース: MariaDB 5.5.60
PHP: PHP 5.4.16
WordPress: WordPress 4.9.8

ここでは、remiリポジトリなどの拡張リポジトリからyumで入れる方法をとって、最新ではないですが少しでも新しいものを入れてみます。

1. SSHログインして、epelリポジトリ、remiリポジトリ、iusリポジトリをインストール
$ ssh ji0vwl-aws (configで設定済みの前提)

$ sudo -i
# timedatectl set-timezone Asia/Tokyo
# yum -y update
# yum -y install epel-release
# yum -y install "http://rpms.famillecollet.com/enterprise/remi-release-7.rpm"
# yum -y install "https://centos7.iuscommunity.org/ius-release.rpm"
# yum -y install mailcap git wget net-tools bind-utils
2. Apache2.4.35、mod_sslをインストール、設定
# systemctl stop httpd
# yum remove httpd
# yum remove httpd-tools
# yum --disablerepo=base,extras,updates --enablerepo=ius -y install httpd
# yum -y install openldap-devel expat-devel
# yum --disablerepo=base,extras,updates --enablerepo=ius -y install mod_ssl
# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.old
# vi /var/www/html/index.html
-----------------------
<h1>ji0vwl.net</h1>
-----------------------
:wq
# chown -R apache:apache /var/www/html
# chmod -R 755 /var/www/html
# setenforce 0
# vi /etc/selinux/config
-----------------------
...
SELINUX=permissive
...
-----------------------
:wq

HTTPバーチャルホストの設定

# vi /etc/httpd/conf.d/vhost-http.conf
-----------------------
<VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName ji0vwl.net

  <Directory "/var/www/html/">
    Options FollowSymlinks Includes
    AllowOverride All
    AddType text/html .html
    Require all granted
  </Directory>

  # HTTP -> HTTPS リライトするときはコメントアウト解除
  #RewriteEngine on
  #RewriteCond %{SERVER_NAME} =ji0vwl.net
  #RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
-----------------------
:wq
# systemctl start httpd.service
# systemctl enable httpd.service
3. Let’s EncryptでSSL証明書を取得、HTTPS設定

Let’s Encryptのインストール

# yum -y install certbot python-certbot-apache
# certbot
...

HTTPSバーチャルホストの設定

# vi /etc/httpd/conf.d/vhost-https.conf
-----------------------
<IfModule mod_ssl.c>
<VirtualHost *:443>
  DocumentRoot /var/www/html
  ServerName ji0vwl.net

    <Directory "/var/www/html/">
        Options FollowSymlinks Includes
        AllowOverride All
        AddType text/html .html
        Require all granted
    </Directory>
  
  # Let's Encrypt 証明書
  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/ji0vwl.net/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/ji0vwl.net/chain.pem
</VirtualHost>
</IfModule>
-----------------------
:wq
4. PHP7.3.00をインストール
# yum -y --enablerepo=epel install libmcrypt
# yum -y remove php-*
# yum -y install --enablerepo=remi,remi-php73 php php-devel php-mbstring php-pdo php-gd php-xml php-mysql php-opcache php-pecl-apcu
# yum -y install php73-php-fpm
# systemctl start php73-php-fpm
# systemctl enable php73-php-fpm
5. mariaDB 10.3.11をインストール、設定
# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
# yum -y install MariaDB-server MariaDB-client
# systemctl start mariadb
# systemctl enable mariadb
# mysql -u root
> update mysql.user set password=password('rootパスワード入力') where # user = 'root';
> flush privileges;
> exit;

WordPress用DB,User,Password作成

# mysql -u root -p
> CREATE DATABASE wordpress_db DEFAULT CHARACTER SET UTF8 DEFAULT COLLATE UTF8_GENERAL_CI;
> CREATE USER 'wordpress_ur'@'localhost' IDENTIFIED BY 'wp用パスワード入力';
> GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress_ur'@'localhost';
> exit;
6. WordPress4.9.8 インストール、設定
# cd /var/www/
# wget https://ja.wordpress.org/wordpress-4.9.8-ja.tar.gz
# tar zxvf wordpress-4.9.8-ja.tar.gz
# mv html/ html_old
# mv wordpress html
# chown -R apache:apache html
# chmod -R 755 html
# cd html
# cp wp-config-sample.php wp-config.php
# vi wp-config.php
-----------------------
...
/** WordPress のためのデータベース名 */
define('DB_NAME', 'wordpress_db');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'wordpress_ur');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'wp用パスワード');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

/* HTTPS化するにはこれを追記する必要がある*/
$_SERVER['HTTPS'] = 'on';
...
-----------------------
:wq
# systemctl restart httpd.service
7. メモリ不足を解消するためにスワップファイルを作成
# dd if=/dev/zero of=/swapfile bs=1M count=2048
# mkswap /swapfile
# swapon /swapfile
# chmod 600 /swapfile
# vi /etc/fstab
-----------------------
...
/swapfile               swap                    swap    defaults        0 0
...
-----------------------
:wq

 

うまく動かなくて、何度も消したり入れたりしたので上記の通りで完璧に動かないかもしれませんが、最終的には以下の環境が入り、このBlogサーバーが稼働を開始しました。

Linux OS: CentOS 7.6.1810
Webサーバ: Apache 2.4.6 → 2.4.35
データベース: MariaDB 5.5.60 → 10.3.11
PHP: PHP 5.4.16 → 7.3.00
WordPress: WordPress 4.9.8 → 5.0.2(自動更新)

Lightsail にWordPressを入れる(その1)

先ほどの記事に書きましたように、LightsailにWordpressを入れて、Blogサーバーを移行しましたので、覚書を残したいと思います。

まずは、Lightsailのインスタンスを作ります。

1. AWSにログインし、Lightsailの画面を開く

AWSアカウントがあることが前提ですが、ログインしてサービス一覧を表示すると、EC2の下に「Lightsail」がありますのでクリックします。

2. Lightsailの画面が出たら、仮想サーバのインスタンスを作成

「インスタンスの作成」ボタンをクリックします。

3. CentOS7を選択

「OSのみ」、「CentOS」を選択、最下部の「インスタンスの作成」をクリックします。WordPressがプリインストールされているインスタンスも作れますが、自分で自由にいじるには素のOSが良いと思います。

ハードウェアスペック

$3.50/月(約400円/月)
512 MB メモリ
1 コアプロセッサ
20 GB SSD ディスク
1 TB 転送/月

4. SSH ログインの設定

作成されたインスタンスにSSHログインするために設定を行います。デフォルトのキーペアができているので、これをダウンロードします。



ダウンロードしたキーペアで、Macのターミナルや、WindowsのTeraTerm等でSSHログインできるように設定します(説明省略)。

5. ネットワークの設定

ネットワークタブから、必要に応じて静的IPを割り当てます。また、初期状態ではSSHとHTTPしかポートが開いていないので、最低限HTTPSのポートを追加で解放します。

これで空っぽの、CentOS7のインスタンスは完成。ターミナルからSSHログインができたら、Apacheなどを入れていきます。

EC2よりは作れる仮想サーバーの種別は少ないですが、SGの設定やEIPの割り当てなど必要な作業が一箇所にまとまっていて、初めてAWSを触る人にはとっつきやすいUIですね。

 

 

BlogサーバーをAWSに引っ越しました

3年半ほどLinuxサーバの勉強のついでにBlogサイトを動かしてきた、さくらインターネットのVPSですが、CentOS6、Apache2.2などとソフトのサポート切れ問題と、ハードの老朽化が進んでいるようでしたので、思い切ってサーバを引っ越しすることにしました。メールサーバやCW Freakランキング集計機能は安定稼働が必要なので、今後も引き続きさくらインターネットのレンタルサーバー(マネージド)上で稼働させます。

引っ越し先は、AWS東京リージョン上のLightsailです。もともとEC2を使ってWordPressをたてようかと考えていたのですが、LightsailというVPSが$3.50/月と、だいぶお安いことに気づきトライしてみました。

ハードウェアスペック

$3.50/月(約400円/月)
512 MB メモリ
1 コアプロセッサ
20 GB SSD ディスク
1 TB 転送/月

今使っている、さくらのVPS 512MB 685円/月 と同等スペックのミニマム構成です。別途構築手順を書こうと思いますが、メモリが少なすぎてDBがすぐにコケることが判明し、SSDの2GB分をスワップメモリに割り当ててなんとか動かしました。(旧Webサイトはまだ旧サーバ上に置きっぱなしですが、そのうち移行予定)

LAMP環境+WordPress

Linux OS: CentOS 7.6.1810
Webサーバ: Apache 2.4.6
データベース: MariaDB 5.5.60
PHP: PHP 5.4.16
WordPress: WordPress 4.9.8(インストール後、5.0.2に自動バージョンアップ)

手抜きでyumで入る環境にしてしまったので全般的にちょっと古いです。Apache 2.4.37, OpenSSL 1.1.1でTLS1.3ハンドシェイクとかやってみたいのですがまたの機会に。

LightsailはWordPressプリインストールのインスタンスも作れるので初心者にとても優しいのですが、HTTPS化やサブドメインを切ったりすることを考えると、ブラックボックスだと逆に面倒なので、自分で素のLinux OSを入れることにします。ほんとはAmazon Linux2で最新環境が良いのですが、Lightsailは安いだけあって旧Amazon Linuxしか選べなかったので、CentOS 7にしました。ほぼEC2と同じ使い方で、EC2の半額程度の低コスト運用ができそうです。