mirror of https://github.com/grpc/grpc.io.git
Add ALTS auth guide (#301)
* Add ALTS auth guide
* Move alts_auth.md to guides/auth/ALTS.md
* Fix ALTS link
* Address reviewer's comments
* Split ALTS.md into two pages.
* Revert "Split ALTS.md into two pages."
This reverts commit 55dbbd9986.
* Address reviewer comments
* Address Cesar's comments
* Remove GCP specific info. Make ALTS guide more generic
This commit is contained in:
parent
13591d08a2
commit
46b0c24a20
|
|
@ -0,0 +1,232 @@
|
||||||
|
---
|
||||||
|
title: ALTS Authentication
|
||||||
|
description: >
|
||||||
|
An overview of gRPC authentication using Application Layer Transport Security
|
||||||
|
(ALTS).
|
||||||
|
---
|
||||||
|
|
||||||
|
### Overview
|
||||||
|
|
||||||
|
Application Layer Transport Security (ALTS) is a mutual authentication and
|
||||||
|
transport encryption system developed by Google. It is used for securing RPC
|
||||||
|
communications within Google's infrastructure. ALTS is similar to mutual TLS
|
||||||
|
but has been designed and optimized to meet the needs of Google's production
|
||||||
|
environments. For more information, take a look at the
|
||||||
|
[ALTS whitepaper](https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security).
|
||||||
|
|
||||||
|
ALTS in gRPC has the following features:
|
||||||
|
|
||||||
|
- Create gRPC servers & clients with ALTS as the transport security protocol.
|
||||||
|
- ALTS connections are end-to-end protected with privacy and integrity.
|
||||||
|
- Applications can access peer information such as the peer service account.
|
||||||
|
- Client authorization and server authorization support.
|
||||||
|
- Minimal code changes to enable ALTS.
|
||||||
|
|
||||||
|
gRPC users can configure their applications to use ALTS as a transport security
|
||||||
|
protocol with few lines of code. gRPC ALTS is supported in C++, Java, Go, and
|
||||||
|
Python.
|
||||||
|
|
||||||
|
Note that ALTS is fully functional if the application runs on
|
||||||
|
[Google Cloud Platform](https://cloud.google.com/). ALTS could be run on any
|
||||||
|
platforms with a pluggable
|
||||||
|
[ALTS handshaker service](https://github.com/grpc/grpc/blob/master/src/proto/grpc/gcp/handshaker.proto#L233-L243).
|
||||||
|
|
||||||
|
### gRPC Client with ALTS Transport Security Protocol
|
||||||
|
|
||||||
|
gRPC clients can use ALTS credentials to connect to servers. The following
|
||||||
|
provides examples of how to set up such clients in all supported gRPC languages.
|
||||||
|
|
||||||
|
#### C++
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <grpcpp/grpcpp.h>
|
||||||
|
#include <grpcpp/security/credentials.h>
|
||||||
|
|
||||||
|
using grpc::experimental::AltsCredentials;
|
||||||
|
using grpc_impl::experimental::AltsCredentialsOptions;
|
||||||
|
|
||||||
|
auto creds = AltsCredentials(AltsCredentialsOptions());
|
||||||
|
std::shared_ptr<grpc::Channel> channel = CreateChannel(server_address, creds);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Java
|
||||||
|
|
||||||
|
```java
|
||||||
|
import io.grpc.alts.AltsChannelBuilder;
|
||||||
|
import io.grpc.ManagedChannel;
|
||||||
|
|
||||||
|
ManagedChannel managedChannel =
|
||||||
|
AltsChannelBuilder.forTarget(serverAddress).build();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Go
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/alts"
|
||||||
|
)
|
||||||
|
|
||||||
|
altsTC := alts.NewClientCreds(alts.DefaultClientOptions())
|
||||||
|
conn, err := grpc.Dial(serverAddr, grpc.WithTransportCredentials(altsTC))
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Python
|
||||||
|
|
||||||
|
```python
|
||||||
|
import grpc
|
||||||
|
|
||||||
|
channel_creds = grpc.alts_channel_credentials()
|
||||||
|
channel = grpc.secure_channel(address, channel_creds)
|
||||||
|
```
|
||||||
|
|
||||||
|
### gRPC Server with ALTS Transport Security Protocol
|
||||||
|
|
||||||
|
gRPC servers can use ALTS credentials to allow clients to connect to them. The
|
||||||
|
following provides examples of how to set up such servers in all supported gRPC
|
||||||
|
languages.
|
||||||
|
|
||||||
|
#### C++
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <grpcpp/security/server_credentials.h>
|
||||||
|
#include <grpcpp/server.h>
|
||||||
|
#include <grpcpp/server_builder.h>
|
||||||
|
|
||||||
|
using grpc::experimental::AltsServerCredentials;
|
||||||
|
using grpc_impl::experimental::AltsServerCredentialsOptions;
|
||||||
|
|
||||||
|
grpc::ServerBuilder builder;
|
||||||
|
builder.RegisterService(&service);
|
||||||
|
auto creds = AltsServerCredentials(AltsServerCredentialsOptions());
|
||||||
|
builder.AddListeningPort("[::]:<port>", creds);
|
||||||
|
std::unique_ptr<Server> server(builder.BuildAndStart());
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Java
|
||||||
|
|
||||||
|
```java
|
||||||
|
import io.grpc.alts.AltsServerBuilder;
|
||||||
|
import io.grpc.Server;
|
||||||
|
|
||||||
|
Server server = AltsServerBuilder.forPort(<port>)
|
||||||
|
.addService(new MyServiceImpl()).build().start();
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Go
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/alts"
|
||||||
|
)
|
||||||
|
|
||||||
|
altsTC := alts.NewServerCreds(alts.DefaultServerOptions())
|
||||||
|
server := grpc.NewServer(grpc.Creds(altsTC))
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Python
|
||||||
|
|
||||||
|
```python
|
||||||
|
import grpc
|
||||||
|
|
||||||
|
server = grpc.server(futures.ThreadPoolExecutor())
|
||||||
|
server_creds = grpc.alts_server_credentials()
|
||||||
|
server.add_secure_port(server_address, server_creds)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Server Authorization
|
||||||
|
|
||||||
|
gRPC has built-in server authorization support using ALTS. A gRPC client using
|
||||||
|
ALTS can set the expected server service accounts prior to establishing a
|
||||||
|
connection. Then, at the end of the handshake, server authorization guarantees
|
||||||
|
that the server identity matches one of the service accounts specified
|
||||||
|
by the client. Otherwise, the connection fails.
|
||||||
|
|
||||||
|
#### C++
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <grpcpp/grpcpp.h>
|
||||||
|
#include <grpcpp/security/credentials.h>
|
||||||
|
|
||||||
|
using grpc::experimental::AltsCredentials;
|
||||||
|
using grpc_impl::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);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Java
|
||||||
|
|
||||||
|
```java
|
||||||
|
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();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Go
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/alts"
|
||||||
|
)
|
||||||
|
|
||||||
|
clientOpts := alts.DefaultClientOptions()
|
||||||
|
clientOpts.TargetServiceAccounts = []string{expectedServerSA}
|
||||||
|
altsTC := alts.NewClientCreds(clientOpts)
|
||||||
|
conn, err := grpc.Dial(serverAddr, grpc.WithTransportCredentials(altsTC))
|
||||||
|
```
|
||||||
|
|
||||||
|
### Client Authorization
|
||||||
|
|
||||||
|
On a successful connection, the peer information (e.g., client’s service
|
||||||
|
account) is stored in the
|
||||||
|
[AltsContext](https://github.com/grpc/grpc/blob/master/src/proto/grpc/gcp/altscontext.proto).
|
||||||
|
gRPC provides a utility library for
|
||||||
|
client authorization check. Assuming that the server knows the expected client
|
||||||
|
identity (e.g., foo@iam.gserviceaccount.com), it can run the following example
|
||||||
|
codes to authorize the incoming RPC.
|
||||||
|
|
||||||
|
#### C++
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#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"});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Java
|
||||||
|
|
||||||
|
```java
|
||||||
|
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"));
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Go
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/alts"
|
||||||
|
)
|
||||||
|
|
||||||
|
err := alts.ClientAuthorizationCheck(ctx, []string{"foo@iam.gserviceaccount.com"})
|
||||||
|
```
|
||||||
|
|
@ -24,6 +24,11 @@ The following authentication mechanisms are built-in to gRPC:
|
||||||
to authenticate the server, and to encrypt all the data exchanged between
|
to authenticate the server, and to encrypt all the data exchanged between
|
||||||
the client and the server. Optional mechanisms are available for clients to
|
the client and the server. Optional mechanisms are available for clients to
|
||||||
provide certificates for mutual authentication.
|
provide certificates for mutual authentication.
|
||||||
|
- **ALTS**: gRPC supports
|
||||||
|
[ALTS](https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security)
|
||||||
|
as a transport security mechanism, if the application is running on
|
||||||
|
[Google Cloud Platform (GCP)](https://cloud.google.com/). See
|
||||||
|
[ALTS Authentication Guide](ALTS) for details.
|
||||||
- **Token-based authentication with Google**: gRPC provides a generic
|
- **Token-based authentication with Google**: gRPC provides a generic
|
||||||
mechanism (described below) to attach metadata based credentials to requests
|
mechanism (described below) to attach metadata based credentials to requests
|
||||||
and responses. Additional support for acquiring access tokens
|
and responses. Additional support for acquiring access tokens
|
||||||
Loading…
Reference in New Issue