Skip to content

# Secrets, permisos y seguridad

Los workflows tienen acceso al codigo, secretos y API de GitHub. Configurar permissions minimas y proteger secrets es obligatorio en repositorios serios.

Secrets

Repository secrets

Settings -> Secrets and variables -> Actions.

yaml
- run: npm publish
  env:
    NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

Nunca:

yaml
- run: echo ${{ secrets.API_KEY }}  # puede filtrarse en logs

GitHub enmascara valores conocidos, pero evita imprimir secrets.

Environment secrets

Secretos por entorno (staging, production) con reglas de aprobacion:

yaml
jobs:
  deploy-prod:
    environment: production
    steps:
      - run: ./deploy.sh
        env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}

Organization secrets

Compartidos entre repos con politicas de acceso.

permissions en el workflow

Por defecto GitHub ajusto permisos conservadores. Declara explicitamente:

yaml
permissions:
  contents: read

Deploy que escribe en gh-pages:

yaml
permissions:
  contents: write

Workflow de validacion de este repo:

yaml
permissions:
  contents: read

Permisos comunes

PermisoUso
contents: readCheckout, leer codigo
contents: writeCommits, tags, pages
packages: writeGHCR npm/docker
pull-requests: writeComentar en PR
id-token: writeOIDC a cloud (AWS, Azure)
yaml
permissions:
  contents: read
  pull-requests: read

OIDC sin secrets de larga duracion

yaml
permissions:
  id-token: write
  contents: read

steps:
  - uses: aws-actions/configure-aws-credentials@v4
    with:
      role-to-assume: arn:aws:iam::123456789:role/github-deploy
      aws-region: eu-west-1

GitHub emite token JWT; AWS confia en el. Mejor que access keys estaticas.

Seguridad en pull requests de forks

Los workflows de PR desde forks no reciben secrets del repo base por defecto.

Cuidado con:

  • pull_request_target — corre en contexto base con secrets; riesgo si ejecutas codigo del PR sin aislar.
  • Workflows que hacen checkout del head del PR y ejecutan scripts arbitrarios.

Patron seguro: solo validar codigo sin secrets o usar pull_request estandar.

GITHUB_TOKEN

Token automatico por job:

yaml
- run: gh pr comment 123 --body "CI OK"
  env:
    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Limitado por permissions del workflow.

Branch protection

Complementa Actions:

  • Require status checks antes de merge.
  • Require review.
  • Restrict who can push to main.
  • Require signed commits (opcional).

Auditar actions

  • Preferir actions/* y acciones conocidas.
  • Pin SHA para supply chain security.
  • Habilitar Dependabot para actions.

Buenas practicas

  • Principio de minimo privilegio en permissions.
  • Secrets por entorno, no un mega-secret global.
  • Rotacion periodica de tokens.
  • No pasar secrets a logs ni artefactos.
  • OIDC para cloud en lugar de keys en GitHub.
  • Revisar workflows en PRs como codigo de produccion.

Errores habituales

  • permissions: write-all o omitir permissions en repos antiguos.
  • Secrets en variables de entorno de repositorio publico en forks.
  • pull_request_target ejecutando npm install del contribuidor sin sandbox.
  • Compartir un deploy key entre staging y prod.
  • Tokens personales en secrets en vez de fine-grained o OIDC.

Siguiente paso

El capitulo 6 optimiza pipelines con matrices de versiones y cache de dependencias.