Apigee mTLS 機能により、Edge for Private Cloud クラスタ内のコンポーネント間の通信のセキュリティが強化されます。これにより、業界標準の方法でサービス メッシュを構成してインストールできます。また、パッケージ管理と構成の自動化をサポートしています。
アーキテクチャの概要
コンポーネント間の安全な通信を提供するために、Apigee mTLS はコンポーネント間で安全な相互認証 TLS 接続を確立するサービス メッシュを使用します。
次の図は、Apigee mTLS が保護する Apigee コンポーネント間の接続(in red)を示しています。図に示されているポートは一例です。各コンポーネントで使用できる範囲のリストについては、ポートの使用をご覧ください。

(「M」で示されたポートはコンポーネントの管理に使用され、Management Server がアクセスできるようにコンポーネント上で開いておく必要があります)。
上の図からわかるように、Apigee mTLS は、クラスタ内のほとんどのコンポーネント間の接続にセキュリティを追加します。
| ソース | 目的地 | |
|---|---|---|
| 管理サーバー | Router、MP、QPid、LDAP、Postgres、Zookeeper、Cassandra の各ノード | |
| ルーター | ループバック、Qpid ノード、Zookeeper ノード、Cassandra ノード | |
| Message Processor | ループバック、Qpid ノード、Zookeeper ノード、Cassandra ノード | |
| ZooKeeper と Cassandra | その他の Zookeeper ノードと Cassandra ノード | |
| Edge UI | SMTP(外部 IDP の場合のみ) | |
| Postgres | その他の Postgres、Zookeeper、Cassandra ノード | 
メッセージの暗号化/復号
Apigee mTLS サービス メッシュは、クラスタ内の各 ZooKeeper ノードで実行される Consul サーバーと、クラスタ内のすべてのノードにある次の Consul サービスで構成されます。
- ホストノードで送信メッセージをインターセプトする下り(外向き)プロキシ。このサービスは、送信メッセージを宛先に送信する前に暗号化します。
 - ホストノードで受信メッセージをインターセプトする Ingress プロキシ。このサービスは、受信メッセージを最終的な宛先に送信する前に復号します。
 
たとえば、Management Server が Router にメッセージを送信すると、下り(外向き)プロキシ サービスは送信メッセージをインターセプトして暗号化し、Router に送信します。Router のノードがメッセージを受信すると、Ingress プロキシ サービスはメッセージを復号し、処理のために Router コンポーネントに渡します。
この処理はすべて、Edge コンポーネントに対して透過的に行われます。Consul プロキシ サービスによって実行される暗号化と復号の処理は認識されません。
また、Apigee mTLS は、トラフィックのリダイレクトを管理する Linux ファイアウォール サービスである iptables ユーティリティを使用します。
要件
Apigee mTLS をインストールする前に、環境が次の要件を満たしている必要があります。
以降のセクションでは、これらの要件について詳しく説明します。
トポロジの要件
Apigee mTLS では、環境のトポロジに少なくとも 3 つの Zookeeper ノードが含まれている必要があります。そのため、Apigee mTLS は 5、9、12(マルチ データセンター)、または 13 のノードを使用するトポロジにのみインストールできます。詳細については、インストール トポロジをご覧ください。
ユーティリティ/パッケージ
Apigee mTLS を使用するには、インストール プロセスを開始する前に、クラスタ内の各マシン(管理マシンを含む)に次のパッケージをインストールして有効にする必要があります。
| ユーティリティ/パッケージ | 説明 | インストール後に削除しますか? | 
|---|---|---|
base64 | 
   インストール スクリプト内のデータを検証します。 | |
gnu-bashgnu-sedgnu-grep | 
   インストール スクリプトやその他の一般的なツールで使用されます。 | |
iptables | 
   デフォルトのファイアウォール firewalld に代わるものです。 | 
   |
iptables-services | 
   iptables ユーティリティに機能を提供します。 | 
   |
lsof | 
   インストール スクリプトで使用されます。 | |
nc | 
   iptables ルートを検証します。 | 
   |
openssl | 
   最初のブートストラップ プロセス中にローカルで証明書に署名します。 | 
インストール時に、管理マシンにも Consul パッケージをインストールします。これにより、認証情報と暗号鍵を生成できます。
apigee-mtls パッケージは、クラスタ内の ZooKeeper ノードに上り(内向き)プロキシと下り(外向き)プロキシを含む Consul サーバーをインストールして構成します。
ユーザー アカウント権限
インストールする前に、新しいユーザー アカウントを作成するか、昇格した権限を持つアカウントにアクセスできることを確認してください。
クラスタ内の各ノードで Apigee mTLS のインストールを実行するアカウントは、次のことができる必要があります。
- Apigee コンポーネントを起動、停止、再起動、初期化する
 - ファイアウォール ルールを設定
 - 新しい OS/システム ユーザー アカウントを作成する
 systemctlを使用してサービスの有効化、無効化、開始、停止、マスクを行う
管理マシン(推奨)
Apigee では、このドキュメントで説明する次のような管理タスクを実行できるノードをクラスタ内に配置することをおすすめします。
- HashiCorp Consul 1.6.2 をインストールします。
 - 証明書と鍵のペアと Gossip 暗号鍵を生成して配布する。
 - 構成ファイルを更新して配布します。
 
管理マシンを設定する場合:
- そのファイルへの root アクセス権があることを確認します。
 - Edge apigee-setup ユーティリティをインストールするの説明に従って、
