Git, GitHub e chave SSH: acesso sem senha e sem dor
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.nameeuser.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 addpara 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 resultadoNota 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.gitCriando 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 ..
doneNota 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. Qual arquivo você registra no GitHub?
2. O que faz o ssh-agent?
3. Qual credencial é mais adequada para um runner de CI que só precisa ler um repositório?
4. Você comitou um arquivo .env com senha e apagou no commit seguinte. O que fazer?
Minhas anotações
Salvo automaticamente neste navegador.