メインコンテンツまでスキップ

· 約3分

NGINXにLet's Encryptで取得したサーバ証明書を適用し、HTTPSサーバを建てるための手順

必要なツールの準備

NGINXとLet's Encryptを利用した署名所作成ツール(certbot)のインストールを行う。

NGINXのインストール

yum install nginx

certbotのインストール

yum install certbot

証明書の取得

証明書の取得コマンド

証明書の取得をcertbotコマンドを利用して行う。
このコマンドは80番ポートでLet's Encrypt からの通信を待ち受け、必要な通信を行う。
certbot certonly --standalone -d <ドメイン名> -m <メールアドレス> --agree-tos -n

サーバのHTTPS化

NGINXの設定

NGINXにSSL設定と証明書鍵のファイルパスを記載する。

server {
..<中略>..
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate "/etc/letsencrypt/live/<Domain名>/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/<Domain名>/privkey.pem";
..<中略>..
}

上記設定後にNGINXを再起動し設定を反映する。
systemctl restart nginx

証明書の更新

証明書更新のための設定変更

Let's Encryptで取得した証明書の期間は90日と短いため、定期的に更新する必要がある。
しかし、80番ポートに関しては既にNGINXで利用しているため、取得時と同様にcertbotが80番ポートを利用することができない。
そのため、Let's Encryptの証明書更新に必要なファイルはHTTPでアクセスできる用にNGINXの設定ファイルを変更する。

server {
listen 80;
listen [::]:80;

location ^~/.well-known/acme-challenge/ {
default_type "text/plain";
}

location / {
return 301 https://$host$request_uri;
}
}

それに合わせて、Let's Encryptの設定を変更する。

# Options used in the renewal process
[renewalparams]
authenticator = webroot
webroot_path = /usr/share/nginx/html,
[[webroot_map]]
<domain名> = /usr/share/nginx/html

疎通確認のため、以下のコマンドを実行しエラーが発生しないか確認する。
certbot renew --dry-run

証明書更新の自動化

月に一回anacronを利用して更新を行うようにする。
yum install cronie-anacron
systemctl enable anacron
vi /etc/cron.monthly/letsencrypt.sh

#!/bin/sh

certbot renew > /dev/null
wait
systemctl restart nginx

[参考サイト]

· 約3分

logrotateの設定として、ファイルの圧縮やScriptを実行するオプションがありますが、
どのタイミングで圧縮やローテーション、Scriptが実行されるかを理解せずに書いていたことで、
スクリプトが想定通りに実行されないことがあったため、処理順について検証しました。

検証用設定ファイルの作成

まず、以下のようなlogrotate設定ファイルを作成する。

/root/rotate/test
{
weekly
rotate 2
compress
ifempty
missingok
create
sharedscripts
firstaction
echo "firstaction" > /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/firstaction
endscript
prerotate
echo "prerotate" >> /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/prerotate
endscript
postrotate
echo "postrotate" >> /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/postrotate
endscript
preremove
echo "preremove" >> /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/preremove
endscript
lastaction
echo "firstaction" > /root/rotate/script_order
ls /root/rotate/test* > /root/rotate/lastaction
endscript
}

logrotateの実行

touchなどでローテーション対象のファイルを作成して、1回ローテーションを実行する。
script_orderを確認して処理順を確認したところ、logrotateに設定したScriptは以下の順で事項される

  1. firstaction
  2. prerotate
  3. postrotate
  4. preremove
  5. lastaction

次に、logrotateを実行したときのローテーションなどの処理順を確認するために、
さらに2回ローテーションを実行する。
(rotate 2 のため合計3回のローテーション処理実行をする)

各ファイルの中身は以下のようになった。

  • script_order

    firstaction
    prerotate
    postrotate
    preremove
    preremove
    lastaction
  • firstaction

    test
    test.1.gz
    test.2.gz
  • prerotate

    test
    test.2.gz
    test.3.gz
  • postrotate

    test
    test.1
    test.2.gz
    test.3.gz
  • preremove

    test
    test.1.gz
    test.2.gz
    test.3.gz
  • lastaction

    test
    test.1.gz
    test.2.gz

1回目と違い、preremoveが二回実行されていたが、どうやらファイルを削除する直前に毎回呼び出される模様。
(preremove -> test.1を削除 -> preremove -> test.3.gzを削除)

ローテーション対象ファイルが複数ある場合は以下のように実行された。
(preremove -> test.1を削除 -> preremove -> test.3.gzを削除
-> preremove -> sample.1を削除 -> preremove -> sample.3.gzを削除)

logrotate設定の動作順

したがって、各ファイルの実行結果から、logrotateの実行順序は

  1. firstaction/endscriptの実行
  2. ローテーション済みファイルのローテーション(例:test.1.gz->test.2.gz)
  3. prerotate/endscriptの実行
  4. 対象ファイルのローテーション(例:test->test.1)
  5. postrotate/endscriptの実行
  6. ファイルの圧縮(例:test.1->test.1.gz)
  7. preremove/endscriptの実行※
  8. 圧縮元ファイルの削除(例:test.1の削除)※
  9. preremove/endscriptの実行※
  10. 期限切れファイルの削除(例:test.3.gzの削除)※
  11. lastaction/endscriptの実行

※preremoveはローテーション対象ファイル数回、繰り返し実行される。