Resolver problemas do Cloud Run com SSH

O SSH permite estabelecer uma conexão de shell interativa e segura com as instâncias de contêiner em execução. Isso dá acesso direto ao sistema de arquivos e ao ambiente de execução do contêiner, permitindo que você inspecione os recursos do sistema, verifique as configurações e solucione problemas.

O SSH para Cloud Run adiciona automaticamente os binários sshd necessários ao sistema de arquivos do contêiner. Esses binários só ficam acessíveis durante a sessão SSH e são removidos quando ela termina. As configurações SSH atuais, incluindo entradas /etc/passwd, são ignoradas pelo SSH do Cloud Run em favor das configurações gerenciadas pelo Google.

Os avisos de direitos autorais de código aberto de terceiros para dependências SSH gerenciadas pelo Google são montados no contêiner quando uma sessão SSH é estabelecida no seguinte caminho: /usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES.

Limitações

As seguintes limitações se aplicam ao SSH:

  • O SSH só está disponível para serviços executados no ambiente de segunda geração do Cloud Run e em instâncias do Cloud Run.
  • Ao usar o SSH, as chaves de host na imagem são substituídas. As chaves permanecem substituídas após o término da sessão SSH até que a instância do serviço seja reiniciada.
  • Windows: o PuTTY não é compatível. Use o cliente OpenSSH.
  • É necessário ter cuidado extra para proteger o contêiner ao usar o SSH. Considere as práticas recomendadas de segurança, como executar o código do aplicativo como um usuário não raiz.

Antes de começar

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Ative as APIs Cloud Run Admin, Cloud Resource Manager, Identity-Aware Proxy e Cloud OS Login:
      gcloud services enable run.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. Instale e inicialize a CLI gcloud.
  8. Atualize os componentes:
    gcloud components update
  9. Windows:verifique se o cliente OpenSSH está instalado.

    O cliente OpenSSH geralmente é instalado por padrão no Windows 10 e em versões mais recentes. Se ele não estiver instalado, execute o seguinte comando no PowerShell como administrador:

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

    Para mais informações, consulte Instalar o OpenSSH.

  10. Consulte a página de preços do Cloud Run. Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. O SSH cobra pelos bytes de saída da rede.
  11. Se o projeto usa o VPC Service Controls (VPC-SC), o processo de tunelamento verifica iaptunnel.googleapis.com como o nome do serviço, em vez de run.googleapis.com.

Funções exigidas

Para conseguir as permissões necessárias a fim de concluir estas etapas, peça ao administrador para conceder 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.

Se você não for membro da organização a que o projeto pertence, o Cloud Run bloqueará o acesso SSH. Para ter acesso SSH, adicione o papel roles/compute.osLoginExternalUser ou use um papel personalizado com a permissão compute.oslogin.updateExternalUser.

É possível conceder o papel de usuário de túnel protegido por IAP no nível do projeto para restringir esse papel a um serviço ou instância específica do Cloud Run. Para isso, execute o comando a seguir:

Para um serviço específico

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --service=SERVICE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

Substitua:

  • SERVICE: o nome do serviço.
  • REGION: a região em que o serviço está implantado.
  • MEMBER: a identidade a que o acesso será concedido.

Para uma instância específica

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --instance=INSTANCE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

Substitua:

  • INSTANCE: o nome da instância.
  • REGION: a região em que o serviço está implantado.
  • MEMBER: a identidade a que o acesso será concedido.

Para conceder o roles/iap.tunnelResourceAccessor no nível do projeto e da região, consulte Configurar políticas de acesso do IAP.

Usar SSH com serviços do Cloud Run

Configure o acesso SSH no nível do serviço e conecte-se a ele usando SSH.

Configurar o acesso SSH no nível do serviço

É possível permitir o acesso de inspeção em um serviço específico usando a CLI gcloud ou YAML:

gcloud

Para ativar o acesso em um serviço atual, use o seguinte comando:

gcloud beta run services update SERVICE --ssh

Também é possível permitir o acesso de inspeção a um serviço usando a flag --ssh ao implantar o serviço.

