Como acessar o GitHub com um build com chaves SSH


Neste tutorial, mostramos como usar o Secret Manager com o Cloud Build para acessar repositórios particulares do GitHub em um build. O Secret Manager é um serviço do Google Cloud que armazena com segurança chaves de API, senhas e outros dados sensíveis.

Objetivos

  • Configurar uma chave SSH do GitHub.
  • Adicione a chave SSH pública às chaves de implantação de um repositório privado.
  • Armazene a chave SSH privada no gerenciador de secrets.
  • Envie uma versão que acesse a chave do gerenciador de secrets e a use para acessar o repositório particular.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

  • Secret Manager
  • Cloud Build

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de 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. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Cloud Build and Secret Manager.

    Ative as APIs

  5. Instale a CLI do Google Cloud.
  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  8. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  9. Ative as APIs Cloud Build and Secret Manager.

    Ative as APIs

  10. Instale a CLI do Google Cloud.
  11. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  12. Opcional. Conclua o guia de início rápido do "Gerenciador de secrets" para se familiarizar com este produto.

Criar uma chave SSH

  1. Abra uma janela de terminal.

  2. Crie um novo diretório chamado workingdir e navegue até ele:

    mkdir workingdir
    cd workingdir
    
  3. Crie uma nova chave SSH do GitHub, em que github-email é seu endereço de e-mail do GitHub:

    ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
    

    Esse comando cria uma nova chave SSH workingdir/id_github sem uma senha longa para sua chave SSH. O Cloud Build não pode usar sua chave SSH se ela estiver protegida com uma senha longa.

Armazenar a chave SSH privada no gerenciador de secrets

Quando você cria uma chave SSH, um arquivo id_github é criado no ambiente. Como qualquer pessoa pode se autenticar na sua conta com esse arquivo, é necessário armazená-lo no gerenciador de secrets antes de usá-lo em uma versão.

  1. Para armazenar sua chave SSH no gerenciador de secrets:

    1. Acesse a página do Secret Manager no console do Google Cloud:

      Acessar a página "Gerenciador de secrets"

    2. Na página Gerenciador de secrets, clique em Criar secret.

    3. Na página Criar secret, em Nome, digite secret-name.

    4. No campo Valor do secret, clique em Fazer upload e faça upload do arquivo workingdir/id_github.

    5. Deixe a seção Regiões inalterada.

    6. Clique no botão Criar secret.

Isso fará o upload do arquivo id_github para o gerenciador de secrets.

Adicionar a chave SSH pública às chaves de implantação do repositório privado

  1. Faça login no GitHub.

  2. No canto superior direito, clique na sua foto do perfil e em Seu perfil.

  3. Na página do perfil, clique em Repositórios e, em seguida, clique no nome do repositório.

  4. No seu repositório, clique em Configurações.

  5. Na barra lateral, clique em Implantar chaves e em Adicionar chave de implantação.

  6. Forneça um título e cole sua chave SSH pública de workingdir/id_github.pub.

  7. Selecione Permitir acesso de gravação se você quiser que essa chave tenha acesso de gravação ao repositório. Uma chave de implantação com acesso de gravação permite que uma implantação seja enviada ao repositório.

  8. Clique em Adicionar chave.

  9. Exclua a chave SSH do disco:

    rm id_github*
    

Conceder permissões

Você precisa conceder à conta de serviço do Cloud Build a permissão para acessar o gerenciador de secrets durante a versão.

  1. Abra a página do IAM no console do Google Cloud:

    Abra a página do IAM

  2. Selecione o projeto e clique em Abrir.

  3. Na tabela de permissões, localize o e-mail que termina com @cloudbuild.gserviceaccount.com e clique no ícone de lápis.

  4. Adicione o papel Secret Manager Secret Accessor

  5. Clique em Save.

Adicionar a chave SSH pública aos hosts conhecidos

A maioria das máquinas contém um arquivo chamado known_hosts, que contém chaves conhecidas para hosts remotos. As chaves geralmente são coletadas dos hosts remotos ao se conectarem a elas pela primeira vez, mas também podem ser adicionadas manualmente. As chaves neste arquivo são usadas para verificar a identidade do host remoto e proteger contra a falsificação de identidade.

Para que o Cloud Build se conecte ao GitHub, você precisa adicionar a chave SSH pública ao arquivo known_hosts no ambiente de compilação do Cloud Build. Para isso, adicione a chave a um arquivo known_hosts.github temporário e copie o conteúdo de known_hosts.github para o arquivo known_hosts no ambiente de compilação do Cloud Build.

No diretório workingdir, crie um arquivo chamado known_hosts.github e adicione a chave SSH pública a esse arquivo:

ssh-keyscan -t rsa github.com > known_hosts.github

Na próxima seção, ao configurar o build, você adicionará instruções no arquivo de configuração do Cloud Build para copiar o conteúdo de known_hosts.github para o arquivo known_hosts no ambiente de criação do Cloud Build.

Configure a compilação

Para configurar a versão:

  1. Crie um arquivo de configuração do build chamado cloudbuild.yaml em duas etapas: a primeira etapa gcloud acessa a chave SSH no Secret Manager e a salva como id_rsa em um volume chamado ssh, junto com uma cópia do known_hosts.github. O volume é usado para manter os arquivos nas etapas da criação. A segunda etapa git usa a chave em id_rsa para se conectar ao repositório em git@github.com:git-username/git-repository.

    # Access the id_github file from Secret Manager, and setup SSH
    steps:
    - name: 'gcr.io/cloud-builders/git'
      secretEnv: ['SSH_KEY']
      entrypoint: 'bash'
      args:
      - -c
      - |
        echo "$$SSH_KEY" >> /root/.ssh/id_rsa
        chmod 400 /root/.ssh/id_rsa
        cp known_hosts.github /root/.ssh/known_hosts
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Clone the repository
    - name: 'gcr.io/cloud-builders/git'
      args:
      - clone
      - --recurse-submodules
      - git@github.com:GIT_USERNAME/GIT_REPOSITORY
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest
        env: 'SSH_KEY'
    

Substitua os valores dos marcadores nos comandos acima pelo seguinte:

  • GIT_USERNAME: é o nome de usuário do GitHub do proprietário do repositório.
  • GIT_REPOSITORY: o nome do repositório do GitHub que você quer acessar.
  • PROJECT_ID: o ID do projeto do Google Cloud em que você armazenou as chaves secretas.
  • SECRET_NAME: o nome do secret que você criou no Secret Manager.

Para saber mais sobre strings de multilinhas YAML usadas no snippet acima, consulte Multilinhas YAML.

Enviar a versão

Para enviar o build, execute o seguinte comando:

gcloud builds submit --config=cloudbuild.yaml .

O resultado será assim:

Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"

FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][  3.9 KiB/  3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                              IMAGES  STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487  XXXX-XX-XXT17:57:21+00:00  13S       gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz  -                                 SUCCESS

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Exclua o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

Para excluir o projeto, faça o seguinte:

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Como excluir a chave de implantação do repositório

  1. No GitHub, acesse a página principal do repositório.

  2. No nome do repositório, clique em Settings.

  3. Na barra lateral esquerda, clique em Implantar chaves.

  4. Na página Implantar chaves, procure as chaves de implantação associadas ao seu repositório e clique em Excluir.

A seguir