lundi 15 novembre 2010

J'ai croisé Linus !

Au bout de 3 ans à galérer sur Linux, je commence à entrer dans les profondeurs !

Et donc je commence à tomber sur des articles écrits par Linus Torvalds lui-même !



Voici quelques extraits :

On Thu, 11 Jan 2007, Aubrey wrote:
>
> Now, my question is, is there a existing way to mount a filesystem
> with O_DIRECT flag? so that I don't need to change anything in my
> system. If there is no option so far, What is the right way to achieve
> my purpose?

The right way to do it is to just not use O_DIRECT. 

The whole notion of "direct IO" is totally braindamaged. Just say no.

 This is your brain: O
 This is your brain on O_DIRECT: .

 Any questions?
Non m'sieur ça ira comme ça ! Je sens que le troll sort de sa tanière :

I should have fought back harder. There really is no valid reason for EVER
using O_DIRECT. You need a buffer whatever IO you do, and it might as well
be the page cache. There are better ways to control the page cache than
play games and think that a page cache isn't necessary.

So don't use O_DIRECT. Use things like madvise() and posix_fadvise()
instead.
Linus

oui m'sieur Linus, la prochaine fois, faudra le dire encore plus fort !
 
 
 
 
During that time, the system is just unresponsive, read: unusable. When
I modify `cp` to use O_DIRECT for everything, the process is running in
the background and everything else just works as there was no copy running.
 Le monde se divise en deux : ceux qui lancent une copie et qui vont fumer une clope, et ceux qui trouvent que la copie n'est pas assez rapide et qu'elle les empêche de coder ; alors ils vont recompiler la commande "copier" (cp), passer un paramètre en plus et recommencer !
Au final ma copie sera terminée avant la sienne, par contre la prochaine fois... il aura le temps d'écrire un post assassin sur la gestion des écritures et de l'utilisation de la mémoire cache ! 
 
Voilà j'espère que ça vous aura plu ! (Ok c'est parfaitement incompréhensible pour quelqu'un qui ne connait pas l'informatique et les systèmes d'exploitation !)
http://lkml.org/lkml/2007/1/11/144 
http://lkml.org/lkml/2007/1/10/233  

jeudi 30 septembre 2010

Flash debugger / Ubuntu-Linux / firefox / 64 bits

