Gitlab con Nginx

Reverse proxy

Voy a documentar el proceso de instalación de Gitlab en una máquina virtual detrás de un Nginx haciendo de reverse proxy.

Descripción del escenario

Diagrama en el que me basaré para la explicación
Diagrama en el que me basaré para la explicación.
  • Certificado SSL con Let's Encrypt y certbot.
  • Escuchar en los puertos 80 (HTTP) y 443 (HTTPs) con una redirección automática desde el 80 al 443.
  • Acceso mediante SSH con clave pública y protegido con fail2ban.

Configuración del router

En la sección de redirección de puertos (port forwarding) de nuestro router creamos dos registros nuevos sobre el protocolo TCP.

  • El puerto 80 del router apuntará al puerto 80 de la máquina de Nginx (192.168.1.105), para las conexiones HTTP.
  • El puerto 443 del router apuntará al puerto 443 de la máquina de Nginx (192.168.1.105), para las conexiones HTTPs.
  • El puerto 22 del router apuntará al puerto 22 de la máquina de Gitlab (192.168.1.108), para las conexiones SSH.

Configuración de Nginx

Nos situamos en la máquina que va a ejercer de reverse proxy con Nginx y creamos el archivo /etc/nginx/sites-available/git.example.com.conf.

server {
    listen 80;
    listen [::]:80;
    server_name git.example.com;

    location / {
        proxy_pass "http://192.168.1.108/";
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_set_header X-Url-Scheme $scheme;
    }
}

Habilitamos el sitio.

ln -s /etc/nginx/sites-available/git.example.com.conf /etc/nginx/sites-enabled/

Testeamos la sintaxis de la configuración de Nginx, y si todo va bien, recargamos la configuración.

nginx -t
systemctl reload nginx

Con el Virtual Host correctamente configurado en Nginx, ejecutamos el certbot.

certbot ---nginx -d git.example.com

Durante el proceso de creación del certificado indicamos que queremos redireccionar el tráfico HTTP al HTTPs. Y a continuación se expone cómo quedará /etc/nginx/sites-available/git.example.com.conf después de ejecutar el certbot.

server {
    server_name git.example.com;

    location / {
        proxy_pass "http://192.168.1.108/";
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_set_header X-Url-Scheme $scheme;
    }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = git.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;

    server_name git.example.com;
    return 404; # managed by Certbot
}

Configuración SSH

Generamos en nuestro equipo una clave SSH y copiamos la clave a la máquina del Gitlab (192.168.1.108).

ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.1.108

Nos situamos en la máquina que va a ejecutar Gitlab (192.168.1.108) y editamos el archivo /etc/ssh/sshd_config. Después nos aseguramos de que las siguientes lineas tengan los valores mostrados.

UsePAM yes
PasswordAuthentication no

Y agregamos la siguiente línea al final.

PermitRootLogin no

Guardamos y reiniciamos el servicio.

sudo systemctl restart sshd

Fail2ban

Instalamos el programa.

sudo apt update
sudo apt install fail2ban

Creamos el archivo /etc/fail2ban/jail.local y agregamos las siguientes lineas.

[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.1.0/24
bantime = 10m
maxretry = 5
findtime = 1d

[sshd]
enabled = true

Guardamos y reiniciamos el servicio.

sudo systemctl restart fail2ban

Instalación y configuración de Gitlab

Nos situamos en la máquina que va a ejecutar Gitlab (192.168.1.108) e instalamos los paquetes necesarios. Luego agregamos el repositorio de Gitlab.

sudo apt update
sudo apt install curl openssh-server ca-certificates tzdata perl postfix

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

sudo EXTERNAL_URL="http://git.example.com" apt-get install gitlab-ce

Nótese que el parámetro EXTERNAL_URL se define con http y no con https. Posteriormente editamos el archivo /etc/gitlab/gitlab.rb y agregamos las siguientes lineas al final.

nginx['listen_port'] = 80
nginx['listen_https'] = false

nginx['proxy_set_headers'] = {
    "X-Forwarded-Proto" => "http"
}

nginx['real_ip_trusted_addresses'] = [ '192.168.1.0/24' ]
nginx['real_ip_header'] = 'X-Forwarded-For'
nginx['real_ip_recursive'] = 'on'

Re-configuramos Gitlab.

sudo gitlab-ctl reconfigure

Hay que esperar un rato a que se reconfigure, incluso después de que el comando haya finalizado. Una vez acabado este proceso ya podremos acceder a nuestro Gitlab a través de HTTPs para definir la contraseña del usuario root.

Referencias

*   *   *