さくらのVPSでWordPressのサイトを立ち上げるまでのメモ

  1. CentOS 8のインストール
  2. VPSにログイン
  3. 一般ユーザーの作成
  4. rootで直接アクセスできないようにする
  5. apacheのインストール
  6. ルートの権限の変更
  7. ポート番号を変更する
  8. 公開鍵の設定
  9. phpをインストールする
  10. MariaDBをインストールする
  11. phpmyadminをインストールする
  12. SSL証明書 Let’s Encryptをインストールする
  13. WordPress用のDBを作成する
  14. SiteGuardを導入する
  15. WordPress管理画面のログインURLを変更する。
  16. 管理者からのアクセスは検査しないように設定する
  17. WordPressのログインIDを変更する
  18. 投稿者アーカイブからユーザー名が分からないようにする
  19. XML-RPC防御の設定を行う

【WordPressにリンクを設定】基本から応用までを徹底解説! ワプ活

 また立ち上げ直さなきゃいけない事もあると思うので、このサイトを作った時のメモをアップしておきます。誰かの役に立つ事もある…といいけど。何度もインストールを繰り返したので下に行くほど私の理解が深まり説明が雑になっていきます。

 参考サイトは数年前の記事なのでCentOS7をインストールするように書いてあるが、CentOSのサポート期限もあるし、お勉強にもなると思ったので新しいOSを入れている。

インストール完了日付:2021年6月6日

  • OS : CentOS8 x86_64
  • php version : 8.0.6
  • phpMyadmin version : 5.1.1
  • 使用したパソコンとソフト:Macbook コンソール、Fillezilla

1.CentOS8のインストール

さくらの講座(ネコでもわかる!さくらのVPS講座 )を参考にサイト構築を進めていく。

・VPSの申し込みを済ませる

・さくらVPSコントロールパネルにログイン  「各種設定」→「OSインストール」→「標準OS」

「OS CentOS8 x86_64」を選択 「スタートアップスクリプトを利用しない」  パケットフィルタにフィルタの用途「Web」を追加  公開鍵の登録「登録しない」

2.VPSにログイン

・Macのターミナルを使用  以下のコマンドでログイン 初回接続はYesを押す

ssh root@xxx.xxx.xxx.xxx

・OSを入れ直したせいかfingerprintが違うと警告が出る。  /.ssh/known_hostsの情報を修正するように書いてあるので、エディタで編集してデータを消す。

# yum update

質問には[y]

3.一般ユーザーの作成

vpsuserの所は任意

# adduser vpsuser

パスワード作成

# passwd vpsuser

一度終了

# exit

作ったユーザーでログイン

$ ssh vpsuser@xxx.xxx.xxx.xxx

rootに変更

$ su -

4.rootで直接アクセスできないようにする

 サーバーを立ち上げた時点で不正アクセスされまくる。1分間に1回など猛烈なアクセス。これではパスワードが解読されるのも時間の問題なのでセキュリティ対策から進める。

ディレクトリ移動。編集前のファイルのバックアップ

# cd /etc/ssh# cp sshd_config sshd_config.old

vimで編集

# vim sshd_config

-bash: vim: command not found
と表示される。つまりvimが入っていないので、下記のサイトを参考にインストールする。参考サイト(初期設定 : Vim の設定 server world)

#dnf -y install vim-enhanced

vimで編集再開。

# vim sshd_config

下記の記述を見つけ出し以下のように変更する。

「変更前」

#PermitRootLogin yes

「変更後」

PermitRootLogin no

sshdを再起動。一度終了

# systemctl restart sshd.service# exit

rootでログインできなくなっている事を確認。

5.Apacheのインストール

Apachを入れるとWebサーバーとして機能するようになる。以下は、rootで作業していく。httpdがapachの事らしい。dはデーモンの略でlinuxの常駐プログラムの事。
参考サイト:デーモンとは 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

# yum install httpd

質問には[y]

httpdを起動

systemctl start httpd

ファイヤウォールサービスはさくらのVPSのコントロール画面のパケットフィルタで動いているので飛ばす。 アドレスを入力して、ブラウザ表示OK

サーバーの電源ONと同時にapacheが起動するようにスタートアップに登録する。

systemctl enable httpd

