Aller au contenu | Aller au menu | Aller à la recherche

Another Home Page Blog

lundi, août 25 2014

CentOS Dojo Paris

Version en français plus bas.

For once, this blog post is available both in french and in english. Today I attended the first CentOS Dojo in Paris. I also had the chance to be one of the speakers, wich was a very interesting experience : even if I am almost used to talk to a crowd, it was a long time since I used a microphone (more than 10 years if I remember correctly). Moreover, it was my first talk in english, and the demo I planned failed. Since all the talks of the day were recorded, I'm not going to tell you who talked about what. You can go to my Twitter account or search tweets with the hashtag #centosdojo. However I can't help thinking again about my talk and the problem in my demo. My frustration is compensated by the fact that everyone was really nice to me. Like I tweeted earlier, I learned the lesson and won't try another live demo soon. While waiting for the recordings to be online, you can download the slides, in french or in english. Many thanks to Zenika, Normation and InfoQ for sponsoring the event !

Pour une fois, ce billet est en français et en anglais. Aujourd'hui j'ai assisté au premier CentOS Dojo à Paris. J'ai aussi eu la chance d'être l'un des intervenants, ce qui fut une expérience très intéressante : même si j'ai à peu près l'habitude de parler en public, je n'ai pas utilisé de micro depuis très longtemps (plus de 10 ans si je me souviens bien). De plus, cela a été ma première présentation en anglais, et la démo que j'avais prévue n'a pas fonctionné. Puisque toutes les présentations du jour ont été enregistrées, je ne vais pas vous raconter qui a parlé de quoi. Vous pouvez simplement aller voir sur mon compte Twitter ou rechercher les tweets ayant pour hashtag #centosdojo. Cependant, je ne peux m'empêcher de penser à ma présentation et au problème lors de ma démo. Ma frustration est compensée par le fait que tout le monde a été sympa avec moi. Comme je l'ai tweeté plus tôt, j'ai compris la leçon et je ne vais pas tenter des démonstrations en direct. En attendant que les enregistrements soient en ligne, vous pouvez télécharger les slides, en français ou en anglais. Merci beaucoup à Zenika, Normation et InfoQ d'avoir sponsorisé l'évènement !

lundi, septembre 2 2013

obtenir facilement les propriétés d'un fichier avec stat

Généralement, quand on cherche à obtenir les propriétés d'un fichier, on utilise la commande ls, avec l'argument -l, ce qui donne un résultat proche de ceci :

nils@orgrimmar:~$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 août  4 11:21 /dev/null

C'est bien gentil, mais si on ne souhaite avoir comme information que le propriétaire d'un fichier, ça fait beaucoup de choses à filtrer. Filtrer la sortie de ls avec awk n'est pas le truc le plus méchant, mais je trouve que c'est comme utiliser un fusil à pompe pour se débarrasser d'une mouche. On est dans le monde UNIX, là où il y a des programmes qui ne font qu'une seule tâche, mais qui la font bien.

Et l'outil qui fait cela se nomme tout simplement stat, et est disponible sur de nombreux systèmes. Sous RHEL/CentOS, il est inclus dans le paquet coreutils, et il est installé avec le système de base dans NetBSD. Là où c'est par contre un peu moins drôle, c'est que l'implémentation Linux diffère de l'implémentation BSD.

Exemple, sous Linux :

nils@orgrimmar:~$ stat -c %U /dev/null 
root

Et ensuite sous NetBSD :

nils@dev:~$ stat -c %U /dev/null 
stat: unknown option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]

Allez, on recommence avec les bonnes options :

nils@dev:~$ stat -f %Su /dev/null 
root

Ici, j'ai cherché à afficher le nom de l'utilisateur propriétaire du fichier, mais d'autres propriétés sont disponibles, comme le nom du groupe, les UID et GID propriétaires, les droits, la taille, les dates de création et de modification, le nom du fichier... D'ailleurs, lancé sans autre argument que le nom du fichier, stat propose bon nombre d'informations.

lundi, octobre 1 2012

Nombre d'occurrences dans un fichier - remix

Je détaillais dans un billet écrit il y a déjà un sacré bout de temps comment obtenir une sorte de top 10 des adresses IP effectuant le plus de requêtes dans un fichier de log Apache. J'ai décidé de revenir dessus, et de faire quelques déclinaisons de ce one-liner selon les recherches. Attention si vous voulez copier-coller ces exemples, ils ont été réalisés sous NetBSD, et la commande sort n'a pas les mêmes options. Grosso modo pour le moment, j'ai vu que là où on écrit sort -g sous GNU/Linux, il faut écrire sort -n sous NetBSD. J'ai aussi décidé de me limiter à un top 5 dans l'affichage, afin d'éviter un billet trop long.

Revenons donc d'abord sur le one-liner de base, les IP qui font le plus de requêtes, avec à gauche, l'adresse IP, et à droite le nombre de hits :

root@dev:/var/log/httpd# awk '{frequencies[$1]++;} END {for (field in frequencies) printf "%s\t%d\n" , field , frequencies[field];}' < ./access.log | sort -nr -k 2,2 | head -5
81.X.Y.Z    6414
208.F.B.I 1578
178.K.G.B  1301
67.D.S.T  1179
77.C.I.A     1157

Ensuite, effectuons pareil mais sur les URLs visitées, toujours avec le nombre de hits à droite :

root@dev:/var/log/httpd# awk '{frequencies[$7]++;} END {for (field in frequencies) printf "%s\t%d\n" , field , frequencies[field];}' < ./access.log | sort -nr -k 2,2 | head -5
/post/2008/05/17/installation-de-phpmyadmin-sur-CentOS-5        7787
/post/2008/05/24/Installation-de-mod_gnutls-sur-CentOS-5        4010
/post/2008/06/20/Utilisateurs-virtuels-sous-CentOS-5-avec-base-de-donnees-MySQL 1910
/post/2007/11/28/Installation-et-configuration-dun-serveur-dedie-OpenArena-071  1284
/post/2009/11/09/Utilisation-transparente-d-une-passerelle-SSH  1266

Comme il ne s'agit que de modifier le numéro du champ, on peut aussi voir les codes de retour HTTP les plus obtenus :

root@dev:/var/log/httpd# awk '{frequencies[$9]++;} END {for (field in frequencies) printf "%s\t%d\n" , field , frequencies[field];}' < ./access.log | sort -nr -k 2,2 | head -5
200     57019
304     6156
404     1797
500     114
403     20

