CentOS 7で暗号化してHAProxyを保護する方法

前書き

Let’s Encryptは、無料のTLS / SSL証明書を簡単に取得してインストールする新しい認証局(CA)です。これにより、Webサーバーで暗号化されたHTTPSを有効にします。 必要な手順のほとんどを自動化しようとするソフトウェアクライアントCertbotを提供することにより、プロセスを簡素化します。 現在、証明書の取得とインストールのプロセス全体は、Apache Webサーバーでのみ完全に自動化されています。 ただし、Certbotを使用すると、無料のSSL証明書を簡単に取得できます。この証明書は、Webサーバーソフトウェアの選択に関係なく、手動でインストールできます。

このチュートリアルでは、Let’s Encryptを使用して無料のSSL証明書を取得し、CentOS 7のHAProxyで使用する方法を示します。 また、SSL証明書を自動的に更新する方法も示します。

image:https://assets.digitalocean.com/articles/letsencrypt/haproxy-letsencrypt.png [TLS / SSL証明書を暗号化して自動更新するHAProxy]

前提条件

このチュートリアルを実行する前に、いくつかのものが必要です。

`+ sudo +`権限を持っている非rootユーザーがいるCentOS 7サーバーが必要です。 CentOSの初期サーバーセットアップ7チュートリアル

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

まだ行っていない場合は、ドメインがサーバーのパブリックIPアドレスを指す* Aレコード*を作成してください。 これは、Let’s Encryptが証明書を発行するドメインを所有していることを検証する方法のために必要です。 たとえば、「+ example.com 」の証明書を取得する場合、検証プロセスが機能するためには、そのドメインがサーバーに解決される必要があります。 このセットアップでは、ドメイン名として「 example.com 」と「 www.example.com +」を使用するため、両方のDNSレコードが必要です

すべての前提条件が揃ったら、Certbotのインストールに進みましょう。Certbotの暗号化クライアントソフトウェアです。

手順1-Let’s EncryptクライアントであるCertbotのインストール

Let’s Encryptを使用してSSL証明書を取得する最初のステップは、サーバーに「+ certbot +」ソフトウェアをインストールすることです。 現在、これをインストールする最良の方法はEPELリポジトリを使用することです。

次を入力して、サーバー上のEPELリポジトリへのアクセスを有効にします。

sudo yum install epel-release

リポジトリが有効になったら、次を入力して `+ certbot +`パッケージを取得できます。

sudo yum install certbot

「+ certbot +」Let’s Encryptクライアントがインストールされ、使用できる状態になりました。

ステップ2-証明書の取得

Let’s Encryptは、さまざまなプラグインを通じてSSL証明書を取得するさまざまな方法を提供します。 https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04 [別のチュートリアル]で説明されているApacheプラグインとは異なります]、ほとんどのプラグインは、使用するWebサーバーを手動で構成する必要がある証明書の取得にのみ役立ちます。 証明書を取得するだけでインストールしないプラグインは、サーバーに証明書を発行するかどうかを認証するために使用されるため、「認証者」と呼ばれます。

*スタンドアロン*プラグインを使用してSSL証明書を取得する方法を示します。

ポート80が開いていることを確認する

スタンドアロンプ​​ラグインは、SSL証明書を取得する非常に簡単な方法を提供します。 サーバーのポート「80」で一時的に小さなWebサーバーを実行し、Let’s Encrypt CAが証明書を発行する前にサーバーのIDに接続して検証できるようにします。 そのため、この方法では、ポート「80」が使用されていないことが必要です。 つまり、ポート + 80 +`を使用している場合は、通常のWebサーバーを必ず停止してください(つまり、 `+ http +)、このプラグインを使用する前に。

たとえば、HAProxyを使用している場合は、次のコマンドを実行して停止できます。

sudo systemctl stop haproxy

ポート `+ 80 +`が使用されているかどうかわからない場合は、次のコマンドを実行できます。

netstat -na | grep ':80.*LISTEN'

このコマンドを実行しても出力がない場合は、スタンドアロンプ​​ラグインを使用できます。

Certbotを実行する

次のコマンドを実行して、スタンドアロンプ​​ラグインを使用します。

sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d  -d

メールアドレスを入力し、Let’s Encryptの利用規約に同意するよう求められます。 その後、 `+ http `チャレンジが実行されます。 すべてが成功した場合、 ` certbot +`は次のような出力メッセージを出力します:

Output:IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /fullchain.pem. Your cert
  will expire on . 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 /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

上記の出力例で強調表示された証明書のパスと有効期限を書き留めておきます。