httpd serviceのenableを確認

# systemctl list-unit-files -t service

6.ルートの権限の変更

htmlファイルを作成。 FilleZillaも設定する。 apacheにユーザー追加、モード変更

# cd /var/www# chown apache:vpsuser html# chmod 775 html

ファイルをアップしブラウザで表示を確認。 ドメインの取得。さくらのコントロールパネルで設定 参考サイト(ドメイン ゾーン情報の変更 さくらのインターネット)

7.ポート番号を変更する

 セキュリティ対策その2 サイトと通信するポート番号をデフォルトの22番では攻撃されやすいので適当な番号に変更する。

参考サイト(port番号を変更してVPSサーバーのセキュリティを高める【ConohaVPS + kusanagi】 めりでり.com)

Vimで編集

#vim /etc/ssh/sshd_config
#Port 22

#Port 29870

になど適当なポート番号変更する。(番号は任意)

サービス再起動

#systemctl restart sshd.service

さくらのVPSコントローグパネルからパケットフィルタの設定変更 カスタムで新しいポート番号を追加して、22番は削除。 ログインは下記のコードに変わる(番号は任意)

ssh vpsuser@xxx.xxx.xxx.xxx -p 29870

8.公開鍵の設定

 セキュリティ対策その3 鍵ファイルをもつコンピュータしかアクセスさせないようにする。

参考サイト(「よく分かる公開鍵認証」~初心者でもよくわかる!VPSによるWebサーバー運用講座(2) さくらのナレッジ)

Macのコンソールで下記を実行 ディレクトリを作って権限を変更。作ったディレクトリに移って鍵作成。

$ mkdir .ssh$ chmod 700 .ssh$ cd .ssh$ ssh-keygen

公開鍵の内容をエディタにコピー

cat id_rsa.pub

8.1 サーバー側の公開鍵設定

一般ユーザでログイン

$ mkdir .ssh$ chmod 700 .ssh$ cd .ssh

ファイル作成コピーした内容を貼り付ける

vim authorized_keys

このファイルを自分のみ読み書き可能にしておく。

$ chmod 600 authorized_keys

下記のコードでログインする

ssh -i .ssh/id_rsa vpsuser@xxx.xxx.xxx.xxx -p 28970

8.2 通常ログインでの接続を禁止する

通常のパスワードでログインする接続方法は禁止して、公開鍵を使ったアクセスのみに受け付けるようにする。
sshdの設定を変更する

$ su -# cd /etc/ssh# vim sshd_config

PasswordAuthentication  yes → noに変更

PasswordAuthentication no

sshdを再起動

# service sshd restart

9.phpをインストールする

参考リンク (ネコでもわかる!さくらのVPS講座 ~第四回「phpとMariaDBをインストールしよう」 さくらのナレッジ)

以下のphpファイルをテスト用に準備 /var/www/html/の下に配置

<html>  <body>    <?php echo "Hello World! php" ?>  </body></html>

9.1 EPEL(リポジトリ)を使用可能にする

リポジトリ…アプリケーション配布サーバーのこと。EPELというリポジトリを使えるようにする。

参考リンク(EPEL8がリリースされました。使い始めましょう 赤帽エンジニアブログ)

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

9.2 remiリポジトリ用の設定パッケージをインストールする

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm

phpのインストール 以下のリンクで最新バージョンを調べる

参考リンク php.net

参考リンク([CentOS] CentOS8.0にPHP7.3をインストール 適当に書き連ねるネタ帳のようなもの)

dnf module install -y php:remi-8.0

これでphp8.0.6がイントールされる。 さくらのマニュアルに従い、以下のモジュールもインストールする。

# yum install php-devel(php拡張を構築するのに必要)
# yum install php-mbstring(マルチバイト文字モジュール)
# yum install php-mysqlnd(MySQL native driver)
# yum install php-pdo(PHP Data Objects)
# yum install php-gd(PHPの画像処理)

httpd再起動

# systemctl restart httpd

表示を確認

9.3 phpのアップロード上限サイズの変更

「php.ini]を編集する。

# cd /etc# cp php.ini php.ini.old# vim php.ini
post_max_size = 8M・・・upload_max_filesize = 2M

となっている設定を、それぞれ

