ALTS認証

アプリケーションレイヤートランスポートセキュリティ(ALTS)を使用したJavaでのgRPC認証の概要。

ALTS認証

アプリケーションレイヤートランスポートセキュリティ(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"));