FreeBSDでLet’s Encryptを使用してNginxを保護する方法

前書き

Let’s Encryptは、無料のTLS / SSL証明書を取得してインストールする簡単な方法を提供する認証局(CA)です。これにより、Webサーバーで暗号化されたHTTPSを有効にします。 ほとんどのステップを自動化するソフトウェアクライアントCertbotを提供することにより、プロセスを簡素化します。

このチュートリアルでは、Certbotを使用して無料のSSL証明書を取得し、それをNginxを実行しているFreeBSDサーバーで使用する方法を示します。 また、SSL証明書を自動的に更新する方法も示します。

このチュートリアルでは、個別のサーバーブロックファイルの代わりに、デフォルトのNginx構成ファイルを使用します。 https://www.digitalocean.com/community/tutorials/technical-recommendations-and-best-practices-for-digitalocean-s-tutorials#web-servers [一般に推奨]各Nginxサーバーブロックファイルを作成するためよくある間違いを避けるのに役立ち、デフォルトファイルを意図したフォールバック構成として維持します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • FreeBSDサーバー。 FreeBSD 11を初めて使用する場合は、https://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsd-10-1 [このガイド]を参考にしてください。始めましょう。

  • Nginxがサーバーにインストールおよび構成されています。 これを設定する方法については、https://www.digitalocean.com/community/tutorials/how-to-install-nginx-freebsd-11-2 [FreeBSD 11.2にNginxをインストールする方法]のガイドを参照してください。

  • 所有および管理する登録済みドメイン名。 登録済みのドメイン名をまだお持ちでない場合は、多数のドメイン名レジストラーのいずれかに登録できます(例: Namecheap、GoDaddyなど)。

  • ドメインがサーバーのパブリックIPアドレスを指す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レコードが必要です

これらの前提条件を完了したら、クライアントソフトウェアの暗号化を行うCertbotのインストールに進みましょう。

ステップ1-Certbotのインストール

Let’s Encryptを使用してSSL証明書を取得する最初のステップは、サーバーに「+ certbot +」クライアントソフトウェアをインストールすることです。 Certbotの最新バージョンは、FreeBSDのhttps://www.digitalocean.com/community/tutorials/how-to-install-and-manage-ports-on-freebsd-10-1[ports system]を使用してソースからインストールできます。

まず、ポートツリーの圧縮スナップショットを取得します。

sudo portsnap fetch

このコマンドが完了するまでに数分かかる場合があります。 終了したら、スナップショットを抽出します。

sudo portsnap extract

このコマンドが終了するまでに時間がかかる場合があります。 完了したら、portsツリー内の `+ py-certbot +`ディレクトリに移動します。

cd /usr/ports/security/py-certbot

次に、 `+ sudo `権限で ` make +`コマンドを使用して、Certbotソースコードをダウンロードしてコンパイルします。

sudo make install clean

次に、ポートツリー内の `+ py-certbot-nginx +`ディレクトリに移動します。

cd /usr/ports/security/py-certbot-nginx

このディレクトリから `+ make `コマンドを再度実行します。 これにより、SSL証明書を取得するために使用するCertbot用の ` nginx +`プラグインがインストールされます。

sudo make install clean

このプラグインのインストール中に、次のような青いダイアログウィンドウがいくつか表示されます。

image:https://assets.digitalocean.com/articles/letsencrypt_freebsd/py-nginx.png [py-certbot-nginxダイアログウィンドウの例]

これらは、プラグインとその依存関係のドキュメントをインストールするオプションを提供します。 このチュートリアルの目的のために、これらのウィンドウでデフォルトのオプションを受け入れるために `+ ENTER +`を押すだけでこのドキュメントをインストールできます。

これで、 + certbot + Let’s Encryptクライアントを使用する準備が整いました。 ただし、証明書を取得する前に、ファイアウォールを設定し、HTTPSトラフィックを許可することが重要です(まだ行っていない場合)。

手順2-ファイアウォールの設定とHTTPSアクセスの許可

サーバーにファイアウォールを既に設定している場合は、HTTPSアクセス(ポート `+ 443 +`経由)が許可されていることを確認する必要があります。 まだファイアウォールを設定していない場合は、この手順で説明されている指示に従って設定できます。

お好みのエディターで、 `+ / etc / `ディレクトリにある ` rc.conf `ファイルを開きます。 ここでは、 ` ee +`を使用します。

sudo ee /etc/rc.conf

このファイルは、マシンが起動するたびに開始するサービスをFreeBSDに通知するために使用されます。 ファイルの上部近くに、次の強調表示された行を追加します。

/etc/rc.conf

. . .
nginx_enable="YES"

