ALTS認証
Application Layer Transport Security(ALTS)を使用したC++におけるgRPC認証の概要です。
ALTS認証
概要
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クレデンシャルを使用してサーバーに接続できます。
#include <grpcpp/grpcpp.h>
#include <grpcpp/security/credentials.h>
using grpc::experimental::AltsCredentials;
using grpc::experimental::AltsCredentialsOptions;
auto creds = AltsCredentials(AltsCredentialsOptions());
std::shared_ptr<grpc::Channel> channel = CreateChannel(server_address, creds);
ALTSトランスポートセキュリティプロトコルを使用したgRPCサーバー
gRPCサーバーは、次に示すように、ALTSクレデンシャルを使用してクライアントがサーバーに接続できるようにします。
#include <grpcpp/security/server_credentials.h>
#include <grpcpp/server.h>
#include <grpcpp/server_builder.h>
using grpc::experimental::AltsServerCredentials;
using grpc::experimental::AltsServerCredentialsOptions;
grpc::ServerBuilder builder;
builder.RegisterService(&service);
auto creds = AltsServerCredentials(AltsServerCredentialsOptions());
builder.AddListeningPort("[::]:<port>", creds);
std::unique_ptr<Server> server(builder.BuildAndStart());
サーバー認証
gRPCは、ALTSを使用した組み込みのサーバー認証サポートを備えています。ALTSを使用するgRPCクライアントは、接続を確立する前に、期待されるサーバーサービスアカウントを設定できます。ハンドシェイクの最後に、サーバー認証によって、サーバーのIDがクライアントによって指定されたサービスアカウントのいずれかと一致することが保証されます。そうでない場合、接続は失敗します。
#include <grpcpp/grpcpp.h>
#include <grpcpp/security/credentials.h>
using grpc::experimental::AltsCredentials;
using grpc::experimental::AltsCredentialsOptions;
AltsCredentialsOptions opts;
opts.target_service_accounts.push_back("expected_server_service_account1");
opts.target_service_accounts.push_back("expected_server_service_account2");
auto creds = AltsCredentials(opts);
std::shared_ptr<grpc::Channel> channel = CreateChannel(server_address, creds);
クライアント認証
接続が成功すると、ピア情報(例:クライアントのサービスアカウント)はAltsContextに格納されます。gRPCは、クライアント認証チェックのためのユーティリティライブラリを提供します。サーバーが期待されるクライアントID(例:`foo@iam.gserviceaccount.com`)を知っていると仮定すると、次のコード例を実行して、受信RPCを承認できます。
#include <grpcpp/server_context.h>
#include <grpcpp/security/alts_util.h>
grpc::ServerContext* context;
grpc::Status status = experimental::AltsClientAuthzCheck(
context->auth_context(), {"foo@iam.gserviceaccount.com"});