Authentification Système sous MySQL (LAMP)

Publié le par | Développement|sécurité

Un élément important de la sécurité des base de données est est l’authentification système (réutilisé l’authentification système d’exploitation), cette méthode évite d’avoir des mots de passe en clairs dans les configurations. Cette méthode était facile à implanter sous PHP/IIS/SQL Server, mais était plus problématique à déployer sous plateforme LAMP (Linux / MySQL)

Depuis MySQL 5.5 une nouvelle infrastructure d’authentification modulaire rend possible l’utilisation de nouvelles méthodes d’authentification, notamment l’authentification via socket qui permet une connexion transparente si l’utilisateur système est identique à l’utilisateur MySQL.

– Apache (si possible avec un MPM peruser)
– MySQL 5.5 local
– PHP utilisant les drivers natifs MySQL (MYSQL_MODULE_TYPE = External)

Activer le module dans le serveur MySQL en ajoutant la plugin-load dans la section mysqld

[mysqld]
plugin-load=auth_socket=auth_socket.so

Créer votre compte mysql et assigné les permissions sur la base désirée

CREATE USER 'apache'@'localhost' IDENTIFIED WITH auth_socket;
GRANT SELECT,INSERT,UPDATE,DELETE ON mon_schema.* TO apache;

Normalement, chaque pool d’application devrait fonctionner avec son propre GUI (soit via php-fpm, ou l’utilisation du MPM ITK) donc apache devrait rouler avec un UID différent. Donc, votre application à besoin d’identifier son nom d’utilisateur, et par la suite de se connecter à la base de données.

$username = exec('whoami);
$db  = new PDO('mysql:unix_socket=/var/lib/mysql/mysql.sock', $username, '' ,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES 'UTF8''));
$db->exec('USE mon_schema');

Et le tout sans mot de passe, cette méthode fonctionne aussi bien en console via php-cli ou via d’autres environnement comme nginx.