Debian8でLet'sEncryptを使用してApacheを保護する方法

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

序章

このチュートリアルでは、ApacheをWebサーバーとして実行しているDebian8サーバーでLet'sEncryptからTLS/SSL証明書を設定する方法を説明します。 また、cronジョブを使用して証明書の更新プロセスを自動化する方法についても説明します。

SSL証明書は、サーバーとクライアント間のトラフィックを暗号化するためにWebサーバー内で使用され、アプリケーションにアクセスするユーザーに追加のセキュリティを提供します。 Let's Encryptは、信頼できる証明書を無料で取得してインストールする簡単な方法を提供します。

前提条件

このガイドを完了するには、管理タスク用の非ルートsudoユーザーを持つDebian8サーバーが必要です。 Debian 8初期サーバーセットアップガイドに従って、適切な権限を持つユーザーをセットアップできます。

証明書を使用する登録済みドメイン名を所有または管理する必要があります。 まだドメイン名を登録していない場合は、そこにある多くのドメイン名レジストラの1つに登録できます(例: Namecheap、GoDaddyなど)。

まだ作成していない場合は、ドメインがサーバーのパブリックIPアドレスを指す Aレコードを作成してください(DigitalOceanのDNSを使用している場合は、このガイドに従うことができます])。 これが必要なのは、Let's Encryptが、証明書を発行しているドメインを所有していることを検証する方法のためです。 たとえば、example.comの証明書を取得する場合、検証プロセスを機能させるには、そのドメインをサーバーに解決する必要があります。 この設定では、ドメイン名としてexample.comwww.example.comを使用するため、両方のDNSレコードが必要です

先に進む準備ができたら、sudoアカウントを使用してサーバーにログインします。

ステップ1:Let'sEncryptクライアントであるCertbotをインストールする

Let's Encryptを使用してSSL証明書を取得するための最初のステップは、サーバーにcertbotLet'sEncryptクライアントをインストールすることです。

certbotパッケージは、Debian8がリリースされたときには利用できませんでした。 certbotパッケージにアクセスするには、サーバーでJessieバックポートリポジトリを有効にする必要があります。 このリポジトリを使用して、安定したリポジトリに含まれているものよりも新しいバージョンのソフトウェアをインストールできます。

次のように入力して、バックポートリポジトリをサーバーに追加します。

echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

新しいリポジトリを追加した後、aptパッケージインデックスを更新して、新しいパッケージに関する情報をダウンロードします。

sudo apt-get update

リポジトリが更新されたら、バックポートリポジトリをターゲットにすることで、certbotを取り込むpython-certbot-apacheパッケージをインストールできます。

注:バックポートを使用する場合は、一般的な更新にリポジトリを使用するのではなく、必要な特定のパッケージのみをインストールすることをお勧めします。 バックポートパッケージは、メインリポジトリよりも互換性の保証が少なくなっています。

このリポジトリを使用して誤ってパッケージをインストールまたは更新しないようにするには、リポジトリ名とともに-tフラグを明示的に渡して、バックポートからパッケージをインストールする必要があります。


sudo apt-get install python-certbot-apache -t jessie-backports

これで、certbotクライアントを使用する準備が整いました。

ステップ2:ApacheServerNameとServerAliasを設定する

certbotユーティリティを呼び出すときに、保護したいドメインを引数として渡すことができます。 ただし、certbotは、Apache構成自体からこれらを読み取ることもできます。 サーバーが応答するドメインについて常に明示することをお勧めします。そのため、Apache構成でServerNameServerAliasを直接設定します。

python-certbot-apacheサービスをインストールしたときに、Apacheがシステムにまだ存在していない場合は、Apacheがインストールされました。 デフォルトのApache仮想ホストファイルを開いて、ドメイン名を明示的に設定できるようにします。

sudo nano /etc/apache2/sites-available/000-default.conf

内部の仮想ホストブロック内で、ServerNameディレクティブを追加またはコメント解除し、プライマリドメイン名に設定します。 このサーバーも応答する必要のある代替ドメイン名は、ServerAliasディレクティブを使用して追加できます。

この例では、正規名としてexample.comを使用し、エイリアスとしてwww.example.comを使用しています。 これらのディレクティブを設定すると、次のようになります。

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    . . .
    ServerName example.com
    ServerAlias www.example.com
    . . .
</VirtualHost>

終了したら、 CTRLを押しながらXを押して、ファイルを保存して閉じます。 Y と入力し、Enterを押してファイルを保存します。

構成ファイルをチェックして、変更によって生じた可能性のある構文エラーをキャッチします。

sudo apache2ctl configtest

出力で次の行を探します。

OutputSyntax OK

ファイルが構文テストに合格した場合は、Apacheサービスを再起動して変更を実装します。

sudo systemctl restart apache2

Apacheがドメイン名で構成されたので、certbotを使用してSSL証明書を取得できます。

ステップ3:ファイアウォールを調整する

