Como acessar o GitHub com um build com chaves SSH


Este tutorial demonstra como usar o Secret Manager com o Cloud Build para acessar repositórios privados 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    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, insira um nome para o secret.

    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 permissão para acessar o Secret Manager para o serviço que você está usando para a versão.

  1. Abra a página "Configurações" do Cloud Build:

    Abrir a página "Configurações do Cloud Build"

  2. Na lista suspensa, selecione a conta de serviço com os papéis que você quer atribuir mudar.

  3. Defina o status do papel Secret Manager Secret Accessor como Ativar.

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 os secrets.
  • SECRET_NAME: o nome do secret criado 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 .

A saída 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:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

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