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/...
gzip -d /home/log/php/xxxxxxx.gzProxy : particularités
HTTPS
Les connections SSL sont prises en charge par les proxies en entrée des plateformes comme ceci :
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 :
- https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
- http://symfony.com/doc/current/request/load_balancer_reverse_proxy.html
- http://symfony.com/doc/current/routing/scheme.html
- https://codex.wordpress.org/Administration_Over_SSL
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 :
- Utiliser le header X_FORWARDED_FOR au lieu de REMOTE_ADDR (c’est la norme standard)
- Utiliser le header REMOTE_ADDR quand le module RPAF d’Apache 2 est activé sur demande (dans ce cas REMOTE_ADDR est re-écrit avec le contenu de X_FORWARDED_FOR)
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é
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