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"});