LAMP

De Justine's wiki
Aller à la navigation Aller à la recherche

Présentation de LAMP

LAMP est un ensemble de logiciels:

  • Linux
  • Apache
  • MySql
  • PHP

Sa fonction est d'héberger des sites web. LAMP est le plus connu mais on peut aussi l'ajuster : il existe par exemple des solutions WAMPServer ou EasyPHP sous Windows, et même XAMPP (avec PHP et Perl) qui fonctionne sur les 3 OS courants. On peut remplacer Apache par NGinx (Et puisque Nginx se prononce "engine X", on nomme alors la suite de logiciels LEMP). On peut aussi MariaDB au lieu de MySql.

NB: MariaDB est un fork de MySql : MySql a été racheté par Oracle, qui n'est pas forcément pour le logiciel libre.

Architecture 3 tiers

L'architecture 3 tiers concerne le développement applicatif : elle a été conçue pour faire face à plusieurs difficultés liées à l'architecture deux tiers habituellement utilisée (client serveur). Elle a plusieurs avantages, parmi lesquels :

  • Allègement du poste de travail client
  • Prise en compte de l'hétérogénéité des plate-formes (serveurs, clients, langage, etc)
  • Amélioration de la sécurité des données en améliorant le lien entre le client et les données
  • Rupture du lien de propriété exclusive entre applications et données; ici la BDD peut facilement être normalisée et intégrée à un entrepôt de données
  • Meilleure répartition de la charge de travail entre les serveurs d'application.
  • Facilitation de l'évolution du code de l'application (et encore plus dans les architectures n-tiers). La séparation en couches permet de faire évoluer plus facilement l'une d'entre elles, et permet aussi de prévoir plus simplement la différence des interfaces du client (smartĥone, PC, etc).

Le concept de l'architecture 3-tiers permet de définir une application logicielle comme un ensemble de 3 couches:

  • La couche présentation, visible de l'utilisateur
  • La couche métier (de traitement des données selon les règles de gestion locales)
  • La couche d'accès aux données

Archi 3tiersb.png

 

Comme avec le modèle OSI, chaque couche ne communique qu'avec les couches qui lui sont adjacentes. Cette communication se fait grâce à des services et des protocoles d'échange précis.

Par exemple, avec une application web et par ordre chronologique:

  • L'application va accéder à la couche données pour aller chercher les informations brutes dans une base de données (Oracle, MySQL, etc)
  • L'application va effectuer des traitements sur ces données en fonction des règles de gestion métier (pour une application de e-commerce, gérer des stockes, par exemple). Cette logique est dite "métier" car elle dépend directement de l'environnement professionnel de l'application.
  • Enfin, la présentation d'écrans/interfaces, résultant du traitement des données, est faite au client. Pour notre interface web, ce sera une page HTML.

Architectures n-tiers

L'architecture 3 tiers, n'est pas parfaite, et il existe d'autres architectures plus fines; cependant la logique reste la même.

Archi ntiers.png

Ces architecture répondent aux pré-requis techniques suivants :

  • Plusieurs serveurs, un client
  • Du réseau entre eux
  • Et des firewalls entre les couches.

 

MySQL

MySQL est un système de gestion de base de données relationnelles (SGBDR) créé en 1995, un des plus utilisés au monde. Son nom vient du prénom de la fille du cocréateur Michael Widenius (My), et SQL (le langage utilisé). Racheté en 2009 par Sun, il a forké et la version libre s'appelle MariaDB. Il a été développé avec un souci de rapidité en lecture; c'est-à-dire qu'il est davantage orienté vers l'utilisation de système déjà en place que vers des systèmes fréquemment mis à jour. Il est libre et open source, payant seulement s'il est associé avec un produit propriétaire (sinon, il est sous licence GPL). Un produit gratuit qui l'utilise devra donc être libre lui aussi. Cependant si il est séparé du produit qui l'utilise, il n'as pas besoin de licence. Il fonctionne sous beaucoup d'OS et de nombreux langages de programmation possèdent une API dédiée.

Il supporte le SQL et le SQL /PSM (Persistent Stored Modules) une extension procédurale. Le PSM permet de créer des requêtes SQL possédant du code procédural (boucles, conditions...).

Il fait partie de LAMP et est souvent utilisé conjointement avec php pour l'hébergement de sites web. Il supporte la nome SQL2, ce qui en fait un SGBD sûr; cependant les fonctionnalités des normes SQL les plus récentes ne sont pas implémentées, ce qui fait que ses requêtes ne sont pas interopérables avec les autres SGBD.

Deux moteurs principaux sont présents : MyISAM et InnoDB. Il est interopérable avec les tableurs grâce à CSV et on peut sauvegarder en xml.

Serveur / clients

Lorsque l'on parle de MySQL en tant que service on rajoute le d de daemon à la fin. MySQLd est donc le service MySQL qui est fourni à des clients.

Le client peut être n'importe quel logiciel compatible :

  • Un client lourd avec UI (MySQLWorkbench par exemple)
  • Un serveur web
  • Un client en ligne de commandes (comme mysql)

"mysql" est un client du service MySQLd, installé en même temps que celui-ci. Il ne faut don pas confondre MySQLd, MySQL, et mysql !

Environnement réseau

Dans une architecture LAMP, la base de données est un élément sensible : Il n'est pas conçu pour se protéger efficacement des attaques, et de plus il contient des données, soit la seule information pérenne dans notre architecture réseau. Il convient donc de le placer en MZ, avec le serveur web en DMZ. On peut cependant mettre le serveur web en MZ lui aussi, en utilisant un reverse proxy.

