Généralités

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

[HTTP_X_FORWARDED_PROTO] => https

Documentations de références :

Exemple pour Symfony app/config/config.yml

trusted_proxies: [<ip_publique_proxy1>, <ip_publique_proxy2>, <...>]

Les IP publiques sont disponibles sur la documentation de la plateforme concernée.

Forcer l’utilisation de HTTPS
  • Via fichier .htaccess :
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Protocoles 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 free.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: www.free.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, la plupart du temps on utilise le header REMOTE_ADDR.

Ce header contient l’adresse IP du dernier client avant le serveur web donc 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

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