Ubuntu 20.04でLet’s Encryptを使用してNginxをセキュリティ保護する方法

はじめに

Let’s Encryptは、ウェブサーバー上で暗号化されたHTTPSを可能にするための無料のTLS/SSL証明書を簡単に取得してインストールする方法を提供する証明機関(CA)です。それは、必要な手順のほとんど(もしくはすべて)を自動化しようとするソフトウェアクライアントであるCertbotを提供することによって、プロセスを簡素化します。現在、証明書を取得してインストールする全プロセスは、ApacheとNginxの両方で完全に自動化されています。

このチュートリアルでは、Certbotを使用してUbuntu 20.04上のNginxのために無料のSSL証明書を取得し、証明書を自動的に更新する方法を学びます。

このチュートリアルでは、デフォルトのファイルの代わりに個別のNginxサーバー構成ファイルを使用します。各ドメインごとに新しいNginxサーバーブロックファイルを作成することをお勧めします。これにより、一般的な間違いを回避し、デフォルトファイルをフォールバック構成として維持するのに役立ちます。

NginxとLet’s Encryptの管理をDigitalOceanに任せましょう。DigitalOcean App Platformを使用すれば、数分でGitHubから直接デプロイできます。App Platformはまた、SSL証明書とルーティングを自動的に処理します。

前提条件

このチュートリアルに従うには、次のものが必要です:

  • この Ubuntu 20.04 の初期サーバー設定 チュートリアルに従って設定された Ubuntu 20.04 サーバー1台。sudo 権限を持つ root 以外のユーザーとファイアウォールが含まれます。

  • 登録されたドメイン名。このチュートリアルでは example.com を使用します。ドメイン名は、Namecheap から購入したり、Freenom で無料で取得したり、お好みのドメイン登録業者を使用できます。

  • サーバーに次のDNSレコードの両方を設定してください。DigitalOcean を使用している場合は、詳細については当社の DNS ドキュメント を参照してください。

    • example.com の A レコードを、サーバーの公開IPアドレスに向けて設定してください。
    • www.example.com の A レコードを、サーバーの公開IPアドレスに向けて設定してください。
  • Nginxは、Ubuntu 20.04にNginxをインストールする方法に従ってインストールされました。ドメイン用のサーバーブロックを持っていることを確認してください。このチュートリアルでは、/etc/nginx/sites-available/example.comを例に使用します。

ステップ1 — Certbotのインストール

Let’s Encryptを使用してSSL証明書を取得するための最初のステップは、Certbotソフトウェアをサーバーにインストールすることです。

CertbotとそのNginxプラグインをaptでインストールします:

  1. sudo apt install certbot python3-certbot-nginx

Certbotは今使用準備ができていますが、NginxのSSLを自動的に構成するためには、Nginxの構成の一部を確認する必要があります。

ステップ2 — Nginxの構成の確認

Certbotは、SSLを自動的に構成するために正しいserverブロックをNginxの構成から見つける必要があります。具体的には、要求されたドメインに一致するserver_nameディレクティブを探します。

もしNginxのインストールチュートリアルでサーバーブロックの設定手順に従っていれば、すでに/etc/nginx/sites-available/example.comにドメイン用のサーバーブロックが設定されているはずで、server_nameディレクティブが適切に設定されています。

確認するには、お好みのテキストエディタでドメインの構成ファイルを開きます:

  1. sudo nano /etc/nginx/sites-available/example.com

既存のserver_name行を見つけます。次のようになっているはずです:

/etc/nginx/sites-available/example.com
...
server_name example.com www.example.com;
...

もしそうであれば、エディタを終了して次のステップに進んでください。

もしそうでない場合は、それに合わせて更新してください。その後、ファイルを保存し、エディタを終了し、構成編集の構文を確認してください:

  1. sudo nginx -t

