Archives pour la catégorie SSL/TLS

Maintenir Nginx à jour sur un vieux tromblon

Nginx est le serveur Web le plus utilisé, juste devant Apache et ces deux programmes «motorisent» à eux seuls 2/3 des sites Web.

Apache, tout comme Nginx,  peut être utilisé comme «reverse-proxy». Mais Nginx est bien plus efficace, performant et facile à configurer dans ce cadre.

Une machine virtuelle ou un conteneur Nginx peut donc être utilisée comme frontal de nombreux sites Web non routés sur Internet. L’intérêt est multiple: cela permet d’avoir de nombreux sites (pas forcément sur le même domaine) sur une seule IPv4/IPv6, les sites ne sont pas directement accessibles et le proxy peut filtrer les requêtes, il peut être utilisé comme mandataire TLS. C’est en quelque sorte une  «gare de triage» pour des requêtes HTTP, HTTPS (merci SAN et SNI) mais aussi  TCP et UDP !

Un frontal qui n’exécute rien d’autre qu’un serveur Web qui assure la fonction de proxy ne craint pas grand chose (il n’interprète pas de code PHP ou autres). Les possibilités d’attaque sont très faibles et il est acceptable d’avoir des uptimes de plusieurs années sur des OS obsolètes … du moment que le principal intéressé (Nginx) soit à jour (ainsi que tous les composants dont il dépend).

Le script suivant télécharge, compile et installe Nginx et ses dépendances en statique:

#!/bin/bash

# Compilation et installation de Nginx + OpenSSL/PCRE/ZLIB statiques
# pour une utilisation en reverse-proxy HTTP/HTTPS/TCP/UDP

mkdir -p nginx-static
cd nginx-static

##################################################

NGINX_VERSION="1.22.1"
FAKE_NGINX_NAME="Microsoft IIS"
SSL_VERSION="1.1.1t"
PCRE_VERSION="10.37"
ZLIB_VERSION="1.2.13"

OPTS="
--with-threads
--with-http_ssl_module
--with-http_v2_module
--with-http_stub_status_module
--with-http_sub_module
--with-http_auth_request_module
--with-stream
--with-stream_ssl_module
--with-stream_ssl_preread_module
--with-openssl=../openssl-${SSL_VERSION}
--with-pcre=../pcre2-${PCRE_VERSION}
--with-zlib=../zlib-${ZLIB_VERSION}
--with-http_gzip_static_module
--add-module=../headers-more-nginx-module
"

##################################################

apt-get -y install build-essential git

##################################################

[ -d nginx ] || mkdir nginx
cd nginx

##################################################

[ -f nginx-${NGINX_VERSION}.tar.gz ] || wget "http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
tar -xzf nginx-${NGINX_VERSION}.tar.gz

if [ -d headers-more-nginx-module ] ; then
  cd headers-more-nginx-module
  git pull https://github.com/openresty/headers-more-nginx-module.git
  cd ..
else
  git clone https://github.com/openresty/headers-more-nginx-module.git
fi

[ -f openssl-${SSL_VERSION}.tar.gz ] || wget "http://www.openssl.org/source/openssl-${SSL_VERSION}.tar.gz"
[ -d openssl-${SSL_VERSION} ] && rm -rf openssl-${SSL_VERSION}
tar -xzf openssl-${SSL_VERSION}.tar.gz

[ -f pcre2-${PCRE_VERSION}.tar.gz ] || wget "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-${PCRE_VERSION}/pcre2-${PCRE_VERSION}.tar.gz"
[ -d pcre2-${PCRE_VERSION} ] && rm -rf pcre2-${PCRE_VERSION}
tar -xzf pcre2-${PCRE_VERSION}.tar.gz

[ -f zlib-${ZLIB_VERSION}.tar.gz ] || wget "http://zlib.net/zlib-${ZLIB_VERSION}.tar.gz"
[ -d zlib-${ZLIB_VERSION} ] && rm -rf zlib-${ZLIB_VERSION}
tar -xzf zlib-${ZLIB_VERSION}.tar.gz

##################################################

cd nginx-${NGINX_VERSION}

sed -i "s/<center>nginx<\/center>/<center>${FAKE_NGINX_NAME}<\/center>/g" src/http/ngx_http_special_response.c

make clean

./configure --prefix=/usr/local/nginx-static ${OPTS}
make -j $(( $(grep -c ^processor /proc/cpuinfo) + 1 ))

[ $? -eq 0 ] || { echo "erreur compilation" ; exit 1 ; }

make install

##################################################

service nginx stop
PIDS=$(ps awx |grep " nginx: " |grep -v grep |awk '{print $1}')
[ "${PIDS}" = "" ] || kill ${PIDS}

grep -q "^DAEMON=" /etc/default/nginx || cat<<EOT>>/etc/default/nginx
DAEMON="/usr/local/nginx-static/sbin/nginx"
DAEMON_OPTS="-c /etc/nginx/nginx.conf"
EOT

##################################################

service nginx start

cd ..

 

Avec Let’s Encrypt, vous n’avez plus d’excuses pour ne pas utiliser HTTPS !

Let’s Encrypt est un service qui permet d’obtenir des certificats TLS gratuitement. Bien évidemment, l’intérêt d’un tel service est que l’autorité qui signe les certificats est pré-enregistrée, donc connue des navigateurs et des systèmes d’exploitation.

Les certificats Let’s Encrypt sont donc:

  • reconnus par les systèmes d’exploitation,
  • reconnus par les navigateurs Web,
  • et reconnus par la plupart des logiciels.

Ce service est gratuit pour deux raisons:

  • il est porté par un consortium qui a compris que la généralisation de TLS permet d’apporter un peu plus de sécurité sur la toile,
  • la validation des certificats est entièrement automatique.

Les certificats ont une durée volontairement limitée (3 mois) pour inciter (disons plutôt obliger) les administrateurs à les renouveler régulièrement.