0 XP
Módulo 0 · Boas-vindas e Ambiente

Git, GitHub e chave SSH: acesso sem senha e sem dor

Iniciante 40 min+25 XPGitGitHubSSH

Objetivos desta aula

  • Entender como funciona a criptografia de chave pública no acesso ao repositório
  • Gerar e registrar uma chave ed25519
  • Configurar identidade e comportamento padrão do Git
  • Criar os três repositórios do projeto e fazer o primeiro push
  • Escolher entre chave de deploy, token e GitHub App em automações

1. Por que não usar senha

Autenticar por HTTPS colando token a cada push é atrito e risco: o token costuma parar em arquivo, em histórico de shell ou em print de tela. Com chave SSH, a parte secreta nunca sai da sua máquina e o acesso pode ser revogado em um clique no provedor.

2. Como funciona um par de chaves

Você gera duas chaves ligadas matematicamente: a privada (id_ed25519) fica na sua máquina; a pública (id_ed25519.pub) é cadastrada no GitHub. Na conexão, o servidor envia um desafio, sua máquina responde assinando com a chave privada e o servidor valida com a pública. A chave privada nunca é transmitida.

Use o algoritmo ed25519: chaves curtas, rápidas e recomendadas hoje. Proteja com passphrase — se o notebook for roubado, a chave sozinha não serve.

3. ssh-agent: digitar a passphrase uma vez só

O ssh-agent é um processo que mantém sua chave destravada em memória durante a sessão. Sem ele, cada operação pede a passphrase. O erro permission denied (publickey) em 90% dos casos significa: a chave não está no agente, ou a chave pública certa não está cadastrada.

4. known_hosts e confiança no servidor

Na primeira conexão, o SSH pergunta se você confia na impressão digital do servidor e salva a resposta em ~/.ssh/known_hosts. Isso protege contra alguém se passar pelo GitHub na sua rede. Se a impressão mudar sem motivo, pare e investigue em vez de apagar o arquivo.

5. Configurações de Git que evitam confusão

  • user.name e user.email: aparecem em todo commit e são usados na revisão.
  • init.defaultBranch main: nome padrão do branch inicial.
  • pull.rebase true: traz mudanças remotas sem criar commits de merge desnecessários.
  • push.default current: envia apenas o branch atual, evitando push acidental em outros.

6. O vocabulário mínimo do Git

  • Working directory: seus arquivos como estão agora.
  • Staging (index): o que você selecionou com git add para o próximo commit.
  • Commit: uma fotografia imutável com autor, data e mensagem.
  • Branch: um ponteiro para um commit; serve para trabalhar em paralelo.
  • Remote: o repositório no servidor (origin).
  • Pull request: proposta de mudança revisada antes de entrar em main.

7. O fluxo diário, em cinco comandos

git switch -c feat/preco → edita → git add -p (revisa trecho a trecho) → git commit -m "feat: exibe preço com desconto" → git push -u origin feat/preco → abre pull request. Mensagens no padrão Conventional Commits (feat:, fix:, chore:) permitem gerar versão e changelog automaticamente mais tarde.

8. Três repositórios, três responsabilidades

O CloudShop usa repositórios separados de propósito:

  • cloudshop-app — código da aplicação e seus testes.
  • cloudshop-infra — infraestrutura como código (Terraform).
  • cloudshop-gitops — manifests que descrevem o que roda no cluster.

Separar não é preciosismo: permite exigir revisão mais rígida na infraestrutura do que na aplicação e reduz o estrago de um acesso comprometido.

9. .gitignore e o que nunca deve entrar no repositório

Antes do primeiro commit, crie o .gitignore: dependências (node_modules), artefatos de build (dist), arquivos de ambiente (.env) e estado do Terraform local. Segredo comitado é incidente: mesmo apagado depois, continua no histórico e precisa ser rotacionado.

10. Automação: chave de deploy, token ou GitHub App

  • Deploy key: chave SSH ligada a um repositório, ideal para leitura em servidor ou runner.
  • Personal Access Token (PAT): vinculado a uma pessoa; simples, mas carrega as permissões dela e expira mal gerenciado.
  • GitHub App: identidade própria, permissões finas e token de curta duração — o padrão em empresa.

11. Diagnóstico quando o acesso falha

Sequência que resolve quase tudo: ssh -T git@github.com para testar identidade; ssh -vT git@github.com para ver qual chave foi oferecida; ssh-add -l para conferir o que está no agente; git remote -v para verificar se o remote é SSH e não HTTPS.

12. Checagem final da aula

Ao final você deve ter: chave cadastrada, ssh -T respondendo com seu usuário, os três repositórios criados com README e .gitignore, e um commit enviado em cada um.

