Seguridad y Hardening
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
MAX_SIZE_SHIFT: tamano maximo del archivo en bytes como potencia de 2 (28 = 256 MB)MAX_DAYS: dias de retencion antes de eliminar logs rotados
Resumen del tutorial
A lo largo de estos 22 capitulos has visto como:
- Instalar Forgejo con Docker Compose
- Configurar el servidor con app.ini
- Gestionar usuarios, organizaciones y permisos
- Usar repositorios, branches, issues y pull requests
- Configurar Forgejo Actions para CI/CD
- Usar el Package Registry para artefactos
- Exponer y consumir la API REST
- Configurar webhooks y migrar desde otras plataformas
- Elegir y migrar la base de datos
- Hacer backups, restaurar y actualizar
- Asegurar la instancia con 2FA, fail2ban y monitoreo
Proximos pasos recomendados
- Explorar Forgejo Actions para reemplazar GitHub Actions en tus pipelines actuales
- Configurar un Package Registry para centralizar artefactos del equipo
- Evaluar Codeberg.org como alternativa publica gestionada
- Seguir el desarrollo de federation ActivityPub en el proyecto
Volver al indice: Forgejo: Indice del Tutorial