FreeNGINX. Cómo Compilarlo

CiberSeguridad 18 de feb. de 2024

FreeNginx. El porqué de un fork de Nginx

Nginx, es un servidor web con más de una década de historia, que pasó de ser un proyecto personal de Igos Sysoev a un software profesional.

Nginx surge en 2004 y en 2011 pasa a ser una empresa responsable de su desarrollo y mantenimiento con licencia BSD con Maxim Dounin como uno de sus principales mantenedores de forma voluntaria.
El software de Nginx queda en dos partes:

  • Nginx: Como software Open Source
  • Nginx +: Como software privativo y de pago

En 2019 es comprada por F5 Networks y durante unos años mantiene todo como estaba, pero hace poco las cosas han cambiado...
Una de las cosas que quieren hacer es interferir con las política de seguridad que utiliza Nginx (open source), ante el problema y peligro de esto, se ha creado el fork FreeNginx para no perder el control y seguir manteniendo seguro el código de nginx.

Requisitos para compilar freenginx

A día de hoy no hay binarios de FreeNginx, así que os voy a mostrar una forma de compilarlo para tenerlo disponible si lo deseamos instalar en nuestros equipos o servidodres.

Una de las primeras cosas que debemos tener en cuenta es que Nginx y FreeNginx están desarrollados en C, con lo que para una compilación básica vamos a necesitar de pocas herramientas:

  • GCC. El compilador GNU para C
  • Librerias para OpenSSL (OpenSSL o LibreSSL o BoringSSL)
  • Liberías para ZLib
  • Librerías para PCRE (expresiones regulares)

Opcionalmente podemos instalar y usar otra serie de librerías que nos darán una mayor potencia a FreeNginx como son: GeoIP, Perl, libxml, libxslt, etc.

Herramientas y Librerías para compilación

Nosotros vamos a compilar nuestro propio FreeNginx y le vamos a "vitaminar" con varias opciones que no suelen venir por defecto para poder obtener más rendimiento y extraer mayores datos de los Logs cuando lo tengamos funcionando.

# Actualizamos nuestra paquetería
sudo apt update; sudo apt -y upgrade

# Instalamos lo mínimo para compilar y descargar el código
sudo apt -y install -y build-essential git tree wget mercurial-git

# Instalamos librerias para compilación con extras en freeNginx
sudo apt -y install libgeoip-dev perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev appstream-util libxml2-utils
Descargando Herramientas compilacion y Librerias

Descarga del código fuente del repositorio

El código fuente de FreeNginx está en un repositorio bajo un contro de versiones de tipo Mercurial, lo descargaremos mediante el siguiente comando:

hg clone http://freenginx.org/hg/nginx freenginx

Nos cambiamos al directorio creado 'freenginx' y todos los siguientes procesos los realizaremos desde este directorio.

cd freenginx

Descarga de PCRE2

Desde dentro del directorio freenginx vamos a descargarlos PCRE2, mediante el siguiente comando git:

git clone https://github.com/PCRE2Project/pcre2.git

Ahora nos cambiamos a este nuevo directorio y lo preparamos para que freenginx lo pueda usar en el proceso de compilación:

cd pcre2
./autogen.sh
cd ..

Descarga de ZLib

Seguimos en el directorio de freenginx y nos descargaremos zlib mediante wget:

wget --continue http://zlib.net/zlib-1.3.1.tar.gz -O zlib-1.3.1.tar.gz
tar xzvfp zlib-1.3.1.tar.gz
rm zlib-1.3.1.tar.gz
``

Ajustamos textos para FreeNginx

En este paso, simplemente para dejar correctamente reflejado el uso de FreeNginx, vamos a ajustar los literales que enlaces que muestra freenginx a la nueva web:

sed -i "s/Welcome to nginx/Welcome to freenginx/g" docs/html/index.html
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" docs/man/nginx.8
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" docs/text/README
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" docs/html/index.html
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" misc/README
sed -i "s/http:\/\/nginx.org/http:\/\/freenginx.org/g" src/http/modules/perl/nginx.pm

