Ubuntu上でApacheをLet’s Encryptで保護する方法

紹介

Let’s Encryptは、無料の<TLS/SSL証明書を取得およびインストールするを支援する証明局(CA)であり、ウェブサーバー上で暗号化されたHTTPSを有効にすることができます。これは、必要な手順のほとんど(またはすべて)を自動化しようとするソフトウェアクライアント、Certbotを提供することでプロセスを簡素化しています。現在、証明書の取得およびインストールの全体のプロセスは、ApacheとNginxの両方で完全に自動化されています。

このガイドでは、Certbotを使用してUbuntu上のApache用の無料SSL証明書を取得し、この証明書が自動的に更新されるように設定する方法を説明します。

このチュートリアルでは、Let’s Encryptで保護されるウェブサイトを設定するためにApacheのデフォルト設定ファイルの代わりに別の仮想ホストファイルを使用します。私たちは推奨します、サーバー上にホストされる各ドメイン用に新しいApache仮想ホストファイルを作成することは、一般的な間違いを回避するのに役立ち、デフォルトの設定ファイルをフォールバック設定として保持するのに役立ちます。

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

  1. Certbotのインストール
  2. Apache仮想ホスト設定の確認
  3. ファイアウォールを通じてHTTPSを許可
  4. SSL証書の取得
  5. Certbotの自動更新を確認

前提条件

このチュートリアルに従うために必要なものは以下の通りです:

  • rootユーザーではないユーザーで設定され、sudo管理者権限とファイアウォールが有効なUbuntuサーバーの1台です。これは、私たちのUbuntuの初期サーバー設定チュートリアルに従って設定できます。

  • 完全に登録されたドメイン名です。このチュートリアルではyour_domainを例として使用します。ドメイン名はNamecheapで購入するか、Freenomで無料で取得するか、またはご希望のドメイン登録サービスを使用してください。

  • 以下の両方のDNSレコードをお使いのサーバーに設定してください。これらを追加する方法の詳細については、DigitalOcean DNSのこのガイドに従ってください。

    • your_domainがサーバーのパブリックIPアドレスに向けてポイントするAレコード。
    • www.your_domainがサーバーのパブリックIPアドレスに向けてポイントするAレコード。
  • ApacheはUbuntuにApacheをインストールする方法に従ってインストールされていることを確認してください。ドメイン用の仮想ホストファイルがあることを確認してください。このチュートリアルでは、例として/etc/apache2/sites-available/your_domain.confを使用します。

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

Let’s EncryptでSSL証明書を取得するためには、サーバーにCertbotソフトウェアをインストールする必要があります。それには、デフォルトのUbuntuパッケージリポジトリを使用します。

まず、ローカルのパッケージインデックスを更新します:

  1. sudo apt update

2つのパッケージが必要です:certbotpython3-certbot-apacheです。後者はCertbotをApacheと統合するプラグインで、証明書の取得とWebサーバー内でHTTPSの設定を1つのコマンドで自動化することができます:

  1. sudo apt install certbot python3-certbot-apache

インストールを確認するためにYを押してからENTERを押すように促されます。

Certbot は現在、お使いのサーバーにインストールされました。次のステップでは、Apacheの設定を確認し、仮想ホストが適切に設定されていることを確認します。これにより、certbot クライアントスクリプトがドメインを検出し、新しく生成されたSSL証明書を自動的に使用するためにウェブサーバーを再設定することができます。

ステップ2 — Apache仮想ホスト設定の確認

ウェブサーバーにSSLを自動的に取得し設定するために、CertbotはApacheの設定ファイル内の正しい仮想ホストを見つける必要があります。サーバーのドメイン名は、VirtualHost 設定ブロック内に定義された ServerNameServerAlias ディレクティブから取得されます。

Apacheインストールチュートリアルの仮想ホスト設定ステップに従った場合、/etc/apache2/sites-available/your_domain.conf にドメイン用の VirtualHost ブロックが設定され、ServerNameServerAlias ディレクティブがすでに適切に設定されているはずです。

これが設定されていることを確認するには、nano やお好みのテキストエディターを使用して、ドメインの仮想ホストファイルを開きます:

  1. sudo nano /etc/apache2/sites-available/your_domain.conf

既存のServerNameServerAliasの行を見つけてください。以下のようにリストされているはずです:

/etc/apache2/sites-available/your_domain.conf
...
ServerName your_domain
ServerAlias www.your_domain
...

既にServerNameServerAliasがこのように設定されている場合、テキストエディタを閉じて次のステップに進みます。現在の仮想ホスト設定が例と一致していない場合は、それに従って更新してください。nanoを使用している場合、CTRL+Xを押してからYENTERを押して変更を確認します。

  1. sudo apache2ctl configtest

次のコマンドを実行して変更を検証します:

  1. sudo systemctl reload apache2

Syntax OKという応答を受け取るべきです。エラーが発生した場合、仮想ホストファイルを再び開き、タイポや欠けている文字を確認してください。設定ファイルの構文が正しい場合、変更を有効にするためにApacheを再読み込みします:

これらの変更により、Certbotは正しいVirtualHostブロックを見つけて更新することができます。

ステップ3 — ファイアウォールを通じてHTTPSを許可する

