Ubuntu 14.04でHAProxyを使用してSSL終了を実装する方法

前書き

HA Proxyは、High Availability Proxyの略で、Linux、Solaris、およびFreeBSDで実行できる一般的なオープンソースソフトウェアTCP / HTTPロードバランサーおよびプロキシソリューションです。 最も一般的な用途は、複数のサーバーにワークロードを分散させることにより、サーバー環境のパフォーマンスと信頼性を向上させることです(例: ウェブ、アプリケーション、データベース)。 GitHub、Imgur、Instagram、Twitterなど、多くの有名な環境で使用されています。

このチュートリアルでは、SSLの終了、トラフィックの暗号化、およびWebサーバーの負荷分散にHAProxyを使用する方法について説明します。 また、HAProxyを使用してHTTPトラフィックをHTTPSにリダイレクトする方法も示します。

ネイティブSSLサポートは、2014年6月に安定バージョンとしてリリースされたHAProxy 1.5.xに実装されました。

前提条件

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

  • HTTP(ポート80)でリッスンするプライベートネットワークを備えた少なくとも1つのWebサーバー

  • HAProxyをインストールする追加のVPSへのルートアクセス。 ルートアクセスをセットアップする手順は、こちら(ステップ3および4)にあります:https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04[Ubuntuでの初期サーバーセットアップ14.04]。

  • ドメイン名またはIPアドレスと一致する「共通名」を持つSSL証明書と秘密キーのペア

SSL証明書と秘密キーのペアがまだない場合は、続行する前に取得してください。 SSL証明書の作成をカバーする手順を含むいくつかのチュートリアルがあります。

結合されたPEM SSL証明書/キーファイルの作成

HAProxyでSSL終了を実装するには、SSL証明書とキーペアが適切な形式のPEMであることを確認する必要があります。 ほとんどの場合、SSL証明書(認証局が提供する.crtまたは.cerファイル)とそれぞれの秘密鍵(ユーザーが生成した.keyファイル)を単純に組み合わせることができます。 証明書ファイルの名前が `+ example.com.crt `であり、秘密鍵ファイルの名前が ` example.com.key +`であると仮定すると、ファイルを結合する方法の例は次のとおりです。

cat .crt .key > example.com.pem
sudo cp .pem /etc/ssl/private/

これにより、「+ example.com.pem 」という名前の結合PEMファイルが作成され、「 / etc / ssl / private +」にコピーされます。 いつものように、PEMファイル(秘密鍵を含む)など、秘密鍵ファイルのコピーを必ず保護してください。

場合によっては、CAルート証明書とCA中間証明書をPEMファイルにコピーする必要があります。

私たちの出発環境

これが私たちが始めている環境です:

image:https://assets.digitalocean.com/articles/HAProxy/ssl/web_server_http.png [HTTP上のWebサーバー]

Webサーバーで既にSSLを使用している場合や、別のデータベースサーバーを使用している場合など、環境が例と異なる場合は、このチュートリアルを環境に合わせて調整できる必要があります。

レイヤー7のロードバランシングやバックエンド、ACLなどの基本的なロードバランシングの概念や用語に慣れていない場合は、基本を説明する記事があります:https://www.digitalocean.com/community/articles/an-introduction- to-haproxy-and-load-balancing-concepts [HAProxyと負荷分散の概念の紹介]。

私たちの目標

このチュートリアルの終わりまでに、次のような環境が必要になります。

image:https://assets.digitalocean.com/articles/HAProxy/ssl/haproxy_ssl.png [HAProxy SSL Termination]

つまり、ユーザーはHTTPS経由でHAProxyサーバーに接続することでWebサイトにアクセスし、SSLセッションを復号化して、暗号化されていないリクエストをWebサーバーに転送します(つまり、 www-backendのサーバー)、ポート80のプライベートネットワークインターフェイス経由。 Webサーバーは応答をHAProxyサーバーに送信します。HAProxyサーバーは応答を暗号化し、元の要求を行ったユーザーに返信します。

同一のコンテンツを提供する限り、_www-backend_を必要な数のWebサーバーでセットアップできます。 つまり、単一のサーバーでこれをセットアップし、必要な数のサーバーを追加することで後でスケールアウトできます。 トラフィックが増加すると、ユーザートラフィックを処理するのに十分なシステムリソースがない場合、HAProxyサーバーがパフォーマンスのボトルネックになる可能性があることに注意してください。

