Guide complet sur l’installation et la configuration d’un serveur mysql sécurisé sur ubuntu 12.04 lts

Ca fait un moment que ça me trottait, voici enfin le guide complet sur la gestion d’un serveur mysql.
Mysql est le système de gestion de base de données le plus communément utilisé dans les CMS tel que WordPress, Joomla ou Drupal. Il est bien plus simple d’installation que ses concurrents (Informix, Oracle …) puisqu’il se trouve dans les dépôts.

Installation

On commence par la mise a jour de l’OS

sudo su
apt-get update
apt-get upgrade

Puis on installe le paquet mysql-server qui a pas mal de dépendances notamment mysql-client pour pouvoir communiquer avec le serveur. Il vous faudra choisir un mot de passe pour l’utilisateur root, qui est a ne pas confondre avec le compte root de l’OS.

apt-get install mysql-server

Une bonne pratique est de sécuriser le serveur en supprimant l’accès au compte root et de supprimer comptes anonymes et base de test.

mysql_secure_installation

Configuration

Par défaut mysql-server n’est joignable que sur la machine elle même, on va donc changer le comportement pour permettre l’accès aux autres machines d’un réseau en commentant la ligne de bind-address

vim /etc/mysql/my.cnf
#bind-address           = 127.0.0.1

Et on peut vérifier l’état d’écoute du port

netstat -tnlpv | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      12951/mysqld    

Mise en place des bases

Création d’une base

Toutes les opérations administratives se font avec le compte root de mysql.

mysqladmin -u root -p create MABASE

Attribution des droits d’un user pour la base

mysql -u root -p
GRANT ALL ON MABASE.* TO MONUSER@'%' IDENTIFIED BY 'MONPASSWORD';
GRANT ALL ON MABASE.* TO MONUSER@localhost IDENTIFIED BY 'MONPASSWORD';
FLUSH PRIVILEGES;

Quelques explications :

  • Les 2 premières lignes paraissent les mêmes, mais l’endroit d’ou on se connecte diffère
  • Le % représente n’importe quel IP, on pourrait tout aussi bien mettre une IP particulière
  • Localhost indique que l’on peut se connecter à MABASE avec MONUSER sur le serveur mysql seulement
  • La dernière ligne indique un rechargement des droits ce qui aura comme conséquence de rendre effectif nos changements

On sort de la console mysql en tapant soit exit soit en utilisant le combo Ctrl+d .

Administration

Backup

Rien de plus simple en utilisant la commance mysqldump

mysqldump -u MONUSER -p MABASE > MABASE.sql

Ou en y rajoutant le drop des anciennes tables avant de restaurer.

mysqldump --add-drop-table -u MONUSER -p MABASE > MABASE.sql

Restore

Le restore d’une base est également aisé.

mysql -u MONUSER -p MABASE < MABASE.sql

Si vous avez installé phpmyadmin, il peut être nécessaire de reconfigurer le paquet.

dpkg-reconfigure phpmyadmin

Check, Repair , Optimize

Il peut arriver que des bases soient corrompues ou que le requetage soit lent. Le binaire mysqlcheck permet de faire le boulot. Ici pour toutes les bases.

mysqlcheck -u root -p --auto-repair --check --optimize --all-databases

Troubleshooting

Host is blocked because of many connection errors

Il peut arriver qu'une machine voit son accès au serveur mysql bloqué pour diverses raisons :

  • Une tentative de hack
  • Une script de monitoring foireux
  • Un plugin mal écrit

Dans ce cas un message est visible dans les logs

Host 'xxxxxxxxxx' is blocked because of many connection errors.

On restaurera via cette commande

mysqladmin -u root -p flush-hosts

Le nombre de connexion en défaut acceptables est par défaut 10. On peut verifier la valeur via :

mysql -u root -p 
SHOW VARIABLES;

Ce qui devrait afficher :

| max_connect_errors                                | 10  

Pour modifier ce comportement il faut lancer mysql avec cet argument pour le monter à 100 :

mysqld 	--max_connect_errors=100

mysql.proc is corrupted

En cas de migration de serveur ou d'update de mysql il m'est déjà arrivé d'avoir ce message d'erreur :

Cannot load from mysql.proc. The table is probably corrupted

Dans ce cas pas de souci il suffit de lancer la commande

mysql_upgrade -u root -p

Il se peut également que cela ne suffise pas dans ce cas on rajoute un petit --force

mysql_upgrade --force -u root -p

Clients GUI

Le client le plus connu est phpmyadmin, mais il ne me convient plus car il nécessite une installation et une configuration.
Sinon il y a encore plus gros et avec plus de fonctionnalites c'est Mysql Workbench qui permet en plus de migrer des bases, de faire du design de bases.
Pour ma part je préfère largement Adminer qui est portable en tient en un seul fichier php. Beaucoup plus facile a déployer.

Sécuriser Ubuntu avec LMD : Linux Malware Detect

Au détour de mes recherches, je suis tombé sur Linux Malware Detect qui est un utilitaire pour scanner votre serveur à la recherche de vilaines bébêtes. Il peut utiliser ClamAV comme moteur de scan meme s’il utilise sa propre bibliothèque de signature. Voila le guide d’installation et de configuration.

Installation

Pour l’installation rien de plus simple :

wget www.rfxn.com/downloads/maldetect-current.tar.gz
tar xvfvz maldetect-current.tar.gz
cd maldetect-*
./install.sh

Mettre à jour le script :

maldet -u

Configuration

Un configuration plus avancée peut être faite dans le fichier de configuration comme :

  • Gestion des envoies d’email
  • Activation de la quarantaine
  • Permission aux non root de lancer un scanner

Le tout se fait ici :

vim  /usr/local/maldetect/conf.maldet 

Utilisation

Les scans de LMD permettent de :

  • Monitorer l’activité des users
  • Scanner des paths spécifiques
  • D’utiliser les meta caracteres (le ? remplace le *)
maldet --monitor users
maldet -a /home/user/dir
maldet -a /home/?/

Une autre option intéressante est la soumission d’un fichier a rfxn :

maldet -a /home/user/suspect_file