前回の続き。
3. Let’s EncryptからSSL証明書を取得して常時SSL化
今時ですからまあ常時SSL化はしておきたいものです。で、個人で証明書を取得するのであればLet’s Encryptがド定番ということになるでしょう。
今回はDNSもAWSのRoute53を使用しているので、DNS認証を使用してワイルドカード証明書を取得します。
Let’s Encryptから証明書を取得するのによく使われるのはcertbotですが、これはPythonで動くツールです。
ところがAmazon Linux 2のベースはCent OS 7なので、Pythonのバージョンはデフォルトで2系となりますが、Python2は1年近く前の2020/01/01にサポート終了してしまっています。
ツールを使う上ではサポート終了していてもとりあえずの問題は無いわけですが、使わないので済むのであれば使いたくないというのが個人的な意見です。
というわけでcertbotの代替を探すわけですが、色々探してみたところ、go言語製のlegoというツールがよさそうでした。certbotと似たような感覚で使え、インストールも簡単です。
https://github.com/go-acme/lego
インストールするにはまずgo言語が必要です。
yum install golang
その後は上記のGithubのページにインストール手順があるので、それに従いましょう。
参照するのは From sources の欄です。
バイナリファイルができたら適宜移動させましょう。私は /usr/local/bin に配置しました。
次にDNS認証を使うためにRoute53へのアクセスが必要になりますが、そのためには何らかの認証の手立てが必要です。
EC2で運用しているのであれば、このようなときはIAM ロールを使うのがベターなのかもしれませんが、残念ながらLightsailはIAM ロールを使用できません。
というわけで普通にIAM ユーザを使用します。必要な権限は下記のJSONを使うと楽です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "route53:GetChange", "route53:ListHostedZonesByName", "route53:ListResourceRecordSets" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/[HostzoneID]" ] } ] }
[HostzoneID] の部分は自分で持っているRoute53上のIDを指定してください。
ユーザを作成したら、サーバからアクセスできるように環境設定をして、アクセスキーの設定をしておきましょう。
legoはAWS_PROFILEの環境変数を見てくれるようなので、デフォルトのプロファイル以外でも使えそうなのですが、未検証です。
自分はデフォルトのプロファイルで使用しています。
aws configure
一通り、設定が終わったらいよいよ証明書を取得します。
/usr/local/bin/lego \ --accept-tos \ --path=/etc/letsencrypt \ --email="[メールアドレス]" \ --dns="route53" \ --domains="[ドメイン名1(example.com)]" \ --domains="[ドメイン名2(*.example.com)]" \ run
メールアドレスとドメイン名は適宜変更してください。certbotでもそうですが、ワイルドカードありとなしのドメイン名を両方指定して一度にどちらでも使える証明書を取得することができます。
これで証明書を取得できたので、nginxに設定すれば無事常時SSL化が完了します。
私は下記のような共通ファイルを使用しておいて、各バーチャルホスト毎のconfigファイルからインクルードするという方法をとっています。
/etc/nginx/common/subdomain_ssl.conf
ssl_certificate /etc/letsencrypt/certificates/[crtファイル]; ssl_certificate_key /etc/letsencrypt/certificates/[keyファイル]; ssl_dhparam dhparam.pem; ssl_ciphers ECDHE+AESGCM:DHE+AESGCM:HIGH:!aNULL:!MD5; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.2; add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";
/etc/nginx/conf.d/[バーチャルホスト名(example.com)].conf
server { listen 80; server_name [バーチャルホスト名(example.com)]; return 301 https://[バーチャルホスト名(example.com)]$request_uri; } server { listen 443 ssl http2; server_name [バーチャルホスト名(example.com)]; root /usr/share/nginx/wordpress; index index.php; include common/subdomain_ssl.conf; access_log /var/log/nginx/[バーチャルホスト名(example.com)].access.log; error_log /var/log/nginx/[バーチャルホスト名(example.com)].error.log; }
各種ファイル名であったり、バーチャルホスト名はあくまで例なので、適宜自分の環境に合わせて変更してください。
また、configファイル中にも出てきていますが、ssl_dhparamの設定はnginx 1.11.0から必須になっているそうですので、作成してパスを設定しておきましょう。
openssl dhparam -out /etc/nginx/dhparam.pem 2048
これで一通り設定が完了したはずですので、configのチェックをした後問題なければnginxを再起動しましょう。
4. MariaDBのインストール
前回MariaDBはExtras Libraryに含まれているもの古いと書きました。なので、MariaDBについてはExtras Libraryではなく、公式のリポジトリを参照して最新版を入れていきたいと思います。
公式のリポジトリの使用法ですが、MariaDBのページには下記のコマンドを叩くようにと書いてありますが、OSの名称を見て処理を切り替えているようでAmazon Linux 2の場合はこの場合分けに出てこない = サポート外のOSとして扱われてしまうようです。
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
もちろん動かないなんてことはなく、普通に動くのですがツールでは弾かれてしまいます。
なので手でリポジトリの設定を書き加えます。
vi /etc/yum.repos.d/MariaDB.repo ### ファイルに下記の内容を書き込む ### # MariaDB 10.5 CentOS repository list - created 2020-10-17 01:57 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.5/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 # ファイル保存後にMariaDBをインストール yum install MariaDB-server MariaDB-client MariaDB-backup
通常であれば MariaDB-backup は不要かも知れませんが、今回はあくまで別のサーバーからの移行で元のDBをバックアップしてある想定のためインストールしています。
ちなみにバックアップからの復元方法は下記の通りですが、復元では無く新規のDBを作るときはDBのファイルを削除してしまうので、絶対にやってはいけません。
cd /var/lib/mysql rm -fr * mariabackup --copy-back --target-dir [バックアップのパス]
これでMariaDBもインストール完了です。
必要なソフトは一通りインストールされました。
WordPressのインストールについては書いていませんが、世の中探せばいくらでも見つかるのと、今回は別のサーバーからの移行のため手順的に新規インストールとは大分異なるため省略しています。
(PHPの設定は同じと言えば同じですが、それ以外は元のサーバーからファイル一式を持ってきて展開するだけ)
去年中に最後まで書ききりたかったのが、延び延びになってしまいましたが一旦これにて終了。