はじめに#
前回の記事「Hyperledger Fabric アーキテクチャの詳細」では、Fabric
のアーキテクチャと動作原理について詳しく解説しました。しかし、エンタープライズレベルのブロックチェーンシステムとして、Fabric
は複雑なビジネス要件に基づいてネットワークを構築し、実行中にどのようなセキュリティ上の問題が存在し、Fabric
はどのようにそれを防止しているのでしょうか?
本記事では、簡略化された企業向けFabric
ネットワークの構築例を通じて、ネットワークとセキュリティシステムの解析を行います。もし間違いや抜け漏れがあれば、ご指摘いただければ幸いです。
Hyperledger Fabric ネットワーク#
Hyperledger Fabric のアプリケーションシナリオの例#
ビジネスロール#
Fabric
システムを使用したアプリケーションシナリオを考えてみましょう。
4 つの組織R1
、R2
、R3
、R4
があるとします。R4
はネットワークのイニシエータであり、R1
とR4
はネットワーク管理者の役割を共有しています。
システムには 2 つのチャネル、C1
とC2
が設定されています。R1
とR2
はC1
チャネルを使用し、R2
とR3
はC2
チャネルを使用します。
アプリケーションA1
は組織R1
に属し、C1
チャネルで実行されます。アプリケーションA2
は組織R2
に属し、C1
チャネルとC2
チャネルの両方で実行されます。アプリケーションA3
は組織R3
に属し、C2
チャネルで実行されます。
P1
、P2
、P3
はそれぞれ組織R1
、R2
、R3
のノードです。
オーダリングノードはO4
によって提供され、組織R4
に属しています。
構築手順#
実際のビジネスアプリケーションシナリオと比較して、ロールとビジネスロジックは非常に簡略化されていますが、異なるノードとロールの機能と相互作用を理解するのに適しています。次に、ネットワークの構築手順を一つずつ説明します。
ネットワークの作成とネットワーク管理者の追加
各組織はネットワークに参加するためにMSP
の CA 機関から発行された証明書が必要ですので、各ノードには対応する CA が必要です。
ネットワークのイニシエータであるR4
は、ネットワークを設定し、オーダリングノードO4
を設立する必要があります。ネットワークが作成された後、ネットワーク管理者としてR1
を追加するため、R1
とR4
はネットワークの設定(NC4
)を行うことができます。
アライアンスの定義とチャネルの作成
R1
とR2
はC1
チャネルを介してビジネスのやり取りを行うため、ネットワーク内でアライアンスを定義する必要があります。R1
とR4
の両方がネットワークの設定を行えるため、アライアンスを定義することができます。
その後、このアライアンスのためにC1
チャネルを作成します(オーダリングサービスO4
に接続)。
ノードの参加、スマートコントラクトのデプロイとアプリケーション
P1
ノードは既に作成されたC1
チャネルに参加し、台帳L1
を維持しています。
この時点で、ノードにスマートコントラクトをインストールしてインスタンス化することができます。Fabric
のスマートコントラクトはチェーンコードであり、チェーンコードはノードのファイルシステムに保存され、特定のチャネルで起動およびインスタンス化する必要があります。その後、アプリケーションはトランザクション提案を背書ノードに送信することができます(チェーンコードの背書ポリシーに従う必要があります)。
以下の図は、P1
ノードがチェーンコードS5
をインストールし、C1
チャネルでインスタンス化した後、アプリケーションA1
からのチェーンコード呼び出しに応答できるようになる様子を示しています。P2
ノードはチェーンコードS5
をインストールし、C1
チャネルでインスタンス化した後、アプリケーションA2
からのチェーンコード呼び出しに応答できるようになります。
チャネル内の各ノードはコミットノードであり、新しいブロック(オーダリングノードからのもの)を受け取り、検証して台帳にコミットすることができます。また、チェーンコードがデプロイされた一部のノードは背書ノードになることもできます。
新しいアライアンスの定義と新しいチャネルの作成
新しいアライアンスをネットワークに定義し、C2
チャネルに参加します。
新しいノードの参加、スマートコントラクトのデプロイとアプリケーション
注意すべきは、一部のノードが複数のチャネルに同時に参加し、異なるビジネスで異なる役割を果たすことです。他の手順は同じです。
ネットワークの構築完了
Fabric
は、権限管理、チャネルなどのメカニズムを採用し、異なるノードの機能を分散させることで、システムの実行効率を向上させ、複雑なビジネスシナリオにおけるセキュリティとプライバシーを保護しています。強力なチェーンコードとカスタマイズ可能な背書ポリシーなども、システムの拡張性を保証し、複雑なビジネスロジックを処理することができます。
Hyperledger Fabric セキュリティ分析#
Fabric セキュリティメカニズム#
Fabric
は、システムのセキュリティを保護するために多くのメカニズムを設計しています。
システムの設定とメンバー管理#
ビットコインやイーサリアムなどのパブリックチェーンとは異なり、Fabric
ネットワークへの参加には権限の検証が必要です。Fabric CA
はメンバー管理にX.509
証明書メカニズムを使用しており、スプーフィング攻撃などの潜在的な攻撃を防ぐために権限を保護しています。
既存のシステムメンバーは新しいメンバーの参加ルールを定める必要があります。たとえば、多数決などの手法を使用することがあります。既存のメンバーはネットワークやスマートコントラクトの更新や変更を決定する必要があり、これにより悪意のあるノードによるシステムのセキュリティを大幅に防止することができます。既存のノードは自分自身で権限をアップグレードすることはできません。さらに、システムの一般的なデータモデルなどの設定も決定する必要があります。
Fabric
のネットワークトランスポートはTLSv1.2
を使用しており、データの安全性を保証しています。また、システム内の操作(トランザクションの発行、背書など)はデジタル署名技術を使用して記録され、悪意のある操作を容易に追跡することができます。ただし、注意が必要なのは、オーダリングノードはシステム内のすべてのノードのトランザクションデータにアクセスできるため、オーダリングサービスノードの設定はシステム全体のセキュリティに特に重要であり、その公正性はシステム全体の運営に大きく影響し、システムの信頼性を決定するため、ビジネスとシステムの構造に基づいて慎重に選択する必要があります。
パブリックチェーンシステムでは、すべてのノードがブロックチェーンの台帳のコピーを持ち、スマートコントラクトを実行します。一方、Fabric
システムでは、ビジネス関連のノードはノードグループを形成し、トランザクション(ビジネス)に関連する台帳を保持し、チェーンコードによる台帳の更新もノードグループの範囲内に制限されるため、システム全体の安定性が保証されます。
スマートコントラクトの実行はトランザクションと呼ばれ、Fabric
システム内のトランザクションも一貫性を保つ必要があります。これには、トランザクションの改ざんを防ぐために暗号技術を使用することが一般的です。SHA256
、ECDSA
などの検証によって変更が検出されることが多いです。Fabric
はモジュール化されたプラグインアーキテクチャを採用しており、トランザクションの実行、検証、合意を分離するため、異なる合意メカニズムやルールを選択することができます。これにより、要件に応じて異なる合意メカニズムを選択できるだけでなく、システムの拡張性も向上し、セキュリティも向上します。
これらの設定とルールは、システムのセキュリティを決定するため、ビジネス要件、効率、セキュリティのバランスを取る必要があります。
スマートコントラクトのセキュリティ#
Fabric
のチェーンコードはノードにインストールしてインスタンス化する必要があり、チェーンコードのインストールには CA の検証が必要なため、権限管理に注意する必要があります。チェーンコードは独立した Docker コンテナで実行されるため、より軽量ですが、Fabric
ネットワークにアクセスできるため、厳格なコードレビューやネットワークの分離が行われていない場合、悪意のある結果をもたらす可能性があります。
Fabric
のチェーンコードは、Go
、Java
などのさまざまな汎用プログラミング言語で記述することができます。これにより、システムの拡張性が向上し、既存のシステムやツールにも容易に統合できますが、実行結果は非決定的です。プログラミング言語のいくつかの特性(ランダム数、システムタイムスタンプ、ポインタなど)により、異なる背書ノードでの実行結果が異なる場合があり、システムの一貫性が損なわれる可能性があります。また、チェーンコードは外部の Web サービス、システムコマンド、ファイルシステム、サードパーティライブラリなどにアクセスすることもでき、潜在的なリスクを引き起こす可能性があります。したがって、これらの汎用言語で開発されたチェーンコードは、比較的独立しており、コードレビューが強化される必要があります。
トランザクションのプライバシー#
Fabric
は、チャネルメカニズムを使用してシステム全体を複数のサブブロックチェーン(台帳)に分割しています。チャネルに参加しているノードのみがトランザクション情報を表示および保存できますが、オーダリングノードは表示できます。
では、チャネル内の一部のプライベートデータのプライバシーを保護する方法はありますか?
Fabric
は、チャネル内のノードが特定のデータ共有対象(ノード)を選択できるようにするプライベートデータの保存方法を提供しています。
このメカニズムでは、実際のデータは指定されたノードにgossip
プロトコルを介して送信され、データはプライベートデータベースに格納されます。認可されたノードのみがチェーンコードを介してアクセスできますが、このプロセスはオーダリングサービスを含まないため、オーダリングノードはアクセスできません。
また、システム内で伝播、ソート、および台帳への書き込みが行われるデータは、ハッシュ暗号化されたバージョンであり、トランザクションは各ノードによって検証されますが、ハッシュの特性により、元のデータが漏洩することはありません。
ただし、背書ノードがトランザクションプロセス中にデータを使用する場合、背書ノードの読み取り可能性と他のノードへの非表示性(非対称暗号など)を保証するために、追加のメカニズムが必要です。
まとめ#
以上がHyperledger Fabric
ネットワークの構築とセキュリティシステムの分析です。次に、Go
とチェーンコードの開発を学び、プロジェクト実践を通じてより深く理解する予定です!
参考文献
- FITE3011 Distributed Ledger and Blockchain, Allen Au,HKU