CentOS8でLet'sEncryptを使用してNginxを保護する方法

提供:Dev Guides
移動先:案内検索

著者は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を押して挿入モードを終了し、:wqENTERを押してファイルを保存して終了します。 テキストエディタ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ブログで、重要な更新を随時確認することもできます。