On peut ensuite aller chercher avec grep les pages causant des erreurs 500 ou 404.

Toujours avec la même facilité (un simple numéro de champ à modifier), on peut afficher les referers qui amènent le plus de hits :

root@dev:/var/log/httpd# awk '{frequencies[$11]++;} END {for (field in frequencies) printf "%s\t%d\n" , field , frequencies[field];}' < ./access.log | sort -nr -k 2,2 | head -5
"-"     44306
"http://blog.anotherhomepage.org/post/2008/05/17/installation-de-phpmyadmin-sur-CentOS-5"       3443
"http://blog.anotherhomepage.org/post/2008/06/20/Utilisateurs-virtuels-sous-CentOS-5-avec-base-de-donnees-MySQL"        686
"http://blog.anotherhomepage.org/post/2009/11/09/Utilisation-transparente-d-une-passerelle-SSH" 552
"http://www.google.fr/search?q=phpmyadmin+centos&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:fr:official&client=firefox-a"   401

On remarque que beaucoup n'ont pas de referer, mais il est probable que ce soient des hits sur le flux RSS. On remarque aussi que j'ai beaucoup de referers de mon propre site, il me suffit de les filtrer si je ne veux pas les afficher. Afin de rendre le traitement plus rapide, je décide de mettre la commande grep en premier dans mon traitement :

root@dev:/var/log/httpd# grep -v "blog.anotherhomepage.org" access.log | awk '{frequencies[$11]++;} END {for (field in frequencies) printf "%s\t%d\n" , field , frequencies[field];}' | sort -nr -k 2,2 | head -5
"-"     44306
"http://www.google.fr/search?q=phpmyadmin+centos&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:fr:official&client=firefox-a"   401
"http://www.google.fr/search?q=centos+phpmyadmin&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:fr:official&client=firefox-a"   166
"http://forum.hardware.fr/hfr/OSAlternatifs/Installation/resolu-centos-phpmyadmin-sujet_70143_1.htm"    121
"http://www.google.fr/" 77

Reprenons notre affichage des URLs les plus visitées, mais cette fois prenons en compte les méthodes (GET, HEAD, POST) et la version du protocole HTTP :

root@dev:/var/log/httpd# awk -F "\"" '{frequencies[$2]++;} END {for (field in frequencies) printf "%s\t%d\n" , field , frequencies[field];}' < ./access.log | sort -nr -k 4| head -5
GET /post/2008/05/17/installation-de-phpmyadmin-sur-CentOS-5 HTTP/1.1   4266
GET /post/2008/05/17/installation-de-phpmyadmin-sur-CentOS-5 HTTP/1.0   3521
GET /post/2008/05/24/Installation-de-mod_gnutls-sur-CentOS-5 HTTP/1.1   2181
GET /post/2008/05/24/Installation-de-mod_gnutls-sur-CentOS-5 HTTP/1.0   1829
GET /post/2008/06/20/Utilisateurs-virtuels-sous-CentOS-5-avec-base-de-donnees-MySQL HTTP/1.0    1193

On note ici l'utilisation de l'option "-F" de awk pour changer le motif du séparateur de champ, ce qui me permet d'avoir des champs avec espace.

Enfin, dernier exemple, trions maintenant les User-Agents :

root@dev:/var/log/httpd# awk -F "\"" '{frequencies[$6]++;} END {for (field in frequencies) printf "%d\t%s\n" , frequencies[field], field;}' < ./access.log | sort -nr | head -5
10539   Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)
6493    Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320; SPV M700; OpVer 19.123.2.733) OrangeBot-Mobile 2008.0 (mobilesearch.support@orange-ftgroup.com)
4188    Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)
3269    msnbot/2.0b (+http://search.msn.com/msnbot.htm)
3017    Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

J'ai décidé cette fois-ci d'afficher le nombre d'occurrences à gauche, car le nombre de champs (séparés par un espace) n'est plus fixe dans le cas des User-Agents. Mais au moment d'écrire cette phrase, j'ai de nouveau parcouru la page de manuel de sort et j'ai pu voir qu'il est possible de spécifier le séparateur de champ (option -t). J'ai utilisé le caractère $ pour séparer le nombre d'occurrences du libellé du User-Agent, suivi de 'tr' pour le remplacer par une tabulation :

awk -F "\"" '{frequencies[$6]++;} END {for (field in frequencies) printf "%s$%d\n" , field , frequencies[field];}' < ./access.log | sort -nr -t$ -k 2,2| tr $ "\t" | head -5
Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)  10539
Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320; SPV M700; OpVer 19.123.2.733) OrangeBot-Mobile 2008.0 (mobilesearch.support@orange-ftgroup.com)        6493
Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp) 4188
msnbot/2.0b (+http://search.msn.com/msnbot.htm) 3269
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)        3017

Le choix du caractère de séparateur de champ est discutable, mais il ne change pas qu'après réflexion, l'affichage de la commande précédente me semble plus lisible. Et je pense qu'afficher le nombre d'occurences en permier sera plus lisible dans d'autres cas, comme le referer ou l'URL.

lundi, octobre 17 2011

Installation de phpMyAdmin sur CentOS 6 - suite

Résumé de l'épisode précédent

Lors de mon précédent billet sur l'installation et la configuration de phpMyAdmin sur CentOS 6, nous avions obtenu une installation fonctionnelle, mais perfectible. Nous allons voir ensemble comment rendre l'installation plus confortable et tenter de la sécuriser un peu.

Authentification par cookie

Lors de la connexion à phpMyAdmin, c'est une authentification de type HTTP qui est envoyée. Sachant que nous n'avons pas encore activé HTTPS, les identifiants circulent en clair sur le réseau. De plus, à chaque fois qu'on ferme la fenêtre ou l'onglet du navigateur, il faut s'authentifier à nouveau. Le cookie devrait donc aider. Pour activer ce mécanisme, éditons le fichier de configuration de phpMyAdmin :

[root@crashtest ~]# vi /etc/phpMyAdmin/config.inc.php

A la ligne 41, on trouvera l'expression suivante :

$cfg['Servers'][$i]['auth_type']     = 'http';      // Authentication method (config, http or cookie based)?

Il suffit donc de remplacer 'http' par 'cookie' puis d'enregistrer le fichier. Le paramètre 'config' est à manipuler avec la plus grande précaution, et nécessite de renseigner les identifiants dans les champs suivants, ce qui n'est pas du tout sécurisé à mon sens. Une fois la modification effectuée, une (jolie ?) page d'identification devrait apparaître en lieu et place de l'horrible notification du navigateur demandant le login et le mot de passe. En prime, il est possible de choisir la langue :-)

