Tags, Scopes y Seguridad

Por: Artiko
gitlabrunnerstagsseguridad

Tags, Scopes y Seguridad

Tags

Los tags son etiquetas que asignas a un runner para controlar que jobs puede ejecutar.

Asignar tags al runner

Durante el registro:

sudo gitlab-runner register \
  --tag-list "docker,linux,node"

O en config.toml (no recomendado, mejor desde la UI):

Settings > CI/CD > Runners > Edit > Tags

Usar tags en .gitlab-ci.yml

test:
  tags:
    - docker
    - linux
  script:
    - npm test

deploy:
  tags:
    - deploy
    - production
  script:
    - ./deploy.sh

Run untagged jobs

Por defecto, un runner con tags no ejecuta jobs sin tags. Para permitirlo:

Scopes (Alcance)

ScopeConfigurado enDisponible para
InstanceAdmin AreaTodos los proyectos
GroupGroup > CI/CDProyectos del grupo
ProjectProject > CI/CDSolo ese proyecto

Recomendacion de scopes

Protected Runners

Un runner protegido solo ejecuta jobs en ramas o tags protegidos.

Para que sirve

Evita que cualquier desarrollador ejecute jobs en el runner de produccion creando una rama con un .gitlab-ci.yml modificado.

Configurar

Settings > CI/CD > Runners > Edit > Protected = Yes

Flujo de proteccion

Branch feature/x (no protegida) → Runner protegido → RECHAZADO
Branch main (protegida)         → Runner protegido → EJECUTADO
Tag v1.0.0 (protegido)         → Runner protegido → EJECUTADO

Seguridad

Variables protegidas y enmascaradas

deploy:
  tags:
    - production
  variables:
    DB_PASSWORD: $DB_PASSWORD  # Variable protegida en Settings > CI/CD
  script:
    - echo "Deploying..."

En Settings > CI/CD > Variables:

Limitar imagenes permitidas

En config.toml:

[runners.docker]
  allowed_images = ["node:20-*", "python:3.12-*", "alpine:3.*"]
  allowed_services = ["postgres:16-*", "redis:7-*"]

Esto previene que un .gitlab-ci.yml malicioso use imagenes no autorizadas.

No uses privileged mode sin necesidad

[runners.docker]
  privileged = false  # SIEMPRE false a menos que necesites DinD

privileged = true da acceso root al host. Si necesitas construir imagenes Docker, considera kaniko o buildah como alternativas sin privilegios.

Aislar runners de produccion

  1. Runner dedicado con tag production y Protected = Yes
  2. Solo rama main como protegida
  3. Variables sensibles marcadas como Protected + Masked
  4. allowed_images restrictivo

Siguiente: Capitulo 6: Cache y Artifacts →