Hace unos días se usó una vulnerabilidad en la versión que tenía instalada de gitlab en la que era posible ver los mails de los usuarios de la instancia de gitlab… esto hizo que los usuarios empezásemos a recibir correos electrónicos de que nuestra cuenta estaba bloqueada por intentos fallidos de acceso.
Actualicé a la última versión de gitlab y como veía que seguían los intentos de acceso al sistema tomé una drástica decisión, parar el gitlab y encenderlo solo cuando lo necesitase hasta que tuviese tiempo de implementar esta solución que planteo en este post.
Había dos cosas a solucionar, la primera la del proxy de nginx y la segunda la del fail2ban.
Proxy nginx
El gitlab lo tengo en un contenedor lxc detrás de un proxy nginx, la parte del frontal ya la tenía bien configurada, pero faltaba configurar la parte del gitlab. Para ello será necesario editar el fichero de configuración de gitlab y añadir lo siguiente:
# vi /etc/gitlab/gitlab.rb # Each address is added to the NGINX config as set_real_ip_from address; nginx['real_ip_trusted_addresses'] = [ '192.168.1.0/24', '192.168.1.10', '2001:0db8::/32' ] # Other real_ip config options nginx['real_ip_header'] = 'X-Forwarded-For' nginx['real_ip_recursive'] = 'on'
Y recargar la configuración
# gitlab-ctl reconfigure # gitlab-ctl status
Ahora si vemos el log, si está todo bien, veremos ya la ip real
# tail -f /var/log/gitlab/nginx/gitlab_access.log
Listos!
fail2ban
Ahora la segunda parte, bloquear estas ips que nos están dando la brasa y bloquearlas. Lo haremos con fail2ban
# apt -y install fail2ban
Y creamos el fichero de configuración jail.local con este contenido
# vi /etc/fail2ban/jail.local [DEFAULT] # IPs que nunca se deben bloquear (loopback + rango interno) ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 # Tiempo del bloqueo: 24 horas bantime = 86400 # Tiempo en que se cuentan los tiempos fallidos (10 minutos) findtime = 600 # Numero máximo de intentos antes del bloqueo maxretry = 5 # Backend para leer logs backend = auto # Acción para bloquear ips banaction = iptables-multiport # Email opcional para alertas mta = sendmail # ------------------------- # SSH Protection # ------------------------- [sshd] enabled = true port = ssh logpath = /var/log/auth.log backend = systemd # ------------------------- # GitLab Protection # ------------------------- [gitlab] enabled = true filter = gitlab port = http,https # Incluye logs de Rails y API logpath = /var/log/gitlab/gitlab-rails/production.log /var/log/gitlab/gitlab-rails/api_json.log maxretry = 5 findtime = 600 bantime = 86400
Ahora recargamos la configuración y miramos el estado
# fail2ban-client reload # fail2ban-client status gitlab Status for the jail: gitlab |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- File list: /var/log/gitlab/gitlab-rails/production.log /var/log/gitlab/gitlab-rails/api_json.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
Y ahora a esperar… si siguen los intentos y no se bloquean, recomiendo afinar la configuración.