apigee-serviceユーティリティとapigee-setupユーティリティをダウンロードしてインストールします。 scp/sshを使用して、管理マシンからクラスタ内のすべてのノードにアクセスできることを確認します。これは、構成ファイルと認証情報を配布するために必要です。
ポートの使用と割り当て
このセクションでは、Consul と Apigee mTLS の通信をサポートするためのポート使用量とポート割り当てについて説明します。
ポートの使用: apigee-mtls を実行しているすべてのノード
apigee-mtls サービスを使用するクラスタ内のすべてのノードで、localhost(127.0.0.1)上のサービスからの接続を許可する必要があります。これにより、Consul プロキシは、受信メッセージと送信メッセージを処理するときに他のサービスと通信できます。
ポートの使用: Consul サーバーノード(ZooKeeper を実行しているノード)
クラスタ内のすべてのノードからのリクエストを受け入れるには、Consul サーバーノード(ZooKeeper を実行しているノード)で次のポートのほとんどを開く必要があります。
| ノード | Consul サーバー ポート | 説明 | プロトコル | 外部の mtls-agents を許可する *  | 
      
|---|---|---|---|---|
| Consul サーバー(ZooKeeper ノード) | 8300 | 
        クラスタ内のすべての Consul サーバーを接続します。 | RPC | |
8301 | 
        クラスタ内のメンバーシップ メッセージとブロードキャスト メッセージを処理します。 | UDP/TCP | ||
8302 | 
        マルチデータセンター構成でメンバーシップ メッセージとブロードキャスト メッセージを処理する WAN ポート。 | UDP/TCP | ||
8500 | 
        同じノード上のプロセスから Consul Server API への HTTP 接続を処理します。 このポートはリモートの通信や調整には使用されません。localhost でのみリッスンします。  | 
        HTTP | ||
8502 | 
        クラスタ内の他のノードから Consul Server API への gRPC+HTTPS 接続を処理します。 | gRPC+HTTPS | ||
8503 | 
        クラスタ内の他のノードから Consul Server API への HTTPS 接続を処理します。 | HTTPS | ||
8600 | 
        Consul サーバーの DNS を処理します。 | UDP/TCP | ||
          * Apigee では、インバウンド リクエストをクラスタ メンバーのみ(クロス データストアを含む)に制限することをおすすめします。これは iptables で行うことができます。 | 
      ||||
この表に示すように、consul-server コンポーネントを実行するノード(ZooKeeper ノード)は、データセンター間でも、apigee-mtls サービスを実行しているクラスタのすべてのメンバーに対してポート 8301、8302、8502、8503 を開く必要があります。ZooKeeper を実行していないノードでこれらのポートを開く必要はありません。
すべての Consul ノード(ZooKeeper を実行しているノードを含む)のポート割り当て
Consul 通信をサポートするには、次の Apigee コンポーネントを実行するノードで、次の範囲内のポートへの外部接続を許可する必要があります。
| Apigee コンポーネント | 範囲 | ノードごとに必要なポート数 | 
|---|---|---|
| Apigee mTLS | 10700 ~ 10799 | 1 | 
| Cassandra | 10100 ~ 10199 | 2 | 
| Message Processor | 10500 ~ 10599 | 2 | 
| OpenLDAP | 10200 ~ 10299 | 1 | 
| Postgres | 10300 ~ 10399 | 3 | 
| Qpid | 10400 ~ 10499 | 2 | 
| ルーター | 10600 ~ 10699 | 2 | 
| ZooKeeper | 10,000 ~ 10,099 | 3 | 
Consul は単純な直線的な方法でポートを割り当てます。たとえば、クラスタに 2 つの Postgres ノードがある場合、最初のノードは 2 つのポートを使用するため、Consul はポート 10300 と 10301 を割り当てます。2 番目のノードも 2 つのポートを使用するため、Consol はそのノードに 10302 と 10303 を割り当てます。これは、すべてのコンポーネント タイプに適用されます。
ご覧のとおり、実際のポート数はトポロジによって異なります。クラスタに 2 つの Postgres ノードがある場合は、4 つのポートを開く必要があります(2 つのノードにそれぞれ 2 つのポートを掛けます)。
次の点に注意してください。
- Consul プロキシは、Apigee サービスと同じポートでリッスンできません。
 - Consul にはポート アドレス空間が 1 つしかありません。Consul プロキシのポート割り当ては、データセンターを含むクラスタ全体で一意である必要があります。つまり、ホスト A のプロキシ A がポート 15000 でリッスンする場合、ホスト B のプロキシ B はポート 15000 でリッスンできません。
 - 前述のように、使用されるポートの数はトポロジによって異なります。
 
マルチ データセンター構成では、mTLS を実行するすべてのホストもポート 8302 を開く必要があります。
Apigee mTLS が使用するデフォルト ポートをカスタマイズできます。方法については、プロキシポート範囲のカスタマイズをご覧ください。
制限事項
Apigee mTLS には次の制限があります。
- ノード間の Cassandra 通信を暗号化しない(ポート 7000)
 - 構成と設定がべき等ではありません。つまり、1 つのノードで 1 つの変更を行った場合、すべてのノードで同じ変更を行う必要があります。その変更は他のノードには適用されません。詳細については、既存の apigee-mtls 構成を変更するをご覧ください。
 
用語
このセクションでは、次の用語を使用します。
| 用語 | 定義 | 
|---|---|
| cluster | Edge for Private Cloud インストールを構成するマシンのグループ。 | 
| Consul | Apigee mTLS で使用されるサービス メッシュ。Consul が Private Cloud の通信を保護する方法については、Consul のセキュリティ モデルをご覧ください。 | 
| mTLS | 相互認証 TLS。 | 
| サービス メッシュ | オーバーレイ ネットワーク(またはネットワーク内のネットワーク)。 | 
| TLS | トランザクション レイヤのセキュリティ。安全な通信のための業界標準の認証プロトコル。 |