*注:*このチュートリアルでは、アプリケーションまたはWebサーバーに依存することが多いため、Web /アプリケーションサーバーが同じコンテンツを提供することを保証する方法については説明しません。

HAProxy 1.6.xをインストールします

プライベートネットワークで新しいVPSを作成します。 このチュートリアルでは、_haproxy-www_と呼びますが、好きな名前を付けることができます。

  • haproxy-www * VPSで、apt-getに専用のPPAを追加します。

sudo add-apt-repository ppa:vbernat/haproxy-1.6

次に、aptキャッシュを更新します。

sudo apt-get update

次に、apt-getで次のコマンドを使用してHAProxy 1.6をインストールします。

sudo apt-get install haproxy

HAProxy 1.6がインストールされたので、構成しましょう!

HAProxy設定

HAProxyの設定ファイルは「+ / etc / haproxy / haproxy.cfg +」にあり、2つの主要なセクションに分かれています。

  • グローバル:プロセス全体のパラメーターを設定します

  • プロキシdefaults _、 listen frontend_、および_backend_セクションで構成されます

繰り返しますが、HAProxyまたは基本的なロードバランシングの概念と用語に不慣れな場合は、次のリンクを参照してください。https://www.digitalocean.com/community/articles/an-introduction-to-haproxy-and-load-balancing -concepts [HAProxyと負荷分散の概念の紹介]。

HAProxy構成:グローバル

  • HAProxy設定はすべて、HAProxy VPS _haproxy-www_で実行する必要があります。*

エディターでhaproxy.cfgを開きます。

sudo vi /etc/haproxy/haproxy.cfg

_global_と_defaults_の2つのセクションが既に定義されていることがわかります。

最初に行うことは、_maxconn_を適切な数に設定することです。 この設定は、HAProxyが許可する同時接続の数に影響を与えます。これにより、QoSに影響を与え、Webサーバーがクラッシュしてリクエストが多すぎないようにできます。 あなたの環境に合うものを見つけるために、それをいじる必要があります。 設定の_global_セクションに次の行を(妥当と思われる値で)追加します

  maxconn

生成される一時DHEキーの最大サイズを構成するには、次の行を追加します。

  tune.ssl.default-dh-param 2048

次に、_defaults_セクションで、「+ mode http +」という行の下に次の行を追加します。

  option forwardfor
  option http-server-close

_forwardfor_オプションは、各リクエストにX-Forwarded-Forヘッダーを追加するようにHAProxyを設定し、_http-server-close_オプションは、接続を閉じながらキープアライブを維持することでHAProxyとユーザー間の待ち時間を短縮します。

HAProxy設定:統計

HAProxyの統計を使用すると、HAProxyが着信トラフィックを処理する方法を決定するのに役立ちます。 HAProxy統計ページを有効にする場合は、_defaults_セクションに次の行を追加します(ユーザーとパスワードを安全な値に置き換えます)。

  stats enable
  stats uri
  stats realm Haproxy\ Statistics
  stats auth :

