Seguridad y Hardening

Por: Artiko
forgejoseguridadhardeningfail2banprometheus2fa

Seguridad y Hardening

Una instancia de Forgejo expuesta a internet requiere configuracion activa para reducir la superficie de ataque. Esta seccion cubre las medidas mas importantes ordenadas por impacto.


Control de registro de usuarios

Por defecto, cualquier persona puede crear una cuenta. Para una instancia privada o corporativa, esto debe desactivarse.

Deshabilitar registro completamente

[service]
DISABLE_REGISTRATION = true

Con esto solo los administradores pueden crear cuentas desde Admin Panel > Users > Create User.

Permitir solo registro interno

Permite que los admins inviten usuarios pero no que se registren solos:

[service]
ALLOW_ONLY_INTERNAL_REGISTRATION = true

Whitelist de dominios de email

Permite el registro solo a usuarios con emails de dominios especificos:

[service]
EMAIL_DOMAIN_WHITELIST = miempresa.com,consultora.org

Lista negra de dominios

Para bloquear proveedores de email temporales:

[service]
EMAIL_DOMAIN_BLOCKLIST = mailinator.com,guerrillamail.com,tempmail.com

2FA y TOTP

Habilitar autenticacion de dos factores

Forgejo soporta TOTP (aplicaciones como Authy, Google Authenticator o Bitwarden). Los usuarios lo activan desde Settings > Security > Two-Factor Authentication.

Forzar 2FA para administradores

[security]
ADMIN_REQUIRE_2FA = true

Los administradores que no tengan 2FA configurado seran redirigidos a configurarlo al iniciar sesion.

Forzar 2FA para una organizacion

Desde la interfaz de administracion de la organizacion: Organization Settings > Security > Require two-factor authentication for all members.

Los miembros sin 2FA son removidos automaticamente hasta que lo configuren.


fail2ban: proteccion contra fuerza bruta

Forgejo registra los intentos fallidos de login en sus logs. fail2ban puede leer esos logs y bloquear IPs que superen el umbral de intentos.

Filtro para Forgejo

Crear /etc/fail2ban/filter.d/forgejo.conf:

[Definition]
failregex = ^.*Failed authentication attempt for .* from <HOST>.*$
            ^.*invalid credentials from <HOST>.*$
            ^.*Failed to authenticate token from <HOST>.*$
ignoreregex =

Jail de fail2ban

Crear /etc/fail2ban/jail.d/forgejo.conf:

[forgejo]
enabled   = true
port      = http,https
filter    = forgejo
logpath   = /var/lib/docker/volumes/forgejo_data/_data/gitea/log/forgejo.log
maxretry  = 5
findtime  = 600
bantime   = 3600
action    = iptables-multiport[name=forgejo, port="http,https", protocol=tcp]

Ajusta logpath segun donde Docker guarde el volumen en tu sistema.

Reiniciar fail2ban

systemctl restart fail2ban
fail2ban-client status forgejo

Headers de seguridad HTTP

Forgejo configura automaticamente varios headers de seguridad. Puedes ajustar el comportamiento en app.ini:

[server]
ENABLE_GZIP = true

[security]
INSTALL_LOCK = true
SECRET_KEY   = clave_aleatoria_larga_y_segura
COOKIE_SECURE = true

Para HSTS, CSP y X-Frame-Options, lo mas recomendable es configurarlos en el proxy inverso (nginx o Caddy):

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;

Nota: Forgejo necesita unsafe-inline para scripts y estilos debido a como genera parte del HTML dinamico.


Actualizaciones regulares

Mantener Forgejo actualizado es la medida de seguridad mas efectiva. El proyecto publica parches de seguridad rapidamente.

Suscribete a las notificaciones de releases en Codeberg o RSS:

https://codeberg.org/forgejo/forgejo/releases.rss

El proceso de actualizacion esta detallado en el capitulo anterior.


Monitoreo

Healthcheck endpoint

Forgejo expone un endpoint de salud sin autenticacion:

curl https://tu-forgejo.com/api/healthcheck
# Respuesta: {"status":"pass"}

Util para configurar en balanceadores de carga o monitores de uptime como UptimeRobot o Healthchecks.io.

Metricas Prometheus

Habilitar en app.ini:

[metrics]
ENABLED = true
TOKEN   = token_secreto_para_prometheus

Las metricas se exponen en /metrics. Configurar Prometheus para recolectarlas:

scrape_configs:
  - job_name: forgejo
    bearer_token: token_secreto_para_prometheus
    static_configs:
      - targets: ["tu-forgejo.com"]
    scheme: https
    metrics_path: /metrics

Las metricas incluyen contadores de usuarios activos, repos, issues, operaciones Git y metricas de la base de datos.


Configuracion de logs

Niveles de log

[log]
MODE      = file
LEVEL     = warn
ROOT_PATH = /data/gitea/log

Niveles disponibles de menor a mayor detalle: fatal, error, warn, info, debug, trace.

En produccion, warn o error reducen el ruido. Usar info o debug solo para diagnosticar problemas.

Rotacion de logs

[log.file]
LOG_ROTATE    = true
MAX_SIZE_SHIFT = 28
DAILY_ROTATE  = true
MAX_DAYS      = 7
COMPRESS      = true

Resumen del tutorial

A lo largo de estos 22 capitulos has visto como:

  1. Instalar Forgejo con Docker Compose
  2. Configurar el servidor con app.ini
  3. Gestionar usuarios, organizaciones y permisos
  4. Usar repositorios, branches, issues y pull requests
  5. Configurar Forgejo Actions para CI/CD
  6. Usar el Package Registry para artefactos
  7. Exponer y consumir la API REST
  8. Configurar webhooks y migrar desde otras plataformas
  9. Elegir y migrar la base de datos
  10. Hacer backups, restaurar y actualizar
  11. Asegurar la instancia con 2FA, fail2ban y monitoreo

Proximos pasos recomendados


Volver al indice: Forgejo: Indice del Tutorial