YAML

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço existente, faça o download da configuração YAML correspondente:

    gcloud run services describe SERVICE --format export > service.yaml
  2. O exemplo a seguir contém a configuração YAML:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    Substitua:

    • SERVICE: o nome do serviço do Cloud Run.
    • REGION: a região Google Cloud . Por exemplo, us-central1.
    • IMAGE_URL: uma referência à imagem do contêiner, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL segue o formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. Crie ou atualize o serviço usando o seguinte comando:

    gcloud run services replace service.yaml

    Por padrão, o comando gcloud run services replace usa o arquivo service.yaml, se ele estiver presente.

É possível desativar o acesso SSH por serviço usando a CLI gcloud ou YAML:

gcloud

Para desativar o acesso ao serviço, use o seguinte comando:

gcloud beta run services update SERVICE --no-ssh

YAML

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço existente, faça o download da configuração YAML correspondente:

    gcloud run services describe SERVICE --format export > service.yaml
  2. O exemplo a seguir contém a configuração YAML:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    Substitua:

    • SERVICE: o nome do serviço do Cloud Run.
    • REGION: a região Google Cloud . Por exemplo, us-central1.
    • IMAGE_URL: uma referência à imagem do contêiner, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL segue o formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. Crie ou atualize o serviço usando o seguinte comando:

    gcloud run services replace service.yaml

    Por padrão, o comando gcloud run services replace usa o arquivo service.yaml, se ele estiver presente.

Conectar-se ao serviço com SSH

Para se conectar a um serviço usando SSH, use a CLI gcloud:

Para se conectar a um serviço usando SSH, use o seguinte comando da Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID

Substitua:

  • SERVICE: o nome do serviço.
  • REGION: a região em que o serviço está implantado.
  • PROJECT_ID: o ID do projeto do Google Cloud .

    Se for preciso digitar uma senha longa para a chave SSH, deixe em branco. No entanto, se você inserir uma senha, use a mesma em todas as sessões SSH subsequentes do mesmo espaço de trabalho.

    Quando a sessão SSH for concluída, o Cloud Run vai mostrar a seguinte mensagem:

    Project: my-project
    Region: REGION
    Service: busybox
    Revision: busybox-REVISION
    Instance:
    INSTANCE-ID
    Container: busybox-1
    Image: IMAGE
    

    Para encerrar a sessão SSH, digite exit. Todas as mudanças feitas no contêiner serão mantidas enquanto ele estiver ativo. Sair da sessão não reinicia nem encerra o contêiner.

Especificar uma instância de serviço

Para se conectar a uma instância de serviço específica usando SSH, use a Google Cloud CLI.

Para se conectar a uma instância de serviço do Cloud Run usando SSH, use o seguinte comando da Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --instance=INSTANCE_ID

Substitua:

  • SERVICE: o nome do serviço.
  • REGION: a região em que o serviço está implantado.
  • PROJECT_ID: o ID do projeto do Google Cloud .
  • INSTANCE_ID: o ID da instância Para encontrar o ID da instância de serviço, acesse a página Registros na seção Observabilidade. O ID da instância está localizado no campo labels de uma entrada de registro. Não é possível encontrar o ID da instância se você encerrar a instância específica antes de se conectar a ela.

Especificar uma revisão

Para se conectar a uma revisão específica usando SSH, use a Google Cloud CLI.

Para se conectar a uma revisão de serviço do Cloud Run usando SSH, use o seguinte comando da Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --revision=REVISION

Substitua:

  • SERVICE: o nome do serviço.
  • REGION: a região em que o serviço está implantado.
  • PROJECT_ID: o ID do projeto do Google Cloud .
  • REVISION: o nome da revisão.

Usar SSH com instâncias do Cloud Run

Configure o acesso SSH no nível da instância e conecte-se a ela usando SSH.

Configurar o acesso SSH no nível da instância

O SSH é ativado por padrão para instâncias.

É possível desativar o acesso SSH por instância usando a CLI gcloud ou YAML:

gcloud

Para desativar o acesso na instância, use o seguinte comando:

gcloud beta run instances update INSTANCE --no-ssh

YAML

  1. Se você estiver criando uma nova instância, pule esta etapa. Se você estiver atualizando uma instância, baixe a configuração YAML correspondente:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. O exemplo a seguir contém a configuração YAML:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    Substitua:

    • INSTANCE: o nome da sua instância do Cloud Run.
    • REGION: a região Google Cloud . Por exemplo, us-central1.
    • IMAGE_URL: uma referência à imagem de contêiner, como us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Crie ou atualize a instância usando o seguinte comando:

    gcloud beta run instances replace instance.yaml

