ALTS認証

Application Layer Transport Security (ALTS) を使用した Java における gRPC 認証の概要。

ALTS認証

Application Layer Transport Security (ALTS) を使用した Java における gRPC 認証の概要。

概要

Application Layer Transport Security (ALTS) は、Googleが開発した相互認証およびトランスポート暗号化システムです。Googleのインフラストラクチャ内でのRPC通信の保護に使用されます。ALTSは相互TLSに似ていますが、Googleのプロダクション環境のニーズを満たすように設計および最適化されています。詳細については、ALTSホワイトペーパーをご覧ください。

gRPCにおけるALTSの機能は以下の通りです。

  • ALTSをトランスポートセキュリティプロトコルとしてgRPCサーバーとクライアントを作成します。
  • ALTS接続は、プライバシーと整合性によりエンドツーエンドで保護されます。
  • アプリケーションは、ピアサービスアカウントなどのピア情報にアクセスできます。
  • クライアント認証およびサーバー認証をサポートします。
  • ALTSを有効にするためのコード変更は最小限です。

gRPCユーザーは、数行のコードでALTSをトランスポートセキュリティプロトコルとして使用するようにアプリケーションを設定できます。

ALTSは、アプリケーションがCompute EngineまたはGoogle Kubernetes Engine (GKE)で実行されている場合に完全に機能することに注意してください。

ALTSトランスポートセキュリティプロトコルを使用したgRPCクライアント

gRPCクライアントは、以下のコード抜粋に示すように、ALTS認証情報を使用してサーバーに接続できます。

import io.grpc.alts.AltsChannelBuilder;
import io.grpc.ManagedChannel;

ManagedChannel managedChannel =
    AltsChannelBuilder.forTarget(serverAddress).build();

ALTSトランスポートセキュリティプロトコルを使用したgRPCサーバー

gRPCサーバーは、次に示すように、ALTS認証情報を使用してクライアントが自分に接続できるようにすることができます。

import io.grpc.alts.AltsServerBuilder;
import io.grpc.Server;

Server server = AltsServerBuilder.forPort(<port>)
    .addService(new MyServiceImpl()).build().start();

サーバー認証

gRPCには、ALTSを使用した組み込みのサーバー認証サポートがあります。ALTSを使用するgRPCクライアントは、接続を確立する前に、期待されるサーバーサービスアカウントを設定できます。その後、ハンドシェイクの最後に、サーバー認証はサーバーIDがクライアントによって指定されたサービスアカウントのいずれかと一致することを保証します。一致しない場合、接続は失敗します。

import io.grpc.alts.AltsChannelBuilder;
import io.grpc.ManagedChannel;

ManagedChannel channel =
    AltsChannelBuilder.forTarget(serverAddress)
        .addTargetServiceAccount("expected_server_service_account1")
        .addTargetServiceAccount("expected_server_service_account2")
        .build();

クライアント認証

接続が成功すると、ピア情報(例:クライアントのサービスアカウント)はAltsContextに格納されます。gRPCは、クライアント認証チェックのためのユーティリティライブラリを提供します。サーバーが期待されるクライアントID(例:foo@iam.gserviceaccount.com)を知っていると仮定すると、以下のサンプルコードを実行して着信RPCを認証できます。

import io.grpc.alts.AuthorizationUtil;
import io.grpc.ServerCall;
import io.grpc.Status;

ServerCall<?, ?> call;
Status status = AuthorizationUtil.clientAuthorizationCheck(
    call, Lists.newArrayList("foo@iam.gserviceaccount.com"));