証明書ファイル

証明書を取得すると、次のPEMエンコードファイルが作成されます。

  • * cert.pem:*ドメインの証明書

  • * chain.pem:* Let’s Encryptチェーン証明書

  • * fullchain.pem:* `+ cert.pem `と ` chain.pem +`の組み合わせ

  • * privkey.pem:*証明書の秘密鍵

作成したばかりの証明書ファイルの場所を知っておくことは重要です。そのため、それらをWebサーバーの構成で使用できます。 ファイル自体は、 `+ / etc / letsencrypt / archive `のサブディレクトリに配置されます。 ただし、Certbotは、 ` / etc / letsencrypt / live / +`ディレクトリに最新の証明書ファイルへのシンボリックリンクを作成します。

次のコマンドを実行して(ドメイン名に置き換えて)ファイルが存在することを確認できます。

sudo ls /etc/letsencrypt/live/

出力は、前述の4つの証明書ファイルになります。

fullchain.pemとprivkey.pemを組み合わせます

HAProxyがSSL終了を実行するように設定し、それ自体とエンドユーザー間のトラフィックを暗号化する場合、 `+ fullchain.pem `と ` privkey.pem +`を単一のファイルに結合する必要があります。

最初に、結合されたファイルが置かれるディレクトリ、 `+ / etc / haproxy / certs +`を作成します:

sudo mkdir -p /etc/haproxy/certs

次に、この `+ cat `コマンドで結合ファイルを作成します(強調表示された ` example.com +`をドメイン名に置き換えます):

DOMAIN='' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

次のコマンドを使用して、秘密鍵を含む結合ファイルへの安全なアクセス:

sudo chmod -R go-rwx /etc/haproxy/certs

これで、HAProxyでSSL証明書と秘密鍵を使用する準備が整いました。

ステップ3-HAProxyのインストール

この手順では、HAProxyのインストールについて説明します。 サーバーに既にインストールされている場合は、この手順をスキップしてください。

yumを使用してHAProxyをインストールします。

sudo yum install haproxy

HAProxyはインストールされましたが、構成する必要があります。

ステップ4-HAProxyの構成

このセクションでは、SSLセットアップで基本的なHAProxyを構成する方法を示します。 また、Let’s Encrypt証明書を自動更新できるようにHAProxyを構成する方法についても説明します。

テキストエディタで `+ haproxy.cfg +`を開きます。

sudo vi /etc/haproxy/haproxy.cfg

次のいくつかのセクションで編集するときに、このファイルを開いたままにします。

グローバルセクション

生成される一時DHEキーの最大サイズを設定するには、* global *セクションに次の行を追加します。

haproxy.cfg-5の1

  tune.ssl.default-dh-param 2048

フロントエンドセクション

これで、 `+ front end`セクションを定義する準備ができました。

最初に追加するものは、着信HTTP接続を処理し、それらをデフォルトのバックエンド(後で定義します)に送信するためのフロントエンドです。 ファイルの最後に、* www-http *というフロントエンドを追加しましょう。 必ず `+ haproxy_public_IP +`をHAProxyサーバーのパブリックIPアドレスに置き換えてください:

haproxy.cfg-2/5

frontend www-http
  bind :80
  reqadd X-Forwarded-Proto:\ http
  default_backend www-backend

次に、受信HTTPS接続を処理するフロントエンドを追加します。 ファイルの最後に、* www-https *というフロントエンドを追加します。 `+ haproxy_www_public_IP `をHAProxyサーバーのパブリックIPに置き換えてください。 また、 ` example.com +`をドメイン名(以前に作成した証明書ファイルに対応する必要があります)に置き換える必要があります。

haproxy.cfg-3/5

frontend www-https
  bind :443 ssl crt /etc/haproxy/certs/.pem
  reqadd X-Forwarded-Proto:\ https
  acl letsencrypt-acl path_beg /.well-known/acme-challenge/
  use_backend letsencrypt-backend if letsencrypt-acl
  default_backend www-backend

このフロントエンドは、ACL( + letsencrypt-acl +)を使用してLet’s Encrypt検証リクエスト( + /。well-known / acme-challenge +)を `+ letsencrypt-backend `バックエンドに送信します。 HAProxyサービスを停止せずに証明書。 他のすべてのリクエストは、「 www-backend +」に転送されます。これは、Webアプリケーションまたはサイトを提供するバックエンドです。

バックエンドセクション

フロントエンドの設定が完了したら、次の行を追加して `+ www-backend `バックエンドを追加します。 強調表示された単語をWebサーバーのそれぞれのプライベートIPアドレスに置き換えてください(使用しているバックエンドサーバーの数に合わせて ` server +`行の数を調整してください):

