クラウドベース(Amazon AWS、Rackspaceなど)のマルチテナントSaaSアプリケーションがあり、関連のない複数のテナントドメインのHTTPS通信をサポートする必要があります。
説明のための例として、SaaSが次の場所で利用可能であるとしましょう。
https://foo.com
テナントは、次の方法でテナント固有のUIおよびサービスエンドポイントにアクセスできます。
https://tenantA.foo.com
https://tenantB.foo.com
...
これは、1つのワイルドカードSSL証明書で今日簡単にサポートできます。
ただし、SaaSを使用すると、テナントはUIを(ただし、ブランド化して)直接自分のユーザーに公開したい場合があります。
これにより問題が発生します。たとえば、JohnSmithがtenantA
の既存の顧客であり、foo.com
の知識がないとします。ジョン・スミスがhttps://tenantA.foo.com
に誘導された場合、彼らは簡単に混乱する可能性があります(たとえば、「一体誰がfoo.comですか?なぜ私はここにいますか?私はハッキングされていますか?ああ!」)。
この問題を回避するために、テナントは次のようなサブドメインを設定します。
https://foo.tenantA.com
これにより、エンドユーザーの混乱を避けることができます。tenantA
のユーザーは、tenantA
が所有していると認識したURLを確認でき、アプリをより簡単に使用できます。しかし、tenantA
は、アプリに関するすべてをホストすることを望んでいます。つまり、foo.com
のインフラストラクチャはSSL接続を提供する必要があります。
そのために、以下をサポートしたいと思います。
foo.tenantA.com
のSSL証明書+キーをアップロードします。foo.tenantA.com
がtenantA.foo.com
へのCNAMEリダイレクトになるようにします。このようにして、ロードバランサープールはfoo.tenantA.com
へのすべてのHTTPS通信を提供/終了し、すべてのリクエストはSaaS Webサーバークラスターに負荷分散されます。
これは、SSL証明書をLBプールに追加したりLBプールから削除したりできる必要があることを意味します実行時。変更によって、既存または新規のHTTPS要求を処理する機能が中断されることはありません。
また、Linuxを使用して仮想化ハードウェア(EC2など)にデプロイするため、ハードウェア/データセンターにアクセスできません。これは、Linuxで実行できるソフトウェアベースのソリューションである必要があります。また、高可用性(2つ以上のLB 'ノード')である必要があります。
誰かが具体的な解決策を知っていますか?たとえば、これをサポートするようにNginx、HAProxy、Squid(またはその他)を設定できますか?文書化され適切な「レシピ」または既存のソリューションはありますか?
P.S. AmazonのElasticLoad Balancer(執筆時点)は、このニーズを実用的に満たすことができませんeachテナントドメイン用のAmazonELBが必要になります。すべてのELBがWebサーバーに「ping」する必要があるため、500のテナントがある場合、500のELBがSaaS Webサービスエンドポイントにpingを実行します。これは無視できないほどのパフォーマンスへの悪影響です。
更新2017-09-13:SNIは現在、主流のブラウザーで十分に普及しているため、おそらく要求に対処するために使用できます。この回答は古くなっていると見なされます。
これをサポートする唯一の方法は、クライアントごとにIPを用意することです。 https経由で接続すると、接続はすぐに暗号化されます、ブラウザが「foo.tenantA.comのためにここにいます」と言う機会はありません。したがって、サーバーが接続の暗号化に使用するSSL証明書を知る唯一の方法は、接続が行われたIPに基づいています。
今でもこれは可能ですが、それはあなたがたくさんのIPを必要とすることを意味します。私たちは実際に私の仕事でこの正確なセットアップを行います。 2つのアクティブ/アクティブロードバランサーがあり、一方のバランサーに半分のIPがあり、もう一方のバランサーに残りの半分があります(合計で約500 IP)。次に、すべての接続を取得する複数のWebサーバーがバックエンドにあります。すべてのWebサーバーに障害が発生する可能性があり、ロードバランサーはサーバーへの接続の送信を停止します。または、ロードバランサー自体に障害が発生し、他のロードバランサーがすべてのIPを取得する可能性があります。
これを行う負荷分散ソフトウェアは Pacemaker および ldirectord です(どちらも主流のプロジェクトであり、実行するディストリビューションはすべてリポジトリに格納する必要があります)。 Linuxカーネル自体が実際に負荷分散を行うものであり、ソフトウェアはフェイルオーバーの処理を担当します。
注:負荷分散については、 keepalived や surealived など、ldirectordの代替手段がたくさんあります。実際のロードバランサーフェイルオーバーソフトウェアの場合でも、ペースメーカーを使用する必要があります。
基本ガイド:
This ペースメーカーを構成するための基本的な手順を提供します。 CMANがその代替であるため、以前のものをすべてスキップできます。ガイドのその時点に到達するために必要なことは、ペースメーカーとその依存関係をインストールすることだけです。セクション8.2.4で停止します。セクション8.3に進む必要はありません。それは、あなたがしていることに関係がないからです。
ペースメーカーが機能するようになると、 this は、httpサーバーの負荷を分散するための非常に基本的な構成を提供します。
this および this もご覧ください。ペースメーカーのより高いレベルの概要、それが何をするか、そしてそれをどのように使用するか。
クライアントが自分で薄いラッパーを配置することを推奨するのはどうですか?このようなもの:
https://api.tenantA.com
にリクエストを送信しますapi.tenantA.com
はリクエストをhttps://tenanta.foo.com
に転送するだけですこれがエッジケースである限り、問題なく動作するはずだと思います。