これらの各ディレクティブとその設定の機能は次のとおりです。

  • + firewall_enable =" YES "+-これにより、サーバーが起動するたびにファイアウォールを起動できます。

  • + firewall_type =" workstation "+-FreeBSDはいくつかのデフォルトタイプのファイアウォールを提供しますが、それぞれがわずかに異なる設定を持っています。 `+ workstation +`タイプを宣言することにより、ファイアウォールはステートフルルールを使用してこのサーバーのみを保護します。

  • + firewall_myservices =" 22 / tcp 80 / tcp 443 / tcp "+-+ firewall_myservices +`ディレクティブは、ファイアウォールの通過を許可するTCPポートを一覧表示できる場所です。 この例では、ポート `+ 22 ++ 80 +、および `+ 443 +`を指定して、それぞれサーバーへのSSH、HTTP、およびHTTPSアクセスを許可しています。

  • + firewall_allowservices =" any "+-これにより、任意のIPアドレスのマシンが、 `+ firewall_myservices +`ディレクティブで指定されたポートを介して通信できるようになります。

これらの行を追加したら、ファイルを保存し、「+ CTRL + C 」を押して「 exit 」と入力し、「 ENTER +」を押してエディターを閉じます。

次に、「+ ipfw 」ファイアウォールサービスを開始します。 このサーバーでファイアウォールを起動するのはこれが初めてなので、これを行うとサーバーが失速し、SSH経由でアクセスできなくなる可能性があります。 次の「 nohup +」コマンド-「ハングアップなし」は、ストールを防ぎながらファイアウォールを起動し、標準出力とエラーを一時ログファイルにリダイレクトします。

sudo nohup service ipfw start >/tmp/ipfw.log 2>&1

ただし、 `+ csh `または ` tcsh `を使用している場合、このリダイレクトにより、出力に ` Ambiguous output redirect。`が表示されます。 この場合、代わりに次のコマンドを実行して ` ipfw +`を起動します。

sudo nohup service ipfw start >&/tmp/ipfw.log

将来、他のサービスと同様に、「+ ipfw +」ファイアウォールを管理できます。 たとえば、サービスを停止、開始、および再起動するには、次のコマンドを実行します。

sudo service ipfw stop
sudo service ipfw start
sudo service ipfw restart

ファイアウォールを設定したら、Certbotを実行して証明書を取得する準備ができました。

ステップ3-SSL証明書の取得

Certbotは、さまざまなプラグインを介してSSL証明書を取得するさまざまな方法を提供します。 `+ nginx +`プラグインはNginxの再設定と設定ファイルの再読み込みを処理します:

sudo certbot --nginx -d  -d

このサーバーで初めて `+ certbot `を実行する場合、クライアントはメールアドレスの入力を求め、Let’s Encryptの利用規約に同意するよう求めます。 これを行った後、「 certbot +」はLet’s Encryptサーバーと通信し、チャレンジを実行して、証明書を要求しているドメインを制御していることを確認します。

チャレンジが成功すると、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):

選択項目を選択し、「+ ENTER」を押します。 これにより、構成が更新され、Nginxが再ロードされて新しい設定が取得されます。 `+ 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 2018-09-24. 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 Server Testを使用してサーバーをテストすると、* A *グレードになります。

HTTPS経由でサイトにアクセスできることを確認したら、このチュートリアルの最終ステップに進み、証明書を更新できることを確認してから、証明書を自動的に更新するプロセスを設定します。

ステップ4-Certbotの自動更新の検証

Let’s Encryptの証明書は90日間のみ有効です。 これは、ユーザーが証明書の更新プロセスを自動化することを奨励するためです。 このステップでは、 `+ cron +`タスクを設定して証明書の更新を自動化する方法を説明します。 ただし、この自動更新を設定する前に、証明書を正しく更新できることをテストすることが重要です。

更新プロセスをテストするには、 `+ certbot +`でドライランを実行できます。

sudo certbot renew --dry-run

エラーが表示されない場合は、新しいcrontabを作成する準備が整っています。

sudo crontab -e

これにより、新しい「+ crontab 」ファイルが開きます。 次のコンテンツを新しいファイルに追加します。これにより、「 cron 」が「 certbot renew 」コマンドを毎日正午と真夜中に2回実行するように指示されます。 ` certbot renew +`は、システム上の証明書の有効期限が近づいているかどうかを確認し、必要に応じて証明書の更新を試みます。

0 0,12 * * * /usr/local/bin/certbot renew

`+ crontab -e `コマンドの前に ` sudo +`を付けているため、この操作は* root *として実行されることに注意してください。certbotを実行するにはスーパーユーザー権限が必要なためです。

自動更新プロセスが失敗した場合、Let’s Encryptは指定したメールにメッセージを送信し、証明書の有効期限が近づいていることを警告します。

結論

このチュートリアルでは、Let’s Encryptクライアント「+ certbot +」をインストールし、ドメインのSSL証明書をダウンロードし、これらの証明書を使用するようにNginxを設定し、自動証明書更新を設定しました。 Certbotの使用についてさらに質問がある場合は、https://certbot.eff.org/docs/ [それらのドキュメント]から始めるのが良いでしょう。