第6章. 安全なgRPC
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
gRPCベースのアプリケーションは、ネットワークを介して互いにリモートで通信する。このため、各gRPCアプリケーションは、そのアプリケーションと通信する必要のある他のアプリケーションに対して、そのエントリ・ポイントを公開する必要がある。セキュリティの観点からは、これは良いことではない。エントリ点が多ければ多いほど、攻撃対象は広がり、攻撃されるリスクも高くなる。従って、通信の確保とエントリ点の確保は、実際のユースケースにおいて不可欠である。すべての gRPC アプリケーションは、暗号化されたメッセー ジを扱い、すべてのノード間通信を暗号化し、すべてのメッセー ジを認証・署名できなければならない。
この章では、アプリケーション・レベルのセキュリティを実現する上で直面する課題に対処するために、セキュリティの基礎とパターンのセットを取り上げる。簡単に言うと、マイクロサービス間の通信チャネルをセキュアにし、ユーザの認証とアクセスを制御する方法を探る。
では、まず通信経路の確保から始めよう。
TLSでgRPCチャンネルを認証する
トランスポート・レベル・セキュリティ(TLS)は、通信する2つのアプリケーション間でプライバシーとデータの完全性を提供することを目的としている。ここでは、gRPCクライアント、サーバアプリケーション間のセキュアな接続を提供することを目的としている。トランスポート・レベル・セキュリティ・プロトコル仕様によると、クライアント、サーバ間の接続が安全である場合、以下のプロパティの1つ以上を持つ必要がある:
- 接続はプライベートである
-
対称暗号はデータの暗号化に使われる。暗号化の一種で、暗号化と復号化の両方に1つの鍵(秘密鍵)だけが使われる。これらの鍵は、セッション開始時にネゴシエー ションされた共有秘密鍵に基づいて、接続ごとに一意に生成される。
- 接続は信頼できる
-
これは、各メッセージに、送信中のデータの紛失や改ざんが検出されないようにするためのメッセージ完全性チェックが含まれているためである。
そのため、安全な接続を介してデータを送信することが重要である。この認証メカニズムは gRPC ライブラリに組み込まれている。また、TLSを使った認証と暗号化も推奨されている。
では、gRPC 接続でトランスポート・レベルのセキュ リティを実現するにはどうすればよいのだろうか。クライアント、サーバ間のセキュアなデータ転送は、片方向または双方向(これは相互 TLS、または mTLS とも呼ばれる)で実装することができる。以下のセクションでは、それぞれの方法でセキュリティを有効にする方法について説明する。
一方通行のセキュアな接続を可能にする
一方向接続では、クライアントのみがサーバを検証し、意図したサーバからデータを確実に受信する。クライアント、サーバ間の接続を確立する際、サーバは公開証明書をクライアントと共有し、クライアントは受け取った証明書を検証する。CAが署名した証明書の場合、これは認証局(CA)を通じて行われる。証明書が検証されると、クライアントは秘密鍵を使って暗号化したデータを送信する。
CAは、公衆ネットワークにおける安全な通信に使用されるセキュリティ証明書および公開鍵を管理・発行する信頼できるエンティティである。この信頼できるエンティティによって署名または発行された証明書は、CA ...