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

Appeler un script shell avec mysql en cli sur ubuntu 12.04 en 64 bits avec lib_mysqludf_sys

Au programme aujourd’hui, une fonction de mysql que je n’ai jamais encore touché, les UDF (User Define Functions). Cela permet de rajouter des fonctions disponibles dans les commandes mysql, et précisément dans mon cas de faire un appel système à partir d’une commande mysql.

Pour certaines raisons comme la sécurité, le core de mysql ne permet pas de faire une telle opération.

Heureusement il existe une bibliothèque de plusieurs udf sur www.mysqludf.org avec la librairie qui nous intéresse.

En prenant une Ubuntu server 12.04 LTS en 64bits vous serez surement confronté à ces messages d’erreur :

Can't open shared library 'lib_mysqludf_sys.so' (errno: 0 /usr/lib/mysql/plugin/lib_mysqludf_sys.so: cannot open shared object file
ERROR 1126 (HY000): Can't open shared library 'lib_mysqludf_sys.so' (errno: 0 /usr/lib/mysql/plugin/lib_mysqludf_sys.so: wrong ELF class: ELFCLASS32)

J’ai donc forker le projet github de Jasny pour le rendre compatible avec une installation de mysql avec apt-get sur une ubuntu 64bits.

Voila les grandes lignes pour l’installation :

apt-get update
apt-get install make gcc libmysqlclient15-dev
wget https://github.com/zephilou/lib_mysqludf_sys/archive/master.zip
unzip master.zip
cd lib_mysqludf_sys-master/
./install.sh

Ce qui devrait donner :

Compiling the MySQL UDF
gcc -m64 -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/mysql/plugin/lib_mysqludf_sys.so 
MySQL UDF compiled successfully
Please provide your MySQL root password
Enter password: 
MySQL UDF installed successfully

A partir de là un petit test :

mysql> select sys_exec('ls / > /tmp/sortie.txt');
ERROR 1305 (42000): FUNCTION sys_exec does not exist

Ce qui est plutôt normal puisque mysqld n’a pas été redémarré.

/etc/init.d/mysql restart
mysql -u root -p
mysql> select sys_exec('ls / > /tmp/sortie.txt');
+---------------------------------+
| sys_exec('ls / > /tmp/sortie.txt') |
+---------------------------------+
|                           32512 |
+-------------------------------

On peut ce dire que tout roule mais en fait non, le fichier n’a pas été crée :

ls: cannot access /tmp/sortie.txt: No such file or directory

En fait il s’agit de l’action de apparmor sur le processus mysql, et pour s’en convaincre il suffit de le désactiver.

mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/.usr.sbin.mysqld
/etc/init.d/apparmor restart
/etc/init.d/apparmor status

On recommence donc :

mysql> select sys_exec('ls / > /tmp/sortie.txt');
+---------------------------------+
| sys_exec('ls / > /tmp/sortie.txt') |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)
ls -l /tmp/sortie.txt 
-rw-rw---- 1 mysql mysql 129 Sep 25 13:17 /tmp/sortie.txt

En conclusion, même si les fonctionnalités de lib_mysqludf_sys sont sympathiques, cela pose 2 réels problèmes de sécurité :

  • La désactivation de apparmor n’est pas vraiment une bonne idée
  • En cas d’injection Isql sur votre application les dégâts sont énormes puisque cela confère un accès système

Bonne fête à tous les sysadmins

En ce jour du 26 juillet c’est la fête aux sysadmins !!!
Le site officiel SysAdminDay célèbre aujourd’hui le 14eme jour de l’appréciation des sysadmins et pour la peine voila le message de constat :

Let’s face it, System Administrators get no respect 364 days a year. This is the day that all fellow System Administrators across the globe, will be showered with expensive sports cars and large piles of cash in appreciation of their diligent work. But seriously, we are asking for a nice token gift and some public acknowledgement. It’s the least you could do.

Consider all the daunting tasks and long hours (weekends too.) Let’s be honest, sometimes we don’t know our System Administrators as well as they know us. Remember this is one day to recognize your System Administrator for their workplace contributions and to promote professional excellence. Thank them for all the things they do for you and your business.

Alors même si ce n’est qu’aujourd’hui félicitez votre sysadmin qui prends soin de votre IT toute l’année :)

Découvrez les joies du sysadmin

Piloter son android avec Raspberry Pi et adb

Une bonne nouvelle, grâce a AdamOutler du forum XDA il est possible d’utiliser le Android Debug Bridge (adb) sur le Raspberry Pi très facilement.

Voila comment procéder :

Récupération de l’archive

apt-get install p7zip
wget 'http://forum.xda-developers.com/attachment.php?attachmentid=1392336&d=1349930509' -O adb.7z
7zr x adb.7z 
cp mypart/adb /usr/local/bin/

Et on test le binaire :

adb version
Android Debug Bridge version 1.0.29

Communication avec le smartphone

* En premier lieu il faut autoriser le debugage Android sur le smartphone
Paramètres / Options Devellopeur / Debogage Android

adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached 
SH1BVTRXXX	device

Installation des applications par défaut sur la carte SD

* On vérifie le setting actuel [0/auto] [1/internal] [2/external]

adb shell pm getInstallLocation
0[auto]

* On force le setting a external (si l’application est compatible)

adb shell pm setInstallLocation 2

Avoir un shell sur Android

adb shell
shell@android:/ $ ls   
acct
app-cache
cache
config
d
data
default.prop
dev
etc
init
init.cm.rc
init.goldfish.rc
init.marvel.rc
init.msm7x27.usb.rc
init.rc
init.trace.rc
init.usb.rc
mnt
proc
root
sbin
sd-ext
sdcard
storage
sys
system
ueventd.goldfish.rc
ueventd.marvel.rc
ueventd.rc
vendor

Transfert de fichiers sur/de la carte SD

* Download

adb pull /mnt/sdcard/BLU\ MOD\ V1.1.zip /root/
1544 KB/s (149377165 bytes in 94.433s)

* Upload

adb push /home/pi/test.txt /mnt/sdcard/