前提ガイドに記載されているように、UFWファイアウォールを有効にしている場合、HTTPSトラフィックを許可するために設定を調整する必要があります。インストール時に、Apacheはいくつかの異なるUFWアプリケーションプロファイルを登録します。Apache Fullプロファイルを利用して、サーバー上のHTTPとHTTPSトラフィックを両方許可することができます。

現在サーバーで許可されているトラフィックの種類を確認するには、ステータスを確認してください:

  1. sudo ufw status

私たちのApacheインストールガイドのいずれかに従った場合、以下のような出力が得られ、現在ポート80上のHTTPトラフィックだけが許可されていることを意味します:

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

HTTPSトラフィックを許可するには、「Apache Full」プロファイルを許可してください:

  1. sudo ufw allow 'Apache Full'

その後、不要な「Apache」プロファイルを削除してください:

  1. sudo ufw delete allow 'Apache'

ステータスは以下のように表示されます:

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

これでCertbotを実行して証明書を取得する準備が整いました。

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

Certbotはプラグインを通じてさまざまな方法でSSL証明書を取得することができます。Apacheプラグインは、必要に応じてApacheを再設定し、設定をリロードするのに役立ちます。このプラグインを使用するには、以下を実行してください:

  1. sudo certbot --apache

このスクリプトは、SSL証明書を設定するためにいくつかの質問に答えるように促します。まず、有効なメールアドレスを求めます。このメールアドレスは、更新通知とセキュリティ通知に使用されます:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): you@your_domain

有効なメールアドレスを提供した後、ENTERを押して次のステップに進みます。その後、Let’s Encryptの利用規約に同意するかどうかを確認するよう促されます。同意する場合はYを押してからENTERを押してください:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

次に、Electronic Frontier Foundationにメールを共有してニュースやその他の情報を受け取るかどうかを尋ねられます。彼らのコンテンツに購読したくない場合は、Nと書きます。それ以外の場合は、Yと書いてENTERを押して次のステップに進みます:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

次のステップでは、CertbotにどのドメインでHTTPSを有効にしたいかを伝えるように求められます。一覧表示されたドメイン名は、Apacheの仮想ホスト設定から自動的に取得されるので、仮想ホストに正しいServerNameServerAlias設定が行われていることを確認することが重要です。一覧表示されたすべてのドメイン名にHTTPSを有効にする場合(推奨)、プロンプトを空白のままENTERを押して進めることができます。それ以外の場合は、有効にしたいドメインを各適切な番号でリストアップし、コンマおよび/またはスペースで区切ってENTERを押して進めます:

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 

このステップの後、Certbotの設定は完了し、生成されたファイルの場所についての最終的なコメントと新しい証書について表示されます:

Output
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-07-10. 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/apache2/sites-available/your_domain-le-ssl.conf Successfully deployed certificate for www.your_domain.com to /etc/apache2/sites-available/your_domain-le-ssl.conf Congratulations! You have successfully enabled HTTPS on https:/your_domain and https://www.your_domain.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

証書は現在、Apacheの設定にインストールされ読み込まれています。ウェブサイトをhttps://で再読み込みして、ブラウザのセキュリティインジケータを確認してください。通常、アドレスバーに鍵のアイコンで、サイトが適切に保護されていることが示されます。

SSL Labs Server Testを使用して、外部サービスの視点から証書の評価と詳細情報を確認することができます。

次で最後のステップでは、Certbotの自動更新機能をテストします。これにより、証明書の有効期限が切れる前に自動的に更新されることが保証されます。

ステップ5 — Certbotの自動更新を確認する

Let’s Encryptの証明書は90日間有効です。これは、ユーザーが証明書の更新プロセスを自動化するよう励まるため、そして、誤用された証明書や盗まれた鍵が早く失効するようにするためです。

インストールしたcertbotパッケージは、/etc/cron.dに含まれる更新スクリプトによって更新を処理し、systemctlサービスによって管理されるcertbot.timerと呼ばれるサービスによって管理されます。このスクリプトは1日2回実行され、30日以内に失効する証明書を自動的に更新します。

このサービスのステータスを確認し、アクティブであることを確認するには、以下を実行してください:

  1. sudo systemctl status certbot.timer

出力は以下のようになります:

Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset:> Active: active (waiting) since Mon 2022-04-11 20:52:46 UTC; 4min 3s ago Trigger: Tue 2022-04-12 00:56:55 UTC; 4h 0min left Triggers: ● certbot.service Apr 11 20:52:46 jammy-encrypt systemd[1]: Started Run certbot twice daily.

更新プロセスをテストするために、certbotでドライランを行うことができます:

  1. sudo certbot renew --dry-run
Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account registered. Simulating renewal of an existing certificate for your_domain and www.your_domain.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/your_domain/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

エラーがない場合は、設定が完了しています。必要に応じて、Certbotは証明書を更新し、変更を取得するためにApacheをリロードします。自動更新プロセスが失敗した場合、Let’s Encryptは指定したメールアドレスにメッセージを送信し、証明書が失効する前に警告します。

結論

このチュートリアルでは、Let’s Encryptのクライアントcertbotをインストールし、ドメイン用のSSL証明書を設定およびインストールし、systemctl内でCertbotの自動更新サービスが有効であることを確認しました。Certbotの使用についてさらに質問がある場合は、そのドキュメントが良いスタート点です。

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