エラーが発生した場合は、サーバーブロックファイルを再度開き、タイプミスや欠落している文字を確認してください。構成ファイルの構文が正しい場合は、新しい構成を読み込むためにNginxを再読み込みしてください:

  1. sudo systemctl reload nginx

Certbotは、正しいserverブロックを見つけて自動的に更新できるようになりました。

次に、ファイアウォールを更新してHTTPSトラフィックを許可しましょう。

ステップ3 — ファイアウォールを介したHTTPSの許可

推奨される前提ガイドで有効になっているufwファイアウォールを使用している場合、HTTPSトラフィックを許可するために設定を調整する必要があります。幸い、Nginxはインストール時にufwにいくつかのプロファイルを登録します。

現在の設定を次のように入力して確認できます:

  1. sudo ufw status

おそらく、これのように見えるでしょう。つまり、WebサーバーへのHTTPトラフィックのみが許可されています:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

HTTPSトラフィックも許可するために、Nginx Fullプロファイルを追加で許可し、冗長なNginx HTTPプロファイルの許可を削除します:

  1. sudo ufw allow 'Nginx Full'
  2. sudo ufw delete allow 'Nginx HTTP'

ステータスは今、次のようになるはずです:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

次に、Certbotを実行して証明書を取得しましょう。

ステップ4 — SSL証明書の取得

Certbotは、プラグインを介してさまざまな方法でSSL証明書を取得する機能を提供します。Nginxプラグインは、Nginxの再構成と構成の再読み込みを必要に応じて処理します。このプラグインを使用するには、次のように入力します:

  1. sudo certbot --nginx -d example.com -d www.example.com

これにより、--nginxプラグインを使用して-dで証明書の有効なドメイン名を指定してcertbotが実行されます。

これがcertbotを初めて実行する場合は、メールアドレスを入力し、利用規約に同意するように求められます。その後、certbotはLet’s Encryptサーバーと通信し、ドメインを所有していることを確認するためのチャレンジを実行します。

それが成功した場合、certbotはHTTPSの設定をどのように構成したいかを尋ねます。

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

選択肢を選択してENTERキーを押します。構成が更新され、Nginxは新しい設定を取得するために再読み込みされます。 certbotは、プロセスが成功したことと証明書の保存場所を伝えるメッセージで締めくくります。

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. 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

証明書がダウンロードされ、インストールされ、読み込まれました。ウェブサイトをhttps://を使用して再読み込みして、ブラウザのセキュリティインジケーターに注目してください。通常、サイトが適切にセキュリティで保護されていることを示すはずです。これは通常、ロックアイコンで示されます。サーバーをSSL Labs Server Testを使用してテストすると、Aの評価を受けるでしょう。

最後に、更新プロセスをテストしてみましょう。

ステップ5 — Certbot自動更新の検証

Let’s Encryptの証明書は90日間のみ有効です。これは、ユーザーが証明書の更新プロセスを自動化することを奨励するためです。インストールしたcertbotパッケージは、30日以内に有効期限が切れる証明書を自動的に更新するsystemdタイマーを追加することで、これを処理します。

タイマーのステータスをsystemctlでクエリできます:

  1. sudo systemctl status certbot.timer
Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service

更新プロセスをテストするには、certbotを使用してドライランを実行できます:

  1. sudo certbot renew --dry-run

エラーが表示されない場合は、準備完了です。必要に応じて、Certbotが証明書を更新し、Nginxを再読み込みして変更を適用します。自動更新プロセスが失敗した場合、Let’s Encryptは証明書の期限が切れる直前に指定した電子メールアドレスに警告メッセージを送信します。

結論

このチュートリアルでは、Let’s Encryptクライアントcertbotをインストールし、ドメイン用のSSL証明書をダウンロードし、Nginxをこれらの証明書を使用するように設定し、自動的な証明書の更新を行いました。Certbotの使用に関するさらなる質問がある場合は、公式ドキュメントが良い出発点です。

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04