Disminuimos superficie de exposición

Vamos a evitar sacar la versión que tiene ejecutándose nuestro servidor cambiando un directiva interna:

sed -i 's/NGX_HTTP_SERVER_TOKENS_ON);/NGX_HTTP_SERVER_TOKENS_OFF);/g' src/http/ngx_http_core_module.c

Preparamos el proceso de compilación

Ahora nos toca realizar el proceso de configure, antes de realizar el ultimo paso de compilación, aquí indicaremos todos las opciones y cambios que queremos aplicar a una compilación estandard.
El proceso lo lanzamos desde el directorio de freenginx y usaremos el configure que existe dentro del directorio auto:

auto/configure --build=freengninx --prefix=/opt/nginx --sbin-path=/opt/nginx/nginx --conf-path=/opt/nginx/nginx.conf --with-compat --with-select_module --with-file-aio --with-threads --with-http_ssl_module --with-http_realip_module --with-http_geoip_module --with-http_slice_module --with-http_auth_request_module --with-http_addition_module --with-http_secure_link_module --with-http_random_index_module --with-http_sub_module --with-http_stub_status_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-stream_geoip_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-zlib=zlib-1.3.1 --with-pcre=pcre2

Como particularidades voy a fijar como nombre de construcción freenginx, la versión la mantengo y puedo consultarla con la opción -v desde la consola. Además dejo fijada la ruta destino de instalación en /opt/nginx, lo que me permite usar esta versión de freenginx como si fuese una versión "portable".

Voy a incluir soporte para GeoIP, obtención de la IP real de las peticiones, amplio el soporte a OpenSSL y métodos Auth.

Paso final. Compilación

Si en el paso anterior no has tenido ningún problema de que te faltase alguna librería, ahora solo hace falta realizar la creación del binario de nginx mediante la compilación, simplemente escribe:

make

Una vez finalizada la compilación vamos a revisar el binario generado que se ha generado en el directorio objs, mediante los parámetro -v y -V:

# Obtener version de freenginx
./objs/nginx -v
nginx version: nginx/1.25.4 (freengninx)


# Ver opciones de compilacion
./objs/nginx -V
nginx version: nginx/1.25.4 (freengninx)
built by gcc 12.2.0 (Debian 12.2.0-14) 
built with OpenSSL 3.0.11 19 Sep 2023
TLS SNI support enabled
configure arguments: --build=freengninx --prefix=/opt/nginx --sbin-path=/opt/nginx/nginx --conf-path=/opt/nginx/nginx.conf --with-compat --with-select_module --with-file-aio --with-threads --with-http_ssl_module --with-http_realip_module --with-http_geoip_module --with-http_slice_module --with-http_auth_request_module --with-http_addition_module --with-http_secure_link_module --with-http_random_index_module --with-http_sub_module --with-http_stub_status_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-stream_geoip_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-zlib=zlib-1.3.1 --with-pcre=pcre2

Instalación de FreeNginx

Una vez tengas compilado freengnix, para instarlo en tu equipo tan sólo tienes que ejecutar el siguiente comando, como root para que tenga los permisos necesarios para crear las rutas necesarias:

sudo make install

Para desinstalarlo simplemente deberás borrar la ruta /opt/nginx

Uso de freenginx

Los ficheros de configuración y parámetros son los mismos que los de nginx.

En nuestra compilación no hemos indicado que usuario/grupo es el propietario del servicio de freenginx, con lo que para iniciarlo y pararlo deberás hacerlo con el usuario root.

Si quieres definir un usuario/grupo, deberás crearlos para darle permisos para ejecutar el servicio de freenginx, en la llamada del configure deberás incluir la siguiente línea:

auto/configure --user=nginx --group=nginx ...

ó

auto/configure --user=freenginx --group=freenginx ...

Web Oficial de FreeNginx

Toda la información sobre FreeNginx la tenéis en:

nginx news

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux