CentOS8でLet'sEncryptを使用してNginxを保護する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Let's Encrypt は、 Transport Layer Security(TLS)暗号化の無料の証明書を提供する認証局(CA)です。 ソフトウェアクライアントCertbotを提供することにより、証明書の作成、検証、署名、インストール、および更新のプロセスを簡素化します。
このチュートリアルでは、NginxをWebサーバーとして実行しているCentOS8サーバーでLet'sEncryptからTLS/SSL証明書を設定します。 さらに、cronジョブを使用して証明書の更新プロセスを自動化します。
前提条件
このガイドを完了するには、次のものが必要です。
- CentOS 8初期サーバーセットアップガイドに従ってセットアップされた1台のCentOS8サーバー。これには、
sudo
特権を持つ非rootユーザーとファイアウォールが含まれます。 - サーバーブロックが構成されたCentOS8サーバーにインストールされたNginx。 チュートリアルCentOS8にNginxをインストールする方法に従ってこれを設定する方法を学ぶことができます。
- 完全に登録されたドメイン名。 このチュートリアルでは、全体を通して例として
your_domain
を使用します。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。 - 次の両方のDNSレコードがサーバー用に設定されています。 それらを追加する方法の詳細については、このDigitalOceanDNSの紹介に従ってください。 サーバーのパブリックIPアドレスを指すyour_domainを持つAレコード。 サーバーのパブリックIPアドレスを指すwww.your_domainを含むAレコード。
ステップ1— CertbotLet'sEncryptクライアントのインストール
まず、certbot
ソフトウェアパッケージをインストールする必要があります。 root以外のユーザーとしてCentOS8マシンにログインします。
ssh sammy@your_server_ip
certbot
パッケージは、デフォルトではパッケージマネージャーからは利用できません。 Certbotをインストールするには、EPELリポジトリを有効にする必要があります。
CentOS 8 EPELリポジトリを追加するには、次のコマンドを実行します。
sudo dnf install epel-release
インストールの確認を求められたら、y
と入力して入力します。
追加のリポジトリにアクセスできるようになったので、必要なすべてのパッケージをインストールします。
sudo dnf install certbot python3-certbot-nginx
これにより、Certbot自体と、プログラムの実行に必要なCertbot用のNginxプラグインがインストールされます。
インストールプロセスでは、GPGキーのインポートについて尋ねられます。 インストールが完了するように確認してください。
これでLet'sEncryptクライアントがインストールされましたが、証明書を取得する前に、必要なすべてのポートが開いていることを確認する必要があります。 これを行うには、次の手順でファイアウォール設定を更新します。
ステップ2—ファイアウォールルールを更新する
前提条件のセットアップでfirewalld
が有効になっているため、Nginx Webサーバーで外部接続を許可するには、ファイアウォール設定を調整する必要があります。
すでに有効になっているサービスを確認するには、次のコマンドを実行します。
sudo firewall-cmd --permanent --list-all
次のような出力が表示されます。
Outputpublic target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
サービスリストにhttp
が表示されない場合は、次のコマンドを実行して有効にします。
sudo firewall-cmd --permanent --add-service=http
https
トラフィックを許可するには、次のコマンドを実行します。
sudo firewall-cmd --permanent --add-service=https
変更を適用するには、ファイアウォールサービスをリロードする必要があります。
sudo firewall-cmd --reload
サーバーをhttps
トラフィックに開放したので、Certbotを実行して証明書を取得する準備が整いました。
ステップ3—証明書を取得する
これで、ドメインのSSL証明書をリクエストできます。
certbot
Let's Encryptクライアントを使用してNginxのSSL証明書を生成する場合、クライアントは、パラメーターとして提供されたドメインに有効な新しいSSL証明書を自動的に取得してインストールします。
複数のドメインまたはサブドメインに有効な単一の証明書をインストールする場合は、それらを追加のパラメーターとしてコマンドに渡すことができます。 パラメータリストの最初のドメイン名は、Let'sEncryptが証明書の作成に使用するbase ドメインになります。そのため、リストの最初にトップレベルドメイン名を渡し、その後にトップレベルドメイン名を渡します。追加のサブドメインまたはエイリアス:
sudo certbot --nginx -d your_domain -d www.your_domain
これは--nginx
プラグインでcertbot
を実行し、ベースドメインはyour_domain
になります。 インタラクティブインストールを実行し、単一のドメインのみをカバーする証明書を取得するには、次のコマンドを使用してcertbot
コマンドを実行します。
sudo certbot --nginx -d your_domain
certbot
ユーティリティは、証明書の要求手順中にドメイン情報の入力を求めることもできます。 この機能を使用するには、ドメインなしでcertbot
を呼び出します。
sudo certbot --nginx
証明書オプションをカスタマイズするためのステップバイステップガイドを受け取ります。 Certbotは、紛失したキーの回復と通知のための電子メールアドレスを提供し、利用規約に同意するように求めます。 コマンドラインでドメインを指定しなかった場合、Certbotはserver_name
ディレクティブを探し、見つかったドメイン名のリストを表示します。 サーバーブロックファイルがserver_name
ディレクティブを使用して明示的に提供するドメインを指定していない場合、Certbotはドメイン名を手動で指定するように要求します。
セキュリティを強化するために、Certbotはポート80
のすべてのトラフィックを443
にリダイレクトするように自動的に構成します。
インストールが正常に完了すると、次のようなメッセージが表示されます。
OutputIMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain/privkey.pem Your cert will expire on 2021-02-26. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
生成された証明書ファイルは、/etc/letsencrypt/live
ディレクトリのベースドメインにちなんで名付けられたサブディレクトリ内で利用できます。
Certbotの使用が終了したので、SSL証明書のステータスを確認できます。 好みのWebブラウザで次のリンクを開いてSSL証明書のステータスを確認します( your_domain をベースドメインに置き換えることを忘れないでください)。
https://www.ssllabs.com/ssltest/analyze.html?d=your_domain
このサイトには、 SSLLabsからのSSLテストが含まれています。これは自動的に開始されます。 この記事の執筆時点では、デフォルト設定でAの評価が付けられています。
これで、https
プレフィックスを使用してWebサイトにアクセスできます。 ただし、この設定を機能させるには、証明書を定期的に更新する必要があります。 次のステップでは、この更新プロセスを自動化します。
ステップ4—自動更新の設定
Let's Encryptの証明書は90日間有効ですが、許容誤差を考慮して、60日ごとに証明書を更新することをお勧めします。 Certbot Let's Encryptクライアントには、renew
コマンドがあり、現在インストールされている証明書を自動的にチェックし、有効期限から30日以内の場合は更新を試みます。
次のコマンドを実行して、証明書の自動更新をテストできます。
sudo certbot renew --dry-run
出力は次のようになります。
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...
複数のドメインでバンドルされた証明書を作成した場合、ベースドメイン名のみが出力に表示されますが、更新はこの証明書に含まれるすべてのドメインに対して機能することに注意してください。
証明書が古くならないようにするための実用的な方法は、自動更新コマンドを定期的に実行するcronジョブを作成することです。 更新は最初に有効期限をチェックし、証明書の有効期限が30日以内の場合にのみ更新を実行するため、毎週、または毎日実行するcronジョブを作成しても安全です。
crontabを編集して、更新を1日2回実行する新しいジョブを作成します。 rootユーザーのcrontabを編集するには、次のコマンドを実行します。
sudo crontab -e
テキストエディタはデフォルトのcrontabを開きます。これは、この時点では空のテキストファイルです。 i
を押して挿入モードに入り、次の行に追加します。
crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
終了したら、ESC
を押して挿入モードを終了し、:wq
とENTER
を押してファイルを保存して終了します。 テキストエディタViとその後継のVimの詳細については、クラウドサーバーへのVimテキストエディタのインストールと使用チュートリアルをご覧ください。
これにより、毎日正午と深夜に実行される新しいcronジョブが作成されます。 python -c 'import random; import time; time.sleep(random.random() * 3600)'
は、更新タスクのために1時間以内にランダムな分を選択します。
Certbotのrenew
コマンドは、システムにインストールされているすべての証明書をチェックし、30日以内に期限切れになるように設定されている証明書を更新します。 --quiet
は、情報を出力したり、ユーザー入力を待機したりしないようにCertbotに指示します。
更新の詳細については、Certbotのドキュメントを参照してください。
結論
このガイドでは、Let's EncryptクライアントのCertbotをインストールし、ドメインのSSL証明書をダウンロードして、証明書の自動更新を設定しました。 Certbotの使用について質問がある場合は、Certbotの公式ドキュメントを確認してください。
また、公式の Let's Encryptブログで、重要な更新を随時確認することもできます。