É possível permitir o acesso de inspeção em uma instância específica usando a CLI gcloud ou YAML.

gcloud

Para ativar o acesso em uma instância atual, use o seguinte comando:

gcloud beta run instances update INSTANCE --ssh

Também é possível permitir o acesso de inspeção em uma instância usando a flag --ssh ao fazer a implantação.

YAML

  1. Se você estiver criando uma nova instância, pule esta etapa. Se você estiver atualizando uma instância, baixe a configuração YAML correspondente:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. O exemplo a seguir contém a configuração YAML:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    Substitua:

    • INSTANCE: o nome da sua instância do Cloud Run.
    • REGION: a região Google Cloud . Por exemplo, us-central1.
    • IMAGE_URL: uma referência à imagem de contêiner, como us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Crie ou atualize a instância usando o seguinte comando:

    gcloud beta run instances replace instance.yaml

Conectar-se à instância usando SSH

Para se conectar a uma instância usando SSH, use o seguinte comando da Google Cloud CLI:

  gcloud beta run instances ssh INSTANCE --region=REGION --project=PROJECT_ID

Substitua:

  • INSTANCE: o nome da instância.
  • REGION: a região em que o serviço está implantado.
  • PROJECT_ID: o ID do projeto do Google Cloud .

Se for preciso digitar uma senha longa para a chave SSH, deixe em branco. No entanto, se você inserir uma senha, use a mesma em todas as sessões SSH subsequentes do mesmo espaço de trabalho.

Quando a sessão SSH for concluída, o Cloud Run vai mostrar a seguinte mensagem:

  Project: my-project
  Region: REGION
  Instance: INSTANCE
  Revision: REVISION
  Container: CONTAINER
  Image: IMAGE

Para encerrar a sessão SSH, digite exit.

Usar o cliente OpenSSH para se conectar

Para usar o cliente OpenSSH para se conectar:

  1. Execute o comando gcloud beta run services ssh no serviço de destino.
  2. Inicie o túnel SSH e gere o certificado.
  3. Adicione o seguinte à sua configuração de SSH:

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile /Users/USER/.ssh/google_compute_engine
        CertificateFile /Users/USER/.ssh/google_compute_engine_cert/PROJECT_ID_REGION_SERVICE-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 /Users/USER/google-cloud-sdk/lib/gcloud.py alpha run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE --region=REGION
    

    Substitua:

    • USER: o nome de usuário na sua máquina local.
    • PROJECT_ID: o ID do projeto do Google Cloud .
    • PROJECT_NUMBER: o número do projeto Google Cloud .
    • REGION: a região em que o serviço está implantado.
    • SERVICE: o nome do serviço.

    Se a CLI gcloud estiver instalada em outra pasta, talvez seja necessário atualizar o local na última linha.

  4. Execute este comando:

    ssh cloud-run-ssh
    

Seu certificado SSH expira após cinco minutos. Se você tentar estabelecer uma conexão SSH com seu serviço após cinco minutos, será necessário executar gcloud beta run services ssh novamente para gerar o certificado.

Registros de acesso SSH

Para capturar registros de auditoria do gerenciamento de chaves SSH, é necessário ativar os registros de auditoria da API Login do SO do Cloud. Consulte Ver registros de auditoria de login do SO. Para acessar os registros SSH dos recursos do Cloud Run, você precisa ter acesso aos Registros de auditoria do Cloud desse projeto.

O exemplo a seguir consulta todos os serviços do Cloud Run do último dia:

gcloud logging read '
  logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
  protoPayload.serviceName="oslogin.googleapis.com" AND
  protoPayload.request.instance:"run.googleapis.com"
' --project=PROJECT_ID \
  --freshness=1d \
  --format="table(timestamp, protoPayload.authenticationInfo.principalSubject:label=USER, protoPayload.request.instance:label=CLOUD_RUN_SERVICE)"

Proteger e controlar o acesso SSH

Você pode controlar quem pode usar o SSH e como ele é restrito no seu ambiente.

Desativar o acesso SSH com políticas da organização

Para definir uma política da organização que desative o SSH, use a restrição personalizada que impede a ativação do acesso de depuração SSH nos serviços do Cloud Run.

A seguir