post_max_size = 128M・・・upload_max_filesize = 128M

とする。再起動後に有効になる。

# systemctl restart httpd

10.MariaDBをインストールする

rootで実行

# yum install mariadb-server

mariadbのスタートと、自動実行の設定

# systemctl enable mariadb# systemctl start mariadb

mariadbにログインするパスワードを設定する。

mysql_secure_installation

最初のPasswordの問い合わせはEnter(none) mariadb用のrootパスワードを設定 その後の回答は全て[Y]

mariadbにテストログイン

# mysql -u root -p

ログイン確認後mariadbからログアウト

MariaDB [(none)]> exit

11.phpMyAdminをインストールする

以下のコマンドで一番新しいphpをインストール エラーが出たので下記のコードで実行

#yum install --enablerepo=remi phpMyAdmin

以下の手順でphpMyadmin.confを編集する。

# cd /etc/httpd/conf.d/# cp phpMyAdmin.conf  phpMyAdmin.conf.old# vim phpMyAdmin.conf

以下のように編集。

<Directory /usr/share/phpMyAdmin/>  AddDefaultCharset UTF-8  #Require local  Require all granted</Directory>

再起動。

# systemctl restart httpd

http://xxx.xxx.xxx.xxx/phpmyadmin ログイン画面が表示されることを確認。

11.1.第三者に推測されにくいURLに変更する。

phpMyAdmin.confの編集

# cd /etc/httpd/conf.d/# vim phpMyAdmin.conf

Alias(別名)の編集

#Alias /phpMyAdmin /usr/share/phpMyAdmin#Alias /phpmyadmin /usr/share/phpMyAdminAlias /phpMyAdminごにょごにょ /usr/share/phpMyAdmin

再起動

# systemctl restart httpd

11.3 SSLにより通信内容を暗号化する。

ApacheがSSLを使えるようにするために、mod_sslをインストール

# yum install mod_ss

再起動

# systemctl restart httpd

新しいAliasのURLでアクセス確認OK

httpでphpMyAdminに接続できないように設定しておく

# cd /etc/httpd/conf.d/# vim phpMyAdmin.conf

SSLRequireSSLを追加

<Directory /usr/share/phpMyAdmin/>   AddDefaultCharset UTF-8   SSLRequireSSL

再起動

# systemctl restart httpd

httpでphpMyAdminに接続できないこと確認。

11.4 phpMyAdminをバージョンアップする。

最新のパッケージリストの取得

# yum check-update --enablerepo=remi

phpMyAdminの情報を表示

# yum info --enablerepo=remi phpMyAdmin

アップデートする時は下記のコードを使う(phpmyadminも一番新しいのを入れたが、最初に古いのを入れてもここで更新できた)
phpMyaAdminは定期的なVersion upが必要。

# yum update  --enablerepo=remi phpMyAdmin

12. SSL証明書 Let’s Encryptをインストールする

certbotコマンドをインストール

# yum install certbot python3-certbot-apache

certbotコマンドを実行して証明書をインストールする。

# certbot --apache -d example.com

途中でエラー発生。 Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80. が出たので設定ファイルを編集する。 参考サイト(Let’s Encryptのインストールができない。途中で止まる時の対処法 with feeling like it)

vim /etc/httpd/conf/httpd.conf

最下部に下記を追記

NameVirtualHost *:80​<VirtualHost *:80>ServerAdmin root@freepc.jp<自分のドメインに変更>DocumentRoot /var/www/htmlServerName freepc.jp<自分のドメインに変更></VirtualHost>

再度 certbotを実行

# certbot --apache -d example.com

再起動

systemctl restart httpd

ブラウザでサイト証明書が有効になっている事を確認 (別の端末で確認)

12.1 Let’s Encrypt SSL証明書の更新

有効期限が切れた場合に更新する こちらはすぐにやるとエラーになる

# certbot renew

有効期限に関係なく更新する場合

# certbot renew --force-renew

更新されたことを確認。

参考サイト(【入門】cron(クロン)設定・書き方の基本 カゴヤのサーバー研究室)

cronをroot権限で開く。証明書を自動で更新させる設定を行う。

 # crontab -u root -e