Na prática

Chave SSH e configuração do Git

bash

ssh-keygen -t ed25519 -C "voce@exemplo.com" -f ~/.ssh/id_ed25519
# Enter passphrase: (defina uma) -> gera id_ed25519 (privada) e id_ed25519.pub (publica)

eval "$(ssh-agent -s)"        # Agent pid 3120
ssh-add ~/.ssh/id_ed25519     # Identity added
cat ~/.ssh/id_ed25519.pub     # cole em GitHub > Settings > SSH keys

ssh -T git@github.com         # Hi seu-usuario! You've successfully authenticated...

git config --global user.name "Seu Nome"
git config --global user.email "voce@exemplo.com"
git config --global init.defaultBranch main
git config --global pull.rebase true
git config --global push.default current
git config --global --list | head -10   # confere o resultado

Nota de segurança: id_ed25519 (sem .pub) é a chave privada: nunca compartilhe, nunca comite, sempre proteja com passphrase.

Diagnóstico de 'permission denied (publickey)'

bash

ssh-add -l                    # lista chaves no agente; "The agent has no identities" = problema
ssh-add ~/.ssh/id_ed25519     # adiciona novamente
ssh -vT git@github.com 2>&1 | grep -i "offering\|Authenticated"
# debug1: Offering public key: ~/.ssh/id_ed25519 ED25519
# debug1: Authenticated to github.com

git remote -v                 # origin git@github.com:usuario/repo.git (fetch)  <- SSH, correto
# Se aparecer https://github.com/... troque o remote:
git remote set-url origin git@github.com:usuario/cloudshop-app.git

Criando os três repositórios e o primeiro commit

bash

cd ~/projetos
for repo in cloudshop-app cloudshop-infra cloudshop-gitops; do
  mkdir -p "$repo" && cd "$repo"
  git init -b main
  printf '# %s\n\nParte do projeto CloudShop.\n' "$repo" > README.md
  printf 'node_modules/\ndist/\n.env\n*.tfstate*\n.terraform/\n' > .gitignore
  git add . && git commit -m "chore: estrutura inicial do repositorio"
  git remote add origin "git@github.com:SEU_USUARIO/$repo.git"
  git push -u origin main      # Branch 'main' set up to track 'origin/main'
  cd ..
done

Nota de segurança: O .gitignore com .env e *.tfstate entra no primeiro commit de propósito: evita vazar credencial e estado de infraestrutura.

~/.ssh/config: múltiplas contas e chaves

bash

cat >> ~/.ssh/config <<'EOF'
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes        # oferece somente esta chave (evita bloqueio por tentativas)
EOF
chmod 600 ~/.ssh/config     # permissao aberta faz o cliente recusar o arquivo
ssh -T git@github.com       # Hi seu-usuario!

Por que isso importa

Todo fluxo de CI/CD começa em um repositório. Acesso mal configurado bloqueia deploy e vira incidente de entrega.

Erro comum

Colar a chave privada em vez da pública no GitHub. Se isso acontecer, gere um novo par e revogue o antigo.

Dica de produção

Em servidores e runners, use chaves de deploy com permissão de leitura apenas para o repositório necessário.

Alerta de segurança

Ative 2FA na sua conta GitHub. Conta comprometida em repositório de infra é acesso à produção.

Pergunta de entrevista

Qual a diferença entre chave de deploy, PAT e GitHub App para autenticação em automações?

Glossário

ed25519
Algoritmo de chave pública moderno, com chaves curtas e alta segurança.
ssh-agent
Processo que mantém a chave privada destravada em memória durante a sessão.
known_hosts
Arquivo que guarda a impressão digital dos servidores já aceitos, protegendo contra impostores.
staging area
Área intermediária do Git onde você seleciona o que entrará no próximo commit.
remote
Referência ao repositório hospedado no servidor, normalmente chamada origin.
pull request
Proposta de mudança aberta para revisão antes de ser integrada ao branch principal.
deploy key
Chave SSH com acesso restrito a um único repositório, usada por máquinas e automações.
Conventional Commits
Padrão de mensagem (feat, fix, chore) que permite gerar versão e changelog automaticamente.

Conexão com o CloudShop

Criar cloudshop-app, cloudshop-infra e cloudshop-gitops com README inicial.

Quiz da aula

  1. 1. Qual arquivo você registra no GitHub?

  2. 2. O que faz o ssh-agent?

  3. 3. Qual credencial é mais adequada para um runner de CI que só precisa ler um repositório?

  4. 4. Você comitou um arquivo .env com senha e apagou no commit seguinte. O que fazer?

Minhas anotações

Salvo automaticamente neste navegador.

AnteriorPróxima