Maintenant, un message assez étrange risque d'apparaître lors de vos prochaines connexions, en bas de l'interface de phpMyAdmin : Vous devez ajouter dans le fichier de configuration une phrase de passe secrète (blowfish_secret). Allons donc éditer de nouveau le fichier de configuration, à la ligne 14 :

$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

Et entre les guillemets simple, on insère une phrase de passe. Quelques exemples :

  • je vois un gnou faire de la bicyclette
  • je ne sais pas programmer en python (ou perl, java, c, ruby, ce que vous voulez)
  • aieruhgpauOUGYVaerhg 07856qorieghg (oui, l'aléatoire fonctionne aussi)

Le but n'est pas de fournir une phrase intelligible ou facilement mémorisable, mais une suite de caractère assez longue pour chiffrer le mot de passe dans le cookie. Il ne sera pas nécessaire de réutiliser cette phrase de passe.

HTTPS

L'authentification par cookie apporte un mieux, mais celui-ci peut toujours être intercepté et rejoué par quelqu'un de malintentionné. De plus l'intercepteur pourra examiner le traffic et en retirer les commandes jouées, ou pourquoi pas le contenu des base de données. L'un des moyens d'empêcher cette interception est de chiffrer le trafic entre la machine cliente et le serveur hébergeant phpMyAdmin et MySQL. Pour cela nous allons activer mod_ssl dans Apache afin de naviguer en HTTPS dans phpMyAdmin.

Installons donc mod_ssl :

[root@crashtest ~]# yum install mod_ssl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: mirrors.ircam.fr
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mod_ssl.x86_64 1:2.2.15-5.el6.centos set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package        Arch          Version                         Repository   Size
================================================================================
Installing:
 mod_ssl        x86_64        1:2.2.15-5.el6.centos           base         85 k

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 85 k
Installed size: 183 k
Is this ok [y/N]: y
Downloading Packages:

mod_ssl-2.2.15-5.el6.centos.x86_64.rpm                   |  85 kB     00:00

Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction

Installing     : 1:mod_ssl-2.2.15-5.el6.centos.x86_64                     1/1

Installed:
  mod_ssl.x86_64 1:2.2.15-5.el6.centos

Complete!

Relançons Apache :

[root@crashtest ~]# service httpd restart
Arrêt de httpd :                                           [  OK  ]
Démarrage de httpd :                                       [  OK  ]

Et rendons-nous sur phpMyAdmin, en HTTPS. Dans mon cas l'url est https://crashtest/phpmyadmin/ . Un message du navigateur signale alors que le certificat utilisé pour se connecter est auto-signé.

Il est courant d'accepter le certificat et de le mémoriser : à plus forte raison s'il s'agit d'une machine de tests ou de développement, il suffit de s'assurer que le certificat ne changera pas en le mémorisant dans le navigateur; si jamais ce message devait à nouveau s'afficher, soit vous avez réinstallé le serveur ou changé les certificats, soit un petit malin tente une attaque de type "homme du milieu" (man in the middle en anglais).

Il est aussi possible d'accepter le certificat sans pour autant le mémoriser, et (faire) créer les certificats adéquats, selon votre type d'organisation ; les grosses entreprises possèdent leur propre autorité de certification et la déploient sur leurs postes de travail. Si votre serveur est directement accessible depuis Internet, de nombreux prestataires proposent, gratuitement ou non, de générer un certificat qu'il vous faudra ensuite installer en lieu et place de ceux par défaut. Cela peut vous éviter de vérifier manuellement sur chaque nouvelle machine cliente qu'il s'agit du bon certificat.

La mise en œuvre détaillée d'un serveur HTTPS et d'une infrastructure de gestion de certificats SSL d'entreprise (appelée aussi PKI de l'anglais Public Key Infrastructure) ne fait pas partie des objectifs de ce billet, par conséquent elle est laissée en exercice au lecteur.

Notre serveur accepte donc les connexions HTTP en clair et les connexions HTTPS chiffrées.

Pare-feu

En plus de chiffrer des connexions, il est possible de les filtrer. Dans le précédent billet, nous avons vu qu'Apache peut interdire ou accepter certains clients suivant leur adresse IP. Il est possible, avec un pare-feu (firewall en anglais), de filtrer les connexions Apache comme MySQL ou SSH et d'effectuer un contrôle plus fin sur les connexions.

Sur un système GNU/Linux, en particulier CentOS, le pare-feu de référence est Netfilter (qui fournit entre autres la commande iptables). La plupart des autres projets de pare-feu pour GNU/Linux sont généralement des surcouches à Netfilter.

Attention ! il est très facile, lorsqu'on manipule des règles de filtrage de connexions réseau, de scier la branche sur laquelle on est assis. Si bloquer accidentellement les connexions réseau lorsqu'on est devant la machine n'est pas bien grave, couper la connexion SSH qu'on utilise oblige à se déplacer, couper le pare-feu une fois devant la machine, puis repartir à son poste et se reconnecter.

Pour éviter ce genre de désagrément, il est possible de planifier une tâche qui coupe le firewall, par exemple toutes les 10 minutes. Ainsi, dès qu'on se rend compte que la machine ne répond plus à rien sur le réseau, il ne reste qu'à attendre 10 minutes tout au plus pour que la machine soit à nouveau accessible. L'inconvénient est qu'il faut réussir à faire ses modifications en moins de 10 minutes ! Nous allons donc éditer la crontab :

[root@crashtest ~]# crontab -e

Il est fort probable qu'elle soit vide, puisqu'il s'agit de la crontab de root et que la machine est fraîchement installée. Ajoutons la ligne suivante :

*/10    *       *       *       *       /etc/init.d/iptables stop > /dev/null 2>&1

Et voilà ! Toutes les 10 minutes, le pare-feu sera désactivé. Le temps d'effectuer une modification, et de la valider. Attention cependant, une fois que les changements seront validés, penser à effacer cette ligne, ou à la commenter. Pour plus d'information : la page de manuel. Une fois le garde-fou mis en place, passons aux choses sérieuses : définir les règles de filtrage à mettre en place, puis les mettre en place.