haproxy.cfg-4/5

backend www-backend
  redirect scheme https if !{ ssl_fc }
  server www-1 :80 check
  server www-2 :80 check

このバックエンドが受信するすべてのトラフィックは、HTTP(ポート80)を介して、 `+ server +`エントリ全体に分散されます。

最後に、これらの行を追加して、 `+ letsencrypt-backend +`バックエンドを追加します

haproxy.cfg-5/5

backend letsencrypt-backend
  server letsencrypt 127.0.0.1:54321

証明書の要求と更新に使用されるLet’s Encrypt ACMEチャレンジのみを処理するこのバックエンドは、ポート `+ 54321 `のローカルホストにトラフィックを送信します。 Let's Encrypt SSL証明書を更新するときに、「 80+」と「443」の代わりにこのポートを使用します。

これで、HAProxyを開始する準備ができました。

sudo systemctl start haproxy

Let’s Encrypt TLS / SSL証明書が配置され、自動更新スクリプトをセットアップする準備が整いました。 この時点で、Webブラウザでドメインにアクセスして、TLS / SSL証明書が機能することをテストする必要があります。

ステップ5-自動更新の設定

証明書の暗号化は90日間のみ有効ですので、更新プロセスを自動化することが重要です。

証明書が期限切れにならないようにするための実用的な方法は、更新プロセスを自動的に処理するcronジョブを作成することです。 cronjobは「+ certbot 」を毎日実行し、有効期限が30日以内であれば証明書を更新します。 ` certbot `は、更新が成功した後、特別な ` renew-hook `スクリプトも実行します。 この更新スクリプトを使用して、結合された ` .pem +`ファイルを更新し、haproxyをリロードします。

スクリプトを作成して、テストしてみましょう。

更新スクリプトを作成する

`+ / usr / local / bin +`の新しいファイルを* root *として開きます:

sudo vi /usr/local/bin/renew.sh

これは、新しい空のテキストファイルになります。 次の短いスクリプトを貼り付けて、強調表示されたドメイン名を独自のものに更新してください。

#!/bin/sh

SITE=

# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE

# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem

# reload haproxy
systemctl reload haproxy

ファイルを保存して閉じます。 このスクリプトは正しいLet’s Encryptディレクトリに移動し、 `+ cat `コマンドを実行して2つの ` .pem +`ファイルを1つに連結し、haproxyをリロードします。

次に、スクリプトを実行可能にします。

sudo chmod u+x /usr/local/bin/renew.sh

次に、スクリプトを実行します。

sudo /usr/local/bin/renew.sh

エラーなしで実行する必要があります。 次に、Certbotを更新し、この更新スクリプトを実行するように構成します。

certbot構成の更新

証明書を更新するために使用する「+ certbot renew 」コマンドは、「 certbot 」を初めて実行したときに作成された設定ファイルを読み取ります。 このファイルを開き、 ` certbot +`がスタンドアロンHTTPサーバーの実行に使用するポートを更新して、haproxy(ポート80および443で既にリッスンしている)と競合しないようにする必要があります。 テキストエディターで構成ファイルを開きます。

sudo vi /etc/letsencrypt/renewal/.conf

`+ http01_port +`行を変更する必要があるため、次のようになります。

example.com.conf

http01_port =

ファイルを保存して閉じます。 次に、更新プロセスをテストし、 `+-dry-run`を指定して、実際には何も更新しないようにします。

sudo certbot renew --dry-run

Certbotは更新チャレンジをポート54321でリッスンし、haproxyはポート80から54321へのリクエストをプロキシします。

Cronジョブを作成する

次に、crontabを編集して、 `+ certbot renew +`コマンドを毎日実行する新しいジョブを作成します。 rootユーザーのcrontabを編集するには、次を実行します。

sudo crontab -e

ファイルの最後に次を追加します。

crontabエントリ

30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log

保存して終了。 これにより、毎日午前2:30に `+ certbot renew `コマンドを実行する新しいcronジョブが作成されます。 コマンドによって生成された出力は、 ` / var / log / le-renewal.log `にあるログファイルにパイプされます。 証明書が実際に更新される場合、 `-renew-hook `スクリプトが実行され、結合されたPEMファイルが作成され、 ` haproxy +`がリロードされます。

結論

それでおしまい! HAProxyは現在、無料のLet’s Encrypt TLS / SSL証明書を使用して、HTTPSトラフィックを安全に処理しています。

Related