PhpMyAdmin & suPhp
J’avais déjà eu des soucis entre suPhp, et PhpMyAdmin, et d’une manière générale la résolution ne me plaisait pas !
Soit ajouter /usr/share/phpmyadmin dans les configurations de suPhp, et mettre 1000:1000 comme uid:gid à /usr/share/phpmyadmin, puis rebelote à chaque mise à jour via apt-get !
Soit déplacer le phpmyadmin (ou télécharger la dernière version à la main) dans /var/www, et là encore donner 1000:1000 !
Finalement, j’ai trouvé une solution qui me plait un peu mieux, me permet de garder la version du dépôt centrale ([troll_mode]histoire de toujours être à jour :)[/troll_mode]), et de ne niquer aucun fichier de configuration :
Créer le fichier « /etc/apache2/conf.d/phpmyadmin_suphp.conf »
[code]
<Directory /usr/share/phpmyadmin>
<IfModule mod_suphp.c>
<FilesMatch « .+\.ph(p[345]?|t|tml)$ »>
SetHandler application/x-httpd-php
Order Allow,Deny
Allow from all
php_flag track_vars On
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/
</FilesMatch>
</IfModule>
</Directory>
[/code]
MySQL, la réplication et ses aléas
Ce billet fait suite à celui-ci « MySQL et la réplication » !
Suite à mes vérifications régulières (1 à 2 fois par mois), de mon système de sauvegarde, j’ai constaté un soucis avec la réplication de Mysql !
Pour rappel, le serveur Mysql Maître tourne sur mon Serveur Grumpy, et l’esclave de réplication tourne sur Bashful ! J’ai donc eu le message d’erreur suivant :
Could not parse relay log event entry. The possible reasons are: the master’s binary log is corrupted (you can check this by running ‘mysqlbinlog’ on the binary log), the slave’s relay log is corrupted (you can check this by running ‘mysqlbinlog’ on the relay log), a network problem, or a bug in the master’s or slave’s MySQL code. If you want to check the master’s binary log or slave’s relay log, you will be able to know their names by issuing ‘SHOW SLAVE STATUS’ on this slave.
Le message est plutôt flippant, il semblerait que le soucis ce soit glissé lors d’une récupération du fichier, entre le maître et l’esclave, j’ai trouvé pas mal de chose sur la toile, ce site m’ayant le plus aidé « http://www.redips.net/mysql/replication-slave-relay-log-corrupted/ »
Avec quelques étapes supplémentaires :
- Éxécuter la commande « show slave status\G » dans une commande mysql.
- Récupérer les valeurs de « Relay_Master_Log_File » et « Exec_Master_Log_Pos ».
- Vérifier sur le maître que le fichier pointé par « Relay_Master_Log_File », existe, si oui passez directement à l’étape 8
- Pas de chance, c’est que vous avez attendus trop longtemps avant de constater/corriger le problème, il va falloir récupérer les fichiers manquants depuis vos backups.
- Exemple « Relay_Master_Log_File = mysql-bin.000114 », et vous avez « mysql-bin.000117 » dans le dossier « /var/log/mysql/ » sur le maître, copier les fichiers « mysql-bin.000114, mysql-bin.000115, mysql-bin.000116 » depuis vos backup, dans « /var/log/mysql/ »
- Assurez-vous que les fichiers ais le bon owner, et les bons droits (mysql/adm ; rw-rw—-)
- Modifier le fichier « /var/log/mysql/mysql-bin.index », en ajoutant la totalité des fichiers que vous venez de rajouter à la liste.
- Dans une commande SQL, taper successivement les commandes suivantes :
- stop slave;
- reset slave;
- CHANGE MASTER TO master_log_file=’mysqld-bin.000114‘, master_log_pos=732418;
- start slave;
/!\ Évidement, remplacer les valeurs en gras, par les votre, récupérées plus tôt.
- Normalement tous est ok, et la réplication devrait repartir comme sur des roulettes !
J’espère avoir aidé, et comme d’habitude, ce billet, me sert surtout de pense bête !
Fail2Ban : IPv6 & rootless-mode
Aujourd’hui (Hier soir plus exactement), je me suis attaché à la sécurité de Grumpy. Ce billet est fait un peu vite car, je manque de temps, et je voudrais ne pas oublier ce que j’ai mis en place !
Premier constat
Grumpy, est ipv6 friendly, et il aime tous le monde (C’est un vrai bisounours ce nain :)), bon, ipv6 étant activé, très bien, mais après investigation avec un petit ip6tables -L, tout était ouvert :(((
Du coup Sekoia, c’est attelé à refaire le script des iptables, pour y inclure proprement les ip6tables qui vont bien !
Pour ma part je me suis intéressé à Fail2Ban en IPv6 !
Dans un deuxième temps, un ami m’a appris, il y a plusieurs mois, que l’on pouvait lancer Fail2Ban en mode utilisateur (rootless-mode).
Je viens de trouver un message d’un certains « mazarini » qui résume bien m’a pensé sur ce qui m’arrive :
Apparemment en 2013, SSH en IPv6 est activé par défaut, mais Fail2Ban ne le protège toujours pas par défaut. Comme quoi, on met plein de verrous sur une porte blindée et on laisse la fenêtre ouverte.
(source : http://www.debian-fr.org/fail2ban-et-ipv6-t38368.html#p423586)
À laquelle Sekoia répond tout succinctement :
La sécurité d’un système dépend de son maillon le plus faible.
Je pense qu’il parle de moi :p
Configurations
- OS : Debian 7.0 (Wheezy)
- Version de Fail2Ban (0.8.9 : Depuis le dépôt SID)
Fail2Ban en IPv6
Beaucoup de monde le demande, mais rien d’officiel à l’horizon, c’est pour cela qu’un certains Thanatos, à mis en place un patch, dont voici un très bon tuto pour sa mise en place « https://www.isalo.org/wiki.debian-fr/Fail2ban#Fail2ban_et_ipv6_.28EXPERIMENTAL.29 » repris sur au moins 5 ou 6 sites (Ce n’est probablement pas la version originale).
Bien sûr, il est compatible avec la version 0.8.6 de Fail2Ban, et pas avec la version que j’ai installé, alors j’ai du repatcher à la main (je ferais ptet un patch un jour :)), là manque curel de temps (comme toujours) :
/usr/share/fail2ban/server/failregex.py
1 | regex = regex.replace("", "(?:::f{4,6}:)?(?P[\w\-.^_:]+)") |
Il faut juste ajouter les deux points (:) dans la classe perso de la regexp [\w\-.^_:]
/usr/share/fail2ban/server/filter.py
Je met ici en bloc les méthodes de la classe « DNSUtils » (fin de fichier) modifié :
1 2 3 | class DNSUtils: .IP_CRE = re.compile("^(?:\d{1,3}\.){3}\d{1,3}$") .IP_CRE6 = re.compile("^(?:[0-9:A-Fa-f]{3,})$") |
1 2 3 4 5 6 7 8 9 10 11 12 13 | .#@staticmethod .def searchIP(text): ..""" Search if an IP address if directly available and return it. ..""" ..match = DNSUtils.IP_CRE.match(text) ..match6 = DNSUtils.IP_CRE6.match(text) ..if match: ...return match ..elif match6: ...return match6 ..else: ...return None .searchIP = staticmethod(searchIP) |
1 2 3 4 5 6 7 | .#@staticmethod .def isValidIP(string): ..""" Return true if str is a valid IP ...PATCH v6: We Consider that logfiles didn't make errors ;) ..""" ..return True .isValidIP = staticmethod(isValidIP) |
(Note : Les points sont des tabulations… je hais les interfaces graphiques qui vire les espaces et les tabulations).
Il faudrait vraiment refaire cette méthode isValiddIP, mais là je reprend ce que Thanatos à fait, et je suppose qu’il ne l’a pas fait inutilement 🙂
/usr/bin/ip46tables.sh [NEW FILE]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #!/bin/bash # Iptable multiplexeur (c) 2012 Jupa # Modified by Olivier LONZI <olivier@lonzi.fr> LINE=$* # Note: # ----- # Use sudo, only if you run fail2ban in rootless mode, with good right # /etc/default/fail2ban for more information about rootless mode IP4="/sbin/iptables" IP6="/sbin/ip6tables" RESULT=`echo $LINE | egrep " ([0-9]{1,3}\.){3}[0-9]{1,3}" | wc -l` RESULT6=`echo $LINE | egrep "(::[A-Fa-f0-9])|((:[A-Fa-f0-9]{1,4}){2,})" | wc -l ` # Some params is for IP4 only, so we try to replace, or delete it for IP6 LINE6=`echo $LINE | sed -e "s/REJECT --reject-with icmp-port-unreachable/REJECT/"` if [ $RESULT -eq "1" ]; then .# Action IPv4 .$IP4 $LINE .ERRCODE=$? elif [ $RESULT6 -eq "1" ]; then .# Action IPv6 .$IP6 $LINE6 .ERRCODE=$? else .# Action for both of them .$IP4 $LINE .ERRCODE=$? .$IP6 $LINE6 .if [ $? -ge "1" ]; then ..ERRCODE=$? .fi fi exit $ERRCODE |
/etc/fail2ban/action.d/iptables46-multiport.conf [NEW FILE]
1 | # sed -e "s/iptables/ip46tables.sh/" iptables-multiport.conf > iptables46-multiport.conf |
/etc/fail2ban/action.d/iptables46-allports.conf [NEW FILE]
1 | # sed -e "s/iptables/ip46tables.sh/" iptables-allports.conf > iptables46-allports.conf |
/etc/fail2ban/jail.*
Il faut changer les banaction et action, pour utiliser les fichiers .conf d’actions avec iptables46*, suivant vos besoins, et à adapter.
Tous ça fait que l’IPv6 devrait maintenant être géré correctement, après un reboot du service évidement !
1 | # service fail2ban restart |
Pour desactiver l’IPv6, il suffit de virer le : de la regexp dans le fichier « /usr/share/fail2ban/server/failregex.py » !
Fail2Ban en rootless-mode
Je ne reviens pas sur le pourquoi !
Modifier le fichier « /etc/default/fail2ban », décommenter ou ajouter « FAIL2BAN_USER= »fail2ban » ».
Ensuite on va ajouter ce nouvel utilisateur système « fail2ban », directement dans le groupe « adm » en sus du groupe « fail2ban » ; ceci afin qu’il puisse lire les log de tous le monde !
1 | # useradd --system --no-create-home --home-dir / --groups adm fail2ban |
Pour la suite, il faudrait que fail2ban puisse exécuter iptables (et ip6tables, au besoin), la doc sur ce point est pas protubérante, elle parle d’un module kernel xt_recent… j’ai abandonné cette idée, car pas assez documenté, et manque de temps (toujours la même excuse), et vu que je venais de mettre en place un script temporaire pour l’IPv6, j’avais une solution toute simple :
1 | # apt-get install sudo |
Modifier « /etc/sudoers.d/fail2ban », et ajouter la ligne
« fail2ban ALL=NOPASSWD: SETENV: /sbin/iptables, /sbin/ip6tables ».
Si vous avez suivis le patch pour l’IPv6, modifier « /usr/bin/ip46tables.sh », et ajouter sudo devant les commandes qui vont bien :
IP4= »sudo /sbin/iptables »
IP6= »sudo /sbin/ip6tables »
(Dans le patch de Thanatos, il faut le changer plusieurs fois directement dans le script)
Si vous n’avez pas le patch IPv6, il faut rajouter sudo directement dans les fichiers « /etc/fail2ban/actions.d/iptables46-*.conf »
1 | # service fail2ban restart |
Root-less et Logrotate
Après plusieurs jours/semaines/mois de fonctionnement, et peu de temps pour tester, Sekoia c’est aperçu qu’il y avait un soucis avec la règle des récidivistes, cette règle regarde si une même adresse IP à été ban plusieurs fois dans la semaine, et lui interdit l’accès au serveur pour 1 mois !!! Au niveau de la règle, pas de soucis, mais depuis que j’ais mis fail2ban en mode rootless, lors du logrotate, fail2ban n’avais plus le droit de loguer ses infos….
Pour résoudre cela, on commence par donner les bon droits au fichier :
1 | # chown fail2ban:adm /var/log/fail2ban.log |
puis, on va expliquer à logrotate de faire le boulot que l’on souhaite, dans le fichier « /etc/logrotate.d/fail2ban », on cherche ou ajoute la ligne « create 640 fail2ban adm »
Si vous êtes croyant, priez ; sinon priez quand même, mais dans tous les cas n’oubliez pas de tester tous ça 🙂
J’espère que ça servira !
MySQL et la réplication
Préambule
Je viens de mettre en place la réplication entre Bashful (Situé à BHS au Canada), et Grumpy (Toujours à RBX en France) ; Ce billet vos plus de note rapide que de vérité sur la mise en place de deux serveur de réplication ! Ça je verrais à l’usage.
J’ai trouvé sur la toile, plusieurs ressources, mais aucune qui semble expliquer comment faire une réplication simple, basique et claire ; ça j’espère le faire ici 🙂
Les serveurs
Grumpy : Serveur maître
- Version du système d’exploitation : Debian 7.0 (Wheezy)
- Version Mysql : 5.5.31, for debian-linux-gnu (x86_64)
- Version PhpMyAdmin : 4 (nightly 2013-05-20)
- Bases de données : Plusieurs déjà en place
Bashful : Serveur esclave
- Version du système d’exploitation : Debian 6.0 (Squeezy)
- Version Mysql : 5.5.31, for debian-linux-gnu (x86_64)
- Version PhpMyAdmin : 3.x
- Bases de données : Aucune, mise à part les bases d’origines
Configuration des serveurs
Grumpy : Serveur maître
Modifier le fichier « /etc/mysql/my.cnf » :
1 2 3 4 5 6 7 8 | # Le serveur étant sur le VPN, je n'autorise les connexions que depuis l'adresse IP VPN de Grumpy. # Fait intéressant : Les connexions locales ne sont pas affectées, car utilise la socket locale. bind-address = 192.168.59.1 # Nommer le serveur (Ici : 1) server-id = 1 # Activer les log, et spécifier l'emplacement log_bin = /var/log/mysql/mysql-bin.log |
Rebooter le daemon mysql :
1 | # sudo service mysql restart |
Pour finaliser la configuration du serveur, il faut ce connecter à PhpMyAdmin, dans le menu en haut, choisir « Replication », normalement vous avez trois options :
- Show master status
- Show connected slaves
- Add slave replication user
Choisissons le troisième « Add slave replication user » :
- Username : replication
- Host : Use text field : <ip vpn de bashful>
- Password : Thatsasecretbitch
- Re-type : Thatsasecretbitch
Et on valide notre utilisateur de réplication !
Bashful : Serveur esclave
Modifier le fichier « /etc/mysql/my.cnf » :
1 2 | # Nommer le serveur (Ici : 2) server-id = 2 |
Rebooter le daemon mysql :
1 | # sudo service mysql restart |
Pour finaliser la configuration du serveur, il faut ce connecter à PhpMyAdmin, dans le menu en haut, choisir « Replication », cette fois-ci, pas de configuration pour dire que le serveur est configuré pour être maître, on va donc cliquer sur le bouton « configure » dans la partie « Slave replication » :
- Username : replication
- Password : Thatsasecretbitch
- Host : <ip vpn de Grumpy>
- Port : 3306 (Sauf s’il est différent chez vous)
Go
… à ce stage le liens est fait, si tous c’est correctement déroulé.
Note : à l’écriture de ce billet, j’en suis à peut prêt ici, le reste je spécule est je test, j’ai commencé le billet, car la partie synchronisation est un peu longue pour moi –> normale / anormale ; logique / illogique : tant de questions sans réponses 🙂
Synchroniser les bases déjà présentes
Avec les options proposées par PhpMyAdmin
Et oui, j’ai des bases sur Grumpy à synchroniser sur Bashful, pour cela je me met sur Bashful (Esclave, donc), dans Replication (Menu du haut), puis je clique sur le choix « Synchroniser les bases de données avec le serveur maître », je coche les deux cases :
- Structure
- Données
et lance la synchronisation…
… Pour le reste, il va falloir bidouiller 🙂 Si j’y pense, je reviens sur ce billet !
Au final, je suis convaincus que cette solution est très bien pour des petites synchronisation (très petite), moi ça n’a pas fonctionné, j’ai donc utilisé la solution suivante :
Avec une synchronisation à froid
Problème : Il va falloir stopper le serveur maître (Grumpy) quelques minutes.
- Éteindre le serveur esclave (Bashful)
- Supprimer le dossier /var/lib/mysql/ (rm -r /var/lib/mysql)
- Éteindre le serveur maître
- Supprimer les fichiers dans /var/log/mysql/ (rm /var/log/mysql/*) [Il s’agit du dossier par défaut où sont stockés les log binaire, défini dans la configuration de Grumpy]
- Copier le dossier /var/lib/mysql (Depuis Grumpy vers Bashful) [Par quelques solutions de copie : tar / rsync / …]
- Ouvrir le fichier « /etc/mysql/debian.cnf » sur les deux serveurs, et recopier le mot de passe (2 fois), depuis le maître, vers l’esclave ; sans quoi Debian ne va pas être content.
- Relancer les serveurs (Peut-importe l’ordre)
- Reconfigurer Bashful, comme serveur esclave (Voir chapitre « Configuration des serveurs » > « Bashful : Serveur esclave » ci-dessus)
- Sur le PhpMyAdmin de Bashful, cliquer sur Replication (Menu du haut), puis cliquer sur le choix « Control slave server » puis « Start completly »
Tests de réplication
La partie la plus simple (Bien qu’au final ce ne soit pas très compliqué) : créer, supprimer, ajouter, modifier ; tables, données, et tous ce que vous voulez sur le serveur maître.
Elles sont maintenant synchronisé, vous pouvez éteindre le serveur esclave pour faire une sauvegarde à froid, et le relancer, il va rejouer les logs binaires, là où ils les avaient laissés.
BackupPC et les notifications par courriels + sauvegardes SQL
Ces dernier mois je me suis attelé à la mise en place d’un serveur de Backup, pour l’occasion, j’ai fait l’acquisition d’un nouveau nain, nommé Bashful, est comme son nom l’indique, il est timide, tellement qu’il est situé de l’autre côté du globe (Au Canada).
Après plusieurs essai, l’outil utilisé est BackupPC (Pas mis à jour depuis longtemps, mais relativement simple à prendre en main) :
– http://backuppc.sourceforge.net/
La configuration par défaut est un peu pauvre, et je me suis aperçu qu’aucun courriels n’est envoyés ni en cas d’erreurs de backups, ni en cas de succès !
Donc voici comment j’ai résolu mon problème :
Création d’un script d’envoi des courriels « /usr/share/backuppc/bin/BackupPC_NotifyByEmail »
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/bin/bash #Config FILE_CONFIG=/etc/backuppc/config.pl DIR_CONFIG=/etc/backuppc # Parametres recus ! succes=$1 # Correpond a $xferOK client=$2 [[ $succes == 0 ]] && { mail=`grep 'Conf{EMailAdminUserName}' $DIR_CONFIG/$client.pl | sed "s/.*'\(.*\)'.*/\1/"` [[ -z $mail ]] && { mail=`grep 'Conf{EMailAdminUserName}' $FILE_CONFIG | sed "s/.*'\(.*\)'.*/\1/"` } sujet="[BackupPc] Erreur(s) lors du backup '$client'"; echo | mail -s "$sujet" $mail <<EOT Au moins une erreur est survenue dans la sauvegarde de l'hote '$client' ! Merci de vous connecter au backoffice de supervision : http://ip/backuppc/index.cgi?host=$client EOT echo mail -s "$sujet" $mail } |
Ensuite il suffit d’aller dans la modification de la configuration, puis les paramatrères de sauvegardes pour modifier la valeur par défaut de « DumpPostUserCmd »
1 | /usr/share/backuppc/bin/BackupPC_NotifyByEmail $xferOK $client |
Pour finir, j’ai eu besoin d’un système de Backup SQL :
Pré-requis : Je backup des serveur mutualisé, donc pas toujours accès SSH, heureusement, on a toujours accès à mysqldump, via du php, de fait, la suite :
Attention : Cette partie est un peu brut, je le met surtout pour moi et pour garder trace.
1. Mettre en ligne un script PHP pour le dump SQL (accessible depuis l’extérieur), par exemple : /.sauvegardes/sqldumpall.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $i = 0; $serv[$i]['name'] = "nom-du-serveur"; $serv[$i]['user'] = "user"; $serv[$i]['pass'] = "pass"; $serv[$i]['host'] = "localhost"; $serv[$i]['port'] = "3306"; $serv[$i]['ignore-table'][] = 'performance_schema.events_waits_current'; // Supprimer les backups anciens `find *.sql -atime +20 -exec rm \{\} \;`; // Parcourir les serveurs, pour les sauver foreach ($serv as $ss) { $fichier = 'dump_all_'.$ss['name'].'_'.date('Y-m-d_H-i').'.sql'; // Nom du fichier de sorti dump_all_NAME_YYYY-MM-DD_HH-mm.sql $cmd_add = "--set-charset --default-character-set=UTF8 --add-drop-table"; $cmd_add = isset($ss['ignore-table']) && is_array($ss['ignore-table']) ? '--ignore-table '.implode(' --ignore-table ', $ss['ignore-table']) : ''; // Execution $cmd = "mysqldump $cmd_add --host=$ss[host] --user=$ss[user] --passwor $ss[pass] --port=$ss[port] --all-databases --force --skip-comments -r $fichier"; $retour = system($cmd, $retour2); // On protège le fichier `chmod o-r $fichier`; if ($retour2 != 0) echo "\n\n-----\n- Erreur lors de la sauvegarde de : $ss[name]\n--\n- $cmd$\n--\n- $retour2\n-----\n\n"; } |
2. Faire un script pour BackupPc « /usr/share/backuppc/bin/BackupPC_DumpSql » :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/bash #Config FILE_CONFIG=/etc/backuppc/config.pl DIR_CONFIG=/etc/backuppc # Parametres recus ! client=$1 http=$2 [[ -z $http ]] || { ret=$(wget -O - -- "$http" 2>/dev/null) mail=`grep 'Conf{EMailAdminUserName}' $DIR_CONFIG/$client.pl | sed "s/.*'\(.*\)'.*/\1/"` [[ -z $mail ]] && { mail=`grep 'Conf{EMailAdminUserName}' $FILE_CONFIG | sed "s/.*'\(.*\)'.*/\1/"` } sujet="[BackupPc] Erreur(s) lors du dump SQL '$client'"; echo | mail -s "$sujet" $mail <<EOT Au moins une erreur est survenue lors de la sauvegarde SQL de l'hote '$client' ! Merci de vous connecter au backoffice de supervision : http://ip/backuppc/index.cgi?host=$client /!\ Attention : Cela n'entrave pas la suite de la sauvegarde, BackupPc peux ne pas avoir remarqué le probléme. EOT echo "Erreur lors du Dump SQL" exit(2); } |
3. Configurer « DumpPreUserCmd », pour chaque Hôte :
1 | /usr/share/backuppc/bin/BackupPC_DumpSql $client http://ip/.sauvegardes/sqldumpall.php |
suPhP & ses caprices
Qu’est-ce que suPhP ?
Je n’ai pas vraiment le temps d’écrire une éloge sur suPhP, mais en gros, cela permet d’executer les scripts php avec le owner associé au fichier php, et non le owner d’apache !
De ce fait, l’utilisateur toto, n’iras pas tenter de bidouiller les scripts php de titi, car ils n’auront pas le même owner ! Ce qui n’est pas le cas par défaut quand tous les fichiers php sont au minimum dans le groupe www-data.
Quel caprices ?
Bon le caprice que j’ai eu aujourd’hui, et vraiment con, mais j’ai passé 1h dessus, alors je le met ici surtout comme pense bête… En fait, suPhp n’y ais pour rien 😉
J’ai installé un serveur LDAP sur Grumpy (j’essaierais de faire un article là-dessus, un jour), jusque là, pas de rapport direct, mais une fois que tout fonctionne il m’a fallut un front graphique, j’ai donc installé phpldapadmin.
1 | $ apt-get install phpldapadmin |
Je me connecte ensuite à l’interface graphique, et hop tout beigne, au passage je fais quelques louange au dieu père des gestionnaires de paquets ^^ !
Puis je souhaite configurer mon Webmail favoris… Là c’est le drame, il me pètes des erreurs assez perturbantes, comme quoi il ne trouve pas des fichiers de configurations, alors que ceux-ci existent !!!
Après plusieurs test, surtout sur d’autres sites hébergés par Grumpy, je comprend que suPhP ne fait plus son office !
Comment faire pour que ça fonctionne ?
Pour que ça re-fonctionne, il suffit de comprendre pourquoi ça ne fonctionne plus… En fait pour que suPhP soit opérationnel, il faut tout simplement désactiver le module php de apache !
1 2 3 | $ a2dismod php4 $ a2dismod php5 |
On relance, bien sûr apache
1 | $ /etc/init.d/apache2 restart |
Et le tour est joué 😉
$ a2dismod php4
Ajout d’une IP-FailOver
Il y a longtemps, pratiquement au début de Grumpy, nous avions récupéré une IP-Failover, mais pour être tous à fait franc, celle-ci n’a jamais été utilisé, à tel point qu’aujourd’hui le nouveau domaine que j’ai acheté, et que j’ai fait pointer sur l’IP-Failover ne fonctionnait pas !
En fait la manipulation qui avait été omise a été de créer la configuration qui va bien du côté de grumpy, heureusement le guide d’ovh est là pour me sauver : http://guides.ovh.com/nicolas2 (chapitre « Distribution de base > Debian ») !
1 2 3 4 5 6 7 8 9 | # vim /etc/network/interfaces auto eth0:0 iface eth0:0 inet static address IPFAILOVER netmask 255.255.255.255 broadcast IPFAILOVER # /etc/init.d/networking restart |
Et hop le tour est joué, on balise un peu lorsqu’il s’agit de restart les interfaces réseaux, Fail2Ban, m’envoie plusieurs rapports de redémarrage ! Puis le « ping IPFAILOVER », qui tourne, sans effet, depuis 10min dans le xterm d’à-côté, se met miraculeusement à vivre ses premiers échanges 😉
Alléluyah
Notre réseau privé virtuel
Dans mon premier billet, je vais vous parler de ce petit VPN que nous avons mis en place entre Grumpy (le serveur dédié) et quelques autres machines.
Mais avant tout, quelques points d’explications, pour ne pas perdre ceux qui n’ont jamais entendu parler de cette formidable technologie.
Virtual Private Network (Réseau privé virtuel), qu’est ce que c’est ?
On parle de réseau privé virtuel, ou VPN, lorsque deux machines, se trouvant sur deux réseaux différents, établissent un tunnel. Ce tunnel est le plus souvent chiffré, afin qu’une personne écoutant la communication ne soit pas en mesure d’en comprendre le contenu. Ces deux machines sont alors à même de communiquer l’une avec l’autre, comme si un simple câble les reliait.
Ça à l’air sympa, mais à quoi ça sert un VPN ?
Voyons maintenant quelques cas communs où des VPNs sont mis en place.
Le cas typique: l’entreprise et ses employés travaillant à distance
Imaginons que vous soyez un chef d’entreprise soucieux de la productivité de vos employés (comme beaucoup de PDG je suppose :-)). Ceux-ci sont souvent en déplacement mais ont tout de même besoin d’accéder au réseau local (LAN, Local Area Network) de l’entreprise et à ses ressources (serveur de fichiers, intranet, …).
Vous allez donc demander à votre administrateur réseau de mettre en place une solution VPN qui va permettre aux employés de se connecter à distance au LAN de l’entreprise. Concrètement, vous aurez un serveur VPN, écoutant sur l’Internet, attendant la requête d’un client VPN de l’un de vos employé, connecté à l’autre bout du monde. Un fois la connexion établie, celui-ci pourra communiquer avec une partie, ou l’ensemble des machines du LAN de l’entreprise, tout dépend de la configuration de celui-ci.
Connectons les bureaux !
Toujours dans un soucis de productivité, vous désirez connecter les deux bureaux, espacés d’environ 300 Km. Vous n’allez pas tirer un câble ! (si une fibre, pourquoi ? :-/). Vous allez connecter les deux réseaux à l’aide d’un lien VPN, et au final, tout sera comme si tout était physiquement connecté, et la secrétaire de la ville A pourra sans problème accéder au fichiers du serveur de la ville B.
Point d’accès Wifi, la protection radicale
Cette technique est souvent employée dans les collectivités, par exemple dans les universités, car elle simplifie grandement la gestion des points d’accès aux réseaux sans-fil. Plutôt que de chiffrer le réseau avec les techniques habituelles (clé WEP, chiffrage WPA/WPA2, …), le point d’accès est laissé sans protection. N’importe-qui donc, peut s’y connecter. Seulement, une fois connecté, la seule machine à laquelle on peut parler, est une machine hébergeant un serveur VPN ! Rien d’autre n’est accessible sur ce réseau, pas moyen de router son trafic vers l’Internet.
En revanche, les personnes ayant un accès VPN seront à même de s’y connecter, et ainsi d’ouvrir un tunnel sécurisé avec elle. Ils pourront ainsi communiquer avec le reste du réseau, et souvent avec le reste du monde.
La gestion des utilisateurs est ainsi grandement simplifiée, puisqu’il suffit d’ajouter et de supprimer des comptes sur le serveur VPN suivant le besoins. Si l’administrateur devait changer le mot de passe WPA à chaque fois qu’un utilisateur est supprimé, et le recommuniquer à tout les autres utilisateurs, je vous laisse imaginer la galère (sans compter le manque de traçabilité des utilisateurs, …)
Maintenant que vous avez quelques exemples d’utilisations, je vais rentrer un peu dans le détail et notamment, comment mettre en place un VPN de manière simple.
Les différentes solutions de VPN
Il existe plusieurs solutions pour créer son VPN. Et comme toujours, certaines sont payantes, d’autres gratuites :-).
Exemple de solutions matérielles payantes
Et évidemment, lorsqu’on parle de VPNs professionnels, on ne peut pas passer à côté du géant Cisco [1], qui fabrique entre autres des solutions VPN matérielles (c’est-à-dire, une machine, souvent dans un rack, dédiée à cette tâche). Ils sont bien entendu très performant, mais aussi très onéreux (disons qu’il faut avoir l’utilité d’une bête pareille pour se la payer).
Il existe d’autres constructeurs de matériels réseaux professionnels dans ce genre comme par exemple Juniper Networks [2], l’un de leurs fervents concurrents.
Il faut bien comprendre ici que ces entreprises fabriquent du matériel dédié à cette tâche. C’est donc du matériel extrêmement performant mais qui ne fait que ça. C’est pour celà que l’on parle de VPN matériel (hardware).
Et maintenant, ce dont nous (petits particuliers), nous disposons
Bien entendu, lorsque avec Division-par-zero, nous nous sommes posés la question d’un VPN, nous n’allions certainement pas nous tourner vers le genre d’engins vus dans le paragraphe précédent. Déjà, nous n’avons qu’un serveur à notre disposition, et certainement pas les fonds nécessaires, ni le besoin pour acquérir un tel monstre. Donc, que nous reste-t-il ?
Hé bien ! Le monde du libre est encore une fois passé par là ! Et je vais vous présenter tout de suite OpenVPN [3]. OpenVPN fourni une solution VPN sous licence GPL-2 (entre autres), et permet de déployer son réseau VPN de manière simple et efficace. Il tourne sous Linux, xBSD, Windows et surement d’autres :-).
La différence fondamentale avec les exemples précédents, c’est qu’ici, nous allons installer notre serveur VPN sur une machine quelconque, possédant un OS qui pourrait aussi bien faire tourner un serveur web, un traitement de texte ou Quake 3. Nous parlons alors de VPN logiciel (software).
C’est cette solution que nous avons retenu pour mettre en place notre VPN.
Et bien d’autres…
En effet, je suis loin de tous les connaitre, il doit exister un tas d’autres solutions. Je citerai par exemple Hamachi, très simple à mettre en œuvre et souvent utilisé par les joueurs qui veulent faire comme si ils étaient en Lan :-). Ou encore des solutions L2TP+IPSec, plus compliquées à mettre en place, mais plus « standard » qu’une solution OpenVPN. En effet, OpenVPN parle un langage bien à lui, et il faut un client OpenVPN pour se connecter à un serveur OpenVPN. Avec des solutions L2TP+IPSec, votre réseau à plus de chance d’être « interopérable ». Un exemple bête, Windows, les iPhones, et les téléphones tournant sous Android supportent nativement ce genre de VPNs.
Une présentation de notre infrastructure
Je vais maintenant rapidement vous présenter notre petite infrastructure. Je dois l’avouer, si elle a vu le jour, c’est plus par challenge et par engouement pour le sujet que pour répondre à un réel besoin. Néanmoins aujourd’hui, nous aurions du mal à nous en passer, j’expliquerai à la fin l’utilité que j’en ai tous les jours.
Pour remettre les choses dans le contexte, nous disposons d’un serveur dédié (Grumpy), hébergé chez OVH, allumé 24h/24, avec une IP fixe. Donc lui, peut importe où l’on se trouve, à priori, il est toujours joignable (pour peu d’avoir une connexion Internet fonctionnelle ;-)). Ensuite, nous disposons de nos routeurs respectifs (donc chez nous) :
- Moi (Sékoïa), mon routeur s’appelle Happy, c’est une board Soekris net4801 [4], sur laquelle je rédigerai certainement un billet plus tard 🙂
- Division-par-zero, son routeur s’appelle Sleepy, et c’est un vieux PC avec une distribution de Linux appelée IPCop [5], spécialisée dans le routage, firewalling.
Ceux sont eux (à quelques intermédiaires prêt), qui nous relis à l’Internet.
Hé bien ! Pourquoi ne pas connecter tout ce joyeux monde ? Voici donc un petit schéma pour éclaircir les esprits.
Voici donc l’infrastructure dans sa forme la plus simple, pas de VPN, rien. Le nuage représente le reste du monde, en gros l’Internet, Grumpy et nos routeurs respectifs y sont connectés, et nous avons nos réseau locaux respectifs, nommés pour l’occasion lan_happy et lan_sleepy. Jusqu’ici donc, rien d’exceptionnel, vous avez certainement une installation similaire chez vous, à l’aide du box quelconque.
Regardons maintenant le résultat si on crée une connexion VPN entre Happy et Grumpy, et une autre entre Sleepy et Grumpy:
Les deux routeurs sont maintenant connectés à Grumpy par un lien VPN. Il y a une adresse IP à chaque bout, et chacun peut communiquer avec Grumpy comme si ils y étaient reliés par un cable. Mais cette infrastructure a un défaut, Happy et Sleepy ne peuvent pas communiquer entre eux par le biais du VPN. Voici donc une modification de l’architecture afin de palier à ce problème:
Cette fois-ci, nous créons un pont (bridge) entre les deux interfaces du VPN sur Grumpy (tap0 et tap1 sur le schéma précédent). Si vous ne savez pas ce qu’est un pont, cela permet en gros de faire comme si les interfaces dans le pont étaient connectées à un même switch. Ici le pont s’appelle br0, et il contient tap0 et tap1. Un sous-réseau est alors créé (lan_vpn) et Happy et Sleepy peuvent communiquer :-).
Une fois les tables de routage correctement configurées sur chacun des routeurs, toutes les machines du réseau lan_happy peuvent communiquer avec celles du réseau lan_sleepy et vice-versa !
Vous allez me dire, pourquoi Grumpy sert d’intermédiaire ici ? Happy et Sleepy pourraient très bien négocier leur lien VPN tout seuls ! C’est vrai, mais ce schéma a l’avantage d’être facilement extensible. Avant, un autre routeur nommé Sneeze (tiens dont ! :-D) était lui aussi connecté au réseau lan_vpn, on comprend alors mieux l’intérêt d’avoir un point « central » de communication. Sneeze est maintenant déconnecté mais qui sait, peut-être qu’un jour un autre nain viendra rejoindre la famille.
Mais nous sommes allé plus loin ! En effet, nous voulions permettre à d’autres machines, n’ayant rien à voir avec ce schéma, de se connecter au réseau. C’est pourquoi nous avons mis en place un autre sous-réseau que voici :
Ce sous-réseau (lan_cert_vpn), permet à quiconque étant connecté, de pouvoir communiquer avec le reste du réseau VPN, c’est à dire toutes les machines des réseaux lan_happy et lan_sleepy. Pour se connecter, il suffit d’avoir un certificat valide (chaque client a un certificat différent). Nous pouvons donc ouvrir un accès à quiconque est connecté à l’Internet !
Vous aurez remarqué que pour l’occasion, Grumpy est devenu un routeur, il doit en effet router le trafic entre lan_cert_vpn et le reste du réseau.
Quelques cas pratiques d’utilisations
Car en effet, au delà de pouvoir dire « oui ! je l’ai fait 🙂 », ce réseau peut avoir une certaine utilité. En voici une liste non exhaustive, inspirée de mon utilisation quotidienne :
- Lorsque je suis à l’extérieur (par exemple au travail), je me connecte au vpn lan_cert_vpn et j’ai à tout moments accès à mon PC à mon domicile. Si celui-ci est éteint, je me connecte à Happy et je lance une requête wake on lan sur le réseau lan_happy et il s’allume tout seul 🙂
- Étant relié à Grumpy par un sous-réseau « privilégié », je peux me servir du serveur SMTP de celui-ci pour envoyer des mails. Le serveur SMTP est configuré pour ne pas accepter de transférer des mails arrivants de l’Internet, et dont la destination finale n’est pas lui-même. En gros, il ne peut donc que recevoir des mails. Cela est indispensable pour ne pas servir de relai de spam. Mais les machines connectées au VPN ont le droit de l’utiliser comme relai :-).
- Je peux jouer avec Division-par-zero à des jeux en réseau à peu près comme si on était en Lan Party. Pas exactement car nous ne sommes pas sur le même sous-réseau, donc les options du genre « rechercher les serveurs LAN » dans les jeux ne fonctionnent pas. Néanmoins, en spécifiant l’IP manuellement, pas de problème, et cela nous évite la tâche fastidieuse d’avoir à rediriger les ports sur nos routeurs respectifs.
- Nous pouvons aussi très facilement nous échanger des fichiers comme nos photos de vacances.
J’en oublie surement. Comme vous le voyez, cette infrastructure crée un véritable réseau local, mais virtuel 🙂 et surtout très sécurisé.
Et maintenant ?
Vous avez maintenant une vue d’ensemble de l’infrastructure mise en place. Dans ce billet, je ne suis volontairement pas rentré dans les détails. J’ai voulu resté très général, le but étant de montrer ce qu’il est possible de faire et les services offerts par une telle infrastructure.
Celle-ci n’est certainement pas parfaite, et il y a bien entendu d’autres moyens de faire. Le but était avant tout de le faire pour apprendre, et je suis aujourd’hui à même de vous faire partager ce que j’ai appris :-). J’espère que ce billet vous donnera des idées. N’hésitez pas à les partager ensuite !
Références
[1] http://www.cisco.com [2] http://www.juniper.net [3] http://www.openvpn.net/index.php/open-source/overview.html [4] http://www.soekris.com/net4801.htm [5] http://sourceforge.net/apps/trac/ipcop/wiki
Sleepy, il fait dodo
Comme je n’ai pas beaucoup de temps ce matin, j’écris un petit billet qui n’a pas une grande importance, mais ça va introduire la notion du parc de nains 🙂
Qui est Sleepy ?
Sleepy, c’est à la base une firewall sous une distribution dédié, nommée IpCop ! Je l’utilise pour protéger tous mon réseau domestique, et depuis l’arrivé de Grumpy, ainsi que de son VPN (Sekoïa est en train de rédiger le billet sur le VPN), Sleepy est directement relié aux autres nains (Grumpy donc pour le moment) !
Que fait Sleepy ?
En théorie, comme expliqué plus haut, il relie mon réseau domestique situé dans mon petit village avec les autres nains !
Dans la pratique, il dort dans un coin de ma chambre là ! En effet, il va falloir que je le réveil un jour, mais des événements indépendants de ma volontés font que Sleepy dort (c’était même pas voulus quand j’ai choisis son nom :p) !
Backup avec lftp 4.x
LFTP is sophisticated ftp/http client, file transfer program supporting a number of network protocols.
Site officiel : http://lftp.yar.ru/
Sur mon poste précèdent je vous parlez des soucis que j’avais eu avec les backups, et le protocole FTP, dans ce billet je vais expliquer pourquoi et comment utiliser la version 4.x de lftp sur une debian stable (en effet la branche < 4.0.6 de lftp est en testing à l’heure de ce billet).
Pourquoi LFTP 4 ?
En plus de fait que c’est une version supérieur à la version 3, qui en toutes logique (pas toujours c’est vrai) apporte son lot de mise à jours, et de correction de bugs !
Là où j’ai eu un gros soucis c’est avec les noms des fichiers/dossiers qui commence par un tilde (~). Si on regarde le changelog de lftp, il suffit de faire une recherche sur le mot tilde pour trouver deux dates importantes :
Version 3.5.2 – 2006-07-28
- Fixed mirror for files starting with a tilde.
Version 4.0.1 – 2009-09-17
- Fixed handling of files starting with a tilde in ftp.
Il existe une correction des fichiers qui commencent par un tilde avec l’option mirror, pour la version 3.5.2, effectivement la version de lftp est supérieur à 3.5.2 en stable, et mes fichiers sont bien tout synchronisés, le problème c’est avec l’option –delete de lftp :
1 | lftp bm -e "mirror --delete /source /dest;exit;" |
Cette option à pour effet de supprimer de la destination, les fichiers qui n’existe plus dans la source, afin de faire un véritable miroir.
Et là j’avais une erreur à chaque fois sur mes fichiers commençants par un tilde.
J’ai donc tout de suite testé le problème avec une version de lftp > 4.0.1 sur ma Gentoo, ainsi que sur ma Arch, et je n’avais plus le message d’erreur !
La question suivante a été de savoir si je compilais une version statique de lftp 4.0.1+ pour Grumpy, ou si je trouvais une solution pour installer directement l’outil depuis aptitude dans sa version testing !!
Le problème étant les dépendances, compiler chaque dépendances pour ensuite compiler l’outil en statique ne me semble pas être la solution la plus pérenne ! J’ai donc choisis la solution qui consiste à garder un système en stable, avec quelques outils en testing, on parle ainsi de système mixte !
Installer LFTP 4.0.1+ (testing) sur une Debian stable !
Cela s’adapte à tous les paquets des Debians, pas uniquement pour lftp
Il faut modifier le fichier /etc/apt/apt.conf ou créer un nouveau fichier dans /etc/apt/apt.conf.d/.
Définir le système par défaut
/etc/apt/apt.conf.d/99mixed
APT::Default-Release "stable";
Indiquer où sont les paquets en testing
Dans votre fichier /etc/apt/sources.list, il va falloir dupliquer toutes les lignes qui commencent par deb, et qui contiennent le mot « stable » et/ou le nom de la distribution « etch, lenny, … », puis changer le mot stable par testing, sur les lignes dupliqués, ainsi que le nom de la distribution par le nom de la distribution testing actuel (voir http://packages.debian.org/testing/) !
/etc/apt/sources.list (exemple)
deb http://ftp.fr.debian.org/debian squeeze main testing
Dans cette exemple, lenny est la version stable, je rajoute les paquets de squeeze qui est la version testing actuelle !
La suite est plutôt simple, et doit être adapté suivant le gestionnaire de paquet que vous utilisez habituellement :
aptitude
aptitude -t testing install lftp
apt-get
apt-get -t testing install lftp
Note importante : on le vois écrit trop peu souvent, mais il est important de toujours utiliser le même outil aptitude ou apt-get pour installer des paquets, la différence ce ressent surtout quand vous avez besoin de faire de la place, la gestion des dépendances est pas faite de la même façons entre les outils.