Tutorial: gerenciar controles de política

Neste tutorial, mostramos como implementar controles de política nos recursos do Certificate Authority Service.

Objetivos

Este tutorial fornece informações sobre como configurar um pool de autoridade de certificação (CA, na sigla em inglês) compartilhado para emissão de certificados DNS com os seguintes controles de política:

  • O usuário prod-dns-requester pode solicitar certificados TLS do servidor de entidade final para o domínio *.prod.example.com.
  • O usuário test-dns-requester pode solicitar certificados TLS do servidor de entidade final para o domínio *.test.example.com.
  • O usuário blank-check-requester pode solicitar qualquer tipo de certificado do pool de ACs.

Neste tutorial, usamos a política de emissão de certificados de um pool de ACs, modelos de certificados e vinculações condicionais do IAM para esse cenário.

Antes de começar

Como criar um pool de ACs

Para criar um pool de ACs, siga estas instruções:

  1. Para criar um pool de ACs que use o arquivo issuance-policy.yaml, use o seguinte comando gcloud:

    gcloud

    gcloud privateca pools create POOL_NAME \
        --tier=ENTERPRISE
    

    Em que:

  2. Para criar uma AC com recursos gerenciados pelo Google no pool de AC recém-criado, use o seguinte comando gcloud:

    gcloud

    gcloud privateca roots create CA_NAME \
       --pool=POOL_NAME \
       --subject="CN=Example DNS Root, O=Example LLC, C=US" \
       --validity="10Y" \
       --max-chain-length=1 \
       --auto-enable
    

    Em que:

    • POOL_NAME é o identificador exclusivo do pool de ACs.
    • A sinalização --subject é usada para transmitir o nome do assunto do certificado.
    • A flag --validity determina o período de validade da AC. O período de validade padrão é de 10 anos.
    • A flag --max-chain-length determina a profundidade máxima de ACs subordinadas permitidas em uma AC.
    • A flag --auto-enable cria a CA no estado ENABLED, e não no STAGED. Para mais informações sobre os estados da AC, consulte Estados da AC.

Como configurar controles de política para certificados de teste

As mudanças na política de emissão entram em vigor imediatamente. Recomendamos que você configure os controles da política de teste antes de usá-los na produção. Nesta seção, descrevemos como configurar os controles da política de teste.

Para os modelos DNS de teste e produção, é necessário usar os mesmos valores predefinidos para os certificados TLS do servidor. Crie um arquivo YAML leaf_server_tls_predefined_values.yaml e copie a seguinte configuração TLS do servidor de entidade final nele.

  keyUsage:
    baseKeyUsage:
      digitalSignature: true
      keyEncipherment: true
    extendedKeyUsage:
      serverAuth: true
  caOptions:
    isCa: false

Configurar controles de política para certificados DNS de teste

Esta seção descreve como definir controles de política para permitir que o usuário test-dns-requester solicite certificados TLS do servidor de entidade final para DNS no domínio *.test.example.com.

Criar um modelo de certificado DNS para certificados de teste

Esta seção descreve como criar um modelo de certificado que contenha a configuração TLS do servidor de entidade final. Este modelo de certificado restringe os certificados a usar apenas SANs DNS no domínio *.test.example.com. Essas restrições são implementadas usando uma expressão Common Expression Language (CEL). O modelo de certificado também descarta qualquer assunto especificado na solicitação de certificado.

  1. Use o comando gcloud a seguir para criar o modelo de certificado que contém as extensões TLS do servidor de entidade final, descartar qualquer subject especificado na solicitação de certificado e limitar as SANs permitidas.

    gcloud

    gcloud privateca templates create test-server-tls-template \
      --predefined-values-file  ./leaf_server_tls_predefined_values.yaml \
      --no-copy-subject \
      --copy-sans \
      --identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.test.example.com'))"
    

    Em que:

    • A sinalização --predefined-values-file é usada para transmitir um arquivo YAML que descreve qualquer valor X.509 predefinido definido pelo modelo de certificado.
    • A flag --no-copy-subject descarta todos os assuntos especificados pelo autor da chamada da solicitação de certificado.
    • A flag --copy sans garante que a extensão SAN da solicitação de certificado seja copiada no certificado assinado.
    • A sinalização --identity-cel-expression é usada para transmitir uma expressão CEL que é avaliada em relação à identidade no certificado antes da emissão. Para mais informações sobre como usar expressões CEL para implementar vários controles de políticas, consulte Como usar CEL.

    Para mais informações sobre como criar modelos de certificado, consulte Criar um modelo de certificado.

