FreeBSD12.0でLet’sEncryptを使用してApacheを保護する方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
Let’s Encrypt は、無料の TLS / SSL証明書を簡単に取得してインストールできる認証局(CA)であり、Webサーバーで暗号化されたHTTPSを有効にします。 必要な手順のほとんど(すべてではないにしても)を自動化しようとするソフトウェアクライアントCertbotを提供することにより、プロセスを簡素化します。
このチュートリアルでは、Certbotを使用して、ApacheをWebサーバーとして実行しているFreeBSD12.0サーバーでLet’sEncryptからTLS/SSL証明書を設定します。 さらに、cronジョブを使用して証明書の更新プロセスを自動化します。
前提条件
このガイドを開始する前に、次のものが必要です。
-
FreeBSDの使用を開始する方法のこのガイドを使用して、必要に応じてセットアップできるFreeBSD12.0サーバー。
-
このFAMPスタックチュートリアルのステップ1を完了することによってインストールされたApache。
-
このチュートリアルの手順のファイアウォール構成手順を使用して有効にしたファイアウォール。
-
ドメインがサーバーのパブリックIPアドレスを指す2つのDNSAレコード。 この設定では、ドメイン名として
your-domain
とwww.your-domain
を使用します。どちらも、有効なDNSレコードが必要です。 DigitalOceanプラットフォームでDNSレコードを追加する方法の詳細については、このDigitalOceanDNSの概要を参照してください。 Let’s Encryptが証明書を発行しているドメインを所有していることを検証する方法のため、DNSAレコードが必要です。 たとえば、your-domain
の証明書を取得する場合、検証プロセスを機能させるには、そのドメインをサーバーに解決する必要があります。
これらの前提条件が満たされると、Let’sEncrypt証明書をインストールできるツールであるCertbotのインストールを開始できます。
ステップ1—Let’sEncrypt用のCertbotツールのインストール
Let’s Encrypt証明書は、ユーザーのブラウザがWebサーバーが信頼できる認証局によって保護されていることを確認できることを保証します。 Webサーバーとの通信は、HTTPSを使用した暗号化によって保護されます。
このステップでは、WebサーバーにCertbotツールをインストールして、ドメインの有効な証明書とキーを発行するためにLet’sEncryptサーバーにリクエストを送信します。
次のコマンドを実行して、CertbotパッケージとそのApacheHTTPプラグインをインストールします。
- sudo pkg install -y py37-certbot py37-certbot-apache
パッケージをインストールしたので、次に進んでWebサーバーでTLS接続を有効にします。
ステップ2—ApacheHTTPでSSL/TLS接続を有効にする
デフォルトでは、Apache HTTPをインストールすると、ポート80
(HTTP)でコンテンツが提供されます。 メインのhttpd.conf
構成ファイルのListen 80
エントリは、これを確認します。 HTTPS接続を許可するには、デフォルトのポートを443
にする必要があります。 ポート443
を追加し、SSL / TLS接続を確立するには、ApacheHTTPでmod_ssl
モジュールを有効にします。
httpd.conf
ファイルでこのモジュールを見つけるには、grep
と-n
フラグを使用して、指定したパスのファイルの行に番号を付けます。 ここで、次のコマンドを実行すると、mod_ssl.so
が見つかります。
- grep -n 'mod_ssl.so' /usr/local/etc/apache24/httpd.conf
出力として、必要な回線の番号を受け取ります。
148 #LoadModule ssl_module libexec/apache24/mod_ssl.so
モジュールを有効にするには、行の先頭にあるハッシュタグ記号を削除します。
前のコマンドの行番号を使用して、次のファイルを開きます。
- sudo vi +148 /usr/local/etc/apache24/httpd.conf
これにより、編集用の正しい行に直接移動します。
x
を押して、次のように行を編集します。
#LoadModule session_dbd_module libexec/apache24/mod_session_dbd.so
#LoadModule slotmem_shm_module libexec/apache24/mod_slotmem_shm.so
#LoadModule slotmem_plain_module libexec/apache24/mod_slotmem_plain.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
#LoadModule dialup_module libexec/apache24/mod_dialup.so
#LoadModule http2_module libexec/apache24/mod_http2.so
#LoadModule proxy_http2_module libexec/apache24/mod_proxy_http2.so
#
を削除したら、:wq
を押してから、ENTER
を押してファイルを閉じます。
ApacheHTTPでSSL/TLS機能を有効にしました。 次のステップでは、ApacheHTTPで仮想ホストを構成します。
ステップ3—仮想ホストの有効化と構成
仮想ホストは、同じApache HTTPインストールを使用して、複数のWebサイトが同じサーバーに同時に独立して存在できる方法です。 Certbotでは、Let’s Encrypt証明書が機能するために、構成ファイル(仮想ホスト)内に特定のルールを配置するためにこのセットアップが必要です。
まず、ApacheHTTPで仮想ホストを有効にします。 次のコマンドを実行して、ファイル内のディレクティブを見つけます。
- grep -n 'vhosts' /usr/local/etc/apache24/httpd.conf
出力に行番号が表示されます。
Output508 #Include etc/apache24/extra/httpd-vhosts.conf
次に、次のコマンドを使用してファイルを編集し、その行の先頭から#
を削除します。
- sudo vi +508 /usr/local/etc/apache24/httpd.conf
前と同じように、x
を押して、行の先頭から#
を削除すると、次のようになります。
...
# User home directories
#Include etc/apache24/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include etc/apache24/extra/httpd-info.conf
# Virtual hosts
Include etc/apache24/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include etc/apache24/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include etc/apache24/extra/httpd-dav.conf
...
次に、:wq
とENTER
を押して、ファイルを保存して終了します。
Apache HTTPで仮想ホストを有効にしたので、デフォルトの仮想ホスト構成ファイルを変更して、サンプルドメインをドメイン名に置き換えます。
次に、仮想ホストブロックをhttpd-vhosts.conf
ファイルに追加します。 次のコマンドを使用して、ファイルを編集し、23行目のコメントブロックの後にある2つの既存のVirtualHost
ブロックを削除します。
- sudo vi +23 /usr/local/etc/apache24/extra/httpd-vhosts.conf
ファイルを開いた後、2つの既存のVirtualHost
構成ブロックを削除し、この特定の構成で次のブロックを追加します。
<VirtualHost *:80>
ServerAdmin your_email@your_domain.com
DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog "/var/log/your_domain.com-error_log"
CustomLog "/var/log/your_domain.com-access_log" common
</VirtualHost>
このブロックでは、以下を構成しています。
ServerAdmin
:これは、その特定のサイトの担当者からの電子メールが配置される場所です。DocumentRoot
:このディレクティブは、特定のサイトのファイルが配置され、そこから読み取られる場所を定義します。ServerName
:これはサイトのドメイン名用です。ServerAlias
:ServerName
に似ていますが、ドメイン名の前にwww.
を配置します。ErrorLog
:ここでエラーログパスが宣言されます。 すべてのエラーメッセージは、このディレクティブで指定されたファイルに書き込まれます。CustomLog
:ErrorLog
に似ていますが、今回はすべてのアクセスログを収集するファイルです。
最後に、サイトが配置されるディレクトリを作成します。 このパスは、httpd-vhosts.conf
ファイルのDocumentRoot
ディレクティブで宣言したパスと一致する必要があります。
- sudo mkdir /usr/local/www/apache24/data/your_domain.com
次に、ディレクトリの権限を変更して、Apache HTTPプロセス(www
ユーザーとして実行)がディレクトリを操作できるようにします。
- sudo chown -R www:www /usr/local/www/apache24/data/your_domain.com
chown
を使用して所有権を変更し、-R
フラグを使用して、アクションを再帰的にしました。 ユーザーとグループはwww:www
で設定します。
ApacheHTTPで仮想ホストを有効にしました。 ここで、書き換えモジュールを有効にします。
ステップ4—リライトモジュールを有効にする
URLを変更するには、たとえばHTTPからHTTPSにリダイレクトする場合など、ApacheHTTP内でリライトモジュールを有効にする必要があります。
次のコマンドを使用して、書き換えモジュールを見つけます。
- grep -n 'rewrite' /usr/local/etc/apache24/httpd.conf
次のような出力が表示されます。
Output180 #LoadModule rewrite_module libexec/apache24/mod_rewrite.so
モジュールを有効にするには、行の先頭から#
を削除します。
- sudo vi +180 /usr/local/etc/apache24/httpd.conf
x
を押して、行の先頭から#
を削除して、ファイルを次のように編集します。
#LoadModule actions_module libexec/apache24/mod_actions.so
#LoadModule speling_module libexec/apache24/mod_speling.so
#LoadModule userdir_module libexec/apache24/mod_userdir.so
LoadModule alias_module libexec/apache24/mod_alias.so
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
LoadModule php7_module libexec/apache24/libphp7.so
# Third party modules
IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf
<IfModule unixd_module>
このファイルを保存して終了します。
これで、Apacheで必要な構成のセットアップが完了しました。
ステップ5—Let’sEncrypt証明書を取得する
Certbotは、さまざまなプラグインを介してSSL証明書を取得するためのさまざまな方法を提供します。 apache
プラグインは、ApacheHTTPの再構成を処理します。 対話型インストールを実行し、単一のドメインのみをカバーする証明書を取得するには、次のcertbotコマンドを実行します。
- sudo certbot --apache -d your-domain -d www.your-domain
複数のドメインまたはサブドメインに有効な単一の証明書をインストールする場合は、それらを追加のパラメーターとしてコマンドに渡し、新しい各ドメインまたはサブドメインに-d
フラグをタグ付けできます。 パラメータリストの最初のドメイン名は、Let’sEncryptが証明書を作成するために使用するbaseドメインになります。 このため、最初にベースドメイン名を渡し、次に追加のサブドメインまたはエイリアスを渡します。
このサーバーでcertbot
を初めて実行する場合、クライアントは電子メールアドレスを入力し、Let’sEncryptの利用規約に同意するように求めます。 その後、certbot
はLet’sEncryptサーバーと通信し、チャレンジを実行して、証明書を要求しているドメインを制御していることを確認します。
チャレンジが成功すると、CertbotはHTTPS設定をどのように構成するかを尋ねます。
Output. . .
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
HTTP
とHTTPS
の両方のアクセスを有効にするか、すべてのリクエストをHTTPS
にリダイレクトするかを選択することもできます。 セキュリティを強化するために、暗号化されていない接続を許可する特別な必要がない場合は、オプション2: Redirect
を選択することをお勧めします。 選択してENTER
を押してください。
これにより、構成が更新され、ApacheHTTPがリロードされて新しい設定が取得されます。 certbot
は、プロセスが成功し、証明書が保存されている場所を通知するメッセージで終了します。
OutputIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/usr/local/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/usr/local/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on yyyy-mm-dd. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /usr/local/etc/letsencrypt. You should
make a secure backup of this folder now. This configuration
directory will also contain certificates and private keys obtained
by Certbot so making regular backups of this folder is ideal.
- 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
これで、証明書がダウンロード、インストール、および構成されました。 https://
を使用してウェブサイトをリロードしてみて、ブラウザのセキュリティインジケータに注目してください。 これは、サイトが適切に保護されていることを表し、通常は緑色の鍵のアイコンが付いています。 SSL Labsサーバーテストを使用してサーバーをテストすると、Aグレードになります。
Certbotは、いくつかの重要な構成変更を行いました。 Webサーバーに証明書をインストールするときは、証明書を特定のパスに配置する必要があります。 httpd-vhosts.conf
ファイルの内容を読むと、Certbotプログラムによって行われたいくつかの変更を確認できます。
たとえば、<VirtualHost *:80>
セクションでは、リダイレクトルール(選択されている場合)がその下部に配置されます。
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.your_domain.com [OR]
RewriteCond %{SERVER_NAME} =your_domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
Certbotは、httpd-vhosts-le-ssl.conf
というファイルも作成しました。このファイルには、Apacheの証明書の構成が配置されています。
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin your_email@your_domain.com
DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog "/var/log/your_domain.com-error_log"
CustomLog "/var/log/your_domain.com-access_log" common
Include /usr/local/etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pem
SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem
</VirtualHost>
</IfModule>
注: Let’s Encrypt証明書を使用するサイトでの暗号スイートの使用を変更する場合は、/usr/local/etc/letsencrypt/options-ssl-apache.conf
ファイルで変更できます。
Let’s Encrypt証明書を取得したら、自動更新の設定に進むことができます。
ステップ6—自動証明書更新の構成
Let’s Encryptの証明書は90日間有効ですが、エラーの許容範囲を確保するために、60日ごとに証明書を更新することをお勧めします。 このため、このプロセスを自動化して、証明書を定期的にチェックおよび更新することをお勧めします。
まず、証明書を更新するために使用するコマンドを調べてみましょう。 certbot
Let’sEncryptクライアントにはrenew
コマンドがあり、現在インストールされている証明書を自動的にチェックし、有効期限から30日以内の場合は更新を試みます。 --dry-run
オプションを使用すると、このタスクのシミュレーションを実行して、更新がどのように機能するかをテストできます。
- sudo certbot renew --dry-run
証明書が古くならないようにするための実用的な方法は、自動更新コマンドを定期的に実行するcronジョブを作成することです。 更新は最初に有効期限をチェックし、証明書の有効期限が30日以内の場合にのみ更新を実行するため、毎週または毎日実行されるcronジョブを作成しても安全です。
公式のCertbotドキュメントは、cron
を1日2回実行することを推奨しています。 これにより、Let’s Encryptが証明書の失効を開始した場合、Certbotが証明書を更新するまでに半日以内になります。
crontab
を編集して、更新を1日2回実行する新しいジョブを作成します。 rootユーザーのcrontab
を編集するには、次のコマンドを実行します。
- sudo crontab -e
次の構成をファイルに配置して、1日に2回、システムが更新可能な証明書を検索し、必要に応じて更新するようにします。
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute hour mday month wday command
0 0,12 * * * /usr/local/bin/certbot renew
最初の2行で、環境変数を宣言しています。したがって、実行可能パスが見つかる場所と、それらが実行されているシェルを宣言しています。 次に、関心のある時間枠と実行するコマンドを指定します。
この短い一連の手順で、証明書の自動更新を構成しました。
結論
このチュートリアルでは、Let’sEncryptクライアントcertbot
をインストールし、ドメインのSSL証明書をダウンロードし、これらの証明書を使用するようにApacheを構成し、証明書の自動更新を設定しました。 詳細については、Certbotのドキュメントを参照してください。