Debian 8でLet’s Encryptを使用してApacheを保護する方法

前書き

このチュートリアルでは、WebサーバーとしてApacheを実行しているDebian 8サーバーでhttps://letsencrypt.org/[Let’s Encrypt]からTLS / SSL証明書をセットアップする方法を示します。 また、cronジョブを使用して証明書の更新プロセスを自動化する方法についても説明します。

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

前提条件

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

証明書を使用する登録ドメイン名を所有または制御する必要があります。 登録済みのドメイン名をまだお持ちでない場合は、多数のドメイン名レジストラーのいずれかに登録できます(例: Namecheap、GoDaddyなど)。

まだお持ちでない場合は、サーバーのパブリックIPアドレスをドメインにポイントする* Aレコード*を作成してください(DigitalOceanのDNSを使用している場合は、https://www.digitalocean.com/communityをフォローできます/ tutorials / how-to-set-up-a-host-name-with-digitalocean [このガイド])。 これは、Let’s Encryptが証明書を発行するドメインを所有していることを検証する方法のために必要です。 たとえば、「+ example.com 」の証明書を取得する場合、検証プロセスが機能するためには、そのドメインがサーバーに解決される必要があります。 このセットアップでは、ドメイン名として「 example.com 」と「 www.example.com +」を使用するため、両方のDNSレコードが必要です

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

ステップ1:Let’s Encrypt ClientであるCertbotをインストールする

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

Debian 8のリリース時には、 `+ certbot `パッケージは利用できませんでした。 ` 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 +`パッケージをインストールできます。

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

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

ステップ2:Apache ServerNameおよびServerAliasをセットアップする

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

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

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

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

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

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

<VirtualHost *:80>
   . . .
   ServerName
   ServerAlias
   . . .
</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 Full」アプリケーションプロファイルを許可できます。

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 -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’s Encryptクライアントを使用したApacheのSSL証明書の生成は非常に簡単です。 クライアントは、Apache構成のドメインに有効な新しいSSL証明書を自動的に取得してインストールします。

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

sudo certbot --apache

`+ certbot +`ユーティリティはApacheの設定を評価して、リクエストされた証明書でカバーされるべきドメインを見つけます。 証明書の対象にしたくない定義済みドメインを選択解除できます。

証明書オプションをカスタマイズするためのステップバイステップガイドが表示されます。 失われたキーの回復と通知用の電子メールアドレスを提供するように求められます。また、「+ http 」と「 https 」の両方のアクセスを有効にするか、すべてのリクエストを「 https 」にリダイレクトするかを選択できます。 暗号化されていない「 http 」トラフィックが特に必要でない限り、通常は「 https +」を要求するのが最も安全です。

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

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

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

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

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

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

sudo certbot renew

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

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

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

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

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

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

crontabを編集して、毎週更新コマンドを実行する新しいジョブを作成しましょう。 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 +`にあるログファイルにパイプされます。

結論

このガイドでは、ApacheでホストされているWebサイトを保護するために、Let’s Encryptから無料のSSL証明書をインストールする方法を説明しました。 公式のhttps://letsencrypt.org/blog/[Let’s Encrypt blog]で重要なアップデートを随時確認することをお勧めします。

Related