Criar vinculações do IAM para certificados de teste de DNS

Para permitir que o usuário test-dns-requester@ no pool de ACs do DNS solicite certificados TLS do servidor de teste, crie uma vinculação condicional do IAM no pool de ACs. Conceda o papel privateca.certificateRequester ao usuário test-dns-requester@ somente se a solicitação de certificado contiver uma referência ao modelo test-server-tls-template. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.

  1. Crie um arquivo YAML de política test_dns_condition.yaml e copie a seguinte configuração TLS para o arquivo.

    title: test DNS binding
    description: allows user to only create DNS test certificates
    expression: api.getAttribute("privateca.googleapis.com/template", "") == "PROJECT_ID/-/test-server-tls-template"
    

    O nome do modelo fornecido na condição do IAM precisa corresponder ao nome do modelo na solicitação de certificado. Portanto, se você fornecer um ID do projeto na privateca.googleapis.com/template da expressão CEL, será necessário também forneça um ID do projeto ao solicitar o certificado. Se você fornecer um na expressão CEL, é necessário fornecer um número de projeto na solicitação de certificado.

  2. Use o comando gcloud a seguir para adicionar controles de política que permitem que o test-dns-requester@ solicite apenas certificados TLS de teste de produção do pool de ACs.

    gcloud

    gcloud privateca pools add-iam-policy-binding POOL_NAME \
        --role='roles/privateca.certificateRequester' \
        --member='user:test-dns-requester@' \
        --condition-from-file=./test_dns_condition.yaml
    

    Em que:

    • A sinalização --role é usada para transmitir o nome do papel que será atribuído a um membro. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.
    • A flag --member é usada para transmitir o membro em que a vinculação será adicionada.
    • A sinalização condition-from-file é usada para transmitir o nome do arquivo com a condição CEL.
  3. Use o gcloud a seguir para adicionar controles de política que permitem que o test-dns-requester@ use o "test-server-tls-template" modelo de certificado.

    gcloud

    gcloud privateca templates add-iam-policy-binding test-server-tls-template \
        --role='roles/privateca.templateUser' \
        --member='user:test-dns-requester@'
    

    Em que:

    • A sinalização --role é usada para transmitir o nome do papel que será atribuído a um membro. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.
    • A flag --member é usada para transmitir o membro em que a vinculação será adicionada.

    Para mais informações sobre a configuração de políticas do IAM, consulte Configurar políticas do IAM.

Como configurar controles de política para certificados de produção

Depois de testar os controles de política, é possível usá-los no ambiente de produção.

Configurar controles de políticas para certificados DNS de produção

Esta seção descreve como definir controles de política para permitir que o usuário prod-dns-requester solicite certificados TLS de entidade final para o domínio DNS .prod.example.com.

Criar modelo de certificado para certificados DNS de produção

Use as instruções a seguir para criar um modelo de certificado que contenha a configuração de TLS do servidor de entidade final. Este modelo de certificado restringe os certificados a usar apenas SANs DNS no domínio *.prod.example.com. Essas restrições são implementadas usando uma expressão Common Expression Language (CEL). O modelo de certificado também descarta qualquer assunto especificado na solicitação de certificado.

Crie um modelo de certificado prod-server-tls-template usando o seguinte comando gcloud.

gcloud

  gcloud privateca templates create prod-server-tls-template \
    --predefined-values-file ./leaf_server_tls_predefined_values.yaml \
    --no-copy-subject \
    --copy-sans \
    --identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.prod.example.com'))"

Em que:

  • A sinalização --predefined-values-file é usada para transmitir um arquivo YAML que descreve qualquer valor X.509 predefinido definido pelo modelo de certificado.
  • A flag --no-copy-subject descarta todos os assuntos especificados pelo autor da chamada da solicitação de certificado.
  • A flag --copy sans garante que a extensão SAN da solicitação de certificado seja copiada no certificado assinado.
  • A sinalização --identity-cel-expression é usada para transmitir uma expressão CEL que é avaliada em relação à identidade no certificado antes da emissão. Para mais informações sobre expressões CEL, consulte Como usar expressões CEL.

Para mais informações sobre como criar modelos de certificado, consulte Criar um modelo de certificado.

Para mais informações sobre o comando gcloud privateca templates create, consulte gcloud privateca models create.

Criar vinculação de IAM do DNS de produção

