- CentOS 8のインストール
- VPSにログイン
- 一般ユーザーの作成
- rootで直接アクセスできないようにする
- apacheのインストール
- ルートの権限の変更
- ポート番号を変更する
- 公開鍵の設定
- phpをインストールする
- MariaDBをインストールする
- phpmyadminをインストールする
- SSL証明書 Let’s Encryptをインストールする
- WordPress用のDBを作成する
- SiteGuardを導入する
- WordPress管理画面のログインURLを変更する。
- 管理者からのアクセスは検査しないように設定する
- WordPressのログインIDを変更する
- 投稿者アーカイブからユーザー名が分からないようにする
- XML-RPC防御の設定を行う
また立ち上げ直さなきゃいけない事もあると思うので、このサイトを作った時のメモをアップしておきます。誰かの役に立つ事もある…といいけど。何度もインストールを繰り返したので下に行くほど私の理解が深まり説明が雑になっていきます。
参考サイトは数年前の記事なので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のインストール 以下のリンクで最新バージョンを調べる
参考リンク([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の編集はなぜか上手くいかないので、プラグインで対応。
19.XML-RPC防御の設定を行う
相も変わらず不正アクセスが止まらない…ログを見るとXML-RPCとあるのでこれを調べる。RPCはRemote Procedure Call の略でXMLを使った遠隔手続き操作の事なのだそう。スマートフォンから投稿する際に使う機能だそうだが、全く使っていないので早速設定してしまう。
参考サイト Security Press – セキュリティ プレス –
XML-RPC【XML Remote Procedure Call】 IT用語辞典 e-Words