Emitir certificados que atestam a identidade de terceiros
Este tutorial demonstra como emitir certificados que atestam uma identidade de terceiros usando reflexão de identidade e pools de identidade da carga de trabalho.
É possível usar a reflexão de identidade para criar certificados que correspondam à identidade verificada de um solicitante de certificado. Com o uso da reflexão de identidade, é possível limitar um solicitante de certificado sem privilégios para pedir apenas certificados com um nome alternativo do assunto (SAN) correspondente à identidade na credencial.
Objetivos
Este tutorial mostra como usar o serviço de CA com pools de identidades de carga de trabalho para federar uma identidade de terceiros e receber um certificado que ateste essa identidade.
Antes de começar
Antes de começar, entenda os seguintes conceitos:
- Pools de Identidade da carga de trabalho: permitem gerenciar provedores de identidade de terceiros. Para mais informações, consulte Gerenciar provedores e pools de Identidade da carga de trabalho.
- Federação de identidade da carga de trabalho: usa pools de identidade da carga de trabalho para dar a identidades de terceiros acesso aos serviços do Google Cloud. Para mais informações, consulte Federação de identidades da carga de trabalho.
- Serviço de token de segurança (STS): com o STS, é possível trocar credenciais de terceiros por tokens próprios (Google Cloud). Para mais informações, consulte Security Token Service.
- Reflexão de identidade: com esse recurso, a identidade verificada de um solicitante de certificado é transferida para o certificado solicitado. Para mais informações, consulte Reflexão de identidade.
Verifique se você tem os seguintes papéis do IAM:
- Para gerenciar autoridades certificadoras (CAs) e pools de CAs e solicitar
certificados, você precisa ter a função de gerente de operações do serviço de CA
(
privateca.caManager
). Para mais informações sobre papéis do IAM para o CA Service, consulte Controle de acesso com o IAM. - Para gerenciar pools e provedores de identidade da carga de trabalho, você precisa ter o papel de
Administrador de pool de Identidade da carga de trabalho (
iam.workloadIdentityPoolAdmin
). - Para criar uma conta de serviço, você precisa ter o papel de Administrador da conta de serviço (
iam.serviceAccountAdmin
).
Para saber mais sobre a concessão de papéis do IAM, consulte Gerenciar o acesso a projetos, pastas e organizações. Você pode conceder os papéis necessários do IAM a uma Conta do Google, uma conta de serviço, um Grupo do Google, uma conta do Google Workspace ou um domínio do Cloud Identity.
Configurar um pool de identidades e um provedor de carga de trabalho
Este tutorial explica como usar um provedor Google OpenID Connect (OIDC) combinado com uma conta de serviço para agir como uma identidade de terceiros. O provedor OIDC de contas do Google atua como um provedor de identidade (IDP) terceirizado, e a conta de serviço Google Cloud é uma amostra de identidade terceirizada declarada por esse IDP.
Os pools de identidades de carga de trabalho são compatíveis com vários provedores de identidade, incluindo Microsoft Azure/Active Directory local, AWS e provedores de identidade baseados em SAML.
Para configurar um pool de identidades e um provedor de carga de trabalho, faça o seguinte: 1. Para representar um conjunto confiável de identidades federadas, crie um pool de identidades da carga de trabalho:
```
gcloud iam workload-identity-pools create IDENTITY_POOL_ID --location global --display-name "tutorial-wip"
```
Replace the following:
- <var>IDENTITY_POOL_ID</var>: The unique identifier of the new workload
identity pool.
Crie um provedor de pool de identidade da carga de trabalho para seu provedor de identidade de terceiros:
gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID --location global --workload-identity-pool IDENTITY_POOL_ID --display-name "tutorial-oidc" --attribute-mapping "google.subject=assertion.sub" --issuer-uri="https://accounts.google.com"
Substitua:
- PROVIDER_ID: o identificador exclusivo do provedor de identidade que você quer criar no pool de identidades da carga de trabalho.
É possível personalizar as seguintes flags para seu caso de uso:
attribute-mapping
: essa flag define o mapeamento entre as declarações de terceiros e a declaração principal do Google,google.subject
.google.subject
é um mapeamento obrigatório que pode ser definido para qualquer declaração ou combinação de declarações usando uma expressão CEL. Para mais informações, consulte Definir um mapeamento e uma condição de atributo.issuer-uri
: para provedores OIDC, essa flag é um endpoint acessível publicamente que o Google usa para verificar tokens de terceiros. Para mais informações, consulte Preparar um provedor de identidade externo.
Para mais informações sobre como configurar um provedor de identidade da carga de trabalho, consulte Configurar a federação de identidade da carga de trabalho.
Criar um pool de CA e uma CA emissora
Nesta seção, explicamos como criar um pool de CAs e adicionar uma CA raiz a ele. É possível usar esse pool de CA para emitir certificados que refletem a identidade. Se você quiser usar um pool e uma CA atuais, pule esta seção.
Em vez de uma CA raiz, também é possível criar uma CA subordinada. Criar uma AC raiz ajuda a encurtar o procedimento.
Crie um pool de CA no nível DevOps:
gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devops
Substitua:
- CA_POOL_ID: o ID do pool de CAs do serviço de CA que emite certificados.
- LOCATION: o local do pool de CAs.
Para mais informações sobre como criar pools de ACs, consulte Criar um pool de ACs.
Crie uma CA raiz:
gcloud privateca roots create CA_ID --pool CA_POOL_ID --location LOCATION --subject "CN=test,O=test-org"
Substitua:
- CA_ID: o ID da autoridade certificadora que emite certificados.
- CA_POOL_ID: o ID do pool de CA do serviço de CA que emite certificados.
- LOCATION: o local do pool de CAs.
Para mais informações sobre como criar uma AC raiz, consulte Criar uma AC raiz.
Permitir que identidades federadas do pool de Identidade da carga de trabalho emitam certificados do pool de ACs. A reflexão de identidade exige o papel do IAM Requerente de certificado da carga de trabalho de serviços de CA (
roles/privateca.workloadCertificateRequester
) para os requerentes deCreateCertificate
.É possível representar participantes do pool de identidades da carga de trabalho em várias granularidades, desde um único assunto até todas as identidades no pool em todos os provedores. Para mais informações, consulte os principais ou conjuntos principais disponíveis (use a guia da Google Cloud CLI) para atender melhor ao seu caso de uso.
gcloud privateca pools add-iam-policy-binding CA_POOL_ID \ --location LOCATION \ --role "roles/privateca.workloadCertificateRequester" \ --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/"
Substitua:
- LOCATION: o local do pool de CAs
- PROJECT_ID: o ID do projeto Google Cloud em que você criou o pool de identidades da carga de trabalho
Criar uma conta de serviço que represente uma identidade de terceiros
O procedimento a seguir pressupõe que uma conta de serviço representa um
terceiro. Esta seção mostra como usar o endpoint
GenerateIdToken
do IAM para recuperar uma identidade de terceiros na forma de
um token OIDC. Dependendo do caso de uso, talvez seja necessário seguir etapas diferentes para
receber o token de identidade de terceiros escolhido.
gcloud iam service-accounts create SERVICE_ACCOUNT
Substitua:
- SERVICE_ACCOUNT: o ID da conta de serviço que representa a identidade de terceiros.
Emitir um certificado que ateste a identidade de terceiros
Antes de começar, verifique se você tem o papel do IAM de Criador de token da conta de serviço
(roles/iam.serviceAccountTokenCreator
). Você precisa desse papel do IAM para chamar a API GenerateIdToken
.
Para receber um certificado que ateste a identidade de terceiros, faça o seguinte:
Receba um token de identidade de terceiros do seu provedor de identidade de terceiros.
curl
export ID_TOKEN=`curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;print(json.load(sys.stdin)['token'])"`
Substitua:
- PROJECT_ID: o ID do projeto Google Cloud em que você quer criar recursos.
Bibliotecas de cliente
Para acessar o token de terceiros de maneira programática, você pode conseguir um token de uma credencial de origem de arquivo ou de URL. Para mais informações, consulte Como autenticar usando bibliotecas de cliente, a CLI gcloud ou o Terraform. Neste tutorial, vamos seguir um fluxo de trabalho de credenciais de origem de arquivo.
Carregue sua credencial em um caminho legível pelo solicitante do certificado:
curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json; print(json.load(sys.stdin)['token']) > /tmp/oidc_token.txt
Substitua:
- PROJECT_ID: o ID do projeto em que você quer criar recursos.
Troque seu token de terceiros por um token OAuth federado usando o endpoint
token
da STS:curl
export STS_TOKEN=`curl -L -X POST 'https://sts.googleapis.com/v1/token' -H 'Content-Type: application/json' \ -d '{ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange", "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID", "requested_token_type": "urn:ietf:params:oauth:token-type:access_token", "scope": "https://www.googleapis.com/auth/cloud-platform", "subject_token": "'$ID_TOKEN'", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt" }' | python3 -c "import sys;import json; print(json.load(sys.stdin)['access_token'])"`
Bibliotecas de cliente
- Crie um arquivo de configuração de credenciais chamado
oidc_token.txt
que o código de solicitação de certificado possa ler para realizar uma troca de token.
gcloud iam workload-identity-pools create-cred-config projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID --output-file=/tmp/cred_config.json --credential-source-file=/tmp/oidc_token.txt
- Leia o arquivo
oidc_token.txt
para definir o mecanismo de autorização na biblioteca do cliente:
python
import json from google.auth import identity_pool with open('/tmp/cred_config.json', 'r') as f: json_config_info = json.loads(f.read()) credentials = identity_pool.Credentials.from_info(json_config_info) scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/cloud-platform'])
- Crie um arquivo de configuração de credenciais chamado
Faça uma solicitação ao CA Service com o modo de solicitação de assunto
REFLECTED_SPIFFE
:curl
Opcional: se você não tiver uma CSR, crie uma executando o seguinte comando.
export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
Solicite um certificado com a CSR, um tempo de vida e um modo de solicitação de assunto refletido:
curl -H "Authorization: Bearer $(echo $STS_TOKEN)" https://privateca.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/caPools/CA_POOL_ID/certificates\?alt\=json -X POST -H "Content-Type: application/json" -H 'Accept: application/json' --data '{"lifetime": "100s", "pemCsr": "'$TUTORIAL_CSR'", "subjectMode": "REFLECTED_SPIFFE"}'
Bibliotecas de cliente
Para encaminhar o token de terceiros ao serviço de CA, é necessário criar um cliente com credenciais. Em seguida, use esse cliente com credenciais para fazer solicitações de certificado:
Inicie um cliente do serviço de CA com credenciais:
python
caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
Solicite um certificado.
Python
Para autenticar no serviço de CA, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Verifique o certificado. O certificado precisa ter um assunto que contenha um único SAN de URI. O SAN que atesta uma identidade está no seguinte formato:
spiffe://IDENTITY_POOL_ID.PROJECT_NUMBER.global.workload.id.goog/subject/<oidc_subject_number>
Substitua:
- IDENTITY_POOL_ID: o identificador exclusivo do pool de identidade da carga de trabalho.
- PROJECT_NUMBER: o número do projeto em que você criou o pool de identidades da carga de trabalho.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos do CA Service criados seguindo este documento, execute as seguintes operações usando a Google Cloud CLI:
Exclua a AC que você criou.
Desative a CA:
gcloud privateca roots disable CA_ID --pool CA_POOL_ID --location LOCATION
Substitua:
- CA_ID: o identificador exclusivo da CA.
- CA_POOL_ID: o identificador exclusivo do pool de ACs.
- LOCATION: o local do pool de ACs.
Exclua a CA:
gcloud privateca roots delete CA_ID --pool CA_POOL_ID --location LOCATION --ignore-active-certificates
Substitua:
- CA_ID: o identificador exclusivo da CA.
- CA_POOL_ID: o identificador exclusivo do pool de ACs.
- LOCATION: o local do pool de ACs.
Exclua o pool de ACs que você criou.
gcloud privateca pools delete CA_POOL_ID --location LOCATION
Substitua:
- CA_POOL_ID: o identificador exclusivo do pool de ACs.
- LOCATION: o local do pool de ACs.
Para mais informações sobre o comando
gcloud privateca pools delete
, consulte gcloud privateca pools delete.Exclua o pool de identidades de carga de trabalho que você criou:
gcloud iam workload-identity-pools delete IDENTITY_POOL_ID --location global
Substitua:
- IDENTITY_POOL_ID: o identificador exclusivo do pool de identidade da carga de trabalho.
Exclua a conta de serviço criada:
gcloud iam service-accounts delete SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com
Substitua:
- SERVICE_ACCOUNT: o identificador exclusivo do pool de identidade da carga de trabalho.
- PROJECT_ID: o projeto proprietário da conta de serviço.
O papel do IAM de
Solicitante de certificado da carga de trabalho do serviço de CA (privateca.workloadCertificateRequester
)
restringe o assunto do certificado emitido apenas à
identidade do solicitante. Verifique se os usuários ou cargas de trabalho que usam o recurso de
reflexão de identidade só recebem o papel do IAM de
solicitante de certificado da carga de trabalho do serviço de CA (privateca.workloadCertificateRequester
). Para obedecer ao princípio de privilégio mínimo, evite conceder o papel do IAM de solicitante de certificado do serviço de CA (privateca.certificateRequester
).
A seguir
- Leia sobre os vários controles de política que permitem controlar as propriedades do certificado solicitado além de uma identidade refletida.
- Saiba como configurar e gerenciar vários controles de política.