Afin de rester dans les clous de la distribution, nous n'allons pas créer un script de pare-feu personnalisé, mais utiliser le fichier déjà en place pour sauvegarder les règles. Ce fichier est /etc/sysconfig/iptables, mais comme indiqué en anglais en tête de ce fichier, il n'est pas recommandé de l'éditer manuellement. Nous allons donc lancer le pare-feu, ajouter des règles avec la commande iptables, vérifier leur bon fonctionnement, les sauvegarder, et vérifier la sauvegarde.

Lancement du pare-feu :

[root@crashtest ~]# service iptables start
iptables : Application des règles du pare-feu :            [  OK  ]

Vérification des règles actuellement activées :

[root@crashtest ~]# service iptables status
Table : filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:25
6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Et si on tente de se connecter à phpMyAdmin, cela ne fonctionne plus. Il faut donc accepter les connexions vers le port 80 (HTTP) et 443 (HTTPS). Nous allons insérer dans la chaine INPUT avant la règle numéro 5 (celle qui accepte le port 25 tcp) une règle acceptant le port 80 :

[root@crashtest ~]# iptables -I INPUT 5 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

Si on se connecte à phpMyAdmin, cela fonctionne en HTTP, mais pas en HTTPS. Continuons, cette fois insérons notre règle avant la numéro 6 (décalage oblige du fait de notre insertion précédente) :

[root@crashtest ~]# iptables -I INPUT 6 -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

Voilà, maintenant nous accédons à phpMyAdmin en HTTPS. Vérifions les règles en mémoire pour comparaison avec la situation précédente :

[root@crashtest ~]# service iptables status
Table : filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:25
8    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

A noter que la commande iptables -L -n donne le même résultat, et pourrait servir sur d'autres distributions Linux. A présent, sauvegardons notre configuration :

[root@crashtest ~]# service iptables save
iptables : Sauvegarde des règles du pare-feu dans /etc/sysconfig/iptables : [  OK  ]

Vérifions la sauvegarde :

[root@crashtest ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Thu Sep 22 20:34:19 2011
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1118:858094]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Thu Sep 22 20:34:19 2011

On peut donc voir que les règles acceptant les ports 80 sont bien sauvegardées. La règle autorisant le port 25 n'est pas utile, elle fut ajoutée en exemple lors du billet sur une installation minimaliste de CentOS 6. Le retrait de cette règle est laissé en exercice au lecteur ;-)

Une fois les règles en place donnant satisfaction, il faut penser à retirer le garde-fou en éditant la crontab : on peut alors supprimer la ligne désactivant iptables, ou la mettre en commentaire en place le caractère "#" devant. Après le retrait du garde-fou, on peut activer le pare-feu au démarrage :

[root@crashtest ~]# chkconfig --list iptables
iptables        0:arrêt 1:arrêt 2:arrêt 3:arrêt 4:arrêt 5:arrêt 6:arrêt
[root@crashtest ~]# chkconfig iptables on
[root@crashtest ~]# chkconfig --list iptables
iptables        0:arrêt 1:arrêt 2:marche        3:marche        4:marche        5:marche        6:arrêt

Base de données phpMyAdmin

phpMyAdmin est maintenant un outil complet avec de nombreux paramètres. Certains peuvent être utilisés via le fichier de configuration, mais pour d'autres, une base de données est nécessaire. D'ailleurs, selon le paquet phpMyAdmin installé (une version à jour est arrivée pendant l'écriture des deux billets), vous pouvez avoir le message suivant en bas de l'interface : Le stockage de configurations phpMyAdmin n'est pas complètement configuré, certaines fonctionnalités ont été désactivée. Pour en connaître la raison, cliquez ici. Dans la version plus récente, cet avertissement a été retiré.

Utilisons phpMyAdmin pour créer un nouvel utilisateur dit de contrôle (via l'onglet Privilèges), et appelons-le tout simplement phpmyadmin. Le paramètre client est Local, et on génèrera le mot de passe aléatoirement. Pensez à copier ce mot de passe ailleurs, on va en avoir besoin un peu plus tard. Toujours dans l'interface de création de l'utilisateur, cochons l'option Créer une base portant son nom et donner à cet utilisateur tous les privilèges sur cette base. Enfin, cliquons sur le bouton du bas : Créer un compte d'utilisateur. Une autre manipulation est nécessaire car l'utilisateur de contrôle a besoin d'un peu plus de droits. Pour aller plus vite, rechargeons les privilèges puis cliquons sur l'onglet SQL et entrons le texte suivant dans le champ (j'espère que vous avez bien copié le mot de passe généré de tout à l'heure ;-)):

GRANT USAGE ON mysql.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY 'motdepassealeatoire';
GRANT SELECT (
    Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv,
    Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv,
    File_priv, Grant_priv, References_priv, Index_priv, Alter_priv,
    Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv,
    Execute_priv, Repl_slave_priv, Repl_client_priv
    ) ON mysql.user TO 'phpmyadmin'@'localhost';
GRANT SELECT ON mysql.db TO 'phpmyadmin'@'localhost';
GRANT SELECT ON mysql.host TO 'phpmyadmin'@'localhost';
GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv)
    ON mysql.tables_priv TO 'phpmyadmin'@'localhost';

Cliquons sur Exécuter et on nous signale que MySQL a retourné des résultat vides. Pensons à recharger les privilèges (dans l'onglet Privilèges Encore une chose. Il nous faut peupler la base de données créée pour phpMyAdmin. Pour cela, revenons dans le shell de notre serveur et utilisons le fichier SQL fourni par phpMyAdmin :

[root@crashtest ~]# mysql -u root -p < /usr/share/phpMyAdmin/examples/create_tables.sql

A noter que sur d'anciennes versions, le répertoire est /usr/share/phpMyAdmin/scripts/create_tables.sql . Maintenant éditons à nouveau le fichier de configuration de phpMyAdmin :

[root@crashtest ~]# vi /etc/phpMyAdmin/config.inc.php

Et renseignons aux lignes 34 et 36 l'utilisateur de contrôle et son mot de passe :

$cfg['Servers'][$i]['controluser']   = 'phpmyadmin';          // MySQL control user settings
                                                    // (this user must have read-only
$cfg['Servers'][$i]['controlpass']   = 'motdepassealeatoire';          // access to the "mysql/user"
                                                    // and "mysql/db" tables).
                                                    // The controluser is also
                                                    // used for all relational
                                                    // features (pmadb)

Une fois le fichier enregistré et déconnecté puis reconnecté à phpMyAdmin, nous pouvons utiliser toutes les possibilités de cet outil !

SELinux

J'avoue ne pas être familier avec SELinux. Je me suis contenté d'éditer /etc/sysconfig/selinux et de passer le paramètre SELINUX à enforcing. Un reboot plus tard, SELinux est activé, httpd, mysqld sont lancés, et phpMyAdmin est accessible !

lundi, octobre 3 2011

Installation de phpMyAdmin sur CentOS 6

Préambule

Il y a un peu plus de deux ans, j'écrivais ce qui reste (à l'écriture de ce billet) le contenu phare de ce blog : installation de phpMyAdmin sur CentOS 5. C'est bien simple, c'est la raison pour laquelle une grande majorité des visiteurs atterrit ici. Ca en devient presque frustrant, d'ailleurs ;-) Bref, toujours est-il que depuis juillet, CentOS 6 est (enfin) disponible , il est donc temps de remettre ce petit tutoriel au goût du jour !