Para permitir que o usuário prod-dns-requester@ no pool de ACs do DNS solicite certificados TLS do servidor de produção, crie uma vinculação condicional do IAM no pool de ACs. Conceda ao usuário prod-dns-requester@ o papel privateca.certificateRequester somente se a solicitação de certificado contiver uma referência ao modelo prod-server-tls-template. Para mais informações sobre papéis e permissões do IAM, consulte Controle de acesso com o IAM.

  1. Crie um arquivo YAML de política prod_dns_condition.yaml e copie a seguinte configuração TLS para o arquivo.

    title: Production DNS binding
    description: allows user to only create DNS production certificates
    expression: api.getAttribute("privateca.googleapis.com/template", "") == "PROJECT_ID/-/prod-server-tls-template"
    
  2. Use o comando gcloud a seguir para adicionar controles de política que permitem que o prod-dns-requester@ solicite apenas certificados TLS do servidor de produção do pool de ACs.

    gcloud

    gcloud privateca pools add-iam-policy-binding POOL_NAME \
        --role='roles/privateca.certificateRequester' \
        --member='user:prod-dns-requester@' \
        --condition-from-file=./prod_dns_condition.yaml
    

    Em que:

    • A sinalização --role é usada para transmitir o nome do papel que será atribuído a um membro. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.
    • A flag --member é usada para transmitir o membro em que a vinculação será adicionada.
    • A sinalização condition-from-file é usada para transmitir o nome do arquivo com a condição CEL.

    Para mais informações sobre o comando gcloud privateca pools add-iam-policy-binding, consulte gcloud privateca pools add-iam-policy-binding.

  3. Para adicionar controles de política que permitem que prod-dns-requester@ use o modelo "prod-server-tls-template" modelo de certificado, use o seguinte comando gcloud:

    gcloud

    gcloud privateca templates add-iam-policy-binding prod-server-tls-template \
        --role='roles/privateca.templateUser' \
        --member='user:prod-dns-requester@'
    

    Em que:

    • A sinalização --role é usada para transmitir o nome do papel que será atribuído a um membro. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.
    • A flag --member é usada para transmitir o membro em que a vinculação será adicionada.

Controles de política do usuário irrestrito

Para permitir que o usuário blank-check-requester@ solicite qualquer certificado sem limitações, crie uma vinculação do IAM sem condicionais e conceda ao usuário o papel privateca.certificateRequester.

gcloud

gcloud privateca pools add-iam-policy-binding POOL_NAME \
  --role='roles/privateca.certificateRequester' \
  --member='user:blank-check-requester@example.com'

Em que:

  • O valor da flag --role determina o papel atribuído ao usuário. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.
  • O valor da flag --member determina o usuário ao qual a função é atribuída.

Como testar os controles de política

Depois de implementar as políticas do IAM e de emissão de certificados, é importante analisar e testar essas políticas para garantir que funcionem conforme o esperado.

Recuperar todas as vinculações de política

Busque todas as políticas do IAM que estão implementadas no pool de ACs. Para recuperar todas as políticas do IAM para o pool de ACs, use o comando gcloud privateca pools get-iam-policy:

gcloud

gcloud privateca pools get-iam-policy POOL_NAME

Em que:

  • POOL_NAME é o identificador exclusivo do pool de ACs.

Para mais informações sobre o comando gcloud privateca pools get-iam-policy, consulte gcloud privateca pools get-iam-policy.

Como gerar certificados

Esta seção fornece informações sobre como gerar certificados de uso geral e certificados DNS de teste e produção.

Gerar certificados DNS de teste

Para permitir que o usuário test-dns-requester@ solicite certificados DNS de teste do pool de ACs, use o seguinte comando gcloud:

gcloud

gcloud privateca certificates create test-dns-1 \
    --project=PROJECT_ID \
    --issuer-location=LOCATION \
    --issuer-pool=POOL_NAME \
    --dns-san=foo.bar.test.example.com \
    --generate-key \
    --key-output-file=KEY_FILE_NAME \
    --cert-output-file=test_dns_cert.pem \
    --template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/test-server-tls-template

Em que:

  • A sinalização --issuer-location é usada para definir o local do certificado. Para ver a lista completa de locais, consulte Locais.
  • A flag --issuer-pool define o pool de ACs do qual o certificado é solicitado.
  • A sinalização --dns-san é usada para definir uma ou mais SANs DNS separadas por vírgulas.
  • A sinalização --generate-key aciona a geração de uma nova chave privada RSA-2048 na sua máquina.
  • A sinalização --key-output-file é usada para definir o caminho em que a chave privada gerada é gravada (no formato PEM).
  • A sinalização --cert-output-file é usada para definir o caminho em que o arquivo da cadeia de certificados codificado em PEM resultante é gravado (ordenado da entidade final para a raiz).
  • A sinalização --template é usada para definir o nome do modelo de certificado que você quer usar para emitir esse certificado. O modelo especificado precisa estar no mesmo local que o pool de AC emissoras. Para mais informações sobre modelos de certificado, consulte Visão geral dos modelos de certificado e das políticas de emissão.

