Archives pour la catégorie Système

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 ..

 

SimpleSAMLphp, le couteau suisse de l’authentification

Lorsqu’on héberge de nombreux serveurs ou services Web, un problème se pose forcément un jour ou l’autre: la multiplication des pages d’authentification et des procédures de gestion des utilisateurs. Pour ne rien arranger, elles sont toutes indépendantes les unes des autres. Vous me direz qu’il est possible d’utiliser (par exemple) un annuaire LDAP ou un service authentification centralisé tel que OAuth, mais cela ne règle pas la corvée des authentifications multiples.

Continue la lecture

ProxyJump: rebond automatique vers une machine non routée

Toto travaille sur sa machine pc-perso, il besoin de se connecter à une machine S2 située sur un autre LAN. Manque de pot,  S2 a une adresse IP privée et n’est donc pas accessible depuis Internet.

Toto ne veut pas utiliser le VPN propriétaire du LAN distant soumis au CloudAct et au PatriotAct … Pour ne rien arranger, ce VPN qui coûte un bras est aussi lent et instable que sa grand-mère en rollers !

Mais Toto a la chance d’avoir un accès SSH direct à la machine S1 qui a une patte sur le LAN distant (elle est joignable par une adresse IP publique).

Toto fait donc toutes ses opérations (SSH, scp, rsync, …) par rebonds: il se connecte d’abord à S1 puis  à S2 à partir de S1:

  • La clé publique de toto@pc-perso DOIT être installé sur le compte toto@s1
  • La clé publique toto@s1 DOIT être installés sur le compte toto@s2

Ce n’est pas très pratique pour Toto, surtout pour transférer des fichiers …

toto@pc-perso:~# ssh s1
Welcome to Ubuntu
You have new mail.
Last login: Sat Nov 26 17:05:22 2022 from xxxxxxxxxxxxx
toto@s1:~# ssh s2
Welcome to Debian
No mail.
toto@s2:~#

Un jour, Toto a ouvert la porte de son frigo et a vu la lumière: il a découvert la fonction ProxyJump d’OpenSSH !

Il s’agit d’une option qui permet de spécifier comment accéder à une machine en rebondissant par une autre:

  • Toto DOIT disposer d’un compte sur les deux machines (S1 et S2),
  • Toto DOIT disposer d’une clé SSH sur pc-perso,
  • La clé SSH publique toto@pc-perso DOIT être installée sur les machines (S1 et S2): Toto n’a plus besoin d’une clé publique toto@s1 pour accéder à toto@s2
toto@pc-perso:~# ssh -J s1 s2
Welcome to Debian
No mail.
Last login: Sat Nov 26 17:05:26 2022 from xxxxxxxx
toto@s2:~#

Il est possible de graver ce comportement dans le marbre pour se simplifier la vie: il ne sera plus nécessaire de préciser explicitement l’option de rebond, toutes les opérations (SSH, scp, rsync, …) se feront de façon transparentes entre pc-perso et S2. Il suffit de créer/éditer le fichier ~.ssh/config sur pc-perso:

Host s2
 Hostname s2
 ProxyJump s1

Toto est content: il peut travailler sur S2 directement depuis pc-perso !

toto@pc-perso:~# ssh s2
Welcome to Debian
No mail.
Last login: Sat Nov 26 17:05:26 2022 from xxxxxxxx
toto@s2:~#

 

Redémarrer une machine quand “reboot” ou “shutdown -r now” ne veulent rien savoir !

Mésaventure arrivée grâce à un fichu disque USB défectueux: les commandes “reboot” et “shutdown -r now” ne voulaient rien savoir, et impossible de tuer le processus de copie bloqué. Il existe une alternative moins risquée que le redémarrage “électrique violent”:

echo s > /proc/sysrq-trigger # Flusher les buffers d'IO pour ne pas perdre de données
echo u > /proc/sysrq-trigger # Démonter puis Remonter toutes les partitions en Read-Only
echo b > /proc/sysrq-trigger # Forcer le reboot de la machine

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.