Objectifs : installer et configurer un serveur de base de données MySQL avec une interface web d'administration pour pouvoir ensuite faire du développement ou installer facilement d'autres outils web utilisant ce type de base de données, comme un CMS ou un moteur de blog.

Outils à disposition : que du libre, bien entendu ! Le système d'exploitation est CentOS 6, le serveur de base de données MySQL est disponible dans les dépôts de cette distribution, ainsi que le serveur web, Apache HTTP Server. Le logiciel d'administration web est le très connu phpMyAdmin, qu'on installera (avec ses prérequis) depuis le dépôt EPEL. On supposera donc que la machine a accès à Internet (pour accéder aux dépôts).

Je ne vais pas décrire tout depuis l'installation de l'OS, mais pour s'assurer que les bases sont saines, j'ai effectué une installation ressemblant comme deux gouttes d'eau à mon billet précédent : installation minimaliste d'une CentOS 6 (et je vais peut-être me calmer un peu sur l’auto-promotion ;-) ). Parmi les paramètres importants, notons la désactivation de SELinux.

Une dernière chose avant de rentrer dans le vif du sujet : pour plus de transparence, et aussi parce que les plus intéressés par ce billet sont probablement des débutants dans le monde de GNU/Linux et des logiciels libres, j'ai choisi d'afficher autant que faire se peut les résultats des commandes. Le billet est donc assez long, mais pas complexe pour autant ! Je vous recommande cependant de lire ce billet en entier avant de taper la moindre commande sur votre machine. De toutes façons, vous utilisez une machine (virtuelle) de tests, hein ?

Installation d'Apache, PHP et de phpMyAdmin

Commençons par ajouter le dépôt EPEL à notre installation, de sorte à faciliter l'installation de toute la bande Apache, PHP, MySQL et phpMyAdmin :