Gerar certificados de produção

O usuário prod-dns-requester agora pode solicitar certificados DNS de produção do pool de ACs. O --dns-san=foo.bar.prod.example.com adiciona um SAN do tipo DNS com o valor especificado à solicitação de certificado.

gcloud

gcloud privateca certificates create prod-dns-1 \
    --project=PROJECT_ID \
    --issuer-location=LOCATION \
    --issuer-pool=POOL_NAME \
    --dns-san=foo.bar.prod.example.com \
    --generate-key \
    --key-output-file=KEY_FILE_NAME \
    --cert-output-file=prod_dns_cert.pem \
    --template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/prod-server-tls-template

Em que:

  • A sinalização --issuer-location é usada para definir o local do certificado. Para ver a lista completa de locais, consulte Locais.
  • A flag --issuer-pool define o pool de ACs do qual o certificado é solicitado.
  • A sinalização --dns-san é usada para definir uma ou mais SANs DNS separadas por vírgulas.
  • A sinalização --generate-key aciona a geração de uma nova chave privada RSA-2048 na sua máquina.
  • A sinalização --key-output-file é usada para definir o caminho em que a chave privada gerada é gravada (no formato PEM).
  • A sinalização --cert-output-file é usada para definir o caminho em que o arquivo da cadeia de certificados codificado em PEM resultante é gravado (ordenado da entidade final para a raiz).
  • A sinalização --template é usada para definir o nome do modelo de certificado a ser usado para emitir esse certificado. O modelo especificado precisa estar no mesmo local que o pool de AC emissoras. Para mais informações sobre modelos de certificado, consulte Visão geral dos modelos de certificado e das políticas de emissão.

Gerar certificados de uso geral

O usuário blank-check-requester@ pode solicitar qualquer certificado do pool de AC usando o comando gcloud privateca certificates create.

Para solicitar um certificado de um pool de ACs, use uma chave pública/privada criada pelo CA Service. Para mais informações sobre como solicitar certificados, consulte Solicitar um certificado e ver um certificado emitido.

Limpar

Nesta seção, explicamos como remover políticas do IAM em um pool de ACs.

Remover uma vinculação específica do IAM

Para remover as vinculações condicionais do IAM sobre o pool de ACs do usuário blank-check-requester, use o seguinte comando gcloud:

gcloud

gcloud privateca pools remove-iam-policy-binding POOL_NAME \
    --role='roles/privateca.certificateRequester' \
    --member='user:blank-check-requester@'

Em que:

  • O valor da flag --role determina o papel atribuído ao usuário. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.
  • O valor da flag --member determina o usuário ao qual a função é atribuída.

Ao remover uma vinculação específica do IAM, forneça todas as informações relacionadas a ela no comando gcloud privateca pools remove-iam-policy-binding. Um papel e um membro podem ter várias vinculações do IAM com condições diferentes. É importante fornecer todos os detalhes relacionados à vinculação do IAM para evitar a exclusão acidental de uma vinculação diferente.

Para mais informações sobre o comando gcloud privateca pools remove-iam-policy-binding, consulte gcloud privateca pools remove-iam-policy-binding.

Remover todas as vinculações condicionais do IAM

Para remover uma vinculação do IAM, use o comando gcloud privateca pools remove-iam-policy-binding. Ao remover uma vinculação condicional do IAM, forneça todas as informações sobre ela. Um usuário e um papel podem ter mais de uma vinculação condicional. Para remover todas as vinculações condicionais, use a sinalização --all no comando gcloud.

Use o seguinte comando gcloud para remover todas as vinculações do usuário prod-code-signing-requester.

gcloud

gcloud privateca pools remove-iam-policy-binding POOL_NAME \
    --role='roles/privateca.certificateRequester' \
    --member='user:prod-code-signing-requester@' \
    --all

Em que:

  • O valor da flag --role determina o papel atribuído ao usuário. Para mais informações sobre os papéis e as permissões do IAM para o serviço da AC, consulte Controle de acesso com o IAM.
  • O valor da flag --member determina o usuário ao qual a função é atribuída.