Corda Firewall (Full production HA DMZ ready mode)

はじめに

本稿について

本稿は、Corda Enterpriseの機能である「Corda Firewall」に高可用性を持たせた構築方法について説明したものです。コンセプトに関する英語のドキュメントはこちらをご覧ください。また、具体的な設定方法に関してはこちらをご覧ください。

Corda Firewallの基本概念およびシングル構成の構築例を知りたい方は、こちらの記事をご覧くださいませ。
※Corda FirewallはCorda Enterpriseのみに含まれるコンポーネントです。

 

HA構成構築に向けて

基本用語

Corda Firewallの基本用語について知りたい方はこちらの記事も併せてご覧くださいませ。

Apache ZooKeeper

Apache ZooKeeperは、複数のクラスタを一元管理することができるオープンソースソフトウェアです。Corda Firewallにおいてはクラスタリング化したbridgeのリーダーを自動的に管理するために使用します。今回の構築では、3.5.4-betaを使用します。

 

Corda Firewallの設定

システム構成図

以下はCorda FirewallのHA構成図です。bridgeやfloatを冗長化しています。

ha_nodes.png (1545×689)

以下はCorda FirewallのHA物理構成図です。真ん中に構成するhostnameは「vmInfra1」、「vmInfra2」にはbridgeインスタンス、artemisインスタンス、ZooKeeperクラスタを含みます。

physical_deployment.png (1280×720)

Infra.png (622×519)

キーストアの生成

Corda Firewallの各コンポーネントはSSL暗号化通信によってメッセージの送受信を行います。そのSSL暗号化通信を実現するためにはキーストアが必要です。このキーストアはCorda Enterpriseのモジュール「corda-tools-ha-utilities-X.X.jar」にて簡単に生成できます。

  • Bridge ⇔ Float間のSSL暗号化通信
    BridgeとFloat間のトンネリングを実現するためには、以下のコマンドを実行します。パラメータの-pや-eはキーストアや秘密鍵のパスワードなので、任意に変更可能です。
    mceclip0.png
    コマンドが正常終了すると、同階層に「tunnel」ディレクトリが作成され、「float.jks」「tunnel-truststore.jks」「bridge.jks」ファイルが格納されます。
  • Bridge ⇔ Artemis MQ間のSSL暗号化通信
    BridgeとArtemis 間の通信を行うためには、以下のコマンドを実行します。パラメータは「Bridge ⇔ Float間のSSL暗号化通信」と似ていますが、Artemisには「キーストアのパスワードは、ストア内の秘密鍵のパスワードと同じでないといけない」という制約があるため、-eのパラメータは設定できません。mceclip2.png
    コマンドが正常終了すると、同階層に「artemis」ディレクトリが作成され、「artemis-truststore.jks」「artemis.jks」ファイルが格納されます。

Nodeの設定