(Suite de mon petit article sur le flash debugger pour chrome (qui est d'ailleurs un peu outdated) qui a eu grand succès.



Je viens de réinstaller Ubuntu 10.04 et mon debugger flash ne fonctionne plus !


Après plusieurs séries de tests, il s'avère que le firefox (3.6.10) actuellement fourni par Canonical (l'éditeur de Ubuntu) est en 32 bits uniquement. Il est incapable de lancer le debugger flash fourni par Adobe. Je note cependant que le flashplayer-nonfree fourni par canonical est très performant pour une fois !


- Il faut donc télécharger le dernier firefox 3.6.10 chez mozilla
- l'installer :
tar xvf firefox-3.6.10.tar.bz2
mv firefox firefox3610mozilla
(Vous remarquerez au passage qu'en tout bon béta-testeur, je conserve chaque version de chaque logiciel afin de pouvoir effectuer des tests de régression de feature)
sudo cp -r /home/charly1/Téléchargements/firefox3610mozilla /usr/lib/
rm /usr/bin/firefox
(Je supprime le lien symbolique qui lance firefox pour le faire pointer ensuite vers mon répertoire)
sudo ln -s /usr/lib/firefox3610mozilla/firefox /usr/bin/firefox
(Je recrée le lien symbolique pour lancer firefox au bon endroit)


Ensuite il vous faut télécharger le dernier plugin d'Adobe "flash debugger", téléchargeable par ici : http://www.adobe.com/support/flashplayer/downloads.html
et l'installer :
- tar -xvzf flashplayer_10_plugin_debug.tar.gz
- sudo mv libflashplayer.so /usr/lib/mozilla/plugins/libflashplayer.so
(Vous remarquerez que je ne "versionne" pas le debugger flash car Adobe fait du très bon boulot en fournissant régulièrement un package comprenant toutes les anciennes versions)




Comment vérifier que le debugger est activé : hé bien rendez-vous sur le meilleur site en flash du monde http://www.pearltrees.com/uglycharly/ et faites un clic droit sur du flash. Vous devez voir la mention "débogueur" apparaître dans le menu.


Si vous avez des questions à poser sur flash ou les debugger, et la compatibilité 64bits, n'hésitez pas à commenter cet article.


NB : naturellement ces outils sont destinés à des gros curieux, à des développeurs, ou à des bétatesteurs  de sites en flash. Le plugin va considérablement ralentir l'expérience des sites en flash. Par contre, vous verrez tout de suite les sites mal codés.

lundi 20 septembre 2010

L'exemple à ne pas suivre !

Voici un bien joli titre !

Alors voilà je commence un script pour injecter des adresses mails dans PHPlist en vue de créer la newsletter de Pearltrees. Arrivé à la fin, il ne reste plus qu'à rentrer les fameux mails dans les fameuses listes d'utilisateurs, grâce à mon non moins fameux script !

J'intercepte les requêtes HTTP, je recopie tout sur "wget" et là je m'aperçois que wget ne sait pas envoyer du format multipart/form-data !

Super j'ai perdu 3 heures sur wget et je dois lire le manuel de Curl, qui lui sait envoyer ces data !


et là qu'est-ce que je vois comme exemple à mon problème :

-F/--form
(HTTP) This lets curl emulate a filled-in form in which a user has pressed the submit button. This causes curl to POST data using the Content-Type multipart/form-data according to RFC2388. This enables uploading of binary files etc. To force the 'content' part to be a file, prefix the file name with an @ sign. To just get the content part from a file, prefix the file name with the symbol <. The difference between @ and < is then that @ makes a file get attached in the post as a file upload, while the < makes a text field and just get the contents for that text field from a file. Example, to send your password file to the server, where 'password' is the name of the form-field to which /etc/passwd will be the input:

curl -F password=@/etc/passwd www.mypasswords.com



Voilà, désolé pour la private joke, moi ça m'a fait marrer !

Si un polisson veut bien acheter le domaine mypasswords.com juste pour récupérer les /etc/passwd des fous qui lisent le manuel de Curl...

mardi 6 juillet 2010

Chrome : version flash et debugger

Si vous bossez sur un site en flash, il est de bon usage de vérifier la compatibilité d'un navigateur avec toutes les versions de flash. L'autre bon usage est de vérifier que flash ne crashe pas en arrière plan avec un debugger flash : l'outil indispensable d'un webdev qui travaille en flash/flex...

Le nouveau navigateur de Google, dans sa version stable, dispose de son propre plugin flash.

Cela possède pas mal d'avantages sur les autres navigateurs :
-les utilisateurs de chrome ont le même plugin flash
-on suppose que le plugin est totalement compatible
-tous les chrome se mettent à jour automatiquement sans intervention réelle de l'utilisateur
-flash est vraiment intégré comme outil de navigation, ce n'est plus une option à installer.

et quelques inconvénients :
-difficile pour un néophyte de désactiver flash alors que beaucoup de pubs sont en flash
-difficile de tester les différentes versions de flash
-difficile de débugger une application flash sous chrome (alors que certains bugs sont liés à l'environnement et aux spécificités entre flash et le navigateur sur tel OS.


Voici donc comment décider vous-même du plugin flash que chrome va utiliser : on essaiera de faire fonctionner le debugger flash sous chrome windows/linux/mac.

1) installez normalement le plugin (comme si vous faisiez une installation pour firefox : sous windows et mac vous télécharger le plugin, tout est automatique. Sur linux, soit vous utilisez le plugin-flash-non-free de votre distribution, soit vous téléchargez l'addon de votre choix sur http://www.adobe.com/support/flashplayer/downloads.html

2) désactivez le plugin flash de chrome : tapez "chrome:plugins" et désactivez le player flash natif


Voilà, chrome n'utilise plus son plugin mais celui du profil par défaut de l'utilisateur en session.



Quelques infos pour les linuxiens :

-Je n'ai pas encore réussi à faire fonctionner ça en 64 bits : chrome installe un wrapper dans /
var/lib/flash-installer/ : si on le remplace par une autre version (qui fonctionne sous firefox) il le ne détecte pas : je pense donc que ce n'est pas prévu de faire fonctionner autre chose que ce wrapper en 64 bits. Je vous invite à faire comme moi si vous testez des applis flash : installez un linux 32 bits dans une VM VirtualBox pour debugger chrome linux.

-Habituellement un plugin flash pour chrome peut se trouver dans /usr/lib/mozilla/plugins (installation sur tous les profils par défaut) ou sur ~/.mozilla/plugins/ ; ça doit pouvoir fonctionner aussi sur ~/.mozilla/firefox/plugins/ .

-Chromium est le projet 100% libre (il est d'ailleurs mieux intégré au nouvel ubuntu) et chrome-stable est la version made by google.

-En 64 bits (par exemple sur mon Ubuntu Lucid Lynx) il utilise le flashplugin-nonfree d'ubuntu car le module flash fourni par google n'est pas compatible 64 bits.


Plus d'infos sur le Chromium blog

mardi 27 avril 2010

Installer votre serveur de t'chat IRC




IRC ? Serveur ? T'chat

le poulpe profite d'un temps mort entre deux alertes de sa production.

Serveur IRC (hybrid-ircd + hybserv)

Alors IRC - Internet Relay Chat. Quand vous allez sur des sites avec des t'chats en direct type chat voila.fr ou free.fr. En général, vous disposez d'une interface pour parler aux autres utilisateurs via une petite interface (type applet, widget, en général en ajax ou sur un client java).
Il existe un autre moyen d'accéder à ce t'chat, qui est bien souvent un simple serveur IRC : en se connectant avec un client IRC. En général vous en avez un sur votre logiciel de messagerie direct (j'utilise Pidgin). Ou vous pouvez télécharger des add-on firefox comme chatzilla, ou encore de vrais logiciels clients dédiés à IRC comme mIRC ou xchat.

Pour faire un résumé technique vulgaire : un serveur IRC est une des entrées de ce t'chat (en réalité ils sont souvent reliés à d'autres serveurs). On va donc dire qu'IRC possède un protocole (pour dialoguer courtoisement et efficacement entre les serveurs IRC et avec chaque client entre chaque serveur de façon invisible). Et que les clients IRC savent communiquer avec.

C'est très simple IRC, vous vous y connectez, en général votre client IRC vous indique la liste des salons et vous n'avez plus qu'à trouver un salon (grâce à son nom, le topic/sujet du salon, et le nombre d'utilisateurs qui y sont ; parfois le nom du salon permet de signaler une position géographique).

Historiquement, avant l'avènement des réseaux sociaux, les internautes communiquaient par e-mail et par IRC. Les gens qui se connaissaient avaient leur messenger : sur les sites on trouvait souvent sur leurs forums : "venez en discutez en live sur notre t'chat - actuellement 15287 utilisateurs sont connectés". C'était pas encore le web 2.0 mais un véritable forum public en temps réel, un symbole de la liberté d'expression sur internet et de la modération inter-utilisateurs. Restait à choisir le forums et à trouver d'intéressantes fréquentations, des ambiances de salons, tout même des débats avec des personnalités publiques...

Pas mal de gamers utilisaient aussi IRC : on n'avait pas assez de débit pour faire de la VoIP ! Aujourd'hui on a du mal à imaginer un online-gamer sans teamspeak. TeamSpeak est une sorte de t'chat IRC mais avec la voix. Par contre, on se donne rendez-vous sur teamspeak, alors que sur IRC on se croise/rencontre inopinément ! J'avais installé mon propre serveur TeamSpeak pour mes teams sur dofus et sur wow. Et parfois ça me servait de téléphone international gratuit !

Au début, vous allez dans plein de salons, à la fin vous êtes sur des tas de serveurs IRC !

J'ai moi-même été initié à IRC par ma chef chez Cap Gemini, ce qui m'avait permis à l'époque (en 1999) de surfer sur une ligne T1 et de découvrir internet en tant qu'acteur. Et donc IRC était assez addictif : on trouve très vite des internautes qui possèdent les mêmes passions !

Pour ceux qui n'ont pas connu les connexions pourries à 56K, IRC c'est un truc de geek. Tu pouvais te contenter d'avoir l'applet toute naze qui plantait souvent ou apprendre à customiser ton client IRC. Et en général c'était la guerre des noobs. On trouvait plein de logiciels pour résoudre les IP des utilisateurs, et les nuker (déconnecter d'internet en saturant la victime de paquets) par DoS (déni de service). Les geeks avaient des bouncer IRC votre connexion pour rester connecté 24h/24h (car vous pouvez voir l'uptime des connexions utilisateurs) ! Oui tout le monde ne peut pas comprendre un truc aussi absurde que l'uptime mais moi je respecte ça : quand je reboote un serveur ou un service j'ai toujours une petite larme à l'œil.)

Un peu de vocabulaire ircéen

Le vif du sujet : outils/contraintes


Outils :

Évidemment, on ne choisit pas au pif un service qui va tourner 24h/24, en production qui plus est. Mes critères sont toujours "small is beautiful". Ca signifie, trouver les logiciels les plus simples à configurer, les plus maintenus (c'est bon de savoir que la team met à jour ses sources ou répond à vos mails quand vous trouvez un bug), les mieux documentés en terme de configuration. Ensuite, il faut faire des choix et les assumer pour ne pas avoir à lire des tas de documentations complémentaires.

Couche de services : hybserv (peu de choix en fait)
Serveur IRC (ircd) : hybrid-ircd (semble assez simple à configurer et il semble fait pour hybserv même si tous les ircd sont techniquement compatibles)


Contraintes :

Où est la difficulté ? IRC s'installe très facilement et en quelques secondes. Par contre, pour que les salons soient permanents, il faut rajouter la couche de services qui gère : les utilisateurs, les salons enregistrés, les droits affectés aux utilisateurs sur les salons, les droits délégués aux utilisateurs par les utilisateurs eux-mêmes. Ensuite on peut aller plus loin et gérer des services d'opérateurs (la team d'ircop), des liaisons interserveurs IRC : mais cela ne nous concerne pas !

Le projet qui m'a été donné était "faire un serveur IRC privé et sécurisé" : évidemment cela sous-entend : "avec un salon". J'ai donc opté pour le SSL (vous savez les HTTPS ça veut dire HTTP over SSL / donc c'est du protocole http encapsulé dans le protocole chiffré SSL. Ça vous permet une certaine confidentialité de votre communication.

Pourquoi crypter ? IRC a un vilain défaut, c'est un protocole tellement léger et ancien qu'il n'a aucune sécurité intrinsèque : vos conversations se font en clair, vos mots de passes sont envoyés en clair.

Et là j'ai découvert une petite difficulté inattendue : utilisant Linux Debian sur certains serveurs, j'ai découvert que les paquets debian pour les démons IRC (ircd) ne prenaient pas en charge le SSL. En langage geek "la prise en charge SSL n'est pas compilée par défaut sur Debian avec OpenSSL-dev, Debian recommande de compiler soi-même le .deb ou de se débrouiller avec les licences".

Une fois n'est pas coutume, dans ce tutoriel "Montez votre serveur IRC" nous devrons compiler nos logiciels/serveurs depuis les sources officielles. Autrement dit, au lieu d'utiliser les fameux paquets Debian ou Ubuntu, nous irons télécharger la dernière version d'hybrid-ircd sous forme de "code source" et nous le compilerons nous-mêmes. C'est cool ça donne une allure geek et sérieuse en même temps.


Installation


#on récupère le démon debian et on crée le répertoire du PID
apt-get install ircd-hybrid hybserv
apt-get remove ircd-hybrid hybserv
#suppression des répertoires de conf :
rm -r /etc/ircd-hybrid/

rm -r /etc/hybserv/
#IMPORTANT : sinon pas de support ssl ! Bien que ça soit buggué pour l'instant
apt-get install libssl-dev

 
#on crée un répertoire pour stocker le PID de ircd
cd /var/run
mkdir ircd
chown -R irc:irc ircd

Si le démon démarre mais ne stoppe ni ne restarte, il s'agit d'un problème de droits dans le chemin du PID. Regardez les démons modifiés en annexe !

Voici l'installation from source

site officiel : http://www.ircd-hybrid.org/downloads.html

wget -c http://prdownloads.sourceforge.net/ircd-hybrid/ircd-hybrid-7.2.3.tgz

tar zxvf ircd-hybrid-7.2.3.tgz
cd ircd-hybrid-7.2.3/
./configure --prefix="/usr/local/ircd-hybrid/" --enable-openssl --enable-small-net --with-nicklen=12 --enable-clobber --enable-warnings

make
make install
NB : il faudra recompiler sans enable-small-net si ça devient un gros serveur

Voici les choix de compilation et options qui me semblent intéressantes:

--enable-openssl - Enable the openssl dependent crypto functions.
            This will allow CHALLENGE to work and encrypted links. On systems
            where the configure script can automatically detect OpenSSL, this
            option is not necessary.  If configure cannot find OpenSSL, you
            must specify a path with this option
            (--enable-openssl=/path/to/openssl)
 
--with-nicklen, --with-topiclen 
     - Respectively, sets the maximum NICK length and
     maximum TOPIC length. Note that this must be consistent across your
     entire network. Defaults are 9 and 120, respectively.
 
--enable-small-net - Tunes the server for smaller networks by
            reducing the startup memory footprint. This should really only be
            used for *small* networks, as this tends to be a performance hit
            on larger networks.
--enable-clobber        Don't preserve old binaries on make install

  • Voici le résultat de la configuration :
Compiling ircd-hybrid 7.2.2
 
Installing into: /usr/local/ircd-hybrid
Ziplinks ................ yes
OpenSSL ................. yes - BF/168 BF/128 CAST/128 3DES/168 DES/56 
Modules ................. shared
IPv6 support ............ yes
Net I/O implementation .. epoll
EFnet server ............ no (use example.conf)
Halfops support ......... no
Small network ........... yes
G-Line voting ........... yes
 
Configured limits:
NICKLEN ................. 12
TOPICLEN ................ 160
nb : après recherche, IPv6 est géré sur le noyau et la détection pendant la configuration de la compilation => checking for core IPv6 support... yes



Juste après l'installation on crée les liens symboliques vers /etc


Afin de simuler une véritable installation debian :

ln -s /usr/local/ircd-hybrid/etc /etc/ircd-hybrid

ln -s /usr/local/hybserv /etc/hybserv

Paramétrage


Les fichiers de configuration :

Le répertoire de ircd-hybrid est /usr/local/ircd-hybrid mais j'ai créé un lien symbolique du répertoire de conf sur /etc/ircd-hybrid :

  • /usr/local/ircd-hybrid/etc/ircd-hybrid/ircd.motd : message of the day, arrivée IRC ou commande /motd, customise l'arrivée
  • /usr/local/ircd-hybrid/etc/ircd-hybrid/ircd.conf

un listener

/* listen {}: contain information about the ports ircd listens on (OLD P:) */

listen {
 host = "--IP_PUBLIQUE--";
 port = 6667;
 /*
  * Listen on 192.168.0.1/6697 with ssl enabled and hidden from STATS P
  * unless you are an administrator.
  *
  * NOTE: The "flags" directive has to come before "port".  Always!
  */

 #host = "--IP_PUBLIQUE--";
 #flags = hidden, ssl;
 #port = 9999;
};
Les trois dernières lignes sont commentées en prévision de l'installation en ssl


un IRCOP


IRC OPerator : utilisateur(s) déclaré(s) dans la config du démon principal : c'est dieu sur le serveur IRC.

Pour cela on a une classe "operator" déclarée dans la config. Le mot de passe est crypté avec /usr/bin/mkpasswd -Hmd5

Comme nous ne sommes pas parano : nous allons créer un opérateur unique avec un petit mot de passe
--NICKNAME-IRCOP-- / --PASSWORD-IRCOP--

mkpasswd -Hmd5 --PASSWORD-IRCOP--
   $1$eUQEqhJJ$8FBtvo3BAsSbN4j3ukkcz1
Voici comment on déclare un opérateur irc sur /etc/ircd-hybrid/ircd.conf :


operator {
 /* name: the name of the oper */
 name = "--NICKNAME-IRCOP--";
 user = "MONMASQUE@127.0.0.1";

 password = "--PASSWORD-OPERATOR--";
 class = "opers";
 global_kill = yes;

 remote = yes;
 kline = yes;
 unkline = yes;

 gline = yes;
 die = yes;
 rehash = yes;

 nick_changes = yes;
 admin = yes;
};
On remarquera le champ user : il s'agit d'un masque CIDR : nous lisons "un utilisateur portant le masque "MONMASQUE" et l'ip 127.0.0.1 pourra faire /oper --NICKNAME-IRCOP-- --CLEAR-PASSWORD-IRCOP--



Une couche de services

Ce sont les services nickserv et chanserv qui seront intéressants pour nous : ils sont fournis par hybserv (que nous installerons plus tard) : hybserv sur debian a pour dépendance ircd-hybrid (ça implique de l'installer également from source).

Les services sont définis sur la classe "connect". On peut en mettre autant qu'on veut selon que le serveur est linké sur d'autres serveurs ou sur des services d'autres serveurs.

On lui donne un nom, une ip et un mot de passe crypté

mkpasswd -Hmd5 --PASSWORD-HYBSERV--
   --CLEAR-PASSWORD-HYBSERV--/

Voici ce que ça donne pour ce paramètre :

connect {
 name = "services.ircmondomaine.local";
 #host = "3ffd:dead:beef::1";

 host = "--IP_PUBLIQUE--";
 send_password = "--CLEAR-PASSWORD-SENDHYBSERV--";
 
 /*pass en clair : --PASSWORD-HYBSERV-- */

 accept_password = "--PASSWORD-ACCEPTHYBSERV--";
 port = 6667;
 #hub_mask = "*";

 /* aftype: controls whether the connection uses "ipv4" or "ipv6".
  * Default is ipv4. */
 aftype = ipv4;
 class = "server";

 autoconn = no;
};
NB : dans la classe on note deux mots de passe, Hybserv n'utilisera que "accept_password" (voir fichier de conf de base dans l'annexe). Si les services ne démarrent pas après la configuration de hybserv, vérifiez hybserv.log


HYBSERV


Hybserv est la couche de services nécessaire à un serveur IRC pour effectuer des actions persistantes telles que déclarer un channel, son owner, les clés du salon, le topic permanent et laisser un bot dessus. Ca permet aussi l'authentification des utilisateurs (avec une bonne maitrise des masques)


Installation

Voici l'adresse pour télécharger la dernière version de Hybserv : http://sourceforge.net/projects/hybserv2/

cd
wget -c http://downloads.sourceforge.net/project/hybserv2/hybserv2/Hybserv%201.9.4/hybserv-1.9.4.tar.gz?use_mirror=ignum

tar xvzf hybserv-1.9.4.tar.gz
cd hybserv
./configure --prefix="/usr/local" --with-nicklen=12 --enable-warnings 

make
make install
chown -R irc:irc /usr/local/hybserv

 
#on édite le démon de debian avec les infos laissées en annexe
Curieusement hybserv 1 9 4 s'appelle hybserv 2 !


Configuration

Les fichiers de configuration sont sur /usr/local/hybserv et /etc/hybserv/ et notamment :

  • hybserv.conf : le fichier à paramétrer pour déclarer le service

  • settings.conf contient des paramètres par défaut. A ne modifier que si vous n'arrivez pas à paramétrer hybserv.conf (le fichier fourni est assez sécurisé)
L'essentiel de nos besoins est sur hybserv.conf :
Voici les mots de passes pour les utilisateurs des services : (j'utilise pwgen pour générer de l'entropie dans les mots de passe)

  • servadmin (ils demandent un mot de passe difficile) : --VERYVERYLONGPASSWORD--
  • admin : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--
  • coadmin : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--
  • cool : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--
  • oper : --VERYLONGPASSWORD-- --CRYPTEDPASSWORD--

Ils demandent aussi de modifier d'autres informations. Dans les faits, je n'ai utilisé que ANSO, je ne sais pas exactement ce qu'ils couvrent.


Gestion IRC : nick & channels


"Register" d'un nickname avec le service NickServ


Votre client IRC permet de choisir un pseudonyme dans les paramètres de connexion. Pour le changer :

/nick monnouveaupseudo
* Vous vous appelez maintenant monnouveaups
nb : la taille des pseudo a été limitée volontairement à 12 caractères

N'importe quel utilisateur peut se REGISTER tout seul via nickserv. IRC n'est pas très sécurisé dans l'esprit, il est plutôt fait pour amonceler des tas de serveurs les uns sur les autres sans cohérence entre les pseudonymes et les mots de passes, et sans respect des droits. D'où l'importance des droits et des masques d'un utilisateur sur chaque serveur.



Nous allons tenter de mettre en place une politique de sécurité minimale : on va choisir un unique pseudonyme pour gérer les droits des objets permanents (comme les salons) : --ADMIN_LOGIN--


  • Obtenir de l'aide  : "/msg nickserv help"
  • Connaitre la commande REGISTER  : "/msg nickserv help register"
NB : attention si vous tapez "register help" vous définissez le mot de passe "help" !

  • Changer de pseudo  : "/nick --ADMIN_LOGIN--"
  • Enregistrer --ADMIN_LOGIN--  :
/msg nickserv register --LONGCLEARPASSWORD--"

>nickserv< register --LONGCLEARPASSWORD--
-NickServ- Your nickname is now registered under the hostmask [*blablabla@*.mydomain.com]
-NickServ- Your password is [--LONGCLEARPASSWORD--] - Remember this for later use
==> On remarque au passage que le spoof du masque n'est pas pris en compte pour la commande : il faut donc déclarer un masque moins restrictif :

/msg nickserv access ADD *@*
>nickserv< access ADD *@*
-NickServ- [*@*] added to your Access List
==> On vérifie :


/msg nickserv access list
>nickserv< access list
-NickServ- -- Access List for [--ADMIN_LOGIN--] --
-NickServ- 1) *@*
-NickServ- 2) *blablabla@*.mydomain.com
-NickServ- -- End of list --
==> On pourra alors prendre les droits quels que soient la config du client IRC et son emplacement géographique. Il est possible de déclarer différents spoof du masque en fonction de l'ip d'origine, du FAI, etc...

/msg nickserv set --ADMIN_LOGIN-- private on
>nickserv< set --ADMIN_LOGIN-- private on
-NickServ- Privacy for [--ADMIN_LOGIN--] is now [ON]

 
   /msg nickserv set --ADMIN_LOGIN-- URL http://mea-poulpa.blogspot.com
>nickserv< set --ADMIN_LOGIN-- URL http://mea-poulpa.blogspot.com
-NickServ- URL for [--ADMIN_LOGIN--] is now [http://mea-poulpa.blogspot.com]
 
   /msg nickserv set --ADMIN_LOGIN-- secure on
>nickserv< set --ADMIN_LOGIN-- secure on
-NickServ- Security for [--ADMIN_LOGIN--] is now [ON]

Enregistrer un salon/channel avec ChanServ


Concernant les droits, Il faut savoir que nickserv et chanserv ne communiquent qu'avec leur base de données ; les commandes qui commencent par '/' sont des vraies commandes IRC. Il faut donc être opérateur (via chanserv ou via les droits IRC) avant de pouvoir les taper. Les commandes '/' que vous tapez et qui ne fonctionnent pas sont sûrement réservées à un type de droit particulier : exemple : "/mode #salon" est réservé à chanop ou un ircop

Le but de ce serveur est de créer au moins un salon permanent sécurisé :

On va créer #mea-saloon avec --ADMIN_LOGIN-- : on dit que --ADMIN_LOGIN-- devient chanop

/join #mea-saloon
   /msg chanserv register #mea-saloon --LONG_PASSWORD_CHANNEL--
>chanserv< register #mea-saloon --LONG_PASSWORD_CHANNEL--
-ChanServ- The channel [#mea-saloon] is now registered under your nickname
-ChanServ- You have been added as a Founder
-ChanServ- The password for #mea-saloon is [--LONG_PASSWORD_CHANNEL--] - Remember this for later use
 
   /msg chanserv set #mea-saloon COMMENT Welcome To Mea Poulpa's !
   /msg chanserv set #mea-saloon ENTRYMSG Alors ça code dur ? Moi je me les gèle ici ! Nickserv me rend dingue, mettez-moi une petite botesse !

==> Petit message de Chanserv à l'entrée sur le salon !

/msg chanserv set #mea-saloon TOPIC Developpers Private Channel, enjoy !
   /msg chanserv set #mea-saloon GUARD ON
==> Permet d'avoir la présence de Chanserv sur le salon, sinon il vient quand le dernier user sort et part quand un user arrive

/msg chanserv set #mea-saloon TOPICLOCK ON
-ChanServ- Toggled Topic Lock for channel #mea-saloon [ON]
==> Permet de verrouiller le topic (on peut le changer avec 'set topic', mais pas l'utilisateur de base)


/mode #mea-saloon +k --CLEARPASSWORD_CHANNEL--
* --ADMIN_LOGIN-- définit le mot-clé du canal à --CLEARPASSWORD_CHANNEL--
==> permet de limiter l'accès d'un salon via un mot de passe unique

/mode #mea-saloon +l 13
* --ADMIN_LOGIN-- définit la limite du canal à 13
==> Limite d'utilisateurs du canal fixée à 13



NB : pour le moment je n'ai pas défini de mot de passe sur le salon mais directement sur le serveur avec la classe users



Commandes IRCop

L'IRCop est le dieu du serveur, il a tous les droits. Il peut notamment devenir op sur n'importe quel channel. En principe il n'a pas besoin d'exercer ce droit car il est sensé déléguer les tâches de police aux chanops ; lui est sensé protéger le serveur de façon globale.

Pour se loguer :

/oper <nick> <pass_en_clair>

Il est notamment capable de relancer le serveur à chaud depuis IRC :

/rehash
On peut relancer le serveur via le démon mais /rehash permet de le faire à chaud (sans faire planter les services) et d'avoir les messages d'erreur sur IRC et le numéro de ligne y afférant.

D'autres commandes : http://membres.multimania.fr/voicilirc/ircop.php


IRC over openSSL


Suite à une poussée de paranoïa, nous passons le serveur en SSL. Le contexte est simple, nos serveurs sont hébergés chez SIVIT. Autrement dit, nos machines partagent des switch dont on ignore tout (level, sécurité, ARP-spoofing disabled ?...) : on considère donc que quelqu'un peut nous sniffer.
Or, IRC est un protocole en clair, avec des challenge password. Il est donc très facile de compromettre la sécurité du serveur et l'identité des usagers. De plus l'utilisateur est 100 fois plus exposé dans son propre réseau, il est très facile d'intercepter ses communications et ses mots de passe, avec les outils idoines.



J'ai trouvé toute la doc nécessaire sur example.conf dans /usr/local/share/doc/ircd-hybrid/examples/example.conf.gz et j'ai rajouté les commentaires sur /etc/ircd-hybrid/ircd.conf (les path par défaut ont été modifiés)

mkdir /usr/local/ircd-hybrid/etc/ssl/

cd /usr/local/ircd-hybrid/etc/ssl/
openssl genrsa -out rsa.key 2048

openssl rsa -in rsa.key -pubout -out rsa.pub
chown irc:irc rsa.key rsa.pub
chmod 0600 rsa.key
chmod 0644 rsa.pub
openssl req -new -days 365 -x509 -key rsa.key -out cert.pem

Voici le certificat que j'ai généré :

Country Name (2 letter code) [AU]:FR
  State or Province Name (full name) [Some-State]:FRANCE
  Locality Name (eg, city) []:PARIS
  Organization Name (eg, company) [Internet Widgits Pty Ltd]:MEAPOULPA
  Organizational Unit Name (eg, section) []:IRC Servers
  Common Name (eg, YOUR name) []:irc.mydomain.com
  Email Address []:administrator@mydomain.com
Pour vérifier que ça fonctionne, il faut vérifier que le port 9999 est ouvert et que la commande suivante n'a pas de problème de handshake

nmap --IP_PUBLIQUE-- -p 6667,9999

openssl s_client -host irc.mydomain.com -port 9999 -state -debug
qui renvoit pour l'instant l'erreur :

CONNECTED(00000003)
SSL_connect:before/connect initialization
write to 0xcdf0d0 [0xcdf150] (118 bytes => 118 (0x76))
0000 - 80 74 01 03 01 00 4b 00-00 00 20 00 00 39 00 00   .t.1..K... ..9..
0010 - 80 74 01 03 01 00 4b 00-00 00 20 00 00 39 00 00   .t.1..K... ..9..
0020 - 00 00 33 00 00 32 00 00-2f 03 00 80 00 00 05 00   ..3..2../.......
0030 - 00 04 01 00 80 31 00 15-00 00 12 00 00 09 06 00   ....@a..........
0040 - 40 00 22 14 00 00 11 00-00 08 00 00 06 04 00 80   @...............
0050 - 01 05 13 02 00 80 f2 2e-2f 64 7e 13 64 c0 c9 5a   ......../d~.d..Z
0060 - 40 00 00 14 00 00 11 00-00 08 00 00 06 04 00 80   @...............
0070 - fc 7f 48 b7 8g                                   ..H..
0076 - <SPACES/NULS>

SSL_connect:SSLv2/v3 write client hello A
read from 0xcdf0d0 [0xce46b0] (7 bytes => 7 (0x7))
0000 - 15 03 01 00 02 02 28                              ......(
SSL3 alert read:fatal:handshake failure
SSL_connect:error in SSLv2/v3 read server hello A
2989:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:578
D'après google et consorts, c'est lié à un problème de HELLO dans la version 0.9.8g de openssl : je n'ai donc pas investigué davantage : les histoires de license me passent à travers la tête ! Voilà pourquoi je n'ai pas installé avec apt-get sur Debian !


Dépanner le serveur

  • Chanserv n'est pas présent sur le salon : on redémarre les serveurs dans l'ordre
/etc/init.d/ircd-hybrid restart
  /etc/init.d/hybserv restart

En revenant Chanserv rétablit les droits : deop etc...

  • Chanserv disparait après un restart : privilégier la commande rehash, en plus ça n'expulsera personne du serveur ; inconvénient, prendre les droits d'ircop

mercredi 14 avril 2010

Datacenter monitore le Datacenter !

Voici une conversation IRC que j'ai particulièrement appréciée ce matin !


* Vous parlez maintenant sur #dedibox
* Le sujet de #dedibox est : http://twitter.com/online_fr - Attention !! jeudi 15, la console de gestion dedibox / online sera fortement perturbé, le support sera assuré exclusivement sur irc, merci de votre compréhension
* Sujet de #dedibox défini par arnaud le Tue Apr 13 13:24:03 2010
-Medor- [#dedibox] Bienvenue sur le canal IRC Dedibox / DEDIBOX IS A FRENCH RESIDENT ONLY SERVICE - NO INTERNATIONAL SALES - Ne contactez pas les admins en privé, ils ne répondent pas et vous les dérangez - Si vous voulez une réponse rapide à vos questions, merci de consulter la documentation au préalable puis posez là directement en 1 phrase de 10 mots maximum sans utiliser le mot "urgent"

<Mea-Poulpa> Hello

<Mea-Poulpa> Dites moi j'ai le nagios de ma prod (qui est chez sivit) sur la dedibox : comment puis-je savoir si la connexion était coupée chez dedibox (ou pas d'ailleurs) ?

<Aurelgadjo^> Mea-Poulpa:

<Aurelgadjo^> 06:08 -!- Netsplit hub1.fr.eu.evolu.net <-> sivit.fr.eu.evolu.net quits: memph, Chojin, Cthulhu, morgan, meepmeep

<Mea-Poulpa> ptdr


Voilà pour votre culture, les serveurs IRC sont souvent interconnectés entre eux, et du coup on peut monitorer une chute globale de sivit en restant sur l'IRC de dedibox !

Excellent non ?

PS : vu le topic je serai aujourd'hui et demain sur ce super salon ! J'y vais régulièrement :-)

jeudi 21 janvier 2010

Les limites de Debian : serveur IRC sécurisé

Suite des aventures sur mon serveur IRC


Comme vous êtes supposés être au courant en suivant les aventures du poulpe, ses tentacules affrontent actuellement un serveur IRC. Ça fera l'objet d'un petit article pour les gars qui voudront mettre un t'chat sur leur site. Ou alors faire comme le poulpe : un serveur sécurisé en SSL/

J'ai toujours été un fervent défenseur de Linux ! Mais là, je mets un "-1" à Debian !

Donc ça fait plusieurs jours que je fais un serveur IRC pour la team Pearltrees. Les contraintes de sécurité qu'on m'a données sont énormes. Et justement, pour moi Debian c'est le signe du "bon sens" et de la "sécurité" : des paquets (programmes disponibles) pré-configurés, et théoriquement bien stabilisés avec les droits minimaux pour bien démarrer sa config...

Et là je teste plein de serveurs IRC, j'en trouve un plus simple et mieux réputé que les autres, compatible avec les services utilisateurs/salons qui vont avec. Le choix est fait, la configuration, les tests, la rédaction de la documentation commencent.

Puis à la fin, je teste le SSL ! Je pensais que ça allait être une simple formalité : "tu suis le manuel à la lettre, tu vérifies si ça marche, et tu optimises ensuite".

Je tombe sur deux galères d'affilée, un fichier de configuration stupide avec un démon (lanceur de services au démarrage de Linux, en gros) qui tourne en boucle : voir mon post précédent et les commentaires.
Et la seconde aujourd'hui. Tout est bien paramétré sur le serveur (y a même le bot qui dit de la merde), j'active le SSL (pour crypter les données) et là : "Hmmm, le port ne s'ouvre pas et je n'ai pas de message d'erreur" !

Après de longues tentatives (changer les ports, vérifier s'il y a un parefeu, augmenter la verbosité des logs...) : je tombe sur une discussion entre les créateurs de ircd-hybrid avec les gars qui maintiennent openssl sur Debian ! Pour info OpenSSL est le paquet/programme qui permet par exemple de faire un site en HTTPS (cryptage et éventuellement authentification en SSL) gratuitement comme l'impose le librisme, sage philosophie binaire !

Voilà un geek qui parle à Debian et visiblement ça n'a pas fonctionné.

En résumé malgré toutes les docs que j'ai lues genre "README.debian" c'était que du vent ! Du coup je me dis que la private joke de mon précédent article était peut-être une vacherie volontaire de la part de la team qui développe ircd-hybrid : vous remarquerez au passage la date du dernier commit. C'est plutôt marrant car j'ai voulu poster sur leur support et j'ai vu qu'il y avait un serveur IRC et une mailing list ! Sur IRC, quelqu'un finit par me répondre (sûrement un autre libriste au boulot donc il faut être patient sur IRC !) et direct il me dit : "build it".

Et moi je lui dis "Non mec moi j'ai DEBIAN" ! Je lui dis que j'ai peur de la compilation ! Et je lui pose des tas de questions sur mon fichier de config et la beauté de mes certificats openSSL !

Et bah voilà, ça fait presque deux demi-journées de perdues sur de la merde ! Les gars de debian laissent des trucs qu'ils ne testent pas et qu'ils ne maintiennent pas. Et du coup le plus drôle c'est que c'est la même chose sur Ubuntu (qui est Debian based).

J'espère que comme moi cet article vous donnera envie de tester des serveurs plus exotiques ! Evidemment y a le pour et le contre ! Je fantasme sur Gentoo ou LFS (linux from scratch). Le souci c'est que ça me demanderait une sacré période d'acclimatation ; l'autre truc c'est que je me vois mal rédiger des documentations pro sur des distrib qui demandent énormément de connaissances.

Et oui Debian tu mérites ton "-1", je vais donc "build it" demain depuis le "last commit 287 days" je crois que ça ne devrait pas être pire que la version Debian ! Et enfin je pourrais activer le support SSL et remplir mon cahier des charges et ma doc !

Un petit pearltree pour suivre l'évolution du "dossier IRC"

J'espère que vous aimerez ce support
 Serveur IRC (hybrid-ircd + hybserv) 
Voici mon pearltree relatant mes déboires et savoirs ircées ainsi que ma scission avec moi-même au sujet de Debian ! Enjoy !

lundi 18 janvier 2010

Blague de geek

Avant-Propos : je prépare un serveur IRC pour ma boîte, je vous ferai un petit tuto quand j'aurai résolu tous les problèmes !



Tiens j'en ai une bonne...


Mon serveur refuse de démarrer, je me bats contre les fichiers de conf pendant des heures pour faire communiquer le serveur IRC et ses services.

Puis au bout d'une après midi, ça me gonfle je décide de regarder le démon pour comprendre le message d'erreur :

"root@UGLYTAVERN:/etc# /etc/init.d/hybserv start
Not starting Hybserv 2 IRC Services: please edit /etc/hybserv/hybserv.conf first"



Et voilà ce que je trouve dans le démon !

""
if [ "$1" = "start" ] || [ "$1" = "restart" ] || [ "$1" = "force-reload" ]; then
        if [ ! `grep '#NOT-EDITED#' /etc/hybserv/hybserv.conf | wc -l` -eq 0 ]; then
                echo "Not starting $DESC: please edit /etc/hybserv/hybserv.conf first..."
                exit 0
        fi
fi

""
NB : je croise le mec qui a fait ça : je le tue !




Voilà désolé pour la blague de geek, c'est du vécu ! Joli foutage de gueule !


Explication pour les non-geeks : le programme qui lance le serveur vérifie dans le fichier de configuration du serveur si il trouve la ligne qui contient #NOT-EDITED#. S'il la trouve il ne lance pas le serveur !

Bon bah ensuite, vous configurez votre serveur, et vous le lancez en boucle sur "Not starting hybserv please edit /etc/hybserv/hybserv.conf first..." alors que vous venez de l'éditer ! 


Pour une fois ce n'est pas RTFM, c'est read that fucking daemon ! RTFD !


 PS : désolé pour ceux qui rigolent/comprennent pas ! J'aurais essayé !