Dans la suite de ce cours on ne fera pas de reverse proxy, mais ça ne change rien pour notre serveur web.

Les privilèges

En matière de BDD, on parle de privilèges pour parler de droits. Ces privilèges s'appliquent à des comptes : tel compte a le droit de faire telle action, par exemple Justine a le droit de créer des tables sur telle base de données. La maîtrise des privilèges est fondamentale pour la sécurisation des bases de données.

Il est à noter que les comptes dans MySQL n'ont aucun rapport avec les comptes système : même le root de MySQL n'est pas le même root que celui de Linux.

Par rapport aux comptes, on peut définir plusieurs rôles :

  • Celui qui administre (fais des sauvegardes, attribue des droits, gère une réplication, etc) la BDD, le DBA ou l'opérateur (c'est pareil)
  • Celui qui développe une application disposant d'une BDD, le développeur
  • L'application en elle-même, qui accède au serveur de données pour y effectuer des traitements

L'utilisateur n'est pas dans ce modèle car on est sur un système 3-tiers, et la couche de présentation n'accède pas directement à la base de données. Dans le modèle DevOps, l'opérateur et le dev ont tendance à se confondre.

Il existe de nombreux droits dans MySQL; cette quantité permet une gestion très fine des possibilités de chaque utilisateur.

La liste complète des droits est assez longue (cf la doc de MySQL), mais il y'en a quelques uns à connaître :

  • GRANT : Le droit de donner des droits
  • CREATE : Créer des utilisateurs, des bases, des tables, des index
  • DROP Supprimer des utilisateurs, bases, tables, index
  • ALTER Modifier la structure des tables
  • DELETE Supprimer des données
  • INSERT Ajouter des données
  • UPDATE Modifier des données

Ce que l'on pourrait schématiser :

  • Un admin doit pouvoir créer et supprimer des bases de données et des utilisateurs (CREAT, DROP) et donner des droits (GRANT)
  • Un dev doit pouvoir modifier ses BDD (ALTER) mais pas celles des autres et gérer les données (DELETE, INSERT, UPDATE). En réalité il doit aussi pouvoir gérer les index, créer les déclencheurs (TRIGGERS), etc.
  • Une application doit pouvoir gérer les données (DELETE, INSERT, UPDATE) voire créer des tables temporaires (CREATE TEMPORARY TABLES)

La configuration de MySQL

Le fichier de configuration

Il s'agit du fichier my.cnf qui est en général dans /etc/mysql. Rarement modifié, il contient principalement :

  • Le port d'écoute de MySQLd : 3306
  • Différents dossiers utilisés
  • Le nom d'utilisateur des processus de MySQLd (mysql)
  • Des paramètres liées aux perfs (taille mémoire allouée, taille du cache...) ou à la configuration fine de moteurs ISAM, InnoDB
  • Les logs

Concernant les logs, il faut dé-commenter les lignes:

  • general_log_file        = /var/log/mysql/mysql.log
  • general_log             = 1

Ce sont des "tueurs de performance" mais ils sont parfois très utiles. À éviter en prod, mais ponctuellement en zone de test, pourquoi pas.

Ensuite, par défaut, le serveur ne répond qu'aux requêtes venant de sa boucle locale, ce qui est peut être embêtant. On utilise pour cela la directive bind-address.

bind-address

Cette directive sert à restreindre l'accès au service : par défaut elle est à 127.0.0.1, et seule la machine indiquée dans cette directive peut accéder à la base de données. Cela pose problème : notre serveur web, qui est en théorie sur une autre machine, doit pouvoir accéder à la BDD, de même que notre DBA.

Le problème c'est que cette directive ne peut acceuillir qu'une seule adresse : impossible d'y mettre notre serveur ET le poste de travail de notre DBA ! Il faut utiliser 0.0.0.0, qui autorise l'accès à toutes les machines. On a pas de demie-mesure.

MySQL n'est vraiment pas doué pour se protéger.

Les hôtes et leurs comptes

Les hôtes sont les postes (au sens réseau du terme) qui vont se connecter sur le serveur MySQLd. Il faudra donc que bind-address soit ouverte, mais aussi que l'on ait identifié quel hôte sera utilisé par qui (quel droits donner à quel utilisateur). Et il faut bien prendre garde à appliquer le principe de moindre privilège à tous les éléments du système.

Un compte se décompose en deux parties :

  • Le nom de l'utilisateur
  • Le nom ou l'adresse IP de l'hôte depuis lequel il se connecte

Donc par exemple : justine@192.168.1.41. Si je veux que justine puisse se connecter depuis n'importe quelle IP, je peux remplacer son IP par % : justine@%

Par défaut, on a un compte root@127.0.0.1 (voire root@::1 ou root@localhost).

La commande pour créer un compte est:

CREATE USER 'user'@'host' IDENTIFIED BY 'xxxxx'

Commandes de base

  • Créer un compte : CREATE USER 'user'@'host'
  • Se connecter au serveur MySQLd avec le client CLI mysql : mysql -h localhost -u root -p
  • Supprimer un compte : DROP user 'user'@'host'
  • Assigner un mot de passe : SET PASSWORD FOR 'user'@'localhost'=PASSWORD('motdepasse')
  • Donner tous les droits sur la base toto à l'utilisateur justine : GRANT ALL ON *.toto TO 'justine'@'localhost'
  • Donner tous les droits sur toutes les bases avec la possibilité de donner des droits aux autres : GRANT ALL ON *.*TO 'justine'@'localhost' WITH GRANT OPTION
  • Actualiser les droits : FLUSH PRIVILEGES