これにより、 `+ / stats +`のドメインに移動してHAProxyの統計ページを見ることができます(例: https://example.com/stats)。

まだ構成ファイルを閉じないでください! 次にプロキシ設定を追加します。

HAProxy設定:プロキシ

フロントエンド構成

最初に追加したいのは、着信HTTP接続を処理するフロントエンドです。 ファイルの最後に、_www-http_というフロントエンドを追加しましょう。 `+ haproxy_www_public_IP +`をhaproxy-www VPSの* public IP *に置き換えてください:

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

上記のフロントエンド構成スニペットの各行の意味は次のとおりです。

  • * frontend www-http *:「www-http」という名前のフロントエンドを指定します

  • * bind haproxy_www_public_IP:80 *: `+ haproxy_www_public_IP +`をhaproxy-wwwのパブリックIPアドレスに置き換えます。 これは、このフロントエンドがこのIPアドレスとポート80(HTTP)の着信ネットワークトラフィックを処理することをHAProxyに伝えます

  • * reqadd X-Forwarded-Proto:\ http *:HTTPリクエストの末尾にHTTPヘッダーを追加します

  • * default_backend www-backend *:これは、このフロントエンドが受信するすべてのトラフィックが次のステップで定義する_www-backend_に転送されることを指定します

次に、受信HTTPS接続を処理するフロントエンドを追加します。 ファイルの最後に、_www-https_というフロントエンドを追加しましょう。 `+ haproxy_www_public_IP +`をhaproxy-www VPSの* public IP *に置き換えてください:

frontend www-https
  bind :443 ssl crt /etc/ssl/private/
  reqadd X-Forwarded-Proto:\ https
  default_backend www-backend
  • * frontend www-https *:「www-https」という名前のフロントエンドを指定します

  • * haproxy_www_public_IP:443 ssl crtをバインドします。 これは、このフロントエンドがこのIPアドレスとポート443(HTTPS)の着信ネットワークトラフィックを処理することをHAProxyに伝えます。

  • * reqadd X-Forwarded-Proto:\ https *:HTTPSヘッダーをHTTPS要求の末尾に追加します

  • * default_backend www-backend *:これは、このフロントエンドが受信するすべてのトラフィックが次のステップで定義する_www-backend_に転送されることを指定します

バックエンド構成

フロントエンドの設定が完了したら、次の行を追加してバックエンドの追加を続けます。 強調表示された単語をWebサーバーのそれぞれのプライベートIPアドレスに置き換えてください:

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

上記のバックエンド設定スニペットの各行が何を意味するのか説明します:

  • *バックエンドwww-backend *:_www-backend_という名前のバックエンドを指定します

  • *リダイレクトスキームhttps if!\ {ssl_fc} *:この行は、HTTP要求をHTTPSにリダイレクトします。これにより、サイトはHTTPSのみになります。 HTTPとHTTPSの両方を許可する場合は、この行を削除します

  • * server www-1…*:_www-1_という名前のバックエンドサーバー、プライベートIP(置き換える必要があります)、およびリッスンしているポート_80_を指定します。 _check_オプションは、ロードバランサーにこのサーバーのヘルスチェックを定期的に実行させます

  • * server www-2…*:前の行と同様です。 適切な名前とIPアドレスを使用してこのような行を追加し、ロードバランサーにサーバーを追加します。

ここで、 `+ haproxy.cfg +`を保存して終了します。 HAProxyを開始する準備ができましたが、最初にロギングを有効にしましょう。

HAProxyロギングを有効にする

HAProxyでのロギングの有効化は非常に簡単です。 最初にrsyslog.confファイルを編集します。

sudo vi /etc/rsyslog.conf

次に、次の2行を見つけてコメント解除し、UDP syslog受信を有効にします。 完了すると、次のようになります。

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

rsyslogを再起動して、新しい構成を有効にします。

sudo service rsyslog restart

HAProxyロギングが有効になりました! HAProxyが開始されると、ログファイルは `+ / var / log / haproxy.log +`に作成されます。

HAProxyを起動します

  • haproxy-www *で、HAProxyを起動して構成の変更を有効にします。

sudo service haproxy restart

HAProxyは現在、WebサーバーのSSL終了と負荷分散を実行しています! ユーザーは、ロードバランサーのパブリックIPアドレスまたはドメイン名haproxy-wwwを介して、負荷分散サーバーにアクセスできるようになりました。 すべてが正しく設定されていることを確認するために、確認することがいくつかあります。

確認事項

  • まだお持ちでない場合は、ネームサーバーを更新して、ドメインが_haproxy-www_サーバーのパブリックIPアドレスを指すようにします

  • サーバーでHTTPSのみを使用する場合は、Webサーバー(例: www-1、www-2など)は、ポート80のプライベートIPアドレスでのみリッスンしています。 そうしないと、ユーザーはパブリックIPアドレスでHTTP(暗号化されていない)経由でWebサーバーにアクセスできます。

  • HTTPS経由で_haproxy-www_にアクセスし、機能することを確認します

  • HTTP経由で_haproxy-www_にアクセスし、HTTPSにリダイレクトされることを確認します(HTTPとHTTPSの両方を許可するように構成した場合を除く)

注: WordPressなど、独自のURLを知る必要があるアプリケーションを使用している場合、URL設定を「http」からhttps」に変更する必要があります。 WordPressの例に従うには、WordPressの一般設定に移動し、WordPressアドレス(URL)とサイトアドレス(URL)を「http」から「https」に変更します。

結論

これで、SSL接続を処理し、サーバー環境を水平にスケールアウトするために使用できるロードバランサーソリューションができました。 このガイドで学んだことを他のHAProxyガイドと自由に組み合わせて、環境をさらに改善してください。

Related