Vim Editor (「i」でインサートモードに入れる。編集終わる時は「Esc」「 :wq 」で保存して閉じる 「:q」で閉じる)で下記のコマンドを書き入れる 毎月10日の午前3時にcertbotコマンドを実行する
 1番目は分、2番目は時間、3番目は日付、4番目は月、5番目が曜日 ワイルドカードを使うと全部の意味。例えば4番目に*を使うと毎月実行されるという意味になる。

最初にこう書いたのだがが何故か上手くいかない

0 3 10  *  * root /usr/bin/certbot renew 

 別のサイトを参考にして書き方を変える。何度か試してこれで上手くいった。これで朝4時に実行するという意味になる。参考にしたサイトにはメールを送信するというのものだったが、それだと動かないのでこれだけにする。

00 04 01 * * certbot renew

確認する際に役立ったコマンドのメモ。私の環境の場合、エラーログは letsencryptにあった。

# cronが動いているかを調べる Active と表示されている事を確認する 成功したものだけしか表示されない
service crond status 
# 全てのログがある場所に移動
cd /var/log/letsencrypt/
# ログを見る less で読み取り専用で開くという意味になる
less (ログ名 メモし忘れた…)

2023年1月14日 追記
上手くいきました。これで毎回証明書を更新する必要がなくなりました。^^^

Let’s Encrypt の証明書の更新を自動化する手順 (cron)

https://weblabo.oscasierra.net/letsencrypt-renew-cron/

Cronが動かないとは何ごとぞ!

https://zenn.dev/whitecat_22/articles/e18b7f4a72d267

cronでLet’s Encryptの証明書を自動的に更新する

https://izadori.net/linux-centos-cron-certbot/

cronがどうやっても動かない時に考えられる原因とその対処法

https://qiita.com/nagimaruxxx/items/b7308644b5d2c9efbeea

13.WordPress用のDBを作成する

phpmyadminにログイン 「データベース」→「wordpressdb」→照合順次「utf8mb4_general_ci」

13.1 WordPressをインストールする

tar.gz形式のダウンロードのリンクアドレスをコピーする。

VPSにSSHログイン rootユーザにスイッチ wgetでファイルをダウンロード

# cd /var/www/html
# wget https://ja.wordpress.org/latest-ja.tar.gz

ファイル確認

# ls -l

テストファイルの削除

# rm index.html

ファイルの解凍

# tar xvzf latest-ja.tar.gz

ファイル確認

# ls -l

圧縮ファイルの削除。wordpressの中身を全てを一つ上の階層に「wordpress/」の後ろのアスタリスクでフォルダ内の全てのファイルを対象にする。空になったフォルダを削除する。

# rm latest-ja.tar.gz
(rm: remove regular file 'wordpress-4.9-ja.tar.gz'? と聞かれた場合にはyと答えます)
# mv wordpress/* .
# rmdir wordpress

権限の設定 apache vpsuser両方ともファイルを更新できるようにする。

説明文から chown(change owner)でファイルの所有者(ユーザーとグループ)の変更をし、chmod(change mode)で書き込み権限を変更。 -R 「サブディレクトリにあるファイルも対象」 また、前回chmodコマンドを使用した時は“775”という数字を指定しましたが、今回は”g+w”と指定しています。この場合、「グループに書き込み権限を追加する」という意味になります。ここで”775″と指定してコマンドを実行してしまうと、ディレクトリもファイルもすべて775の権限になってしまいます。もともとはディレクトリは755、ファイルは644というそれぞれ違う権限だったものを同じ権限にまとめてしまうのはセキュリティ的によろしくありません。ですのでグループの書き込み権限だけ追加する”g+w”という指定をしています。

# chown -R apache:vpsuser *
# chmod -R g+w *

サイトにアクセス WordPressの画面を確認

wp-config.phpにアクセスできないというエラーがでたので直接ファイルを配置。

\# vim wp-config.php

セキュリティアップデートをするときは下記のコードを実行。

yum --security update

14.SiteGuardを導入する

  • ご利用ガイドPDFを開くためのパスワードを控える。
  • SiteGurard利用よりパスワードを控える
  • ご利用ガイドのPDFファイルを開いておく

14.1 OpenJDK8をインストールする

OpenJDK8はjavaのツール群。SiteGuardを動かすのに必要。