Nodeを任意のネットワークに参加させますが、今回は1つのサーバーに2つのNode(EntityA, EntityB)を配置して「corda-tools-ha-utilities-X.X.jar」を用いて登録してみます。

  • network-root-truststore.jksの配置
    参加したいネットワークから「network-root-truststore.jks」を取得します。一般的なNode登録の場合、このファイルは「certificates」ディレクトリに格納しますが、今回は「corda-tools-ha-utilities-X.X.jar」の配置先と同階層のディレクトリに配置します。
  • node.confの修正
    EntityAとEntityBにそれぞれnode.confを用意します。以下EntityAのnode.conf例です。
    (EntityBのnode.confにも流用できますが、※のコンフィグは適宜変更してください。
    mceclip3.png
  • Nodeをネットワークに登録
    複数のNodeを一度にネットワークに登録してみます。
    mceclip4.png
    上記コマンドが正常終了した場合、実行階層に以下のディレクトリやファイルが生成・配布されています。
    mceclip5.png
    これらのjksやnetwork-parametersを各Nodeにコピーします。現状のNodeのディレクトリは以下のような構成になっているはずです。
    mceclip7.png
    Nodeの設定に関しては他にもCorDappsやDBドライバーの配置も行いますが、今回の記事では割愛します。
  • 集約されたSSLキーストアの設定
    今回は、1つのサーバーに複数のノードを配置するシナリオになっています。その外側に窓口になる1つのBridgeインスタンスを配置するため、すべてのノードを代表する役割の集約されたSSLキーストアが必要になります。このような集約されたキーストアを作成ために以下のコマンドを実行します。mceclip8.png
    上記コマンドが正常終了した場合、実行階層に以下のディレクトリやファイルが生成・配布されています。mceclip9.png
    上記の「nodesUnitedSslKeystore.jks」は後でBridgeインスタンスに配布します。

Floatの設定

floatは冗長構成のために2つ(vmFloat1、vmFloat2)用意します

  • firewall.confの設定
    vmFloat1とvmFloat2にそれぞれfirewall.confを用意します。以下vmFloat1のfirewall.conf例です。
    (vmFloat2のfirewall.confにも流用できますが、※のコンフィグは適宜変更してください。mceclip10.png
  • jksファイルおよびnetwork-parametersの配置。
    floatのベースディレクトリ直下に「tunnel」ディレクトリを作成し、その中に「キーストアの生成」の手順で生成した「float.jks」「tunnel-truststore.jks」を配置します。
    また、「Nodeの設定」で生成された「network-parameters」をベースディレクトリに配置します。
  • corda-firewall.jarの配置
    ベースディレクトリに「corda-firewall.jar」を配置します。

現時点でfloatのベースディレクトリは以下のような構成になっています。

mceclip11.png

Apache ZooKeeperの設定

Apache ZooKeeperのインスタンス(vmInfra1、vmInfra2、vmZkWitness)を3つ用意します。ダウンロードした3.5.4-betaを任意のディレクトリに解凍します。

解凍したディレクトリのconf配下に格納されている「zoo_sample.cfg」をコピーして、「zoo.cfg」を作ります。zoo.cfgは以下のコンフィグを設定します。
mceclip12.png

また、zoo.cfg.dynamicを設定します。配置先は「zoo.cfg」に設定した「dynamicConfigFile」のパスを設定します。ZooKeeperのサーバーのアドレスおよびポートを任意に設定します。
mceclip13.png

最後に「myid」というファイルを同ディレクトリに配置します。各々にはサーバーの識別子となる数値を設定します。例えばvmInfra1のmyidには「1」とだけ設定します。同様にvmInfra2のmyidには「2」、vmZkWitnessのmyidには「3」と設定します。

 

Bridgeの設定

bridgeも冗長構成のために2つ(vmInfra1、vmInfra2)用意します。

  • firewall.confの設定
    vmInfra1とvmInfra2にそれぞれfirewall.confを用意します。以下vmInfra1のfirewall.conf例です。
    (vmInfra2のfirewall.confにも流用できますが、一部修正が必要です。以下の例中のコメントをご参考ください)
    mceclip15.png
  • jksファイルおよびnetwork-parametersの配置。
    bridgeのベースディレクトリ直下に「tunnel」ディレクトリを作成し、その中に「キーストアの生成」の手順で生成した「bridge.jks」「tunnel-truststore.jks」を配置します。
    また、「Nodeの設定」で生成された「network-parameters」をベースディレクトリに配置します。また、「artemis」ディレクトリを作成し、「キーストアの生成」の手順で生成した「artemis.jks」および「artemis-truststore.jks」を配置します。
    また「nodesCertificates」ディレクトリを作成し、「Nodeの設定」の「集約されたSSLキーストアの設定」を「nodesUnitedSslKeystore.jks」および「network-root-truststore.jks」を配置します。
  • corda-firewall.jarの配置
    ベースディレクトリに「corda-firewall.jar」を配置します。

    現時点でbridgeのベースディレクトリは以下のような構成になっています。
    mceclip16.png

Artemisの設定

artemisはNodeとbridgeの通信に使用されます。artemisはこちらからダウンロードして任意のフォルダに解凍します。(本稿では2.6.3のバージョンを使用します)
次にartemisのmasterディレクトリを生成します。以下のコマンドを実行することでartemis-masterフォルダが生成されます。
mceclip17.png

${ARTEMIS_DISTRIBUTION_DIR}はartemisの解凍先、${WORKING_DIR}はartemis-masterディレクトリを生成するディレクトリを設定します。

生成された「artemis-master/etc」配下に、「artemis」ディレクトリを作成し、「キーストアの生成」で作成した「artemis-truststore.jks」および「artemis.jks」を配置します。

またvmInfra2ではmaster-slaveを作成します。
mceclip18.png

こちらも生成した「artemis-slave/etc」配下に、「artemis」ディレクトリを作成し、「キーストアの生成」で作成した「artemis-truststore.jks」および「artemis.jks」を配置します。

 

各インスタンスの起動

floatの起動

floatのベースディレクトリに移動し、以下のコマンドを実行します。
mceclip19.png

ログ中に以下のようなメッセージがでていれば、正常に起動しています。
mceclip20.png

ZooKeeperの起動

3つのサーバー(vmInfra1、vmInfra2、vmZkWitness)に配置したZooKeeperをそれぞれ起動します。以下、サーバー1の起動例です。
mceclip21.png

起動した場合以下のようなメッセージが表示されます。
mceclip22.png

また、以下のコマンドでZooKeeperのステータスを確認できます。
mceclip23.png

この時、「Mode」が「leader」のインスタンスが1つ「follower」のInstanceが2つできていれば正常に起動しています。
mceclip24.png

一つだけインスタンスを起動した場合にZooKeeperのステータスを確認してしまうと、「Error contacting service. It is probably not running.」というエラーが表示されますが、これはZooKeeperクラスタが起動するための最低起動台数を満たしていことに起因します。
かならず全てのインスタンスを起動してからstatusコマンドを実行してください。

Artemisの起動

artemis-masterおよびartemis-slaveを起動します。
mceclip25.png

mceclip26.png
正常に起動した場合、artemis-masterのnohup.outには以下のメッセージが出力します。
mceclip27.png

Bridgeの起動

bridgeを起動します。bridgeのベースディレクトリに移動して、以下のコマンドを実行します。
mceclip28.png

bridgeのlog上に「Session created」というメッセージが出力すると正しくセッションが確立しています。

Nodeの起動

最後にNodeを起動します。これは、通常通り以下のコマンドで起動できます。
mceclip29.png

 

おわりに

各インスタンスを冗長化することで単一障害点をなくすことができ、システムの可用性向上が期待できます。また構築や運用に関することでご不明点等ありましたら、弊社のプロフェショナルサービスのご利用もご検討くださいませ。

 

Created by: Kazuto Tateyama

Last edited by: Kazuto Tateyama

Updated: 2021/08/06

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています