Usar SSH para o Cloud Run

Nesta página, descrevemos como usar o SSH para se conectar aos serviços do Cloud Run por encaminhamento de TCP do Identity-Aware Proxy (IAP).

Ao proteger suas conexões SSH com o IAP, você pode depurar instâncias de contêiner individuais em um ambiente seguro.

Antes de começar

  1. Verifique se o serviço do Cloud Run está sendo executado em um ambiente de execução de segunda geração e inclui as ferramentas de depuração necessárias para executar comandos depois de conectado. Para mais informações, consulte ambientes de execução.
  2. Para garantir que você está usando a versão mais recente da Google Cloud CLI, execute o seguinte comando:

    gcloud components update
    
  3. Ative as APIs Cloud Run, Cloud Resource Manager, Cloud OS Login e Identity-Aware Proxy no projeto.

    Para ativar as APIs, execute o seguinte comando:

    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        oslogin.googleapis.com \
        iap.googleapis.com \
        run.googleapis.com
    

Funções exigidas

Para receber as permissões necessárias para configurar políticas e se conectar a cargas de trabalho, peça ao administrador que conceda a você os seguintes papéis do IAM:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.

Limitações

O SSH para Cloud Run tem as seguintes limitações:

  • Somente serviços e instâncias do Cloud Run são compatíveis.
  • Para serviços, apenas o ambiente de execução de segunda geração é compatível.
  • Os jobs do Cloud Run não são compatíveis.
  • Os pools de workers não são compatíveis.
  • Ao usar o SSH, as chaves de host na imagem são substituídas. As chaves permanecem substituídas após o fim da sessão SSH até que o serviço seja reiniciado.
  • Windows: o PuTTY não é compatível. Use o cliente OpenSSH.

Configurar políticas de autorização do IAP

É possível gerenciar o acesso aos recursos do Cloud Run no nível do projeto, da região ou do serviço usando a CLI gcloud ou a API REST do IAP.

É possível configurar políticas para os seguintes identificadores da API Cloud Identity:

  • Cloud Identity: por exemplo, user:EMAIL@example.com
  • Federação de identidade da força de trabalho: por exemplo: principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

Para mais informações e exemplos de tipos de principais, consulte a lista de identificadores de principais.

Atualizar um serviço do Cloud Run

Para atualizar o serviço e ativar o SSH, execute o seguinte comando:

gcloud beta run services update \
    SERVICE_NAME \
    --ssh

Substitua SERVICE_NAME pelo nome do serviço do Cloud Run. É possível implantar um serviço do Cloud Run adicionando --ssh a gcloud beta run deploy.

Conceder acesso a todos os recursos do Cloud Run em um projeto

Para gerenciar o acesso a todos os recursos em um projeto, aplique a vinculação de política do IAM no nível do projeto.

gcloud

Execute este comando:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run

Substitua USER pelo identificador principal do usuário, por exemplo, user:user@example.com ou o principal da Federação de identidade de colaboradores.

API REST

Envie uma solicitação POST para o endpoint da política do projeto:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun:setIamPolicy"

Substitua:

  • USER: o identificador principal do usuário.
  • PROJECT_NUMBER: o número do projeto Google Cloud em que os recursos estão hospedados.

Conceder acesso a todos os recursos do Cloud Run em um local específico

Para restringir o acesso a todos os recursos em uma região específica (por exemplo, us-central1), aplique a vinculação de política no nível do local.

gcloud

Execute este comando:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --region=LOCATION

Substitua:

  • USER: o identificador principal do usuário.
  • LOCATION: a região Google Cloud em que os recursos são implantados (por exemplo, us-central1).

API REST

Envie uma solicitação POST para o endpoint da política de local:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
LOCATION:setIamPolicy"

Substitua:

  • USER: o identificador principal do usuário
  • PROJECT_NUMBER: o número do projeto Google Cloud
  • LOCATION: a Google Cloud região

Conceder acesso a um serviço específico do Cloud Run

Para restringir o acesso a um único serviço nomeado no seu projeto, aplique a vinculação de política no nível do serviço.

gcloud

Execute este comando:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --service=SERVICE_NAME \
    --region=LOCATION

Substitua:

  • USER: o identificador principal do usuário
  • SERVICE_NAME: o nome da lógica de serviço a ser conectada
  • LOCATION: a Google Cloud região em que o serviço é implantado

API REST

Envie uma solicitação POST para o endpoint da política de serviço:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
    PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
    LOCATION/services/\
    SERVICE_NAME:setIamPolicy"

Substitua:

  • USER: o identificador principal do usuário
  • PROJECT_NUMBER: o número do projeto Google Cloud
  • LOCATION: a Google Cloud região
  • SERVICE_NAME: o nome do serviço

Conectar usando SSH

Para estabelecer um túnel SSH com um recurso do Cloud Run, use a CLI gcloud.

Conectar-se a um serviço

Execute este comando:

gcloud beta run services ssh SERVICE_NAME \
    --region=LOCATION \
    --project=PROJECT_ID

Substitua:

  • SERVICE_NAME: o nome do serviço a ser conectado
  • LOCATION: a Google Cloud região em que o serviço está localizado.
  • PROJECT_ID: o ID do seu projeto Google Cloud

Sair da sessão

Para encerrar a sessão SSH, digite exit.

As modificações feitas no contêiner persistem apenas enquanto ele estiver ativo. Sair da sessão não interrompe nem reinicia o contêiner automaticamente.

Usar um cliente OpenSSH local

Para usar um cliente OpenSSH local para conexões:

  1. Para iniciar o túnel SSH e gerar o certificado necessário, execute o seguinte comando:

    gcloud beta run services ssh SERVICE_NAME \
        --region=LOCATION \
        --project=PROJECT_ID
    

    Substitua:

    • SERVICE_NAME: o nome do serviço
    • LOCATION: a Google Cloud região
    • PROJECT_ID: o ID do projeto do Google Cloud
  2. Adicione o seguinte código de configuração ao arquivo ~/.ssh/config local:

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile ~/.ssh/google_compute_engine
        CertificateFile ~/.ssh/google_compute_engine_cert/PROJECT_ID_LOCATION_SERVICE_NAME-cert.pub
        CheckHostIP no
        HashKnownHosts no
        HostKeyAlias cloud-run-default
        IdentitiesOnly yes
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
        ProxyUseFdpass no
        ProxyCommand /usr/local/bin/python3 -S ~/google-cloud-sdk/lib/gcloud.py beta run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE_NAME --region=LOCATION
    

    Se o caminho de instalação do gcloud for diferente, atualize o prefixo no caminho do ProxyCommand.

    Substitua:

    • PROJECT_ID: o ID do projeto do Google Cloud
    • LOCATION: a Google Cloud região
    • SERVICE_NAME: o nome do serviço
    • PROJECT_NUMBER: o número do projeto do Google Cloud
  3. Conecte-se ao serviço usando OpenSSH:

    ssh cloud-run-ssh