# yum install java-1.8.0-openjdk
...
Total download size: 36 M
Is this ok [y/d/N]:y

14.2 firewalldでTCP/9443のポートを開放する

SiteGuard用にPortを開放する。これはさくらのVPSのパケットフィルタで設定。

14.3 SiteGuard Liteのインストール

インストールファイルをマニュアルを参照してURLを調べる。以下のようにコードを実行する。

# wget http://(インストールファイルの場所)

インストールする

# rpm -Uvh (ダウンロードしたrpmファイル)

セットアップする。

# cd /opt/jp-secure/siteguardlite
# ./setup.sh

全てEnterで回答

設定ファイルの編集

# vim /opt/jp-secure/siteguardlite/conf/httpd.conf.siteguardlite_admin_ssl

ファイルの一部を編集する。

SSLCertificateFile /etc/letsencrypt/live/xxxxx.xxx/cert.pem          (xxxxx.xxxはドメイン名)
SSLCertificateKeyFile /etc/letsencrypt/live/xxxxx.xxx/privkey.pem   (xxxxx.xxxはドメイン名)
# systemctl restart httpd

14.4トラステッド・シグネチャ更新URLの設定

(サイトの説明文より)トラステッド・シグネチャとはアンチウイルスソフトでいう定義パターンファイルみたいなもの。マニュアルでURLを確認したら以下のファイルの内容を書き換える。

#vim /opt/jp-secure/siteguardlite/conf/dbupdate_waf_url.conf

14.5管理画面へのアクセスとライセンス情報の登録

ログイン画面にアクセス。パスワードを変更

ライセンスキーを登録して正規ライセンスにする 「管理」→「ライセンス情報」

シリアルキー、サポートID、パスワードの情報をマニュアルを参考に入力。 「正規ライセンス」の表示を確認

14.6 基本設定と管理者への通知メール設定

  • SiteGuardのメイン機能を有効にする。
  • [モジュール設定] → [基本設定] で「ウェブ攻撃検査」を有効にする
  • 通知についてはとりあえず設定キャンセル

14.7 外部からの攻撃を検知できることを確認する

  • https://(自分のドメイン)/WAF-TEST-SIGNATURE SiteGuardの検出メッセージの表示を確認。
  • SiteGuardのログを確認。ブロックできている事を確認した。

15. WordPress管理画面のログインURLを変更する

 ログインするためのURLが簡単すぎるのでプラグインを使って変更する。SiteGuard WP Plug-inを使用。

(参考サイト WordPressのログインURLを変更する方法!プラグインを使ってセキュリティ対策を ワプ活)

16. 管理者からのアクセスは検査しないように設定する

参考サイト 解決法:更新に失敗しました返答が正しいJSONレスポンスではありません。【WordPress/SiteGuard】

参考サイト 正規表現のエスケープ処理とは?

参考サイト 正規表現でIPアドレスを範囲で書くときに便利なページ 暗中模索

この通りにやればOK 正規表現において行の頭を示す [^] と、「 . 」の前には[ \(バックスラッシュ)]を使用する。アルファベット以外の文字列を使う場合はエスケープ処理が必要。最後に$を記述する。(例えば 111.111.111.111 というIPアドレスを正規表現で書くと ^111\.111\.111\.111$ のようになる)

17.WordpressのログインIDを変更する

参考サイト 【WordPressのユーザー名変更方法】新規ユーザー作成→旧削除でOK

この通りにやればOK

18.投稿者アーカイブからユーザー名が分からないようにする

記事を書くと、すぐに不正アクセスが始まる。IDを変えてもすぐに追従されるのでおかしいと思ったら丸見えだった。phpの編集はなぜか上手くいかないので、プラグインで対応。

参考サイト WordPressのユーザー名は丸見え!?

19.XML-RPC防御の設定を行う

 相も変わらず不正アクセスが止まらない…ログを見るとXML-RPCとあるのでこれを調べる。RPCはRemote Procedure Call の略でXMLを使った遠隔手続き操作の事なのだそう。スマートフォンから投稿する際に使う機能だそうだが、全く使っていないので早速設定してしまう。

参考サイト Security Press – セキュリティ プレス –

XML-RPC【XML Remote Procedure Call】 IT用語辞典 e-Words