[seguranca] feat(deploy): guard de autorização do deploy de produção v2 — fecha 4 bypasses [INFRA-68070] #81

Merged
tarcisio merged 2 commits from feat/INFRA-68070-guard-deploy-global-v2 into develop 2026-10-09 16:18:42 -03:00
Owner

[seguranca] INFRA-68070: guard de autorização do deploy de produção, versão canônica (v2)

Substitui o #80, que foi fechado sem merge porque a revisão de segurança achou formas de pular a autorização. O guard existe para que o token do bot não consiga disparar um deploy de produção sozinho.

Bypass Correção
F1 Push de tag v* passava sem conferência, e o bot conseguia criar a tag em qualquer commit e disparar o deploy A tag precisa ser o merge commit de um PR mergeado em main, com ato humano e dentro de 24 h. Sem token de API, falha fechado. Se o GITHUB_SHA divergir da tag, recusa
F2 AUTORIZO hotfix era aceito de qualquer humano não-autor, e o refs/pull/ abria isso para qualquer PR para main Allowlist DEPLOY_APROVADORES (padrão tarcisio) para os três atos: review, merged_by e comentário. Bot nunca conta
F3 O ref vinha do DISPATCH_REF, que o produto pode alimentar com input Decide só o GITHUB_REF. Se o DISPATCH_REF divergir, recusa. O main curto deixou de valer
F4 Review não oficial contava Só conta official is True

Também entram as 4 regras da v1: fuso de São Paulo valendo só hoje e ontem, strip, caractere de controle e :: recusados sem eco, (#N) e (!N) reconhecidos.

Limite documentado: a frase manual não é criptográfica, porque quem dispara o workflow pode escrevê-la. O bloqueio real vem com o runner de deploy com identidade própria (INFRA-68022/68023).

Prova:

  • pytest tests -q: 864 passed.
  • tests/deploy-guard: 82 passed.
  • Os 21 testes de bypass falham contra 9e029ef (v1) e passam agora.

Adoção nos produtos:

  • o job autorizacao precisa de FORGEJO_API + FORGEJO_TOKEN só de leitura, porque o push de tag agora consulta a API;
  • os testes locais que fixam DISPATCH_REF ou o push livre precisam ser ajustados.

🤖 Generated with Claude Code

https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn

## [seguranca] INFRA-68070: guard de autorização do deploy de produção, versão canônica (v2) Substitui o #80, que foi fechado sem merge porque a revisão de segurança achou formas de pular a autorização. O guard existe para que **o token do bot não consiga disparar um deploy de produção sozinho**. | | Bypass | Correção | |---|---|---| | F1 | Push de tag `v*` passava sem conferência, e o bot conseguia criar a tag em qualquer commit e disparar o deploy | A tag precisa ser o merge commit de um PR mergeado em `main`, com ato humano e dentro de 24 h. Sem token de API, falha fechado. Se o `GITHUB_SHA` divergir da tag, recusa | | F2 | `AUTORIZO hotfix` era aceito de qualquer humano não-autor, e o `refs/pull/` abria isso para qualquer PR para `main` | Allowlist `DEPLOY_APROVADORES` (padrão `tarcisio`) para os três atos: review, merged_by e comentário. Bot nunca conta | | F3 | O ref vinha do `DISPATCH_REF`, que o produto pode alimentar com input | Decide só o `GITHUB_REF`. Se o `DISPATCH_REF` divergir, recusa. O `main` curto deixou de valer | | F4 | Review não oficial contava | Só conta `official is True` | Também entram as 4 regras da v1: fuso de São Paulo valendo só hoje e ontem, strip, caractere de controle e `::` recusados sem eco, `(#N)` e `(!N)` reconhecidos. **Limite documentado:** a frase manual não é criptográfica, porque quem dispara o workflow pode escrevê-la. O bloqueio real vem com o runner de deploy com identidade própria (INFRA-68022/68023). **Prova:** - `pytest tests -q`: 864 passed. - `tests/deploy-guard`: 82 passed. - Os 21 testes de bypass falham contra 9e029ef (v1) e passam agora. **Adoção nos produtos:** - o job `autorizacao` precisa de `FORGEJO_API` + `FORGEJO_TOKEN` só de leitura, porque o push de tag agora consulta a API; - os testes locais que fixam `DISPATCH_REF` ou o push livre precisam ser ajustados. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
feat(ci): guard global de autorização do deploy de produção [INFRA-68070]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m55s
9e029ef4af
scripts/ci/conferir_autorizacao_deploy.py vira canônico no ci-shared (origem: Hub
PR #3321 + DANI ffa630037b), mesma interface (conferir, descobrir-pr). Regras novas:
- data da frase no fuso America/Sao_Paulo; vale só hoje e ontem (amanhã reprova);
- strip() nas pontas continua aceito;
- quebra de linha, caractere de controle ou '::' na frase/tag reprova antes de
  qualquer eco; a frase só vai ao log depois de validada, numa linha;
- push só passa sem frase se o ref for refs/tags/v*;
- RE_PR casa (#N) e (!N).

tests/deploy-guard: 61 testes (unittest), incluindo os 6 xfail estritos do DANI
como regra decidida, com controle negativo contra o script antigo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
fix(ci): guard de deploy fecha 4 bypasses da revisão de segurança [INFRA-68070]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m46s
c3daf160f7
- F1: push de tag refs/tags/v* deixa de ser passe livre: a tag (e o GITHUB_SHA)
  tem de ser o merge commit de PR mergeado em main, com o mesmo ato humano do
  release-aprovado; sem PR, sem ato ou sem token: Recusa.
- F2: ato humano só de DEPLOY_APROVADORES (padrão tarcisio, minúsculas) para
  review, merged_by e AUTORIZO hotfix; bot nunca conta.
- F3: ref decisório só do GITHUB_REF; DISPATCH_REF só se idêntico; dispatch
  só de refs/heads/main.
- F4: review só conta com official: true (ausente não conta).

Cada bypass tem teste que falha no 9e029ef (21 falhas) e passa aqui.
Guia de adoção documenta DEPLOY_APROVADORES e o limite da frase manual
(não criptográfica; bloqueio real na INFRA-68022/68023).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
tarcisio merged commit 46a6069d8c into develop 2026-10-09 16:18:42 -03:00
tarcisio deleted branch feat/INFRA-68070-guard-deploy-global-v2 2026-10-09 16:18:42 -03:00
Sign in to join this conversation.
No reviewers
No labels
seguranca
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
TMF/ci-shared!81
No description provided.