Debian8でLet'sEncryptを使用してApacheを保護する方法
序章
このチュートリアルでは、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.com
とwww.example.com
を使用するため、両方のDNSレコードが必要です。
先に進む準備ができたら、sudoアカウントを使用してサーバーにログインします。
ステップ1:Let'sEncryptクライアントであるCertbotをインストールする
Let's Encryptを使用してSSL証明書を取得するための最初のステップは、サーバーにcertbot
Let'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構成でServerName
とServerAlias
を直接設定します。
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構成を評価して、要求された証明書でカバーする必要のあるドメインを見つけます。 証明書の対象とならない定義済みのドメインの選択を解除することができます。
証明書オプションをカスタマイズするためのステップバイステップガイドが表示されます。 紛失したキーの回復と通知用のメールアドレスを入力するよう求められます。http
とhttps
の両方のアクセスを有効にするか、すべてのリクエストを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ブログを時々確認することをお勧めします。