Debian8でLet’sEncryptを使用してApacheを保護する方法
序章
このチュートリアルでは、ApacheをWebサーバーとして実行しているDebian8サーバーでLet’sEncryptからTLS/SSL証明書を設定する方法を説明します。 また、cronジョブを使用して証明書の更新プロセスを自動化する方法についても説明します。
SSL証明書は、サーバーとクライアント間のトラフィックを暗号化するためにWebサーバー内で使用され、アプリケーションにアクセスするユーザーに追加のセキュリティを提供します。 Let’s Encryptは、信頼できる証明書を無料で取得してインストールする簡単な方法を提供します。
前提条件
このガイドを完了するには、ルート以外のDebian8サーバーが必要です。 sudo
管理タスクのユーザー。 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
サーバー上のクライアントを暗号化しましょう。
The certbot
Debian 8がリリースされたとき、パッケージは利用できませんでした。 アクセスするには 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
リポジトリが更新されたら、 python-certbot-apache
引き込むパッケージ certbot
、バックポートリポジトリをターゲットにすることにより:
注:バックポートを使用する場合は、一般的な更新にリポジトリを使用するのではなく、必要な特定のパッケージのみをインストールすることをお勧めします。 バックポートパッケージは、メインリポジトリよりも互換性の保証が少なくなっています。
このリポジトリを使用して誤ってパッケージをインストールまたは更新しないようにするには、明示的に -t
バックポートからパッケージをインストールするためのリポジトリ名のフラグ。
- sudo apt-get install python-certbot-apache -t jessie-backports
The certbot
これで、クライアントを使用する準備が整いました。
ステップ2:ApacheServerNameとServerAliasを設定する
を呼び出すときに、保護したいドメインを引数として渡すことができます。 certbot
効用。 でも、 certbot
これらは、Apache構成自体から読み取ることもできます。 サーバーが応答するドメインについて常に明示することをお勧めします。そのため、 ServerName
と ServerAlias
Apache構成で直接。
インストールしたとき python-certbot-apache
サービス、Apacheは、システムにまだ存在していない場合にインストールされました。 デフォルトのApache仮想ホストファイルを開いて、ドメイン名を明示的に設定できるようにします。
- sudo nano /etc/apache2/sites-available/000-default.conf
内部、仮想ホストブロック内で、 ServerName
ディレクティブを作成し、プライマリドメイン名に設定します。 このサーバーも応答する必要がある代替ドメイン名は、を使用して追加できます。 ServerAlias
指令。
この例では、 example.com
私たちの正規名として www.example.com
エイリアスとして。 これらのディレクティブを設定すると、次のようになります。
<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
The certbot
ユーティリティは、Apache構成を評価して、要求された証明書でカバーする必要のあるドメインを見つけます。 証明書の対象とならない定義済みのドメインの選択を解除することができます。
証明書オプションをカスタマイズするためのステップバイステップガイドが表示されます。 紛失したキーの回復と通知のためにメールアドレスを提供するように求められ、両方を有効にするかどうかを選択できます http
と https
すべてのリクエストにアクセスするか、リダイレクトを強制します https
. 通常、要求するのが最も安全です https
、暗号化されていない必要がある場合を除きます http
トラフィック。
インストールが完了すると、生成された証明書ファイルを次の場所で見つけることができるはずです。 /etc/letsencrypt/live
. SSL証明書のステータスは、次のリンクで確認できます( example.com をドメインに置き換えることを忘れないでください)。
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
テストが完了するまでに数分かかる場合があります。 これで、を使用してWebサイトにアクセスできるようになります。 https
プレフィックス。
ステップ5:自動更新を設定する
Let’s Encryptの証明書は90日間有効ですが、エラーの許容範囲を確保するために、60日ごとに証明書を更新することをお勧めします。 The 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
保存して終了。 これにより、を実行する新しいcronジョブが作成されます。 letsencrypt-auto renew
毎週月曜日の午前2時30分にコマンドを実行します。 コマンドによって生成された出力は、次の場所にあるログファイルにパイプされます。 /var/log/le-renewal.log
.
cronジョブを作成およびスケジュールする方法の詳細については、VPSガイドでCronを使用してタスクを自動化する方法を確認してください。
結論
このガイドでは、ApacheでホストされているWebサイトを保護するために、Let’sEncryptから無料のSSL証明書をインストールする方法を説明しました。 重要な更新については、公式のLet’sEncryptブログを時々確認することをお勧めします。