ファイアウォールを有効にしている場合は、SSLトラフィックを許可するように設定を調整する必要があります。 必要な手順は、使用しているファイアウォールソフトウェアによって異なります。 現在ファイアウォールが構成されていない場合は、スキップしてください。

UFW

ufw を使用している場合は、次のように入力すると現在の設定を確認できます。

sudo ufw status

これは次のようになります。つまり、SSHトラフィックのみがWebサーバーに許可されます。

OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)

さらにHTTPおよびHTTPSトラフィックを取り込むために、「WWWフル」アプリケーションプロファイルを許可できます。

sudo ufw allow 'WWW Full'

ステータスは次のようになります。

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

これで、HTTPおよびHTTPSリクエストがサーバーで受け入れられるようになります。

IPTables

iptablesを使用している場合は、次のように入力すると現在のルールを確認できます。

sudo iptables -S

ルールを有効にしている場合は、それらが表示されます。 構成例は次のようになります。

Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

SSLトラフィックを開くために必要なコマンドは、現在のルールによって異なります。 上記のような基本的なルールセットの場合、次のように入力してSSLアクセスを追加できます。

sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT

ファイアウォールルールをもう一度見ると、新しいルールが表示されます。

sudo iptables -S
Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

プログラムを使用して起動時にiptablesルールを自動的に適用する場合は、必ず新しいルールで構成を更新する必要があります。

ステップ4:SSL証明書を設定する

Let'sEncryptクライアントを使用したApacheのSSL証明書の生成は非常に簡単です。 クライアントは、Apache構成のドメインに有効な新しいSSL証明書を自動的に取得してインストールします。

対話型インストールを実行し、Apache構成で定義されているすべてのドメインの証明書を取得するには、次のように入力します。

sudo certbot --apache

certbotユーティリティは、Apache構成を評価して、要求された証明書でカバーする必要のあるドメインを見つけます。 証明書の対象とならない定義済みのドメインの選択を解除することができます。

証明書オプションをカスタマイズするためのステップバイステップガイドが表示されます。 紛失したキーの回復と通知用のメールアドレスを入力するよう求められます。httphttpsの両方のアクセスを有効にするか、すべてのリクエストをhttps。 暗号化されていないhttpトラフィックが特に必要な場合を除いて、通常はhttpsを要求するのが最も安全です。

インストールが完了すると、/etc/letsencrypt/liveで生成された証明書ファイルを見つけることができるはずです。 SSL証明書のステータスは、次のリンクで確認できます( example.com をドメインに置き換えることを忘れないでください)。

https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest

テストが完了するまでに数分かかる場合があります。 これで、httpsプレフィックスを使用してWebサイトにアクセスできるようになります。

ステップ5:自動更新を設定する

Let's Encryptの証明書は90日間有効ですが、エラーの許容範囲を確保するために、60日ごとに証明書を更新することをお勧めします。 certbotクライアントにはrenewコマンドがあり、現在インストールされている証明書を自動的にチェックし、有効期限から30日以内であれば更新を試みます。

インストールされているすべてのドメインの更新プロセスをトリガーするには、次のコマンドを実行する必要があります。

sudo certbot renew

最近証明書をインストールしたため、コマンドは有効期限のみを確認し、証明書がまだ更新されていないことを通知するメッセージを出力します。 出力は次のようになります。

OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.

複数のドメインでバンドルされた証明書を作成した場合、ベースドメイン名のみが出力に表示されますが、更新はこの証明書に含まれるすべてのドメインに対して有効である必要があることに注意してください。

証明書が古くならないようにするための実用的な方法は、自動更新コマンドを定期的に実行するcronジョブを作成することです。 更新は最初に有効期限をチェックし、証明書の有効期限が30日以内の場合にのみ更新を実行するため、たとえば、毎週または毎日実行するcronジョブを作成しても安全です。

crontabを編集して、毎週renewalコマンドを実行する新しいジョブを作成しましょう。 rootユーザーのcrontabを編集するには、次のコマンドを実行します。

sudo crontab -e

エディターを選択するように求められる場合があります。

Outputno crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny

Choose 1-3 [1]:

vimに慣れていない場合は、 Enter を押して、デフォルトのnanoを使用してください。

crontabの最後に次のコンテンツをすべて1行に含めます。

crontab. . .
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

保存して終了。 これにより、毎週月曜日の午前2時30分にletsencrypt-auto renewコマンドを実行する新しいcronジョブが作成されます。 コマンドによって生成された出力は、/var/log/le-renewal.logにあるログファイルにパイプされます。

cronジョブを作成およびスケジュールする方法の詳細については、VPSガイドでCronを使用してタスクを自動化する方法を確認してください。


結論

このガイドでは、ApacheでホストされているWebサイトを保護するために、Let'sEncryptから無料のSSL証明書をインストールする方法を説明しました。 重要な更新については、公式のLet'sEncryptブログを時々確認することをお勧めします。