====== Nginx ====== ===== Config reverse proxy ===== server { listen 443; server_name mon-domaine.com; ssl on; ssl_certificate /etc/nginx/ssl/mon-domaine.com.pem; ssl_certificate_key /etc/nginx/ssl/mon-domaine.com.key; ssl_session_cache shared:SSL:10m; # config pour un chemin spécifique location /mon-repertoire { proxy_set_header Accept-Encoding ""; # sub_filter permet de modifier un texte dans le fichier html renvoyé par nginx sub_filter_once off; sub_filter "http://mon-url-interne/" "https://mon-url-externe.com/"; proxy_pass http://mon-server-interne/mon-repertoire; # forcer à être en https proxy_redirect http:// https://; } # config pour le reste des chemin location / { # pour les websocket c'est mieux de spécifier la version du proxy proxy_http_version 1.1; proxy_pass http://mon-server-interne:3000/; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } server { listen 80 default; server_name test.local; location / { # permet de transmettre l'ip réel au serveur interne proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; # sur une certaine condition... if ($request_body ~* ^(.*)\.test) { proxy_pass http://www.google.de; break; } root /srv/http; } } ===== GeoIP2 ===== Créer un compte gratuit sur https://www.maxmind.com/ apt install libnginx-mod-http-geoip2 Installation de geoipupdate pour télécharger et maintenir à jour la base de données des GeoIP Doc → https://github.com/maxmind/geoipupdate?tab=readme-ov-file wget https://github.com/maxmind/geoipupdate/releases/download/v7.1.0/geoipupdate_7.1.0_linux_amd64.deb dpkg -i geoipupdate_7.1.0_linux_amd64.deb # configuration vi /etc/GeoIP.conf # GeoIP.conf file for `geoipupdate` program, for versions >= 3.1.1. # Used to update GeoIP databases from https://www.maxmind.com. # For more information about this config file, visit the docs at # https://dev.maxmind.com/geoip/updating-databases. # `AccountID` is from your MaxMind account. AccountID YOUR_ACCOUNT_ID_HERE # `LicenseKey` is from your MaxMind account. LicenseKey YOUR_LICENSE_KEY_HERE # `EditionIDs` is from your MaxMind account. # EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country EditionIDs GeoLite2-Country # Run GeoIP update geoipdate # Télécharge la bdd ici /usr/share/GeoIP/GeoLite2-Country.mmdb # Ajout dans le cron 32 2 * * 1,4 /usr/bin/geoipupdate Pour Nginx #Fichier de config pour spécifier l'emplacement de la base de données vi /etc/nginx/conf.d/geoip2.conf geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb { auto_reload 60m; $geoip2_data_country_code country iso_code; } geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb { auto_reload 60m; $geoip2_data_isp autonomous_system_organization; } Tester apt install mmdb-bin mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip 152.65.252.11 { "continent": { "code": "EU" "geoname_id": 6255148 "names": { "de": "Europa" "en": "Europe" "es": "Europa" "fr": "Europe" "ja": "ヨーロッパ" "pt-BR": "Europa" "ru": "Европа" "zh-CN": "欧洲" } } "country": { "geoname_id": 2658434 "iso_code": "CH" "names": { "de": "Schweiz" "en": "Switzerland" "es": "Suiza" "fr": "Suisse" "ja": "スイス連邦" "pt-BR": "Suíça" "ru": "Швейцария" "zh-CN": "瑞士" } } "registered_country": { "geoname_id": 6252001 "iso_code": "US" "names": { "de": "USA" "en": "United States" "es": "Estados Unidos" "fr": "États Unis" "ja": "アメリカ" "pt-BR": "EUA" "ru": "США" "zh-CN": "美国" } } } Config pour restreindre par pays server{ server_name toto.com; # managed by Certbot listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/toto.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/toto.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 location /restricted_page { if ($geoip2_data_country_code !~* "(FR|IT|CH)") { return 403; } proxy_pass http://192.168.0.1:3000; } # Pour débugguer #location /debug_geoip { # default_type text/plain; # return 200 "$remote_addr - $geoip2_data_country_code\n"; #} access_log /var/log/nginx/access.log geoip2; error_log /var/log/nginx/error.log debug; } server{ if ($host = toto.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80 ; listen [::]:80 ; server_name toto.com; return 404; # managed by Certbot } ===== Authentification par Certificat Client (TLS Mutual Auth) ===== Permet de sécuriser l'accès à un site via un certificat placé au niveau du client. Pratique si on ne peut pas restreindre l'accès par ip ou si on veut éviter la connexion VPN en permanence. ==== Création du notre Autorité de Certification (CA) ==== # Générer la clé de l'autorité openssl genrsa -out ca.key 4096 # Créer le certificat de l'autorité openssl req -new -x509 -days 3650 -key ca.key -out ca.crt Quand la commande vous demande les informations, soyez distinct : * Country Name : FR * Organization Name : Ma Maison * Common Name : Mon-Autorite-CA (Utilisez un nom qui indique clairement que c'est le "patron"). ==== Création du certification pour le client ==== On génère une clé spécifiquer pour le client, signée par le CA. Dans l'exemple, le client sera un smartphone Android # Générer la clé du smartphone openssl genrsa -out smartphone.key 4096 # Créer la demande de signature openssl req -new -key smartphone.key -out smartphone.csr # Signer le certificat avec votre CA # Notez qu'on défini ici un numéro de série 01 openssl x509 -req -days 365 -in smartphone.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out smartphone.crt C'est ici qu'il faut être vigilant : * Country Name : FR * Organization Name : Ma Maison (Le même que le CA, c'est mieux). * Common Name : Smartphone-Jean (Il doit être différent du CN de l'autorité). ==== Convertir pour le smartphone (.p12) ==== openssl pkcs12 -export -out smartphone.p12 -inkey smartphone.key -in smartphone.crt -certfile ca.crt Un mot de passe sera demandé, il permet de sécuriser le fichier car il contient à la fois le certificat et sa clé privée. Envoyez ce fichier .p12 à votre téléphone et installez-le dans les ''paramètres'' / ''Sécurité et confidentialité'' / ''Autres options de sécurité et confidentialité'' / ''Chiffrement et identifiants'' / ''Installer un certificat'' / ''Certificat utilisateur VPN et appli'' Le mot de passe sera demandé lors de l'installation du certificat sur l'appareil. Sur Chrome, il faut aller ici -> ''[[chrome://certificate-manager/clientcerts/platformclientcerts]]'' ==== Configuration Nginx ==== server { listen 443 ssl; server_name votre-ha.domaine.fr; ssl_certificate /chemin/vers/fullchain.pem; # Votre certificat SSL habituel (ex: Let's Encrypt) ssl_certificate_key /chemin/vers/privkey.pem; # --- AJOUT MTLS --- ssl_client_certificate /chemin/vers/ca.crt; # Le certificat CA créé à l'étape 1 ssl_verify_client on; # ------------------ location / { proxy_pass http://127.0.0.1:8123; # ... reste de votre config proxy habituelle } }