Informations techniques générales

PHP : Réglages & modules

Pour afficher la configuration PHP, utiliser la fonction phpinfo() (cf. http://php.net/manual/fr/function.phpinfo.php)

La configuration PHP en ligne de commande (CLI) est différente (limites inexistantes, sécurités plus faibles, etc.)

OPCache

Zend OPCache est activé par défaut sur tous les serveurs PHP. Pour afficher la configuration pour un projet, utiliser la fonction phpinfo() (cf. http://php.net/manual/fr/function.phpinfo.php)

Logs

Dans le cas d’une plateforme avec serveurs redondants, vérifier que le trafic HTTP et/ou HTTPS soit redirigé vers le bon serveur (cf. documentation plateforme concernée : cookie SERVERID) avant de regarder les logs.

Les logs sont situés dans /home/logs/...

Décompresser les anciens logs : gzip -d /home/log/php/xxxxxxx.gz

Proxy : particularités

HTTPS

Les connections SSL sont prises en charge par les proxies en entrée des plateformes comme ceci :

graph TB a(fa:fa-cloud Visiteur)-- HTTPS -->b{Proxy

fa:fa-random} b-- HTTP -->c(fa:fa-globe Serveur Web)

De ce fait, le serveur web et les applications ne savent pas que le flux doit être en HTTPS

Pour indiquer à l’application qu’il s’agit d’un flux HTTPS, il faut utiliser le header X-FORWARDED-PROTO (header standard ajouté par le proxy).

Plus de détail sur le header X-FORWARDED-PROTO :

Configuration Symfony (v5.1)

Ajouter dans public/index.php

// public/index.php

// ...
$request = Request::createFromGlobals();

// tell Symfony about your reverse proxy
Request::setTrustedProxies(
	// trust *all* requests (the 'REMOTE_ADDR' string is replaced at
    // run time by $_SERVER['REMOTE_ADDR'])
    ['REMOTE_ADDR'],

    // trust *all* "X-Forwarded-*" headers
    Request::HEADER_X_FORWARDED_ALL

);

Pour les autres versions et plus de détails : https://symfony.com/doc/current/deployment/proxies.html

Configuration Wordpress

Ajouter dans wp-config.php

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';

if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    $http_x_headers = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );

    $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
}
Forcer l’utilisation de HTTPS

Ajouter dans .htaccess

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Wordpress

Ajouter dans wp-config.php

define('WP_SITEURL', 'https://'.$_SERVER['HTTP_HOST']);
define('WP_HOME', 'https://'.$_SERVER['HTTP_HOST']);
define('FORCE_SSL_ADMIN', true);
Protocoles SSL disponibles

Pour afficher la liste des protocoles et ciphers disponibles, utiliser la commande nmap --script ssl-enum-ciphers -p 443 <hostname>, par exemple :

$ nmap --script ssl-enum-ciphers -p 443 monkees.fr

Starting Nmap 7.60 ( https://nmap.org ) at 2017-11-23 17:09 CET
Nmap scan report for free.fr (212.27.48.10)
Host is up (0.045s latency).
Other addresses for free.fr (not scanned): 2a01:e0c:1::1
rDNS record for 212.27.48.10: monkees.fr

PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 4096) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 4096) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 4096) - A
|       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 4096) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (dh 4096) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 4096) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (dh 4096) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 4096) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|_  least strength: A

Adresse IP client

Pour connaitre l’adresse IP réelle des visiteurs sur une application PHP, on utilise la plupart du temps le header REMOTE_ADDR.

Ce header contient l’adresse IP du dernier client avant le serveur web. S’il y’a un proxy entre le visiteur et le serveur web cela va retourner l’adresse IP du proxy. Pour connaitre la véritable adresse IP du visiteur, il y’a toutefois deux solutions :

Documentation Symfony liée : http://symfony.com/doc/current/introduction/http_fundamentals.html#requests-and-responses-in-symfony

Adresse IP Publique

Pour connaître l’adresse IP publique d’un serveur web, lancer la commande suivante depuis le compte SSH concerné :

curl ipinfo.io/ip

PHPMyADMIN

Règles de sécurité

graph TB a(fa:fa-user https://phpmyadmin.domaine.tld)-->b{IP autorisée

fa:fa-question} b-- oui -->c(fa:fa-table Welcome to phpMyAdmin) b-- non -->d(fa:fa-lock Authentification Basic HTTP) d-->c

Compression GZIP

NGINX

GZip est activé par défaut sur Nginx pour les mime-types suivant :

text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript

Pour vérifier qu’une URL est retournée compressée :

url="<URL>"
size=$(curl "$url" --silent --write-out "%{size_download}\n" -o /dev/null)
gsize=$(curl "$url" --silent -H "Accept-Encoding: gzip,deflate" --write-out "%{size_download}\n" -o /dev/null)
if [ $gsize -lt $size ]; then
	echo "Gzip enabled ($(( $gsize-$size )) octets) for $url"
else
	echo "Gzip disabled for $url"
fi