[root@crashtest ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
Récupération de http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
attention: /var/tmp/rpm-tmp.c1BYty: Entête V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Préparation...                                                          (100%)
1:epel-release                                                         (100%)

Ensuite, c'est assez simple, grâce au jeu des dépendances, nous installons phpMyAdmin :

[root@crashtest ~]# yum install phpmyadmin
Loaded plugins: fastestmirror
Determining fastest mirrors

epel/metalink                                            |  12 kB     00:00     
 * epel: mirrors.ircam.fr

base                                                     | 3.7 kB     00:00     
base/primary_db                                          | 4.2 MB     00:00     

epel                                                     | 4.3 kB     00:00     
epel/primary_db                                          | 3.9 MB     00:15     

extras                                                   |  951 B     00:00     
extras/primary                                           |  203 B     00:00     

updates                                                  | 3.5 kB     00:00     
updates/primary_db                                       | 3.3 MB     00:00     
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package phpMyAdmin.noarch 0:3.4.3.1-1.el6 set to be updated
--> Processing Dependency: php-gd >= 5.2.0 for package: phpMyAdmin-3.4.3.1-1.el6.noarch
--> Processing Dependency: php-mbstring >= 5.2.0 for package: phpMyAdmin-3.4.3.1-1.el6.noarch
--> Processing Dependency: php-mysql >= 5.2.0 for package: phpMyAdmin-3.4.3.1-1.el6.noarch
--> Processing Dependency: php >= 5.2.0 for package: phpMyAdmin-3.4.3.1-1.el6.noarch
--> Processing Dependency: php-mcrypt >= 5.2.0 for package: phpMyAdmin-3.4.3.1-1.el6.noarch
--> Processing Dependency: httpd for package: phpMyAdmin-3.4.3.1-1.el6.noarch
--> Running transaction check
---> Package httpd.x86_64 0:2.2.15-5.el6.centos set to be updated
--> Processing Dependency: httpd-tools = 2.2.15-5.el6.centos for package: httpd-2.2.15-5.el6.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.2.15-5.el6.centos.x86_64
--> Processing Dependency: apr-util-ldap for package: httpd-2.2.15-5.el6.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.2.15-5.el6.centos.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.2.15-5.el6.centos.x86_64
---> Package php.x86_64 0:5.3.2-6.el6_0.1 set to be updated
--> Processing Dependency: php-cli = 5.3.2-6.el6_0.1 for package: php-5.3.2-6.el6_0.1.x86_64
--> Processing Dependency: php-common = 5.3.2-6.el6_0.1 for package: php-5.3.2-6.el6_0.1.x86_64
---> Package php-gd.x86_64 0:5.3.2-6.el6_0.1 set to be updated
--> Processing Dependency: libpng12.so.0(PNG12_0)(64bit) for package: php-gd-5.3.2-6.el6_0.1.x86_64
--> Processing Dependency: libpng12.so.0()(64bit) for package: php-gd-5.3.2-6.el6_0.1.x86_64
--> Processing Dependency: libjpeg.so.62()(64bit) for package: php-gd-5.3.2-6.el6_0.1.x86_64
--> Processing Dependency: libXpm.so.4()(64bit) for package: php-gd-5.3.2-6.el6_0.1.x86_64
--> Processing Dependency: libfreetype.so.6()(64bit) for package: php-gd-5.3.2-6.el6_0.1.x86_64
--> Processing Dependency: libX11.so.6()(64bit) for package: php-gd-5.3.2-6.el6_0.1.x86_64
---> Package php-mbstring.x86_64 0:5.3.2-6.el6_0.1 set to be updated
---> Package php-mcrypt.x86_64 0:5.3.2-3.el6 set to be updated
--> Processing Dependency: libmcrypt.so.4()(64bit) for package: php-mcrypt-5.3.2-3.el6.x86_64
---> Package php-mysql.x86_64 0:5.3.2-6.el6_0.1 set to be updated
--> Processing Dependency: php-pdo for package: php-mysql-5.3.2-6.el6_0.1.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.3.9-3.el6_0.1 set to be updated
---> Package apr-util.x86_64 0:1.3.9-3.el6_0.1 set to be updated
---> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 set to be updated
---> Package freetype.x86_64 0:2.3.11-6.el6_0.2 set to be updated
---> Package httpd-tools.x86_64 0:2.2.15-5.el6.centos set to be updated
---> Package libX11.x86_64 0:1.3-2.el6 set to be updated
--> Processing Dependency: libX11-common = 1.3-2.el6 for package: libX11-1.3-2.el6.x86_64
--> Processing Dependency: libxcb.so.1()(64bit) for package: libX11-1.3-2.el6.x86_64
---> Package libXpm.x86_64 0:3.5.8-2.el6 set to be updated
---> Package libjpeg.x86_64 0:6b-46.el6 set to be updated
---> Package libmcrypt.x86_64 0:2.5.8-9.el6 set to be updated
---> Package libpng.x86_64 2:1.2.44-1.el6 set to be updated
---> Package mailcap.noarch 0:2.1.31-1.1.el6 set to be updated
---> Package php-cli.x86_64 0:5.3.2-6.el6_0.1 set to be updated
---> Package php-common.x86_64 0:5.3.2-6.el6_0.1 set to be updated
---> Package php-pdo.x86_64 0:5.3.2-6.el6_0.1 set to be updated
--> Running transaction check
---> Package libX11-common.noarch 0:1.3-2.el6 set to be updated
---> Package libxcb.x86_64 0:1.5-1.el6 set to be updated
--> Processing Dependency: libXau.so.6()(64bit) for package: libxcb-1.5-1.el6.x86_64
--> Running transaction check
---> Package libXau.x86_64 0:1.0.5-1.el6 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch         Version                   Repository     Size
================================================================================
Installing:
 phpMyAdmin          noarch       3.4.3.1-1.el6             epel          4.4 M
Installing for dependencies:
 apr                 x86_64       1.3.9-3.el6_0.1           updates       124 k
 apr-util            x86_64       1.3.9-3.el6_0.1           updates        87 k
 apr-util-ldap       x86_64       1.3.9-3.el6_0.1           updates        15 k
 freetype            x86_64       2.3.11-6.el6_0.2          updates       359 k
 httpd               x86_64       2.2.15-5.el6.centos       base          811 k
 httpd-tools         x86_64       2.2.15-5.el6.centos       base           68 k
 libX11              x86_64       1.3-2.el6                 base          582 k
 libX11-common       noarch       1.3-2.el6                 base          188 k
 libXau              x86_64       1.0.5-1.el6               base           22 k
 libXpm              x86_64       3.5.8-2.el6               base           59 k
 libjpeg             x86_64       6b-46.el6                 base          134 k
 libmcrypt           x86_64       2.5.8-9.el6               epel           96 k
 libpng              x86_64       2:1.2.44-1.el6            base          180 k
 libxcb              x86_64       1.5-1.el6                 base          100 k
 mailcap             noarch       2.1.31-1.1.el6            base           27 k
 php                 x86_64       5.3.2-6.el6_0.1           updates       1.1 M
 php-cli             x86_64       5.3.2-6.el6_0.1           updates       2.2 M
 php-common          x86_64       5.3.2-6.el6_0.1           updates       516 k
 php-gd              x86_64       5.3.2-6.el6_0.1           updates       103 k
 php-mbstring        x86_64       5.3.2-6.el6_0.1           updates       504 k
 php-mcrypt          x86_64       5.3.2-3.el6               epel           16 k
 php-mysql           x86_64       5.3.2-6.el6_0.1           updates        75 k
 php-pdo             x86_64       5.3.2-6.el6_0.1           updates        72 k

Transaction Summary
================================================================================
Install      24 Package(s)
Upgrade       0 Package(s)

Total download size: 12 M
Installed size: 42 M
Is this ok [y/N]:

Comme on peut le voir, de nombreux autres logiciels viennent s'installer car phpMyAdmin en a besoin pour fonctionner, comme PHP et Apache HTTPD Server (paquets httpd et apr-*). Appuyons sur la touche y de notre clavier :

Is this ok [y/N]: y
Downloading Packages:

(1/24): apr-1.3.9-3.el6_0.1.x86_64.rpm                   | 124 kB     00:00     

(2/24): apr-util-1.3.9-3.el6_0.1.x86_64.rpm              |  87 kB     00:00     

(3/24): apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm         |  15 kB     00:00     

(4/24): freetype-2.3.11-6.el6_0.2.x86_64.rpm             | 359 kB     00:00     

(5/24): httpd-2.2.15-5.el6.centos.x86_64.rpm             | 811 kB     00:00     

(6/24): httpd-tools-2.2.15-5.el6.centos.x86_64.rpm       |  68 kB     00:00     

(7/24): libX11-1.3-2.el6.x86_64.rpm                      | 582 kB     00:00     

(8/24): libX11-common-1.3-2.el6.noarch.rpm               | 188 kB     00:00     

(9/24): libXau-1.0.5-1.el6.x86_64.rpm                    |  22 kB     00:00     

(10/24): libXpm-3.5.8-2.el6.x86_64.rpm                   |  59 kB     00:00     

(11/24): libjpeg-6b-46.el6.x86_64.rpm                    | 134 kB     00:00

(12/24): libmcrypt-2.5.8-9.el6.x86_64.rpm                |  96 kB     00:00     

(13/24): libpng-1.2.44-1.el6.x86_64.rpm                  | 180 kB     00:00     

(14/24): libxcb-1.5-1.el6.x86_64.rpm                     | 100 kB     00:00     

(15/24): mailcap-2.1.31-1.1.el6.noarch.rpm               |  27 kB     00:00     

(16/24): php-5.3.2-6.el6_0.1.x86_64.rpm                  | 1.1 MB     00:00     

(17/24): php-cli-5.3.2-6.el6_0.1.x86_64.rpm              | 2.2 MB     00:00     

(18/24): php-common-5.3.2-6.el6_0.1.x86_64.rpm           | 516 kB     00:00     

(19/24): php-gd-5.3.2-6.el6_0.1.x86_64.rpm               | 103 kB     00:00     

(20/24): php-mbstring-5.3.2-6.el6_0.1.x86_64.rpm         | 504 kB     00:00     

(21/24): php-mcrypt-5.3.2-3.el6.x86_64.rpm               |  16 kB     00:00     

(22/24): php-mysql-5.3.2-6.el6_0.1.x86_64.rpm            |  75 kB     00:00     

(23/24): php-pdo-5.3.2-6.el6_0.1.x86_64.rpm              |  72 kB     00:00     

(24/24): phpMyAdmin-3.4.3.1-1.el6.noarch.rpm             | 4.4 MB     00:18     
--------------------------------------------------------------------------------
Total                                           574 kB/s |  12 MB     00:20     
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

epel/gpgkey                                              | 3.2 kB     00:00 ... 
Importing GPG key 0x0608B895 "EPEL (6) <epel@fedoraproject.org>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
Is this ok [y/N]: 

Autre interrogation intéressante : vous aurez remarqué que tout se déroule grâce à yum, et que nous avons installé un dépôt supplémentaire. Ce dépôt s'identifie via une clé GPG qu'il nous faut importer lors de sa première utilisation. Appuyons-donc sur y et continuons :

Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction

  Installing     : php-common-5.3.2-6.el6_0.1.x86_64                       1/24 

  Installing     : apr-1.3.9-3.el6_0.1.x86_64                              2/24 

  Installing     : apr-util-1.3.9-3.el6_0.1.x86_64                         3/24 

  Installing     : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                    4/24 

  Installing     : httpd-tools-2.2.15-5.el6.centos.x86_64                  5/24 

  Installing     : php-pdo-5.3.2-6.el6_0.1.x86_64                          6/24 

  Installing     : php-mysql-5.3.2-6.el6_0.1.x86_64                        7/24 

  Installing     : php-cli-5.3.2-6.el6_0.1.x86_64                          8/24 

  Installing     : php-mbstring-5.3.2-6.el6_0.1.x86_64                     9/24 

  Installing     : 2:libpng-1.2.44-1.el6.x86_64                           10/24 

  Installing     : freetype-2.3.11-6.el6_0.2.x86_64                       11/24 

  Installing     : libjpeg-6b-46.el6.x86_64                               12/24 

  Installing     : libmcrypt-2.5.8-9.el6.x86_64                           13/24 

  Installing     : libXau-1.0.5-1.el6.x86_64                              14/24 

  Installing     : libxcb-1.5-1.el6.x86_64                                15/24 

  Installing     : mailcap-2.1.31-1.1.el6.noarch                          16/24 

  Installing     : httpd-2.2.15-5.el6.centos.x86_64                       17/24 

  Installing     : php-5.3.2-6.el6_0.1.x86_64                             18/24 

  Installing     : php-mcrypt-5.3.2-3.el6.x86_64                          19/24 

  Installing     : libX11-common-1.3-2.el6.noarch                         20/24 

  Installing     : libX11-1.3-2.el6.x86_64                                21/24 

  Installing     : libXpm-3.5.8-2.el6.x86_64                              22/24 

  Installing     : php-gd-5.3.2-6.el6_0.1.x86_64                          23/24 

  Installing     : phpMyAdmin-3.4.3.1-1.el6.noarch                        24/24 

Installed:
  phpMyAdmin.noarch 0:3.4.3.1-1.el6                                             

Dependency Installed:
  apr.x86_64 0:1.3.9-3.el6_0.1                                                  
  apr-util.x86_64 0:1.3.9-3.el6_0.1                                             
  apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1                                        
  freetype.x86_64 0:2.3.11-6.el6_0.2                                            
  httpd.x86_64 0:2.2.15-5.el6.centos                                            
  httpd-tools.x86_64 0:2.2.15-5.el6.centos                                      
  libX11.x86_64 0:1.3-2.el6                                                     
  libX11-common.noarch 0:1.3-2.el6                                              
  libXau.x86_64 0:1.0.5-1.el6                                                   
  libXpm.x86_64 0:3.5.8-2.el6                                                   
  libjpeg.x86_64 0:6b-46.el6                                                    
  libmcrypt.x86_64 0:2.5.8-9.el6                                                
  libpng.x86_64 2:1.2.44-1.el6                                                  
  libxcb.x86_64 0:1.5-1.el6                                                     
  mailcap.noarch 0:2.1.31-1.1.el6                                               
  php.x86_64 0:5.3.2-6.el6_0.1                                                  
  php-cli.x86_64 0:5.3.2-6.el6_0.1                                              
  php-common.x86_64 0:5.3.2-6.el6_0.1                                           
  php-gd.x86_64 0:5.3.2-6.el6_0.1                                               
  php-mbstring.x86_64 0:5.3.2-6.el6_0.1                                         
  php-mcrypt.x86_64 0:5.3.2-3.el6                                               
  php-mysql.x86_64 0:5.3.2-6.el6_0.1                                            
  php-pdo.x86_64 0:5.3.2-6.el6_0.1                                              

Complete!

Pensons à activer Apache au démarrage de la machine :

[root@crashtest ~]# chkconfig --list httpd
httpd           0:arrêt 1:arrêt 2:arrêt 3:arrêt 4:arrêt 5:arrêt 6:arrêt
[root@crashtest ~]# chkconfig httpd on
[root@crashtest ~]# chkconfig --list httpd
httpd           0:arrêt 1:arrêt 2:marche        3:marche        4:marche        5:marche        6:arrêt

Vous croyez que c'est fini ? Pourtant ce n'est que le début : nous n'avons toujours pas installé MySQL et il faut encore configurer le tout.

Installation et configuration de MySQL

Rien de très compliqué :

[root@crashtest ~]# yum install mysql-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: mirrors.ircam.fr
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mysql-server.x86_64 0:5.1.52-1.el6_0.1 set to be updated
--> Processing Dependency: mysql = 5.1.52-1.el6_0.1 for package: mysql-server-5.1.52-1.el6_0.1.x86_64
--> Processing Dependency: perl-DBI for package: mysql-server-5.1.52-1.el6_0.1.x86_64
--> Processing Dependency: perl-DBD-MySQL for package: mysql-server-5.1.52-1.el6_0.1.x86_64
--> Processing Dependency: perl(DBI) for package: mysql-server-5.1.52-1.el6_0.1.x86_64
--> Running transaction check
---> Package mysql.x86_64 0:5.1.52-1.el6_0.1 set to be updated
---> Package perl-DBD-MySQL.x86_64 0:4.013-3.el6 set to be updated
---> Package perl-DBI.x86_64 0:1.609-4.el6 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package              Arch         Version                  Repository     Size
================================================================================
Installing:
 mysql-server         x86_64       5.1.52-1.el6_0.1         updates       8.1 M
Installing for dependencies:
 mysql                x86_64       5.1.52-1.el6_0.1         updates       889 k
 perl-DBD-MySQL       x86_64       4.013-3.el6              base          134 k
 perl-DBI             x86_64       1.609-4.el6              base          705 k

Transaction Summary
================================================================================
Install       4 Package(s)
Upgrade       0 Package(s)

Total download size: 9.8 M
Installed size: 28 M
Is this ok [y/N]:

Là encore, on nous demande une validation avant d'installer les logiciels.

Is this ok [y/N]: y
Downloading Packages:

(1/4): mysql-5.1.52-1.el6_0.1.x86_64.rpm                 | 889 kB     00:00     

(2/4): mysql-server-5.1.52-1.el6_0.1.x86_64.rpm          | 8.1 MB     00:00     

(3/4): perl-DBD-MySQL-4.013-3.el6.x86_64.rpm             | 134 kB     00:00     

(4/4): perl-DBI-1.609-4.el6.x86_64.rpm                   | 705 kB     00:00     
--------------------------------------------------------------------------------
Total                                           8.4 MB/s | 9.8 MB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction

  Installing     : perl-DBI-1.609-4.el6.x86_64                              1/4 

  Installing     : perl-DBD-MySQL-4.013-3.el6.x86_64                        2/4 

  Installing     : mysql-5.1.52-1.el6_0.1.x86_64                            3/4 

  Installing     : mysql-server-5.1.52-1.el6_0.1.x86_64                     4/4 

Installed:
  mysql-server.x86_64 0:5.1.52-1.el6_0.1                                        

Dependency Installed:
  mysql.x86_64 0:5.1.52-1.el6_0.1      perl-DBD-MySQL.x86_64 0:4.013-3.el6     
  perl-DBI.x86_64 0:1.609-4.el6       

Complete!

Maintenant que MySQL est installé, démarrons-le :

[root@crashtest ~]# service mysqld start
Initialisation de la base de données MySQL :  Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h crashtest password 'new-password'

Alternatively you can run:
/usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /usr/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/bin/mysqlbug script!

[  OK  ]

Démarrage de mysqld :  [  OK  ]

MySQL nous informe donc que sans mot de passe administrateur, c'est un peu la fête du slip et qu'il faut absolument remédier à ça. Soyons donc civilisés, mais pas trop, car pour l'exemple, j'initialise le mot de passe root de MySQL à 'anotherhomepage' (le mot de passe en lui-même ne contient pas les guillemets simples) :

[root@crashtest ~]# /usr/bin/mysqladmin -u root password 'anotherhomepage'
[root@crashtest ~]# /usr/bin/mysqladmin -u root -h crashtest password 'anotherhomepage'

Activons MySQL au démarrage de la machine :

[root@crashtest ~]# chkconfig --list mysqld
mysqld          0:arrêt 1:arrêt 2:arrêt 3:arrêt 4:arrêt 5:arrêt 6:arrêt
[root@crashtest ~]# chkconfig mysqld on
[root@crashtest ~]# chkconfig --list mysqld
mysqld          0:arrêt 1:arrêt 2:marche        3:marche        4:marche        5:marche        6:arrêt

Configurations supplémentaires

Si vous avez effectué une installation identique à celle de mon précédent billet, vous aurez remarqué que le firewall est toujours actif, et que celui-ci n'accepte que du SSH et du SMTP :

[root@crashtest ~]# /etc/init.d/iptables status
Table : filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:25 
6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Désactivons-le :

[root@crashtest ~]# /etc/init.d/iptables stop
iptables : Suppression des règles du pare-feu : [  OK  ]

iptables : Configuration des chaînes sur la politique ACCEPT : filter [  OK  ]

iptables : Déchargement des modules : [  OK  ]
[root@crashtest ~]# chkconfig --list iptables
iptables       	0:arrêt	1:arrêt	2:marche	3:marche	4:marche	5:marche	6:arrêt
[root@crashtest ~]# chkconfig iptables off
[root@crashtest ~]# chkconfig --list iptables
iptables       	0:arrêt	1:arrêt	2:arrêt	3:arrêt	4:arrêt	5:arrêt	6:arrêt

Il nous faut aussi effectuer une autre modification : l'autorisation des machines du réseau à accéder à phpMyAdmin. Pour cela il nous faut éditer le fichier /etc/httpd/conf.d/phpMyAdmin.conf avec votre éditeur de texte préféré, ou celui installé par défaut, très probablement vi. Dans ce fichier, nous voyons ceci :

<Directory /usr/share/phpMyAdmin/>
   Order Deny,Allow
   Deny from All
   Allow from 127.0.0.1
   Allow from ::1
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
   Order Deny,Allow
   Deny from All
   Allow from 127.0.0.1
   Allow from ::1
</Directory>

Deux possibilités : la première, ajoutez votre réseau ou vos machines dans les deux sections Directory après les directives Allow en ajoutant justement une directive de ce type. Par exemple, avec un réseau 10.1.1.0/24, ça donnerait :

Allow from 10.1.1.0/24

Une autre possibilité, bien moins sécurisée mais sans doute plus confortable est de tout autoriser. Dans ce cas, les sections deviennent :

<Directory /usr/share/phpMyAdmin/>
   Order Deny,Allow
   Allow from All
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
   Order Deny,Allow
   Allow from All
</Directory>

Démarrons à présent le serveur web :

[root@crashtest ~]# service httpd start
Démarrage de httpd : [  OK  ]

Il est à présent possible d'accéder à phpMyAdmin, dans mon cas via l'adresse http://crashtest/phpmyadmin/. Bien entendu, un identifiant et un mot de passe seront demandés. Il s'agit de ceux de MySQL (donc 'root' et 'anotherhomepage' dans mon cas).

On pourrait s'arrêter là. Mais ça serait dommage, pour plusieurs raisons :

  • l'authentification se fait via HTTP, pas d'interface d'authentification un peu jolie qui utiliserait par exemple un cookie de session;
  • HTTPS n'est pas activé, et donc le mot de passe se retrouve en clair sur le réseau;
  • le pare-feu est désactivé, sans autre forme de procès (SELinux aussi, d'ailleurs);
  • phpMyAdmin dispose de fonctions supplémentaires qu'on peut activer en créant une base de données

Ces points seront abordés dans un prochain billet, bien entendu ;-)

- page 1 de 5