Rocky Linux 9でLet’s Encryptを使用してNginxを安全に保護する方法
はじめに
Let’s Encryptは、無料のTLS/SSL証明書を取得およびインストールする手段を提供する証明書発行機関(CA)であり、それによりウェブサーバー上で暗号化されたHTTPSを実現します。Certbotと呼ばれるソフトウェアクライアントを提供することで、必要な手順のほとんど(もしくはすべて)を自動化し、プロセスを簡略化しています。現在、証明書の取得およびインストールの手続きは、ApacheとNginxの両方で完全に自動化されています。
このチュートリアルでは、Rocky Linux 9上のNginxに無料のSSL証明書を入手し、証明書を自動的に更新する方法をCertbotを使用して説明します。
このチュートリアルでは、デフォルトのファイルの代わりに別のNginxサーバー設定ファイルを使用します。各ドメインごとに新しいNginxサーバーブロックファイルを作成する必要があります。これにより、一般的なミスを避けることができ、デフォルトのファイルがフォールバック設定として保持されます。
前提条件
このチュートリアルを実行するには、次のものが必要です:
- One Rocky Linux 9 server set up by following this initial server setup for Rocky Linux 9 tutorial, including a sudo-enabled non-root user and a firewall.
- A registered domain name. This tutorial will use example.com throughout. You can purchase a domain name from Namecheap, get one for free with Freenom, or use the domain registrar of your choice.
- Both of the following DNS records set up for your server. If you are using Silicon Cloud, please see our DNS documentation for details on how to add them.An A record with example.com pointing to your server’s public IP address.
An A record with www.example.com pointing to your server’s public IP address. - Nginx installed by following How To Install Nginx on Rocky Linux 9. Be sure that you have a server block for your domain. This tutorial will use /etc/nginx/sites-available/example.com as an example.
ステップ1 — Certbotのインストール
最初に、certbotソフトウェアパッケージをインストールする必要があります。非ルートユーザーとしてRocky Linux 8マシンにログインしてください。
- ssh sammy@your_server_ip
デフォルトでは、パッケージマネージャーを通じてCertbotパッケージは利用できません。Certbotをインストールするには、EPELリポジトリを有効にする必要があります。
Rocky Linux 9のEPELリポジトリを追加するには、以下のコマンドを実行してください。
- sudo dnf install epel-release
インストールの確認を求められたら、yとタイプして入力してください。
追加のリポジトリへのアクセスができるようになったので、必要なパッケージをすべてインストールしてください。
- sudo dnf install certbot python3-certbot-nginx
以下は、プログラムを実行するために必要なCertbot自体と、CertbotのNginxプラグインをインストールします。
インストールのプロセス中に、GPGキーのインポートについて尋ねられますので、それを確認してインストールを完了させてください。
Certbotをインストールしたので、証明書を取得するために実行しましょう。
ステップ2:Nginxの設定を確認する。
Certbotは、自動的にSSLを設定するために、Nginxの設定において正しいサーバーブロックを見つける必要があります。具体的には、要求するドメインに一致するserver_nameディレクティブを探します。
もしNginxのインストールチュートリアルでサーバーブロックの設定手順に従った場合、/etc/nginx/conf.d/example.comにドメインのためのサーバーブロックがあり、server_nameディレクティブも適切に設定されているはずです。
確認するために、nanoやお気に入りのテキストエディタを使って、ドメインの設定ファイルを開いてください。
- sudo nano /etc/nginx/conf.d/example.com
既存のserver_nameの行を見つけてください。以下のように見えるはずです:
...
server_name example.com www.example.com;
...
もし該当する場合は、エディターを終了し、次のステップに進んでください。
もし適用されていなければ、それに合わせて更新してください。その後、ファイルを保存し、エディタを終了し、設定の編集が正しい構文かどうかを確認してください。
- sudo nginx -t
エラーが発生した場合には、サーバーブロックのファイルを再度開き、タイプミスや欠けている文字を確認してください。設定ファイルの構文が正しい場合は、Nginxを再読み込みして新しい設定をロードしてください。
- sudo systemctl reload nginx
Certbotは自動的に正しいサーバーブロックを見つけて更新することができます。
次に、ファイアウォールを更新してHTTPSトラフィックを許可しましょう。
ステップ3:ファイアウォールのルールをアップデートする。
ネイティブの日本語で以下の文を言い換えます。1つのオプションだけ必要です。
「前提のセットアップによってfirewalldが有効になっているため、Nginxウェブサーバーで外部接続を許可するためにファイアウォールの設定を調整する必要があります。」
既に有効になっているサービスを確認するには、次のコマンドを実行してください。
- sudo firewall-cmd –permanent –list-all
こういう出力が受け取れます。
public 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を実行して証明書を取得する準備が整いました。
ステップ4 – SSL証明書の取得
Certbotは、プラグインを介してさまざまな方法でSSL証明書を取得することができます。Nginxプラグインは、必要な場合にNginxを再構成して設定を再読み込みします。このプラグインを使用するには、以下を入力してください。
- sudo certbot –nginx -d example.com -d www.example.com
以下の日本語での文言をネイティブの表現で一つのオプションで言い換えます:
certbotを–nginxプラグインを使用して実行し、-dを使って証明書の有効なドメイン名を指定します。
コマンドを実行すると、メールアドレスの入力と利用規約への同意が求められます。それを完了した後、処理が成功したことと、証明書が保存されている場所を示すメッセージが表示されるはずです。
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain …
あなたの証明書はダウンロードされ、インストールされ、読み込まれました。そして、あなたのNginxの設定により、ウェブのリクエストは自動的にhttps://へのリダイレクトが行われるようになります。ウェブサイトを再読み込みし、ブラウザのセキュリティインジケータを確認してください。通常、ロックアイコンが表示され、サイトが適切に保護されていることが示されます。もしSSL Labs Server Testでサーバをテストすると、Aの評価を受けるはずです。
更新プロセスのテストを終えましょう。
ステップ5 – Certbot自動更新の検証
Let’s Encryptの証明書は90日間有効ですが、誤差を考慮するために証明書を60日ごとに更新することを推奨します。Certbot Let’s Encryptクライアントには、自動的にインストールされている証明書を確認し、有効期限が30日未満の場合には自動的に更新を試みる「renew」コマンドがあります。
このコマンドを実行することで、証明書の自動更新をテストすることができます。
- sudo certbot renew –dry-run
出力はこれに似ているでしょう。 (Shutsuryoku wa kore ni nite iru deshou.)
Saving 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ジョブを作成しても安全です。
1つのオプションで以下の文を日本語で言い換えてください:
クロンタブを編集して、1日に2回更新が実行される新しいジョブを作成してください。rootユーザーのためのクロンタブを編集するには、次を実行してください。
- sudo crontab -e
あなたのテキストエディタは、デフォルトのクロンタブを開きます。この時点では空のテキストファイルです。iキーを押して挿入モードに入り、次の行を追加してください。
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の更新コマンドは、システムにインストールされたすべての証明書を確認し、30日以内に期限が切れるものを更新します。–quietはCertbotに情報を出力せず、ユーザー入力を待たないように指示します。
Certbotのドキュメンテーションには、リニューアルに関するより詳細な情報が記載されています。
結論
このガイドでは、Let’s EncryptのクライアントであるCertbotをインストールし、ドメインのSSL証明書をダウンロードし、自動的な証明書の更新を設定しました。Certbotの使用方法に関する質問がある場合は、公式のCertbotドキュメントを参照してください。
時々、重要な更新情報を得るために、公式のLet’s Encryptブログもチェックすることができます。