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 ao a identidade do solicitante do certificado. Com a reflexão de identidade, é possível limitar solicitante de certificado sem privilégios solicite apenas certificados com um nome alternativo do sujeito (SAN, na sigla em inglês) correspondente à identidade em credencial.
Objetivos
Neste tutorial, explicamos como usar o CA Service pools de Identidade da carga de trabalho para federar uma identidade de terceiros e conseguir certificado que atesta essa identidade.
Antes de começar
Antes de começar, você precisa entender os seguintes conceitos:
- Pools de identidade da carga de trabalho: permitem gerenciar provedores de identidade de terceiros. Para mais informações, consulte Gerenciar pools e provedores de identidade da carga de trabalho.
- Federação de identidade da carga de trabalho: a federação de identidade da carga de trabalho aproveita os pools de identidade da carga de trabalho para conceder acesso a identidades de terceiros aos serviços do Google Cloud. Para mais informações, consulte Identidade da carga de trabalho federação.
- Serviço de token de segurança (STS, na sigla em inglês): permite trocar credenciais de terceiros por tokens próprios (do Google Cloud). Para mais informações, consulte Serviço de token de segurança.
- Reflexão de identidade: o recurso de reflexão de identidade permite que a identidade verificada de um solicitante de certificado seja encaminhada ao 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 (ACs) e pools de ACs e solicitar certificados, você precisa ter a função de gerente de operação de serviço de AC (
privateca.caManager
). Para mais informações sobre o IAM, papéis para o CA Service, consulte Controle de acesso com o IAM. - Para gerenciar provedores e pools 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 Administrador da conta de serviço
(
iam.serviceAccountAdmin
).
Para informações sobre como conceder papéis do IAM, consulte Gerencie o acesso a projetos, pastas e com outras organizações. É possível conceder os papéis do IAM necessários para 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
Neste tutorial, explicamos como você pode usar um Google OpenID Connect (OIDC) provedor de serviços combinado a uma conta de serviço para atuar como uma identidade de terceiros. O provedor OIDC das Contas do Google atua como um provedor de identidade de terceiros (IdP) e a conta de serviço do Google Cloud é um exemplo de identidade de terceiros declarada por esse IdP.
Os pools de identidade da carga de trabalho dão suporte a vários provedores de identidade, como Microsoft Azure/Active Directory on-premises, AWS e baseados em SAML provedores de identidade.
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 identidade 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.
Criar um provedor de pool de identidade da carga de trabalho para sua identidade de terceiros de nuvem:
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 sinalizações de acordo com seu caso de uso:
attribute-mapping
: essa flag define o mapeamento entre o servidor reivindicações da reivindicaçã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 de CEL. Para mais informações, consulte Definir um mapeamento de atributos e condição.issuer-uri
: para provedores OIDC, essa sinalização é um servidor que o Google usa para verificar a identidade de terceiros tokens. Para mais informações, consulte Como preparar uma identidade externa provedor.
Para mais informações sobre como configurar um provedor de identidade de carga de trabalho, consulte Como configurar a federação de identidade de carga de trabalho.
Criar um pool de ACs e uma AC emissora
Nesta seção, explicamos como criar um pool de ACs e adicionar uma raiz CA a ele. É possível usar esse pool de ACs para emitir certificados. Pule esta etapa se quiser usar um pool de ACs e uma AC atuais. nesta seção.
Em vez de uma AC raiz, você também pode criar uma AC subordinada. Criar uma AC raiz ajuda a encurtar o procedimento.
Crie um pool de ACs no nível de DevOps:
gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devops
Substitua:
- CA_POOL_ID: o ID do pool de AC Service da AC que emite certificados.
- LOCATION: o local do pool de ACs.
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 os certificados.
- CA_POOL_ID: o ID do pool de ACs do serviço de AC que emite certificados.
- LOCATION: o local do pool de ACs.
Para mais informações sobre como criar uma CA raiz, consulte Crie uma AC raiz.
Ativar identidades federadas do pool de identidades da carga de trabalho para emitirem certificados do pool de ACs. A reflexão de identidade exige o papel do IAM de requerente do certificado da carga de trabalho de CA (
roles/privateca.workloadCertificateRequester
) para os requerentes deCreateCertificate
.É possível representar os principais do pool de identidade da carga de trabalho em várias granularidades, desde um único assunto até todas as identidades no pool nos provedores. Para mais informações, consulte os princípios ou conjuntos de principais disponíveis (use a guia da Google Cloud CLI) de acordo com seu caso de uso.
gcloud privateca pools add-iam-policy-binding CA_POOL_ID --location LOCATION --role roles/privateca.workloadCertificateRequester --member "principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/*"
Substitua:
- PROJECT_NUMBER: o número do projeto em que você criou o pool de Identidade 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 represente uma
terceira parte. Esta seção mostra como usar o endpoint IAM
GenerateIdToken
para extrair uma identidade de terceiros na forma de
um token OIDC. Dependendo do caso de uso, talvez sejam necessárias etapas diferentes para
receba o token de identidade de terceiros que preferir.
gcloud iam service-accounts create SERVICE_ACCOUNT
Substitua:
- SERVICE_ACCOUNT: o ID da conta de serviço que representa o 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 do token da conta de serviço
(roles/iam.serviceAccountTokenCreator
). Você precisa desse
papel do IAM para chamar a API GenerateIdToken
.
Para obter um certificado que atesta uma identidade de terceiros, faça o seguintes:
Consiga um token de identidade de terceiros do seu provedor de identidade terceirizado.
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 do Google Cloud para o projeto em que você quer criar recursos.
Bibliotecas de cliente
.Para acessar o token de terceiros de maneira programática, é possível extrair 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 Terraform. Neste tutorial, seguimos um fluxo de trabalho de credencial de origem do arquivo.
Carregue a credencial em um caminho legível para o certificado requerente:
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 o token de terceiros por um token OAuth federado usando o endpoint
token
do 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
credencial com o nome
oidc_token.txt
que o código de solicitação do 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
credencial com o nome
Faça uma solicitação ao serviço de autoridade certificadora com o modo de solicitação de assunto
REFLECTED_SPIFFE
:curl
Opcional: se você não tiver um CSR, crie um executando o comando abaixo.
export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
Solicite um certificado com a CSR, um ciclo de vida e um modo de solicitação de assunto:
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 primário ao serviço de AC, você precisa criar um cliente credenciado. Em seguida, use esse cliente com credenciais para fazer solicitações de certificado:
Inicie um cliente de serviço de CA credenciado:
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 é 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 Identidade da carga de trabalho.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos do serviço de CA que você criou seguindo este documento, realize as seguintes operações usando o CLI do Google Cloud:
Exclua a AC que você criou.
Desative a AC:
gcloud privateca roots disable CA_ID --pool CA_POOL_ID --location LOCATION
Substitua:
- CA_ID: o identificador exclusivo da AC.
- CA_POOL_ID: o identificador exclusivo do pool de ACs.
- LOCATION: o local do pool de ACs.
Exclua a AC:
gcloud privateca roots delete CA_ID --pool CA_POOL_ID --location LOCATION --ignore-active-certificates
Substitua:
- CA_ID: o identificador exclusivo da AC.
- 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 cargas 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 que você criou:
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 de serviço de CA
(privateca.workloadCertificateRequester
) restringe o assunto do certificado emitido apenas
à identidade do solicitante. Garanta que os usuários ou as cargas de trabalho que usam
de reflexão só recebem o serviço de AC
Solicitante de certificado da carga de trabalho (privateca.workloadCertificateRequester
)
papel do IAM. Para respeitar o princípio de privilégio mínimo, você pode
evitar conceder ao solicitante de certificado de serviço de CA
(privateca.certificateRequester
) papel do IAM.
A seguir
- Leia sobre os vários controles de políticas que permitem controlar as propriedades do certificado solicitado além de um identidade refletida.
- Saiba como configurar e gerenciar várias políticas controles de segurança.