diff --git a/__pycache__/pelicanconf.cpython-34.pyc b/__pycache__/pelicanconf.cpython-34.pyc deleted file mode 100644 index e37e475..0000000 Binary files a/__pycache__/pelicanconf.cpython-34.pyc and /dev/null differ diff --git a/output/archives.html b/output/archives.html deleted file mode 100644 index 7a158f5..0000000 --- a/output/archives.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - Wxcafé - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-

Archives for Wxcafé

- -
-
Sat 22 August 2015
-
les NUCs et le HDMI-CEC
-
Sat 16 May 2015
-
SSL - STARTTLS
-
Sun 19 April 2015
-
Manettes : Hori vs. PDP
-
Sat 28 February 2015
-
Docker et les ebooks sur Twitter
-
Fri 07 November 2014
-
OpenSMTPd comme serveur mail sous debian
-
Thu 28 August 2014
-
Installer FreeBSD sur un serveur Online avec MfsBSD
-
Fri 30 May 2014
-
SSL ou la sécurité sur l'internet
-
Mon 24 February 2014
-
Mise en place d'un serveur DNS
-
Mon 17 February 2014
-
NAT
-
Mon 09 September 2013
-
Plan9 from whichever space
-
Sun 18 August 2013
-
Sed Basics
-
Wed 10 July 2013
-
Le chiffrement de partitions avec dm-crypt et device-mapper
-
Wed 12 June 2013
-
Redesign du blog, etc
-
Mon 06 May 2013
-
Comment Saurik a rooté les Google Glass
-
Mon 18 March 2013
-
Monter son propre serveur, partie 1: le serveur et l'apache.
-
Mon 04 February 2013
-
Pourquoi je vais quitter linux pour passer a FreeBSD.
-
Sun 27 January 2013
-
Update et pensées a propos du Raspberry Pi
-
Sat 05 January 2013
-
Update
-
Wed 02 January 2013
-
Mutt ou le client email le meilleur moins mauvais
-
-
-
- -
-
- -
- - \ No newline at end of file diff --git a/output/author/wxcafe.html b/output/author/wxcafe.html deleted file mode 100644 index c03c4e0..0000000 --- a/output/author/wxcafe.html +++ /dev/null @@ -1,1513 +0,0 @@ - - - - - Wxcafé - Wxcafe - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-

les NUCs et le HDMI-CEC

-
- Date - - Sat 22 August 2015 - -
- By - Wxcafe -
- Category - Note -
- - - - -
-

J’ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas “profiter” du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc…) simplement.

-

Ayant un Raspberry Pi 1 qui trainait, j’ai -décidé d’installer OpenELEC dessus et de voir ce que ça -donnait. Le résultat n’étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j’ai décidé d’upgrader le système.

-

J’ai donc acquis un NUC D34010WYK -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -adaptateur HDMI-CEC pour celui-ci, et un -SSD mSATA, en me disant que je -pourrais sans trop de problème faire tourner Kodi sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L’autre -avantage de tourner sur du Intel, c’est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).

-

J’ai donc reçu après un certain temps le matériel sus cité, que j’ai avidement -monté, avant de me rendre compte que le manuel de l’adaptateur Pulse-Eight était -[PDF]assez médiocre. J’ai donc -cherché plusieurs heures, avant de trouver [DE]ce -post -expliquant comment brancher l’adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l’information, et pour moi si je dois remonter ce système.

-

Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -“Front Panel”, et un appelé “Custom Solution Header”. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :

-
Custom Solution
-  ┌─┬─┬─┬─┬─┐
-  │g│ │·│r│·│
-  ├─┼─┼─┼─┼─┤
-  │·│·│·│·│·│
-  └─┴─┴─┴─┴─┘
-
-  g ➔ fiche grise
-  r ➔ fiche rouge
-  · ➔ pin inutilisé
-    ➔ espace vide (sans pin)
-
- - -

Une fois cela fait, il faut brancher le Front Panel. Heureusement, c’est plus -facile, puisqu’il n’y a qu’une seule fiche a brancher ici : la orange.

-
  Front Panel
-  ┌─┬─┬─┬─┬─┐
-  │·│·│·│·│·│
-  ├─┼─┼─┼─┼─┤
-  │ │·│o│·│·│
-  └─┴─┴─┴─┴─┘
-
-  o ➔ fiche orange
-  · ➔ pin inutilisé
-    ➔ espace vide (sans pin)
-
- - -

Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons.

-
   Dual-USB
-  ┌─┬─┬─┬─┬─┐
-  │b│B│v│n│·│
-  ├─┼─┼─┼─┼─┤
-  │·│·│·│·│ │
-  └─┴─┴─┴─┴─┘
-
-  b ➔ fiche bleue
-  B ➔ fiche Blanche
-  v ➔ fiche verte
-  n ➔ fiche noire
-  · ➔ pin inutilisé
-    ➔ espace vide (sans pin)
-
- - -

Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que “Deep S4/S5” soit désactivé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.

-

Ne reste plus ensuite qu’a installer un système digne de ce nom dessus!

-
-
-
-

SSL - STARTTLS

-
- Date - - Sat 16 May 2015 - -
- By - Wxcafe -
- Category - Note -
- - - - -
-

Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l’histoire d’Internet. Sa mise en place pose -problème : les protocoles existants ne s’accommodent qu’assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n’apporte rien d’intéressant. Pour palier a ce -problème, deux solutions sont apparues.

-

Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l’extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.

-

L’autre approche qui a été utilisée est une approche d’upgrade. La -communication commence en mode non chiffré, puis le client demande l’upgrade de -la connexion vers le mode chiffré s’il le supporte, les deux machines -machines font un handshake SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la “mise -a jour” en douceur.

-

Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service – laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec STARTTLS, qui upgrade les connexions si nécessaire.
-La réponse est que STARTTLS est plus interessant, pour plusieurs raisons. Tout -d’abord, il permet de n’utiliser qu’un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients “anciens” (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d’éviter aux utilisateurs d’avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l’activera de lui même s’il -voit qu’il est disponible.
-Bref, mettez en place du STARTTLS, et pas du SSL. C’est mieux pour la sécurité -de tout le monde.

-
-
-
-

Manettes : Hori vs. PDP

-
- Date - - Sun 19 April 2015 - -
- By - Wxcafe -
- Category - Vidya Games -
- - - - -
-

Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d’abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de “choses” -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d’autres. Vous aurez aussi remarqué que le -Gamepad n’est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.

-

Cela étant, si comme moi vous avez, euh, “ouvert” le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter l’adaptateur GC pour Wii -U -a votre console.

-

Heureusement pour vous, Nintendo a pensé a une solution (et comme d’habitude -avec Nintendo, c’est une solution a moitié satisfaisante…) : les classic -controller, mais en forme de manettes Gamecube.

-

Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d’argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.

-

Nous allons ici voir deux modèles, un de chacune des boites en question -: PDP et Hori.

-

Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus

-

Commençons par le modèle de chez Hori :

-

Hori_face

-

Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.

-

Hori_dos

-

Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c’est logique puisque c’est comme ça que les -classic controller sont faits, mais c’est décevant tout de même

-

Hori_CM

-

On peut voir ici que la qualité de l’assemblage n’est pas extraordinaire, et on -remarque une soudure mal faite a l’emplacement du stick gauche.

-

Hori_Cstick

-

Le stick c n’est pas fixé au reste de la manette. -J’ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n’avaient pas l’air de très bonne qualité, et j’ai préféré abandonner -l’idée plutôt que de casser la manette.

-

Hori_coque

-

On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d’une Wiimote entière la dedans…

-
- -

Passons maintenant a la manette PDP.

-

PDP_face

-

Au premier coup d’œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c’est un problème de goût).

-

PDP_dos

-

Les gâchettes sont des vraies gâchettes! C’est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.

-

PDP_CM

-

Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon péremptoire perpendiculaire…

-

PDP_CF

-

Vous l’avez deviné, ces deux “cartes filles” servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de “vraies” gâchettes en cela -qu’elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.

-

Quelques photos des gâchettes en question :

-

PDP_G_1

-

PDP_G_2

-

PDP_G_3

-

PDP_G_4

-
-

Vous l’aurez compris, je préfère la version PDP de ces “Fight Pad”, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains esttotalement identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.

-
-
-
-

Docker et les ebooks sur Twitter

-
- Date - - Sat 28 February 2015 - -
- By - Wxcafe -
- Category - Note -
- - - - -
-

Vous avez peut être déjà entendu parler de Docker. Si -ce n’est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n’est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les Jails, -mais n’est devenu possible sous linux que récemment grâce aux cgroups, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d’avoir une machine hôte sur laquelle s’exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l’hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu’avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu’à l’hôte, puisqu’il n’est pas vraiment séparé des -invités.

-

Quoi qu’il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. “Mais pourquoi utiliser Docker, dans ce cas”, vous -demandez-vous peut être, “puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?”. Et bien -c’est très simple : Docker apporte la simplicité de déploiement d’applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le Docker Hub permet aussi de récupérer -rapidement et facilement un grand nombre d’images déjà configurées.

-

Maintenant que nous avons expliqué rapidement ce qu’était Docker, voyons le -rapport avec les ebooks et Twitter.

-

Les comptes dits “ebooks” (le nom vient a l’origine de horse_ebooks, -voir ici pourquoi) sont des bots -twitter utilisant des Chaines de Markov, -avec les tweets d’un utilisateur “source” comme corpus, pour produire des tweets -ressemblant a ceux de l’utilisateur source. Nous allons voir maintenant comment -en installer un.

-

C’est, comme disent certaines personnes, “fun”.

-

Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -celle-ci, qui est une lib ruby créée -par @m1sp, qui gère pour nous a la fois l’API -twitter et la génération des messages.

-

Cependant, cela n’explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d’isoler les bots, et les -containers dockers permettent de les déployer sur n’importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j’ai créé un -repo github qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.

-

Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l’utilisateur source avec ebooks archive <username> <filename> (c’est du json) -, puis vous convertissez le json en fichier utilisable par le bot : ebooks -consume <filename>. Cela fait, démarrer le bot revient a lancer le container : -docker run -d <container name> Pour plus d’informations, allez voir la -documentation Docker

-

Bien entendu, dans l’idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron :

-
00 00 * * *    /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json >> /var/log/ebooks/update.log 2>&1
-00 05 * * *    cd /usr/local/ebooks/main/ && /usr/local/bin/ebooks consume corpus/username.json >> /var/log/ebooks/update.log 2>&1
-00 10 * * *    docker rm -f bots >/dev/null 2>&1
-00 15 * * *    docker rmi bots  > /dev/null 2>&1
-00 20 * * *    cd /usr/local/ebooks/main/ && docker build --rm -t bots . >> /var/log/ebooks/build.log 2>&1
-00 25 * * *    docker run -d --name bots bots >> /var/log/ebooks/run.log 2>&1
-
- - -

Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s’executent en même temps.

-

Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n’est qu’un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner des -applications “usuelles” -dedans, -puisque l’overhead de Docker est minimal, et beaucoup d’autres applications -existent.

-
-
-
-

OpenSMTPd comme serveur mail sous debian

-
- Date - - Fri 07 November 2014 - -
- By - Wxcafé -
- Category - Tutoriel -
- - - - -
-

J’avais dit il y a un certain temps que j’allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j’ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J’ai donc totalement changé d’infrastructure quand a la -gestion de mon système de mails.

-

Ainsi, j’ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. OpenSMTPd est un -projet originaire d’OpenBSD qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu’a le projet OpenBSD, globalement).

-

Pour rappel, le système d’emails fonctionne d’une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.

-

Si vous avez bien suivi, vous pouvez voir que je n’ai pas parlé de récupération -ni de lecture des mails. C’est pour une raison simple, qui est que ces taches -sont remplies par d’autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).

-

Or ce qui nous intéresse ici, ce n’est pas simplement d’envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c’est pour -ça que ce tutoriel ne parlera pas que d’OpenSMTPd mais aussi de Dovecot qui fait office de serveur IMAP et -amavis/spamassassin -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système

-
            ╭────────────────╮                    ╭──────────╮
-            │╭──────────────>│────> to filter ───>│─╮        │
-  mail in   ││               │                    │ │ amavis │
-───────────>│╯ OpenSMTPd  ╭──│<─── from filter<───│<╯        │
-            │             │  │                    ╰──────────╯
-  mail out  │             │  │                    ╭──────────╮
-<───────────│<────────────┴─>│─────> to MDA ─────>│─────────>│──> to user's
-            │                │                    │ dovecot  │     mailbox
-            ╰────────────────╯                    ╰──────────╯
-
- - -

Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d’autres correspondants) sont transmis a OpenSMTPd, qui envoie tout aamavis, qui vérifie a la fois les spams et les malwares pour les mails -venants de l’exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.

-

Voyons comment mettre cela en place. Tout d’abord, il faut décider de la façon -dont les différents services vont communiquer.

-

Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s’agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s’agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.

-

Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -/var/run/dovecot/lmtp).

-

Ainsi, pour reprendre le schéma présenté plus haut :

-
            ╭───────────────╮                    ╭───────────╮
-            │╭─────────────>│──> SMTP (10026) ──>│─╮         │
-  SMTP in   ││              │                    │ │ amavis  │
-────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10027) <──│<╯ (sign)  │
-            │            │  │                    ╰───────────╯
-  SMTP out  │            │  │
-25 <────────│<───────────╯  │
-            ╰───────────────╯
-
- - -

Pour les mails sortants; et

-
            ╭───────────────╮                    ╭────────────╮
-            │╭─────────────>│──> SMTP (10024) ──>│─╮          │
-  SMTP in   ││              │                    │ │ amavis   │
-────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10025) <──│<╯(filter)  │
-            │            │  │                    ╰────────────╯
-            │            │  │                    ╭────────────╮
-            │            ╰─>│──> LMTP (socket) ─>│───────────>│──> to user's
-            │               │                    │  dovecot   │     mailbox
-            ╰───────────────╯                    ╰────────────╯
-
- - -

Pour les mails entrants.

-

Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d’autres plateformes, la configuration devrait être sensiblement la même

-

(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir ce -post)

-

Tout d’abord, commençons par installer les programmes nécessaires :

-
sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved
-sudo pkg_add dovecot dovecot-pigeonhole amavisd-new
-
- - -

Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :

-

/etc/smtpd.conf

-
# This is the smtpd server system-wide configuration file.
-# See smtpd.conf(5) for more information.
-
-## Certs
-pki exem.pl certificate "/etc/certs/exem.pl.crt"
-pki exem.pl key         "/etc/certs/exem.pl.key"
-
-## Ports to listen on, and how to listen on them
-listen on eth0 port 25 tls pki exem.pl hostname exem.pl auth-optional
-listen on eth0 port 465 tls-require pki exem.pl hostname exem.pl auth mask-source
-listen on eth0 port 587 tls-require pki exem.pl hostname exem.pl auth mask-source
-
-## Aliases
-table aliases file:/etc/aliases
-
-# coming from amavisd, checked for spam/malware
-listen on lo port 10025 tag Filtered
-# coming from amavisd, signed with DKIM
-listen on lo port 10027 tag Signed
-
-## Receiving
-# if the (incoming) mail has been through amavisd, then we can deliver it
-accept tagged Filtered for any alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
-# we directly tranfer incoming mail to amavisd to be checked 
-accept from any for domain "exem.pl" relay via "smtp://localhost:10024"
-# we have to put these lines in this order to avoid infinite loops
-
-## Sending
-# if the (outgoint) mail has been through amavisd, then we can deliver it
-accept tagged Signed for any relay
-# we tranfer the outgoing mail to amavisd to be signed
-accept for any relay via "smtp://localhost:10026"
-# same, we have to put these lines in this order or infinite loops...
-
- - -

Expliquons un peu ce fichier de configuration :

-
    -
  • Tout d’abord, le paragraphe nommé “Certs” contient les déclaration - d’emplacement des certificats SSL.
  • -
  • Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire
  • -
  • Les alias sont définis juste après
  • -
  • Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme “Filtered” et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme “Signed”
  • -
  • Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c’est qu’il n’a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l’état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis
  • -
  • Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n’a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu’il le signe. Le - problème de l’ordre des lignes se pose encore, pour la même raison qu’au - dessus.
  • -
-

Nous allons maintenant configurer dovecot. Comme nous l’avons vu, dovecot doit -écouter en LMTP via la socket /var/run/dovecot/lmtp et transmettre les -emails a la boite email de l’utilisateur. Il serait aussi interessant -qu’il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.

-

/etc/dovecot/dovecot.conf

-
## Dovecot configuration file
-
-# basic config
-info_log_path = /var/log/dovecot-info.log
-log_path = /var/log/dovecot.log
-log_timestamp = "%Y-%m-%d %H:%M:%S "
-mail_location = maildir:%h/mail
-
-# authentication
-passdb {
-    driver = pam
-}
-userdb {
-    driver = passwd
-}
-
-# the protocols we use
-protocols = imap lmtp sieve
-
-# ssl config
-ssl_cert = </etc/certs/exem.pl.cert
-ssl_key = </etc/certs/exem.pl.key
-ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
-ssl = yes
-
-## configuring services 
-# disables imap login without SSL (yes dovecot is dumb that way)
-service imap-login {
-    inet_listener imap {
-        port=0 
-    }
-}
-
-service lmtp {
-    unix_listener lmtp {
-        mode = 0666
-    }
-}
-
-## configuring protocols
-# the dovecot lda, we set it to use sieve
-protocol lda {
-    mail_plugins = $mail_plugins sieve
-}
-
-protocol lmtp {
-    postmaster_address =  whoever@exem.pl
-    mail_plugins = $mail_plugins sieve
-}
-
-plugin {
-    sieve = ~/.dovecot.sieve
-    sieve_dir = ~/sieve
-}
-
- - -

ATTENTION: Sous OpenBSD, remplacez

-
passdb {
-    driver = pam
-}
-
- - -

par

-
passdb {
-    driver = bsdauth
-}
-
- - -

pour identifier les utilisateurs système

-

Ici aussi, voyons comment ce fichier est structuré :

-
    -
  • Tout d’abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l’endroit ou seront stockés les mails des utilisateurs.
  • -
  • Nous configurons ensuite la gestion de l’authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)
  • -
  • Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l’IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).
  • -
  • Nous configurons le SSL
  • -
  • Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d’activer IMAPS qu’en activant - IMAP avec. Comme nous ne voulons pas d’IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu’il utilise
  • -
  • Nous configurons maintenant les protocoles, pour faire fonctionner Sieve
  • -
  • enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.
  • -
-

Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n’y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis/usr/local/share/examples/amavisd-new/amavisd.conf et ajoutez les -modifications nécessaires a la fin du fichier.

-

/etc/amavis/conf.d/99-local.conf (debian) -/etc/amavis.conf (OpenBSD)

-
use strict;
-
-$enable_dkim_verification = 1;
-$enable_dkim_signing = 1;
-dkim_key("exem.pl", "main", "/etc/certs/dkim.key" );
-
-@dkim_signature_options_bysender_maps = (
-    { '.' =>
-        { ttl => 21*24*3600, c => 'relaxed/simple' }
-    }
-);
-
-$inet_socket_port = [10024, 10026];
-$policy_bank{'MYNETS'} = {
-        originating => 1,
-        os_fingerprint_method => undef,
-};
-
-$interface_policy{'10026'} = 'ORIGINATING';
-
-$policy_bank{'ORIGINATING'} = {
-        originating => 1,
-        allow_disclaimers => 1,
-        virus_admin_maps => ["root\@$mydomain"],
-        spam_admin_maps => ["root\@$mydomain"],
-        warnbadhsender => 1,
-        forward_method => 'smtp:localhost:10027',
-        smtpd_discard_ehlo_keywords => ['8BITMIME'],
-        bypass_banned_checks_maps => [1],
-        terminate_dsn_on_notify_success => 0,
-};
-
-#------------ Do not modify anything below this line -------------
-1;  # ensure a defined return
-
- - -

A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu’amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l’endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la RFC 4871 -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme “originating” et nous ne vérifierons pas l’OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d’abord, nous réaffirmons qu’ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la RFC - 4871. Nous déclarons l’adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu’il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d’envoi. Et voila!

-

Vous avez pu remarquer qu’a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.

-

Il nous reste cependant quelques opérations a faire, encore. -Tout d’abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j’ai personnellement utilisé opendkim (un -tutorial) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :

-
#rewrite_header Subject *****SPAM*****
-# report_safe 1
-required_score 2.0
-# use_bayes 1
-# bayes_auto_learn 1
-# bayes_ignore_header X-Bogosity
-# bayes_ignore_header X-Spam-Flag
-# bayes_ignore_header X-Spam-Status
-ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
-# shortcircuit USER_IN_WHITELIST       on
-# shortcircuit USER_IN_DEF_WHITELIST   on
-# shortcircuit USER_IN_ALL_SPAM_TO     on
-# shortcircuit SUBJECT_IN_WHITELIST    on
-# shortcircuit USER_IN_BLACKLIST       on
-# shortcircuit USER_IN_BLACKLIST_TO    on
-# shortcircuit SUBJECT_IN_BLACKLIST    on
-shortcircuit ALL_TRUSTED             off
-# shortcircuit BAYES_99                spam
-# shortcircuit BAYES_00                ham
-
-endif # Mail::SpamAssassin::Plugin::Shortcircuit
-
- - -

Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.

-

Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement

-

Bon courage pour votre hosting de mail ensuite…

-
-
-
-

Installer FreeBSD sur un serveur Online avec MfsBSD

-
- Date - - Thu 28 August 2014 - -
- By - Wxcafe -
- Category - Tutoriel -
- - - - -
-

J’ai récemment eu l’occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester bhyve) -et n’ayant pour différentes raisons pas eu l’occasion de le faire sur mon serveur auto-hebergé ni sur ce serveur ci, -j’ai commencé a chercher comment le faire sur ce serveur.

-

Étant donné que Online ne propose pas directement d’image FreeBSD sur ses serveurs, il m’a fallu -chercher un peu plus loin. Il se trouve que ce post sur les forums -d’online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier.

-

J’ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l’on m’a dirigé vers mfsbsd, un projet d’installeur -alternatif, minimaliste et simplifié pour FreeBSD.

-

Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l’image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l’image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l’image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l’air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d’installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.

-

Utilisez donc ce script ainsi :

-
# tout d'abord, wipons le MBR :
-dd < /dev/zero > /dev/da0 count=1
-# maintenant, installons le système
-zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c
-
- - -

Avec -g da0 votre disque dur principal, -s 2G la quantité de swap désirée, --p root le nom du zpool, et -c pour activer la compression. D’autres options -sont disponibles, je vous invite a faire un zfsinstall -h si mon setup ne vous -convient pas.

-

Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :

-
zfs_load="YES"
-sshd_load="YES
-hostname="whatever"
-ifconfig_igb0="DHCP"
-
- - -

Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!

-

Voila, c’est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l’IPv6 chez online est… peu -crédible, disons)

-

Bon sinon sur d’autres sujets, j’ai mis en place des bots twitter : wxcafe_ebooks, -petitefanfare, -capet_ebooks, -zengisse, -et kim_ebooks. Ils sont tous basés sur ce -code, qui vient de -@m1sp -(github.com/twitter_ebooks). Donc voila.

-

A plus

-
-
-
-

SSL ou la sécurité sur l'internet

-
- Date - - Fri 30 May 2014 - -
- By - Wxcafe -
- Category - Note -
- - - - -
-

Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: More Tricks for Defeating SSL, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -A Critique of Lavabit, -ce qui peut avoir l’effet de rendre légèrement parano. Si vous considérez que -c’est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)

-

Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.

-

Cela fait suite aux évènements évoqués dans le Disclaimer, mais aussi a des -doigts sortis d’un endroit particulier du corps de l’admin/auteur de ce “blog”, -qui a pris enfin les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d’un système -fonctionnel utilisant cette compréhension récemment acquise.

-

Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c’est très -simple : il existait auparavant un certificat pour wxcafe.net, un pour -paste.wxcafe.net, un pour mail.wxcafe.net, etc… Bref, un certificat -différent pour chaque sous-domaine.

-

Il s’avère que c’est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d’erreur, etc) et pas plus -sécurisé que d’avoir un seul certificat wildcard. J’ai donc généré un certificat -pour *.wxcafe.net hier, et il sera dorénavant utilisé pour tous les -sous-domaine de wxcafe.net; et un certificat pour wxcafe.net, qui ne matche -pas *.wxcafe.net, et qui sera donc utilisé… bah pour wxcafe.net.

-

Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l’arrivée sur le site ne commence pas -par une page firefox disant “Something’s Wrong!”, et ces redirections ne seront -donc pas mises en place.

-

De plus, après la lecture de l’article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c’est a dire que, même si -quelqu’un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.

-

Bon, maintenant que les explications basiques sont faites, voyons -l’implémentation :
-Pour générer la clé, tout d’abord, il convient d’utiliser les commandes -suivantes:

-
sudo openssl genrsa -out example.key 4096
-# nous utilisons ici une clé de 4096 bits, la taille est laissée a votre appréciation
-sudo openssl req -new -key example.key -out example.csr
-# OpenSSL va ici vous demander de nombreuses informations, "Common Name" devant contenir le FQDN
-sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt
-# enfin, nous générons la clé, d'une durée de vie de 3 ans
-
- - -

Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -*.example.com comme common name. -Une fois la clé générée, il faut dire aux différents services de l’utiliser, et -de n’utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j’utilise :

-

apache :

-
# /etc/apache2/mods_enabled/ssl.conf
-# [...]
-SSLProtocol all -SSLv2 -SSLv3
-SSLHonorCipherOrder on
-SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
-  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
-  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
-# [...]
-# /etc/apache2/sites-enabled/default-ssl
-# [...]
-SSLEngine on
-SSLCertificateFile /etc/certs/example.com.crt
-SSLCertificateKeyFile /etc/certs/example.com.key
-# [...]
-
- - -

nginx :

-
# /etc/nginx/nginx.conf 
-# [...]
-ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
-ssl_prefer_server_ciphers on;
-ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
-  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
-  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
-# [...]
-# /etc/nginx/sites-enabled/default-ssl
-# [...]
-ssl on;
-ssl_certificate /etc/certs/example.com.crt
-ssl_certificate_key /etc/certs/example.com.key
-# [...]
-
- - -

prosody (jabber) :

-
# tout d'abord, lancez la commande suivante :
-sudo openssl dhparam -out /etc/prosody/certs/dh-2048.pem 2048
-# ensuite, pour chaque VirtualHost dans /etc/prosody/prosody.conf :
-ssl = {
-  dhparam = "/etc/prosody/certs/dh-2048.pem";
-  key = "/etc/certs/example.com.key";
-  certificate = "/etc/certs/example.com.crt";
-}
-# la cipher suite de prosody utilise par défaut EDH et EECDH
-
- - -

postfix (email) :

-
# /etc/postfix/main.cf
-# [...]
-smtpd_tls_cert_file = /etc/certs/example.com.crt
-smtpd_tls_key_file = /etc/certs/example.com.key
-tls_preempt_cipherlist = yes
-smtpd_tls_eecdh_grade = strong
-smtdp_tls_mandatory_ciphers = high
-smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS
-smtpd_tls_security_level = encrypt
-smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
-smtpd_use_tls = yes
-# [...]
-
- - -

dovecot (imap) :

-
# /etc/dovecot/dovecot.conf 
-# [...]
-ssl_cert = </etc/certs/example.com.crt
-ssl_key = </etc/certs/example.com.key
-ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
-
- - -

Voila. Pour d’autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.

-

Cela étant dit, je conseille a tout le monde d’aller voir la conférence dans le -disclaimer, et tant qu’a faire la conférence du même hacker SSL and the future -of Authenticity qui parle de son -implémentation d’une technologie “remplaçant” le système de CAs qui existe -actuellement.

-
-
-
-

Mise en place d'un serveur DNS

-
- Date - - Mon 24 February 2014 - -
- By - Wxcafe -
- Category - Tutoriel -
- - - - -
-

Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a http://173.194.45.66, ou a -http://199.16.156.70. Voire même a -http://5.39.76.46).

-

Cependant, le DNS est un système qui date de 1984, et les exigences de l’époque -en termes d’expérience utilisateur n’étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.

-

Tout d’abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est /, celle de DNS est ., et là ou il convient d’écrire, par exemple,/usr/ et ou la progression se fait de gauche a droite pour le FS, pour DNS le -. n’est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) com, et le domaine -google.com appartient a com, on écrit donc google.com sans écrire le point -a la fin de façon courante.

-

Le reverse DNS est une variante du DNS “classique” permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n’a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les “adresses” que l’on query en reverse DNS -sont donc constituées de l’adresse IP, dans le sens contraire a l’ordre -habituel, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire dig PTR -76.46.39.5.in-addr.arpa. La réponse sera, évidemment, wxcafe.net

-

Voyons maintenant comment mettre en place son propre serveur DNS. Tout d’abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est dig. Le DNS fonctionne avec des -“enregistrements”, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. dig se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n’importe quelle information : par exemple, dig NS -wxcafe.net devrait vous renvoyer

-
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> NS wxcafe.net
-;; global options: +cmd
-;; Got answer:
-;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13846
-;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
-
-;; QUESTION SECTION:
-;wxcafe.net.            IN  NS
-
-;; ANSWER SECTION:
-wxcafe.net.     3600    IN  NS  ns.wxcafe.net.
-wxcafe.net.     3600    IN  NS  ns.home.wxcafe.net.
-
-;; Query time: 60 msec
-;; SERVER: 10.0.42.1#53(10.0.42.1)
-;; WHEN: Tue Dec 10 13:31:18 2013
-;; MSG SIZE  rcvd: 67
-
- - -

Comme vous pouvez le voir, les serveurs DNS principaux pour -wxcafe.net sont ns.wxcafe.net et ns.home.wxcafe.net, -qui sont respectivement des alias pour wxcafe.net et home.wxcafe.net. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l’adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu’il est en train de faire une boucle infinie et -demandera l’adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.

-

La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d’écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : named.conf, -named.conf.default-zones, named.conf.local et named.conf.options. -named.conf contient les options par défaut de bind, named.conf.default-zones -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -named.conf.local contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.

-

Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l’autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi).

-

Examinons tout d’abord les fichiers de configuration de named.named.conf.local contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones wxcafe.net et 76.46.39.5.in-addr.arpa sont gérées -en master, et les zones home.wxcafe.net et 103.177.67.80.in-addr.arpa sont -gérées en slave. Nous n’examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l’un héberge en slave les masters de l’autre. -Le fichier named.conf.local sur wxcafe.net contient donc

-
zone "wxcafe.net" {
-    type master;
-    file "/etc/bind/master/wxcafe.net";
-    allow-transfer {
-        80.67.177.103;
-    };
-};
-
-zone "home.wxcafe.net" {
-    type slave;
-    file "/etc/bind/slave/home.wxcafe.net";
-    masters {
-        80.67.177.103;
-    };
-};
-
-zone "46.76.39.5.in-addr.arpa" {
-    type master;
-    file "/etc/bind/master/46.76.39.5.in-addr.arpa";
-    allow-transfer {
-        80.67.177.103;
-    };
-};
-
-zone "103.177.67.80.in-addr.arpa" {
-    type slave;
-    file "/etc/bind/slave/103.177.67.80.in-addr.arpa";
-    masters {
-        80.67.177.103;
-    };
-};
-
- - -

Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans /etc/bind/master/, et les slaves un fichier dans -/etc/bind/slave/, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.

-

Voyons maintenant le fichier de zone concernant wxcafe.net, soit -/etc/bind/master/wxcafe.net :

-
$TTL 3600    ; 1 hour
-@               IN SOA ns.wxcafe.net. wxcafe.wxcafe.net. (
-                        2014011001  ; serial
-                        3h          ; refresh  
-                        1h          ; retry
-                        168h        ; expire
-                        300         ; negative response ttl
-                        )
-
-; Name servers
-                IN  NS      ns.wxcafe.net.
-                IN  NS      ns.home.wxcafe.net.
-
-; Mail exchangers
-                IN  MX  10  wxcafe.net.
-                IN  SPF "v=spf1 ip4:5.39.76.46 a -all"
-
-; Main A/AAAA records
-                IN  A       5.39.76.46
-ns              IN  A       5.39.76.46
-
-; Aliases
-data            IN  CNAME   wxcafe.net.
-;        [...]
-www             IN  CNAME   wxcafe.net.
-
-
-; home.wxcafe.net. definition
-$ORIGIN home.wxcafe.net.
-@               IN  NS      ns.home.wxcafe.net.
-                IN  NS      ns.wxcafe.net.
-ns              IN  A       80.67.177.103
-                IN  A       80.67.177.103
-
- - -

Alors. Expliquons ligne par ligne.
-Tout d’abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone.
-Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net.
-Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l’ordre :
- - Le nameserver autoritaire pour le nom de domaine en question,
- - L’adresse email du responsable de cette zone, avec le premier point - remplacé par un @,

-

puis entre parenthèses :
- - Le numéro de série (“version” du fichier de zone, ici au format - YYYYMMDDNN)
- - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire,
- - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible,
- - La période d’expire, le temps qu’attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin
- - La période de TTL négatif, le temps qu’attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable.

-

Bon, tout ceci est peut-être un peu confus, mais ce n’est pas le record le plus -important a lire (pour les humains en tout cas). Continuons :

-

NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine.

-

MX permet d’indiquer ou il convient d’envoyer les emails pour ce domaine. -SPF est un record d’authentification pour les emails. -Les records A désignent l’association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n’est pas encore en IPv6.

-

Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d’autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d’Apache, pour le web)

-

Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l’adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l’a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.

-

Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n’étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c’est pas les mêmes domaines…).

-

Voila donc une courte explication de ce qu’est le DNS. Bien entendu, tout n’est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le RFC -1034 et le -RFC 1035. Dans un autre style (bien plus -avancé) le blog de Stéphane Bortzmeyer est interessant -aussi.

-
-
-
-

NAT

-
- Date - - Mon 17 February 2014 - -
- By - wxcafé -
- Category - Ranting -
- - - - -
-

NAT (Network Address Translation) in a word?
-It’s complicated. Very. Don’t do it, you’d damage your brain.

-

Bon, sinon, prochain article serieux vite, bisous.

-
-
-
-

Plan9 from whichever space

-
- Date - - Mon 09 September 2013 - -
- By - Wxcafe -
- Category - OSes -
- - - - -
-

Plan 9 from Outer Space est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l’un des pires films jamais sortis. Rempli -d’erreur de montage, d’effets spéciaux au rabais, et ayant même connu la mort -d’un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.

-

Plan 9 from Bell Labs est un OS venant de Bell Labs (comme son nom l’indique), -et qui a été pensé comme le successeur d’Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu’à leur but naturel. Ainsi, c’est Plan9 qui a -introduit le concept d’UnionFS, le protocole 9P qui permet d’acceder a des -ressources appartenant a d’autres ordinateurs a distance, un support de -l’unicode par défaut et sur tout le système (a l’inverse d’Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d’autres améliorations sur les thèmes de base que propose Unix.

-

Cependant, Plan9 n’a jamais été véritablement utilisé pour quoi que ce soit -d’autre que la recherche en systèmes, et c’est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d’intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme “cloud -computing” n’apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.

-

En effet, même si l’on considère que les nouveautés qu’il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu’elles sont déjà -conséquentes), lorsqu’on les prend ensemble, elles font de Plan9 le système -d’exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d’un système -distant comme n’étant qu’une poignée de fichiers permet de le monter comme -n’importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s’ils sont hétérogènes (c’est a dire provenant -de machines différentes), permet d’utiliser les ressources d’une machine -distante comme si elle était présente localement. Le mécanisme d’UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).

-

Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d’ordinateur lorsque le concept même du système est d’être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d’implémenter très facilement -différents concepts réseaux : en montant le /net d’un ordinateur du réseau local -sur celui servant de gateway vers l’internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d’un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l’accès de l’ordinateur distant, et les connections entre les -deux sont chiffrées.

-

Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur “puissance” de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s’est doté du support de jusqu’à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu’ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu’ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l’a été X11, et de nombreuses autres -améliorations sur Unix.

-

Malheureusement, il n’a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : “worse is better”. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 via son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc…

-
-
- -
- -
-
- -
- - \ No newline at end of file diff --git a/output/author/wxcafe2.html b/output/author/wxcafe2.html deleted file mode 100644 index 4bcc2cd..0000000 --- a/output/author/wxcafe2.html +++ /dev/null @@ -1,1461 +0,0 @@ - - - - - Wxcafé - Wxcafe - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-

Sed Basics

-
- Date - - Sun 18 August 2013 - -
- By - Wxcafe -
- Category - Tutoriel -
- - - - -
-

sed est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.
-Or sed a bien plus de possibilités que ça, comme nous allons le voir.

-

Tout d’abord, rappelons les bases : sed est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de ed, l’éditeur original.ed est un éditeur de ligne, conçu a l’époque ou les ordinateurs n’étaient pas -personnels et étaient utilisés avec des téléscripteurs, c’est a dire des -machines dépourvues d’écrans et ne permettant donc pas l’utilisation d’éditeurs -dits “visuels”, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. sed est donc une évolution de ed, le -s signifiant stream, sed est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir Flux standards) pour éditer plus d’une ligne a la fois. -En pratique, sed est principalement utilisé sur des fichiers.

-

sed a quelques options pratique, notamment -s qui permet d’empêcher -l’affichage systématique des lignes traitées, ou bien -i (pour GNU sed) qui -permet de rediriger l’output dans le fichier d’input. Cela dit, l’intérêt unique -du programme est son langage de manipulation de texte.

-

ed, et donc sed, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans sed est

-
/[regex]/
-
- - -

qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n’exécuter les commandes qui suivent que sur ces lignes.)

-


-La commande sed la plus utilisée est bien entendu le s, qui s’utilise de -la façon suivante :

-
s/[old text]/[new text]/[options]
-
- - -

qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant g, -qui permet d’appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.
-Les exceptions a la “fixité” de [new text] sont particulièrement -intéressantes. En effet, sed utilise un langage de regex plutôt standard, -excepté le fait qu’il permet jusqu’à 9 “holding spaces”, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.

-

Par exemple, la commande

-
sed 's/\(hello world\) world/\1/'
-
- - -

sur le texte “hello world world” renverrait comme résultat

-
hello world
-
- - -

De la même façon, le symbole & dans le texte de remplacement représente le -texte original. Ainsi, la commande

-
sed 's/hello world/& world/'
-
- - -

sur le texte “hello world” renverrait comme résultat

-
hello world world
-
- - -


-

Une autre commande utile est p, qui sert a afficher le texte présent dans -l’espace courant :

-
/[regex]/p
-
- - -

sed stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j’appelle l’espace courant (pattern space en anglais). La commandep affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu’il ne contienne que les lignes matchant, et le p affiche donc ce dernier.

-

Un autre exemple de commande sont c, i et a, qui s’utilisent ainsi :

-
c \
-[text]
-
- - -

De la même façon, pour le i :

-
i \
-[text]
-
- - -

Et de même pour a.

-

Ces trois commandes s’utilisent de la même façon pour la bonne raison qu’elles -sont très proches. i sert a insérer du texte avant le pattern space. a -sert a insérer du texte après le pattern space, et enfin c sert a -remplacer tout le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.

-

Enfin, dernière commande ne fonctionnant que ligne par ligne, d : - /[regex]/d -d (delete) supprime les contenus du pattern space.

-

sed est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.

-
-
-
-

Le chiffrement de partitions avec dm-crypt et device-mapper

-
- Date - - Wed 10 July 2013 - -
- By - Wxcafe -
- Category - Tutoriel -
- - - - -
-

Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c’est a dire au fait de passer d’un fichier en -clair a un fichier chiffré dit cyphertext. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l’intégrité d’un système d’exploitation, ou -bien la confidentialité d’un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n’a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d’expliquer les concepts qui entrent en -jeu dans l’utilisation du sous-système du noyau Linux dm_crypt et de -présenter un rapide tutoriel concernant la création d’un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre clé GPG)

-

dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s’appuie sur LUKS, un standard de chiffrement -de disques. Comme son nom l’indique, device-mapper est un système qui a pour but -de mapper des block devices. Pour être plus clair, le kernel considère -comme “block device” tout fichier spécial (en gros, les fichiers disques dans/dev/, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d’un “fichier de périphérique” (trad. -Wikipédia), il en “crée” un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)

-

Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d’un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.

-

D’ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot doit s’appuyer sur une image initrd (l’initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n’est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,…) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l’initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier “cible” est remonté sur la racine, et l’initrd est démonté -est la RAM qu’il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.

-

La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n’est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d’attaques : l’une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du vrai boot -que l’initrd présente toujours le même checksum. Cela dit, cette méthode a -l’inconvénient d’intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.
-Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n’est pas possible pour un -attaquant de modifier ce système de fichier, et l’initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l’initrd et du noyau beaucoup plus difficile qu’elle ne le serait sans.

-

Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, cryptsetup. Ce dernier était en charge de cryptoloop, -l’ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l’utilisation userspace de dm-crypt, qui pour sa -part est entièrement kernel-space. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/…) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root.

-

Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :
-Tout d’abord, il nous faut créer le fichier qui contiendra l’image. Pour cela, -dans une situation réelle ou l’on cherche a chiffrer un disque, il convient -d’utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire :

-
dd bs=1000 count=1000000 if=/dev/urandom of=image.img
-
- - -

Maintenant que notre image est créée, nous pouvons la chiffrer :

-
sudo cryptsetup luksFormat image.img
-
- - -

cryptsetup va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.
-Une fois cela fait, nous allons mapper cette image :

-
sudo cryptsetup luksOpen image.img crypto
-
- - -

cryptsetup nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s’est-il passé? En cherchant un peu, nous -voyons qu’il n’y a pas de nouveau disque dans /dev. C’est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n’a rien a voir. On remarque -qu’est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n’est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l’utiliser.

-
sudo mkfs.ext4 /dev/mapper/crypto
-
- - -

Maintenant que notre disque est formaté, il peut être monté :

-
sudo mount /dev/mapper/crypto /mnt
-
- - -

Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un mount | grep crypto devrait vous donner le résultat -suivant :

-
/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered)
-
- - -

Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité.

-

Pour résumer :

-
    -
  • -

    Pour monter vos partitions :

    -
    sudo cryptsetup luksOpen <fichier chiffré> <nom de disque virtuel>
    -sudo mount /dev/mapper/<nom de disque virtuel> <emplacement>
    -
    - - -
  • -
  • -

    Pour démonter vos partitions :

    -
    sudo umount <emplacement>
    -sudo cryptsetup luksClose <nom de disque virtuel>
    -
    - - -
  • -
-

Pour simplifier la vie de tous, j’ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur github.

-

Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un dd if=votre_image of=/dev/votre_partition -pour ce faire.

-
-
-
-

Redesign du blog, etc

-
- Date - - Wed 12 June 2013 - -
- By - wxcafe -
- Category - Note -
- - - - -
-

Comme vous avez pu le remarquer, ce blog a “un peu” changé récemment.

-

Du coup, expliquons. J’ai récemment monté serverporn, et ai par la même -occasion découvert pelican. J’ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d’utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d’un “thème” -constitué de templates pour les fichiers html et l’organisation du projet et -d’une partie “statique” contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html.

-

Globalement, un thème est constitué ainsi :

-
thème
-├── static
-   ├─ css
-     └─ [css files]
-   ├─ img
-     └─ [image files]
-   └─ js
-      └─ [javascript files]
-└── template
-    ├─ base.html
-    ├─ index.html
-    ├─ page.html
-    ├─ [...]
-    └─ article.html
-
- - -

Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles {{ article.content }}, -par exemple. La syntaxe complète est très bien documentée dans la doc de -pelican.

-

L’un des grands avantages de pelican est aussi la facilité qu’il offre quand a -la mise a jour du blog.
-En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n’existant pas la dernière fois, etc… -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un make html pour mettre a jour le blog.

-

De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c’est moi -qui ait modifié les templates et le css), c’est lisible (puisque c’est du -python, par opposition au PHP…), et c’est plus “efficace”. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n’ai pas besoin d’un accès continu au net, bref, c’est plus -efficace.

-

En ce qui concerne les points négatifs :

-
    -
  • -

    Perte des commentaires: - Je vous propose de vous référer a l’article de Gordontesos ici quand a - mon avis sur ce sujet.

    -
  • -
  • -

    Perte du bouton flattr: - Il va bientôt être remis, c’est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c’est assez facile a - faire.

    -
  • -
  • -

    Perte du spam: - Pourquoi c’est dans les points négatifs, ca?

    -
  • -
  • -

    Temps d’adaptation et d’appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c’est parce que j’apprend a me servir de ce système - et que j’apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d’apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.

    -
  • -
-

Voila, c’est mon retour d’expérience sur pelican. A plus.

-
-
-
-

Comment Saurik a rooté les Google Glass

-
- Date - - Mon 06 May 2013 - -
- By - Wxcafe -
- Category - Hacking -
- - - - -
-

Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un “app store” alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente…), a trouvé intéressant d’obtenir un accès root -sur celles-ci, ce qu’il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d’extraire l’OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.

-

Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n’a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :

-

Je tiens tout d’abord a préciser que toutes les informations qui vont -suivre sont extraites de cet article, et plus précisément de la -partie “How does this exploit work”.  Je tente d’apporter ma maigre -contribution a cette explication.

-

Donc, d’après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d’exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.

-

Saurik a donc cherché un exploit connu pour cette version d’android, et -l’a appliqué a son problème. L’exploit en question est relativement -simple. Depuis la version 4.0 d’android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l’accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc… Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l’application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l’archive gzip.

-

Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx–x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s’il -fonctionne dans une VM ou sur un véritable appareil. S’il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l’on cherche pour l’instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d’android, -dont l’application paramètres, et, dans ce cas précis, l’application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.

-

Cependant, un problème reste : le système de restauration d’Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d’avoir accès directement a /data/local.prop, le -fichier qu’on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d’écrire dans ce dossier.

-

Donc, nous allons lancer deux processus en même temps :

-
    -
  • -

    Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :

    -
    while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2>/dev/null
    -do :
    -done
    -
    - - -
  • -
  • -

    Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu’il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l’ordinateur host :

    -
    adb restore exploit.ab
    -
    - - -

    Ces commandes vont fonctionner de concert pour nous donner un accès root :
    -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.
    -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l’âme proprement.
    -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.

    -
  • -
-

And voilà! On a écrit ce que l’on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu’il tourne dans une machine -virtuelle (ce que l’on veut, c’est en fait “ro.kernel.qemu=1”, qui -indique au noyau qu’il tourne dans qemu, un système de VM).

-

Il nous reste a rebooter, depuis l’ordinateur host :

-
adb reboot
-
- - -

Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :

-
adb shell "mount -o remount,rw /system"
-
- - -

Nous copions le binaire su vers l’appareil :

-
adb push su /system/xbin
-
- - -

Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :

-
adb shell "chmod 6755 /system/xbin/su"
-
- - -

Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :

-
adb shell "rm /data/local.prop"
-
- - -

Enfin, nous redemarrons a nouveau :

-
adb reboot
-
- - -

Et voila, une paire de google glass rootée!

-

Il est bon de préciser que cette manipulation n’est possible que parce -que les lunettes tournent sous une ancienne version d’android, et que ce -bug a été fixé depuis.

-

Il serait aussi interessant de couvrir les problèmes de vie privée -qu’engendrent les Google Glass, et ce sera fait dans un autre billet.

-

A bientôt!

-
-
-
-

Monter son propre serveur, partie 1: le serveur et l'apache.

-
- Date - - Mon 18 March 2013 - -
- By - Wxcafe -
- Category - Tutoriel -
- - - - -
-

Il y a un certain temps, j’avais parlé du concept du self-hosting. Il -s’agit de posséder son propre serveur, et donc, par extension, ses -données.

-

Bien entendu, il n’est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n’est pas le sujet abordé ici.)
-Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l’utilisation que l’on veut en faire ici d’installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c’est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu’une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l’installation simple et -compréhensible).

-

La première chose a faire est bien entendu d’obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d’obtenir un serveur, que ce soit en le -louant chez OVH/1&1/n’importe quel autre hébergeur commercial, en -participant a un système d’hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC… Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi…). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.

-

Dans cet article, lorsque est précisée le type d’IP a utiliser, il -convient de mettre ce type précisément. Quand le type n’est pas -précisée, libre a vous de choisir ipv4 ou ipv6.

-

Bref. Commençons au point ou vous avez un accès root a votre serveur, -n’ayant soit aucun mot de passe, soit un choisi par l’hébergeur, et ou -rien n’est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un passwd, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d’éditer l’entrée DNS pour votre nom de -domaine.

-

Cette entrée doit donc pour l’instant ressembler a ca :

-
    <votre nom de domaine>  NS 1 
-                            IN MX 1 
-                            IN A        <IPv4 de votre serveur>
-                            IN AAAA     <IPv6 de votre serveur>
-
- - -

Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c’est de la magie pour -l’instant, ca sera peut être le sujet d’un autre article), et d’indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.

-

root est un utilisateur assez répandu, et il est assez simple de -bruteforcer le mot de passe. (Relativement assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent…) Ainsi, nous allons -arrêter d’utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.
-Cela se fait en deux temps : tout d’abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l’avenir; puis configurer -OpenSSH pour que celui ci n’accepte que les connections par clés et plus -celles sur root.

-

Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu’il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d’être très chiant a -distinguer de l’autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l’utilisation d’useradd plus facilement.)

-

Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste adduser <username>, soit utiliser le mode non-interactif -en faisant un adduser --group <username>

-

Avec useradd, vous devrez utiliser la commande suivante : useradd -m --N -g <username>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l’ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).

-

Il convient maintenant d’ajouter cet utilisateur aux groupes qu’il sera -amené a administrer: usermod <username> -a -G www-data postfix -users staff sudo wheel, puis de changer son mot de passe -passwd. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: echo "%sudo ALL=(ALL) ALL" >> /etc/sudoers
-Enfin, changeons d’utilisateur : su. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d’administration. Si vous devez encore utiliser root, c’est que -quelque chose ne va pas.

-

Vous êtes donc loggés sur le système en tant qu’utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.
-Tout d’abord, qu’est-ce qu’un login par clé ssh? Il s’agit en fait d’un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d’utiliser plusieurs clés publique pour chaque
-utilisateur.

-

Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d’abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande ssh-keygen -t rsa (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.
-known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c’est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier…) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec unscp ~/.ssh/id_rsa.pub <username>@<votre nom de domaine>:~/ , ou -en la copiant a la main, si ça vous amuse.

-

Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (mkdir .ssh), puis -de déplacer ce fichier a la bonne place (mv ~/id_rsa.pub ~/.ssh/authorized_keys). -Testez si ça fonctionne : ouvez un autre terminal, et
-connectez vous a votre serveur (ssh <username>@<votre nom de -domaine>), et il ne devrait pas vous demander de mot de passe.Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.

-

Continuons. Il ne nous reste plus qu’a installer le serveur web, et a le -configurer:

-
sudo apt-get install \
-apache2 apache2.2-common apache2-doc apache2-mpm-prefork \
-apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \
-php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \
-apache2-suexec php-pear php-auth php5-mcrypt mcrypt \
-php5-imagick imagemagick libapache2-mod-suphp libruby \
-libapache2-mod-ruby
-
- - -

(faisons large, on aura besoin de l’excédent plus tard…), puis activons les
-mods apache en faisant a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest, et faisons en sorte que ces activations -soient prises en compte par apache via un sudo service apache2 -restart

-

Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer.

-

Pour cela, nous allons faire un simple ln -s /etc/apache2/sites-{available,enabled}/default, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l’éditer, en changeant l’adresse mail au début du document -par la votre, et en changeant AllowOverride none en AllowOverride All, -et enfin redémarrer apache pour qu’il prenne en compte les -modifications, par un sudo service apache2 restart

-

Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l’installation du serveur mail (c’est suffisamment complexe pour -prendre un article seul…)

-
-
-
-

Pourquoi je vais quitter linux pour passer a FreeBSD.

-
- Date - - Mon 04 February 2013 - -
- By - Wxcafe -
- Category - Ranting -
- - - - -
-

This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text here

-

Bon, voila. J’ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n’avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n’ai même idée que quelque chose dans mon système d’exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l’époque, je n’avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j’ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s’accumulant et -mon niveau de compréhension du système s’améliorant, j’ai commencé a -remarquer que certain bouts de l’OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s’est faite a -cause de la recrudescence de ces bouts d’OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d’OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j’en ai eu marre de voir unity sur ma machine, et j’ai -choisi de passer a Archlinux. C’était avant le passage a systemd. Ce -système me convenait bien. Si je n’installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c’était le moins -envahissant de ceux la.

-

Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n’a pas vraiment eu le choix, rapport a la philosophie de la -distribution d’avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les kits (bien que ce ne soient -pas les seuls a faire ça…) ont un problème très précis, qui n’importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :

-
    -
  1. Ce qui est petit est beau
  2. -
  3. Faites en sorte que chaque programme fasse une chose, bien.
  4. -
  5. Faites un prototype aussi vite que possible
  6. -
  7. Choisissez la portabilité plutôt que l’efficacité
  8. -
  9. Stockez les données dans des fichiers textes.
  10. -
  11. Utilisez ce qui existe déjà a votre avantage. [1]
  12. -
  13. Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.
  14. -
  15. Évitez les UI qui “capturent” l’utilisateur.
  16. -
  17. Faites de chaque programme un filtre.
  18. -
-

Alors bien entendu, un système d’exploitation est fait pour évoluer, et -on pourrait penser qu’UNIX a fait son temps. Cependant, ce n’est pas -exactement la façon dont l’informatique fonctionne. Effectivement, les -standards, les systèmes d’exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n’est -pas d’UNIX que nous parlons ici. C’est de la philosophie UNIX. Et -celle-ci n’a pas fait son temps, elle a fait ses preuves. La -philosophie UNIX, en plus d’être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu’au premier jour.
-La philosophie UNIX est aussi et surtout une garantie d’utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l’informatiquesérieusement (je ne dis pas que les autres métiers de l’informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).

-

Tous OS se doit d’avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d’échanger des informations. C’est -efficace, ça respecte le “tout est fichier”, c’est standard, c’est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n’est explicitement pas faite pour -être utilisée a la ligne de commande mais a l’aide d’APIs, et un -programme monolithique qui effectue sa tache d’une façon complètement -obscure pour l’utilisateur. Alors bien sur, il l’effectue d’une façon -efficace, cette tache. Oui, ça va plus vite qu’avant. Oui, c’est plus -“rangé”, ça fait moins “fouillis”. Mais c’est moins efficace. C’estbeaucoup moins utilisable pour l’utilisateur final. C’est -horriblement chiant pour les sysadmins, parce qu’ils ne peuvent plus -lire facilement les échanges entre programmes. C’est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.
-Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l’utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d’en choquer quelques -uns, je préfère avoir un système qui boote légèrement plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C’est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n’employant plus les -systèmes basiques d’UNIX.

-

Le problème est qu’il est facilement visible que la direction prise par -la communauté Linux n’est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d’accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d’autres raisons…), et on peut -compter sur le fait que les autres distributions l’adopteront un jour ou -l’autre.

-

Bon, maintenant que nous avons, si ce n’est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu’ils me -déplaisent, on pourrait penser qu’il suffit de passer a une distribution -n’incluant pas systemd, voire a une distribution n’incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu’OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d’ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l’init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d’exploitation une date -d’expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d’init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s’ouvrent a moi: OpenSolaris et *BSD. Minix n’est pas -vraiment un choix, vu le peu de programmes qu’il permet de faire -fonctionner et le fait qu’il ne soit disponible que sur i386, ce qui -n’est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n’est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.

-

OpenSolaris est un système d’exploitation tout a fait valable. Je n’ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l’idée que j’ai d’un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs “release-only”), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n’importe quoi. Bref, cela -n’est pas le sujet. Il convient aussi de voir qu’avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n’ait pas de très beaux jours devant lui (la page d’accueil du -projet affiche d’ailleurs un ÉNORME logo Oracle, du meilleur gout.)

-

Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu’OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c’est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d’être orientées sécurité, et d’après ce que j’ai pu en voir -DFBSD ressemble aussi au système de l’assistance a l’user a outrance -décris plus haut. Mais la vérité est que je n’ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu’entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j’aime -pouvoir configurer mes logiciels de façon assez profonde.)

-

Voila, c’est mon avis sur ce “problème” actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n’apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.
-[1]: Je n’ai pas trouvé de traduction satisfaisante a “software leveraging”, mais l’idée est la…*

-
-
-
-

Update et pensées a propos du Raspberry Pi

-
- Date - - Sun 27 January 2013 - -
- By - Wxcafe -
- Category - Ranting -
- - - - -
-

Bon.
-J’ai annoncé il y a environ 20 jours que j’avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, astucieusement nommée -PiRatBox. Il se trouve qu’après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n’est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.
-Alors, autant il me semble évident qu’avec une -alimentation provenant d’un port USB a 2A (max), je n’avais pas -énormément de chances d’avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité.

-

De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB…), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu’il soit surement possible de la désactiver au niveau du kernel, -il n’est pas simplement possible de la “débrancher”. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve.

-

Bon, je dois avouer n’avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple et -bonne raison qu’arch utilise systemd et qu’il n’existe pas de wrapper -systemd pour les daemons piratebox, et que j’ai la flemme d’en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j’utiliserai debian. Le problème d’utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l’autre, en ce sens que si on installe un package “haut”, c’est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d’installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package “bas”, c’est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -“hauts”, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu’il n’y a pas de moyen “facile” de choisir ce qui -sera installé sur le système avant l’installation proprement dite -(puisque le moyen “universel” d’installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)

-

Il y a énormément d’autres critiques que l’ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s’arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l’OS qui lui même se lance, initialise le hardware, -etc…, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d’une cour d’immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe…), et le moyen le -plus efficace qu’aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc…

-

Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n’estvisiblement pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c’est bien réalisé, sinon je dis non.

-

Enfin, le projet que j’avais est toujours en cours de réalisation. Je -le terminerai dès que j’aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu’il m’a posé, qu’il n’aurait pas du me poser, m’ont -trop agacé pour que j’aie envie de le sortir et de jouer avec une fois -sa mission remplie.

-

Dommage.

-
-
-
-

Update

-
- Date - - Sat 05 January 2013 - -
- By - Wxcafe -
- Category - Note -
- - - - -
-

Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d’une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!

-
-
-
-

Mutt ou le client email le meilleur moins mauvais

-
- Date - - Wed 02 January 2013 - -
- By - Wxcafe -
- Category - Tutoriel -
- - - - -
-

Les clients mails ont une particularité en commun : ils sont tous -très mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation a la UNIX
-Cependant, un d’entre eux se démarque par sa moins-mauvais-itude, c’est -le relativement bien connu Outlook Express 2003 Mutt!
-Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, “just sucks less”. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.

-

La configuration de mutt se fait dans le fichier .muttrc ou dans -/etc/Muttrc, et il est courant d’utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d’un système d’accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d’offlineimap se fait dans~/.offlineimaprc ou dans rien d’autre en fait, c’est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)
-Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et ce script fait par moi, qui vous permet d’installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.
-Ensuite, voyons pour la partie configuration :
-Ma configuration d’offlineimap :

-
## Config file for offlineimap
-## Originally located in ~/.offlineimaprc
-## This should not be edited without creating a copy before
-## Created by Wxcafe (Clément Hertling)
-## Published under CC-BY-SA
-
-[general]
-# List of accounts to be synced, separated by a comma.
-accounts = main
-
-[Account main]
-# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
-localrepository = main-local
-# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
-remoterepository = main-remote
-# Status cache. Default is plain, which eventually becomes huge and slow.
-status_backend = sqlite              # le type de cache. (plain ou sqlite)
-
-[Repository main-local]
-# Currently, offlineimap only supports maildir and IMAP for local repositories.
-type = Maildir                        # le type de stockage (Maildir ou IMAP)
-# Where should the mail be placed?
-localfolders = ~/Emails/                # le dossier dans lequel vous
-                                        # voulez que vos emails apparaissent
-
-[Repository main-remote]
-# Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.
-type = IMAP
-remotehost = //placeholderhost//        # le serveur de votre messagerie
-remoteuser = //placeholderusername//    # votre nom d'utilisateur
-remotepass = //placeholderpassword//    # votre mot de passe
-cert_fingerprint = //placeholdercert//  # le certificat du serveur (IMAPS only)
-
- - -

Ça devrait être assez simple a lire, j’ai tout bien commenté :3
-Puis ma config mutt :

-
## Mutt MUA configuration file
-## This file should not be edited without creating a copy
-## File Created and edited by Wxcafe (Clément Hertling)
-## Published under CC-BY-SA
-
-# General config for reading (fetched via offlineimap)
-
-set mbox_type = Maildir
-# type de boite mail (voir dans offlineimap, mailbox par defaut)
-
-set folder = ~/Email/
-# dossier root mailbox/imap
-
-set spoolfile = +INBOX
-# dossier d'inbox
-
-set mbox = +'All Mail'
-# dossier ou archiver les emails
-
-set copy = yes
-# yes pour copier les messages dans les differents dossier, no pour...
-# enfin voila quoi.
-
-set header_cache = /.hcache/
-# dossier ou sont stockés les headers (pour le cache)
-
-set record = +Sent
-# dossier dans lequel sont stockés les messages envoyés
-
-set postponed = +Drafts
-# dossier dans lequel sont stockés les brouillons
-
-mailboxes = +INBOX +Drafts +Sent +Trash  +All\ Mail 
-# liste des dossiers qui vont apparaitre dans la colonne de gauche
-
-# General config for sending (using Mutt's native support)
-
-set smtp_pass = 'password_placeholder'
-# votre mot de passe
-
-set smtp_url = "smtp://username@whatev.org:465/"
-# l'url ou envoyer les emails
-
-set send_charset = "utf-8"
-# UTF8, NE PAS CHANGER
-
-set signature = ".sign"
-# vous pouvez mettre votre signature dans .sign
-
-set sig_on_top = yes
-# il est d'usge de mettre no ici. Cependant, je trouve ca plus lisible 
-# comme ca.
-
-set ssl_verify_host = no
-# mettez yes ici si votre serveur a un certificat configuré correctement
-
-set hostname = "wxcafe.net"
-# mettez l'adresse de votre serveur ici
-
-# Misc settings
-
-auto_view text/html
-# la façon de voir les emails par défaut.
-
-set date_format = "%y-%m-%d %T"
-# format de date d'envoi/de reception.
-
-set index_format = "%2C | %Z [%D] %-30.30F (%-4.4c) %s"
-# format de l'index (la présentation de l'interface)
-# voir http://www.mutt.org/doc/manual/manual-6.html#index_format
-
-set sort_alias = alias
-set reverse_alias = yes 
-set alias_file = "$HOME/.mutt/aliases"
-# liste des alias noms/email. a créer et remplir vous même.
-# format : "alias short_name long_email_adress"
-source $alias_file
-
-set beep = no
-# ne pas biper. CE SON ME TUE T.T
-
-set tilde = yes
-set sleep_time = 0
-# ?
-
-set sidebar_visible = yes
-set sidebar_width = 15
-# parametres de la barre coté gauche
-
-set realname = "Clément Hertling (Wxcafé)"
-set from = "wxcafe@wxcafe.net"
-set use_from = yes
-set certificate_file = "$HOME/.mutt/cacert"
-# parametres d'envoi. mettez vos propres infos a la place des miennes...
-
-set edit_headers = yes
-# vous permet de vois les headers des mails. j'aime, donc je laisse.
-
-# Macros
-
-# le titre dit tout. index veut dire que la macro est active dans les menus,
-# pager qu'elle l'est dans la visionneuse, les deux qu'elle l'est dans les 
-# deux
-# \C represente la touche Control
-
-bind index,pager \Cp sidebar-prev
-# Control+p -> remonter d'un dossier dans la sidebar
-
-bind index,pager \Cn sidebar-next
-# Control+n -> descendre d'un dossier dans la sidebar
-
-bind index,pager \Co sidebar-open
-# Control+o -> ouvrir le dossier selectionné dans la sidebar
-
-macro index,pager d "=Trash" "Trash"
-# d supprime le message en cours
-
-bind pager   previous-line
-# permet de monter d'une ligne avec la touche up, au lieu de changer de message.
-
-bind pager   next-line
-# permet de descendre d'une ligne avec la touche down, au lieu de changer de 
-# message
-
-bind pager j next-line
-bind pager k previous-line
-# raccourcis vim
-
-# PGP signing commands
-
-set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
-set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
-set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
-set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f"
-set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f"
-set pgp_encrypt_only_command="pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
-set pgp_encrypt_sign_command="pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
-set pgp_import_command="gpg --no-verbose --import -v %f"
-set pgp_export_command="gpg --no-verbose --export --armor %r"
-set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
-set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r" 
-set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r" 
-set pgp_autosign=yes
-set pgp_sign_as=0x********
-# remplacez 0x******** par votre identifiant PGP!!!!!
-
-set pgp_replyencrypt=no
-set pgp_timeout=7200
-set pgp_good_sign="^gpg: Good signature from"
-
-# si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis
-# PGP signing options
-
-# Palette for use with the Linux console.  Black background.
-
-# Schéma de couleur Rouge et Noir. Commentez si vous voulez le 
-# défaut noir et blanc.
-# d'autres schémas sont trouvables sur google et autre.
-
-color hdrdefault red black
-color quoted brightblack black
-color signature brightblack black
-color attachment red black
-color message brightwhite black
-color error brightred black
-color indicator black red
-color status white black
-color tree white black
-color normal white black
-color markers red black
-color search white black
-color tilde brightmagenta black
-color index red black ~F
-color index red black "~N|~O"
-
- - -

Voila, pour plus d’informations vous pouvez aller voir le manuel de mutt -@ http://www.mutt.org/doc/manual/
-J’espère que cette configuration “toute faite” vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu’utiliser une configuration toute faire n’aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l’introduction ou a des situations ou il est absolument -nécessaire d’avoir rapidement une configuration fonctionnelle (c’est a -dire, dans le cas d’un client email, euh… jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -Bing Google Yahoo Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!

-
-
- -
- -
-
- -
- - \ No newline at end of file diff --git a/output/authors.html b/output/authors.html deleted file mode 100644 index e69de29..0000000 diff --git a/output/categories.html b/output/categories.html deleted file mode 100644 index 7ea102c..0000000 --- a/output/categories.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - Wxcafé - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
- -
- - \ No newline at end of file diff --git a/output/category/hacking/index.html b/output/category/hacking/index.html deleted file mode 100644 index 96933e6..0000000 --- a/output/category/hacking/index.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - Wxcafé - Hacking - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-

Comment Saurik a rooté les Google Glass

-
- Date - - Mon 06 May 2013 - -
- By - Wxcafe -
- Category - Hacking -
- - - - -
-

Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un “app store” alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente…), a trouvé intéressant d’obtenir un accès root -sur celles-ci, ce qu’il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d’extraire l’OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.

-

Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n’a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :

-

Je tiens tout d’abord a préciser que toutes les informations qui vont -suivre sont extraites de cet article, et plus précisément de la -partie “How does this exploit work”.  Je tente d’apporter ma maigre -contribution a cette explication.

-

Donc, d’après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d’exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.

-

Saurik a donc cherché un exploit connu pour cette version d’android, et -l’a appliqué a son problème. L’exploit en question est relativement -simple. Depuis la version 4.0 d’android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l’accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc… Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l’application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l’archive gzip.

-

Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx–x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s’il -fonctionne dans une VM ou sur un véritable appareil. S’il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l’on cherche pour l’instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d’android, -dont l’application paramètres, et, dans ce cas précis, l’application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.

-

Cependant, un problème reste : le système de restauration d’Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d’avoir accès directement a /data/local.prop, le -fichier qu’on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d’écrire dans ce dossier.

-

Donc, nous allons lancer deux processus en même temps :

-
    -
  • -

    Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :

    -
    while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2>/dev/null
    -do :
    -done
    -
    - - -
  • -
  • -

    Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu’il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l’ordinateur host :

    -
    adb restore exploit.ab
    -
    - - -

    Ces commandes vont fonctionner de concert pour nous donner un accès root :
    -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.
    -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l’âme proprement.
    -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.

    -
  • -
-

And voilà! On a écrit ce que l’on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu’il tourne dans une machine -virtuelle (ce que l’on veut, c’est en fait “ro.kernel.qemu=1”, qui -indique au noyau qu’il tourne dans qemu, un système de VM).

-

Il nous reste a rebooter, depuis l’ordinateur host :

-
adb reboot
-
- - -

Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :

-
adb shell "mount -o remount,rw /system"
-
- - -

Nous copions le binaire su vers l’appareil :

-
adb push su /system/xbin
-
- - -

Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :

-
adb shell "chmod 6755 /system/xbin/su"
-
- - -

Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :

-
adb shell "rm /data/local.prop"
-
- - -

Enfin, nous redemarrons a nouveau :

-
adb reboot
-
- - -

Et voila, une paire de google glass rootée!

-

Il est bon de préciser que cette manipulation n’est possible que parce -que les lunettes tournent sous une ancienne version d’android, et que ce -bug a été fixé depuis.

-

Il serait aussi interessant de couvrir les problèmes de vie privée -qu’engendrent les Google Glass, et ce sera fait dans un autre billet.

-

A bientôt!

-
-
-
-

Pages

-
  • A propos
  • -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/category/note/index.html b/output/category/note/index.html deleted file mode 100644 index ff097f3..0000000 --- a/output/category/note/index.html +++ /dev/null @@ -1,712 +0,0 @@ - - - - - Wxcafé - Note - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    les NUCs et le HDMI-CEC

    -
    - Date - - Sat 22 August 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    J’ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas “profiter” du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc…) simplement.

    -

    Ayant un Raspberry Pi 1 qui trainait, j’ai -décidé d’installer OpenELEC dessus et de voir ce que ça -donnait. Le résultat n’étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j’ai décidé d’upgrader le système.

    -

    J’ai donc acquis un NUC D34010WYK -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -adaptateur HDMI-CEC pour celui-ci, et un -SSD mSATA, en me disant que je -pourrais sans trop de problème faire tourner Kodi sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L’autre -avantage de tourner sur du Intel, c’est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).

    -

    J’ai donc reçu après un certain temps le matériel sus cité, que j’ai avidement -monté, avant de me rendre compte que le manuel de l’adaptateur Pulse-Eight était -[PDF]assez médiocre. J’ai donc -cherché plusieurs heures, avant de trouver [DE]ce -post -expliquant comment brancher l’adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l’information, et pour moi si je dois remonter ce système.

    -

    Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -“Front Panel”, et un appelé “Custom Solution Header”. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :

    -
    Custom Solution
    -  ┌─┬─┬─┬─┬─┐
    -  │g│ │·│r│·│
    -  ├─┼─┼─┼─┼─┤
    -  │·│·│·│·│·│
    -  └─┴─┴─┴─┴─┘
    -
    -  g ➔ fiche grise
    -  r ➔ fiche rouge
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Une fois cela fait, il faut brancher le Front Panel. Heureusement, c’est plus -facile, puisqu’il n’y a qu’une seule fiche a brancher ici : la orange.

    -
      Front Panel
    -  ┌─┬─┬─┬─┬─┐
    -  │·│·│·│·│·│
    -  ├─┼─┼─┼─┼─┤
    -  │ │·│o│·│·│
    -  └─┴─┴─┴─┴─┘
    -
    -  o ➔ fiche orange
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons.

    -
       Dual-USB
    -  ┌─┬─┬─┬─┬─┐
    -  │b│B│v│n│·│
    -  ├─┼─┼─┼─┼─┤
    -  │·│·│·│·│ │
    -  └─┴─┴─┴─┴─┘
    -
    -  b ➔ fiche bleue
    -  B ➔ fiche Blanche
    -  v ➔ fiche verte
    -  n ➔ fiche noire
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que “Deep S4/S5” soit désactivé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.

    -

    Ne reste plus ensuite qu’a installer un système digne de ce nom dessus!

    -
    -
    -
    -

    SSL - STARTTLS

    -
    - Date - - Sat 16 May 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l’histoire d’Internet. Sa mise en place pose -problème : les protocoles existants ne s’accommodent qu’assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n’apporte rien d’intéressant. Pour palier a ce -problème, deux solutions sont apparues.

    -

    Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l’extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.

    -

    L’autre approche qui a été utilisée est une approche d’upgrade. La -communication commence en mode non chiffré, puis le client demande l’upgrade de -la connexion vers le mode chiffré s’il le supporte, les deux machines -machines font un handshake SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la “mise -a jour” en douceur.

    -

    Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service – laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec STARTTLS, qui upgrade les connexions si nécessaire.
    -La réponse est que STARTTLS est plus interessant, pour plusieurs raisons. Tout -d’abord, il permet de n’utiliser qu’un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients “anciens” (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d’éviter aux utilisateurs d’avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l’activera de lui même s’il -voit qu’il est disponible.
    -Bref, mettez en place du STARTTLS, et pas du SSL. C’est mieux pour la sécurité -de tout le monde.

    -
    -
    -
    -

    Docker et les ebooks sur Twitter

    -
    - Date - - Sat 28 February 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Vous avez peut être déjà entendu parler de Docker. Si -ce n’est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n’est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les Jails, -mais n’est devenu possible sous linux que récemment grâce aux cgroups, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d’avoir une machine hôte sur laquelle s’exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l’hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu’avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu’à l’hôte, puisqu’il n’est pas vraiment séparé des -invités.

    -

    Quoi qu’il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. “Mais pourquoi utiliser Docker, dans ce cas”, vous -demandez-vous peut être, “puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?”. Et bien -c’est très simple : Docker apporte la simplicité de déploiement d’applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le Docker Hub permet aussi de récupérer -rapidement et facilement un grand nombre d’images déjà configurées.

    -

    Maintenant que nous avons expliqué rapidement ce qu’était Docker, voyons le -rapport avec les ebooks et Twitter.

    -

    Les comptes dits “ebooks” (le nom vient a l’origine de horse_ebooks, -voir ici pourquoi) sont des bots -twitter utilisant des Chaines de Markov, -avec les tweets d’un utilisateur “source” comme corpus, pour produire des tweets -ressemblant a ceux de l’utilisateur source. Nous allons voir maintenant comment -en installer un.

    -

    C’est, comme disent certaines personnes, “fun”.

    -

    Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -celle-ci, qui est une lib ruby créée -par @m1sp, qui gère pour nous a la fois l’API -twitter et la génération des messages.

    -

    Cependant, cela n’explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d’isoler les bots, et les -containers dockers permettent de les déployer sur n’importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j’ai créé un -repo github qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.

    -

    Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l’utilisateur source avec ebooks archive <username> <filename> (c’est du json) -, puis vous convertissez le json en fichier utilisable par le bot : ebooks -consume <filename>. Cela fait, démarrer le bot revient a lancer le container : -docker run -d <container name> Pour plus d’informations, allez voir la -documentation Docker

    -

    Bien entendu, dans l’idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron :

    -
    00 00 * * *    /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json >> /var/log/ebooks/update.log 2>&1
    -00 05 * * *    cd /usr/local/ebooks/main/ && /usr/local/bin/ebooks consume corpus/username.json >> /var/log/ebooks/update.log 2>&1
    -00 10 * * *    docker rm -f bots >/dev/null 2>&1
    -00 15 * * *    docker rmi bots  > /dev/null 2>&1
    -00 20 * * *    cd /usr/local/ebooks/main/ && docker build --rm -t bots . >> /var/log/ebooks/build.log 2>&1
    -00 25 * * *    docker run -d --name bots bots >> /var/log/ebooks/run.log 2>&1
    -
    - - -

    Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s’executent en même temps.

    -

    Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n’est qu’un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner des -applications “usuelles” -dedans, -puisque l’overhead de Docker est minimal, et beaucoup d’autres applications -existent.

    -
    -
    -
    -

    SSL ou la sécurité sur l'internet

    -
    - Date - - Fri 30 May 2014 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: More Tricks for Defeating SSL, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -A Critique of Lavabit, -ce qui peut avoir l’effet de rendre légèrement parano. Si vous considérez que -c’est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)

    -

    Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.

    -

    Cela fait suite aux évènements évoqués dans le Disclaimer, mais aussi a des -doigts sortis d’un endroit particulier du corps de l’admin/auteur de ce “blog”, -qui a pris enfin les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d’un système -fonctionnel utilisant cette compréhension récemment acquise.

    -

    Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c’est très -simple : il existait auparavant un certificat pour wxcafe.net, un pour -paste.wxcafe.net, un pour mail.wxcafe.net, etc… Bref, un certificat -différent pour chaque sous-domaine.

    -

    Il s’avère que c’est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d’erreur, etc) et pas plus -sécurisé que d’avoir un seul certificat wildcard. J’ai donc généré un certificat -pour *.wxcafe.net hier, et il sera dorénavant utilisé pour tous les -sous-domaine de wxcafe.net; et un certificat pour wxcafe.net, qui ne matche -pas *.wxcafe.net, et qui sera donc utilisé… bah pour wxcafe.net.

    -

    Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l’arrivée sur le site ne commence pas -par une page firefox disant “Something’s Wrong!”, et ces redirections ne seront -donc pas mises en place.

    -

    De plus, après la lecture de l’article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c’est a dire que, même si -quelqu’un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.

    -

    Bon, maintenant que les explications basiques sont faites, voyons -l’implémentation :
    -Pour générer la clé, tout d’abord, il convient d’utiliser les commandes -suivantes:

    -
    sudo openssl genrsa -out example.key 4096
    -# nous utilisons ici une clé de 4096 bits, la taille est laissée a votre appréciation
    -sudo openssl req -new -key example.key -out example.csr
    -# OpenSSL va ici vous demander de nombreuses informations, "Common Name" devant contenir le FQDN
    -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt
    -# enfin, nous générons la clé, d'une durée de vie de 3 ans
    -
    - - -

    Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -*.example.com comme common name. -Une fois la clé générée, il faut dire aux différents services de l’utiliser, et -de n’utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j’utilise :

    -

    apache :

    -
    # /etc/apache2/mods_enabled/ssl.conf
    -# [...]
    -SSLProtocol all -SSLv2 -SSLv3
    -SSLHonorCipherOrder on
    -SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
    -  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
    -  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
    -# [...]
    -# /etc/apache2/sites-enabled/default-ssl
    -# [...]
    -SSLEngine on
    -SSLCertificateFile /etc/certs/example.com.crt
    -SSLCertificateKeyFile /etc/certs/example.com.key
    -# [...]
    -
    - - -

    nginx :

    -
    # /etc/nginx/nginx.conf 
    -# [...]
    -ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    -ssl_prefer_server_ciphers on;
    -ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
    -  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
    -  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
    -# [...]
    -# /etc/nginx/sites-enabled/default-ssl
    -# [...]
    -ssl on;
    -ssl_certificate /etc/certs/example.com.crt
    -ssl_certificate_key /etc/certs/example.com.key
    -# [...]
    -
    - - -

    prosody (jabber) :

    -
    # tout d'abord, lancez la commande suivante :
    -sudo openssl dhparam -out /etc/prosody/certs/dh-2048.pem 2048
    -# ensuite, pour chaque VirtualHost dans /etc/prosody/prosody.conf :
    -ssl = {
    -  dhparam = "/etc/prosody/certs/dh-2048.pem";
    -  key = "/etc/certs/example.com.key";
    -  certificate = "/etc/certs/example.com.crt";
    -}
    -# la cipher suite de prosody utilise par défaut EDH et EECDH
    -
    - - -

    postfix (email) :

    -
    # /etc/postfix/main.cf
    -# [...]
    -smtpd_tls_cert_file = /etc/certs/example.com.crt
    -smtpd_tls_key_file = /etc/certs/example.com.key
    -tls_preempt_cipherlist = yes
    -smtpd_tls_eecdh_grade = strong
    -smtdp_tls_mandatory_ciphers = high
    -smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS
    -smtpd_tls_security_level = encrypt
    -smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
    -smtpd_use_tls = yes
    -# [...]
    -
    - - -

    dovecot (imap) :

    -
    # /etc/dovecot/dovecot.conf 
    -# [...]
    -ssl_cert = </etc/certs/example.com.crt
    -ssl_key = </etc/certs/example.com.key
    -ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
    -
    - - -

    Voila. Pour d’autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.

    -

    Cela étant dit, je conseille a tout le monde d’aller voir la conférence dans le -disclaimer, et tant qu’a faire la conférence du même hacker SSL and the future -of Authenticity qui parle de son -implémentation d’une technologie “remplaçant” le système de CAs qui existe -actuellement.

    -
    -
    -
    -

    Redesign du blog, etc

    -
    - Date - - Wed 12 June 2013 - -
    - By - wxcafe -
    - Category - Note -
    - - - - -
    -

    Comme vous avez pu le remarquer, ce blog a “un peu” changé récemment.

    -

    Du coup, expliquons. J’ai récemment monté serverporn, et ai par la même -occasion découvert pelican. J’ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d’utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d’un “thème” -constitué de templates pour les fichiers html et l’organisation du projet et -d’une partie “statique” contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html.

    -

    Globalement, un thème est constitué ainsi :

    -
    thème
    -├── static
    -   ├─ css
    -     └─ [css files]
    -   ├─ img
    -     └─ [image files]
    -   └─ js
    -      └─ [javascript files]
    -└── template
    -    ├─ base.html
    -    ├─ index.html
    -    ├─ page.html
    -    ├─ [...]
    -    └─ article.html
    -
    - - -

    Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles {{ article.content }}, -par exemple. La syntaxe complète est très bien documentée dans la doc de -pelican.

    -

    L’un des grands avantages de pelican est aussi la facilité qu’il offre quand a -la mise a jour du blog.
    -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n’existant pas la dernière fois, etc… -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un make html pour mettre a jour le blog.

    -

    De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c’est moi -qui ait modifié les templates et le css), c’est lisible (puisque c’est du -python, par opposition au PHP…), et c’est plus “efficace”. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n’ai pas besoin d’un accès continu au net, bref, c’est plus -efficace.

    -

    En ce qui concerne les points négatifs :

    -
      -
    • -

      Perte des commentaires: - Je vous propose de vous référer a l’article de Gordontesos ici quand a - mon avis sur ce sujet.

      -
    • -
    • -

      Perte du bouton flattr: - Il va bientôt être remis, c’est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c’est assez facile a - faire.

      -
    • -
    • -

      Perte du spam: - Pourquoi c’est dans les points négatifs, ca?

      -
    • -
    • -

      Temps d’adaptation et d’appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c’est parce que j’apprend a me servir de ce système - et que j’apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d’apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.

      -
    • -
    -

    Voila, c’est mon retour d’expérience sur pelican. A plus.

    -
    -
    -
    -

    Update

    -
    - Date - - Sat 05 January 2013 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d’une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!

    -
    -
    -
    -

    Pages

    -
  • A propos
  • -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/category/oses/index.html b/output/category/oses/index.html deleted file mode 100644 index 39ed6a9..0000000 --- a/output/category/oses/index.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - Wxcafé - OSes - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    Plan9 from whichever space

    -
    - Date - - Mon 09 September 2013 - -
    - By - Wxcafe -
    - Category - OSes -
    - - - - -
    -

    Plan 9 from Outer Space est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l’un des pires films jamais sortis. Rempli -d’erreur de montage, d’effets spéciaux au rabais, et ayant même connu la mort -d’un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.

    -

    Plan 9 from Bell Labs est un OS venant de Bell Labs (comme son nom l’indique), -et qui a été pensé comme le successeur d’Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu’à leur but naturel. Ainsi, c’est Plan9 qui a -introduit le concept d’UnionFS, le protocole 9P qui permet d’acceder a des -ressources appartenant a d’autres ordinateurs a distance, un support de -l’unicode par défaut et sur tout le système (a l’inverse d’Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d’autres améliorations sur les thèmes de base que propose Unix.

    -

    Cependant, Plan9 n’a jamais été véritablement utilisé pour quoi que ce soit -d’autre que la recherche en systèmes, et c’est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d’intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme “cloud -computing” n’apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.

    -

    En effet, même si l’on considère que les nouveautés qu’il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu’elles sont déjà -conséquentes), lorsqu’on les prend ensemble, elles font de Plan9 le système -d’exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d’un système -distant comme n’étant qu’une poignée de fichiers permet de le monter comme -n’importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s’ils sont hétérogènes (c’est a dire provenant -de machines différentes), permet d’utiliser les ressources d’une machine -distante comme si elle était présente localement. Le mécanisme d’UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).

    -

    Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d’ordinateur lorsque le concept même du système est d’être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d’implémenter très facilement -différents concepts réseaux : en montant le /net d’un ordinateur du réseau local -sur celui servant de gateway vers l’internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d’un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l’accès de l’ordinateur distant, et les connections entre les -deux sont chiffrées.

    -

    Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur “puissance” de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s’est doté du support de jusqu’à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu’ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu’ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l’a été X11, et de nombreuses autres -améliorations sur Unix.

    -

    Malheureusement, il n’a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : “worse is better”. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 via son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc…

    -
    -
    -
    -

    Pages

    -
  • A propos
  • -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/category/ranting/index.html b/output/category/ranting/index.html deleted file mode 100644 index a508a3b..0000000 --- a/output/category/ranting/index.html +++ /dev/null @@ -1,452 +0,0 @@ - - - - - Wxcafé - Ranting - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    NAT

    -
    - Date - - Mon 17 February 2014 - -
    - By - wxcafé -
    - Category - Ranting -
    - - - - -
    -

    NAT (Network Address Translation) in a word?
    -It’s complicated. Very. Don’t do it, you’d damage your brain.

    -

    Bon, sinon, prochain article serieux vite, bisous.

    -
    -
    -
    -

    Pourquoi je vais quitter linux pour passer a FreeBSD.

    -
    - Date - - Mon 04 February 2013 - -
    - By - Wxcafe -
    - Category - Ranting -
    - - - - -
    -

    This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text here

    -

    Bon, voila. J’ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n’avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n’ai même idée que quelque chose dans mon système d’exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l’époque, je n’avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j’ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s’accumulant et -mon niveau de compréhension du système s’améliorant, j’ai commencé a -remarquer que certain bouts de l’OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s’est faite a -cause de la recrudescence de ces bouts d’OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d’OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j’en ai eu marre de voir unity sur ma machine, et j’ai -choisi de passer a Archlinux. C’était avant le passage a systemd. Ce -système me convenait bien. Si je n’installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c’était le moins -envahissant de ceux la.

    -

    Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n’a pas vraiment eu le choix, rapport a la philosophie de la -distribution d’avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les kits (bien que ce ne soient -pas les seuls a faire ça…) ont un problème très précis, qui n’importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :

    -
      -
    1. Ce qui est petit est beau
    2. -
    3. Faites en sorte que chaque programme fasse une chose, bien.
    4. -
    5. Faites un prototype aussi vite que possible
    6. -
    7. Choisissez la portabilité plutôt que l’efficacité
    8. -
    9. Stockez les données dans des fichiers textes.
    10. -
    11. Utilisez ce qui existe déjà a votre avantage. [1]
    12. -
    13. Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.
    14. -
    15. Évitez les UI qui “capturent” l’utilisateur.
    16. -
    17. Faites de chaque programme un filtre.
    18. -
    -

    Alors bien entendu, un système d’exploitation est fait pour évoluer, et -on pourrait penser qu’UNIX a fait son temps. Cependant, ce n’est pas -exactement la façon dont l’informatique fonctionne. Effectivement, les -standards, les systèmes d’exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n’est -pas d’UNIX que nous parlons ici. C’est de la philosophie UNIX. Et -celle-ci n’a pas fait son temps, elle a fait ses preuves. La -philosophie UNIX, en plus d’être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu’au premier jour.
    -La philosophie UNIX est aussi et surtout une garantie d’utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l’informatiquesérieusement (je ne dis pas que les autres métiers de l’informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).

    -

    Tous OS se doit d’avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d’échanger des informations. C’est -efficace, ça respecte le “tout est fichier”, c’est standard, c’est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n’est explicitement pas faite pour -être utilisée a la ligne de commande mais a l’aide d’APIs, et un -programme monolithique qui effectue sa tache d’une façon complètement -obscure pour l’utilisateur. Alors bien sur, il l’effectue d’une façon -efficace, cette tache. Oui, ça va plus vite qu’avant. Oui, c’est plus -“rangé”, ça fait moins “fouillis”. Mais c’est moins efficace. C’estbeaucoup moins utilisable pour l’utilisateur final. C’est -horriblement chiant pour les sysadmins, parce qu’ils ne peuvent plus -lire facilement les échanges entre programmes. C’est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.
    -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l’utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d’en choquer quelques -uns, je préfère avoir un système qui boote légèrement plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C’est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n’employant plus les -systèmes basiques d’UNIX.

    -

    Le problème est qu’il est facilement visible que la direction prise par -la communauté Linux n’est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d’accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d’autres raisons…), et on peut -compter sur le fait que les autres distributions l’adopteront un jour ou -l’autre.

    -

    Bon, maintenant que nous avons, si ce n’est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu’ils me -déplaisent, on pourrait penser qu’il suffit de passer a une distribution -n’incluant pas systemd, voire a une distribution n’incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu’OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d’ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l’init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d’exploitation une date -d’expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d’init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s’ouvrent a moi: OpenSolaris et *BSD. Minix n’est pas -vraiment un choix, vu le peu de programmes qu’il permet de faire -fonctionner et le fait qu’il ne soit disponible que sur i386, ce qui -n’est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n’est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.

    -

    OpenSolaris est un système d’exploitation tout a fait valable. Je n’ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l’idée que j’ai d’un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs “release-only”), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n’importe quoi. Bref, cela -n’est pas le sujet. Il convient aussi de voir qu’avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n’ait pas de très beaux jours devant lui (la page d’accueil du -projet affiche d’ailleurs un ÉNORME logo Oracle, du meilleur gout.)

    -

    Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu’OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c’est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d’être orientées sécurité, et d’après ce que j’ai pu en voir -DFBSD ressemble aussi au système de l’assistance a l’user a outrance -décris plus haut. Mais la vérité est que je n’ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu’entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j’aime -pouvoir configurer mes logiciels de façon assez profonde.)

    -

    Voila, c’est mon avis sur ce “problème” actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n’apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.
    -[1]: Je n’ai pas trouvé de traduction satisfaisante a “software leveraging”, mais l’idée est la…*

    -
    -
    -
    -

    Update et pensées a propos du Raspberry Pi

    -
    - Date - - Sun 27 January 2013 - -
    - By - Wxcafe -
    - Category - Ranting -
    - - - - -
    -

    Bon.
    -J’ai annoncé il y a environ 20 jours que j’avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, astucieusement nommée -PiRatBox. Il se trouve qu’après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n’est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.
    -Alors, autant il me semble évident qu’avec une -alimentation provenant d’un port USB a 2A (max), je n’avais pas -énormément de chances d’avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité.

    -

    De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB…), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu’il soit surement possible de la désactiver au niveau du kernel, -il n’est pas simplement possible de la “débrancher”. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve.

    -

    Bon, je dois avouer n’avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple et -bonne raison qu’arch utilise systemd et qu’il n’existe pas de wrapper -systemd pour les daemons piratebox, et que j’ai la flemme d’en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j’utiliserai debian. Le problème d’utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l’autre, en ce sens que si on installe un package “haut”, c’est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d’installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package “bas”, c’est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -“hauts”, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu’il n’y a pas de moyen “facile” de choisir ce qui -sera installé sur le système avant l’installation proprement dite -(puisque le moyen “universel” d’installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)

    -

    Il y a énormément d’autres critiques que l’ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s’arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l’OS qui lui même se lance, initialise le hardware, -etc…, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d’une cour d’immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe…), et le moyen le -plus efficace qu’aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc…

    -

    Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n’estvisiblement pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c’est bien réalisé, sinon je dis non.

    -

    Enfin, le projet que j’avais est toujours en cours de réalisation. Je -le terminerai dès que j’aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu’il m’a posé, qu’il n’aurait pas du me poser, m’ont -trop agacé pour que j’aie envie de le sortir et de jouer avec une fois -sa mission remplie.

    -

    Dommage.

    -
    -
    -
    -

    Pages

    -
  • A propos
  • -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/category/tutoriel/index.html b/output/category/tutoriel/index.html deleted file mode 100644 index 985ef29..0000000 --- a/output/category/tutoriel/index.html +++ /dev/null @@ -1,1622 +0,0 @@ - - - - - Wxcafé - Tutoriel - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    OpenSMTPd comme serveur mail sous debian

    -
    - Date - - Fri 07 November 2014 - -
    - By - Wxcafé -
    - Category - Tutoriel -
    - - - - -
    -

    J’avais dit il y a un certain temps que j’allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j’ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J’ai donc totalement changé d’infrastructure quand a la -gestion de mon système de mails.

    -

    Ainsi, j’ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. OpenSMTPd est un -projet originaire d’OpenBSD qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu’a le projet OpenBSD, globalement).

    -

    Pour rappel, le système d’emails fonctionne d’une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.

    -

    Si vous avez bien suivi, vous pouvez voir que je n’ai pas parlé de récupération -ni de lecture des mails. C’est pour une raison simple, qui est que ces taches -sont remplies par d’autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).

    -

    Or ce qui nous intéresse ici, ce n’est pas simplement d’envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c’est pour -ça que ce tutoriel ne parlera pas que d’OpenSMTPd mais aussi de Dovecot qui fait office de serveur IMAP et -amavis/spamassassin -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système

    -
                ╭────────────────╮                    ╭──────────╮
    -            │╭──────────────>│────> to filter ───>│─╮        │
    -  mail in   ││               │                    │ │ amavis │
    -───────────>│╯ OpenSMTPd  ╭──│<─── from filter<───│<╯        │
    -            │             │  │                    ╰──────────╯
    -  mail out  │             │  │                    ╭──────────╮
    -<───────────│<────────────┴─>│─────> to MDA ─────>│─────────>│──> to user's
    -            │                │                    │ dovecot  │     mailbox
    -            ╰────────────────╯                    ╰──────────╯
    -
    - - -

    Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d’autres correspondants) sont transmis a OpenSMTPd, qui envoie tout aamavis, qui vérifie a la fois les spams et les malwares pour les mails -venants de l’exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.

    -

    Voyons comment mettre cela en place. Tout d’abord, il faut décider de la façon -dont les différents services vont communiquer.

    -

    Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s’agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s’agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.

    -

    Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -/var/run/dovecot/lmtp).

    -

    Ainsi, pour reprendre le schéma présenté plus haut :

    -
                ╭───────────────╮                    ╭───────────╮
    -            │╭─────────────>│──> SMTP (10026) ──>│─╮         │
    -  SMTP in   ││              │                    │ │ amavis  │
    -────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10027) <──│<╯ (sign)  │
    -            │            │  │                    ╰───────────╯
    -  SMTP out  │            │  │
    -25 <────────│<───────────╯  │
    -            ╰───────────────╯
    -
    - - -

    Pour les mails sortants; et

    -
                ╭───────────────╮                    ╭────────────╮
    -            │╭─────────────>│──> SMTP (10024) ──>│─╮          │
    -  SMTP in   ││              │                    │ │ amavis   │
    -────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10025) <──│<╯(filter)  │
    -            │            │  │                    ╰────────────╯
    -            │            │  │                    ╭────────────╮
    -            │            ╰─>│──> LMTP (socket) ─>│───────────>│──> to user's
    -            │               │                    │  dovecot   │     mailbox
    -            ╰───────────────╯                    ╰────────────╯
    -
    - - -

    Pour les mails entrants.

    -

    Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d’autres plateformes, la configuration devrait être sensiblement la même

    -

    (Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir ce -post)

    -

    Tout d’abord, commençons par installer les programmes nécessaires :

    -
    sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved
    -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new
    -
    - - -

    Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :

    -

    /etc/smtpd.conf

    -
    # This is the smtpd server system-wide configuration file.
    -# See smtpd.conf(5) for more information.
    -
    -## Certs
    -pki exem.pl certificate "/etc/certs/exem.pl.crt"
    -pki exem.pl key         "/etc/certs/exem.pl.key"
    -
    -## Ports to listen on, and how to listen on them
    -listen on eth0 port 25 tls pki exem.pl hostname exem.pl auth-optional
    -listen on eth0 port 465 tls-require pki exem.pl hostname exem.pl auth mask-source
    -listen on eth0 port 587 tls-require pki exem.pl hostname exem.pl auth mask-source
    -
    -## Aliases
    -table aliases file:/etc/aliases
    -
    -# coming from amavisd, checked for spam/malware
    -listen on lo port 10025 tag Filtered
    -# coming from amavisd, signed with DKIM
    -listen on lo port 10027 tag Signed
    -
    -## Receiving
    -# if the (incoming) mail has been through amavisd, then we can deliver it
    -accept tagged Filtered for any alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
    -# we directly tranfer incoming mail to amavisd to be checked 
    -accept from any for domain "exem.pl" relay via "smtp://localhost:10024"
    -# we have to put these lines in this order to avoid infinite loops
    -
    -## Sending
    -# if the (outgoint) mail has been through amavisd, then we can deliver it
    -accept tagged Signed for any relay
    -# we tranfer the outgoing mail to amavisd to be signed
    -accept for any relay via "smtp://localhost:10026"
    -# same, we have to put these lines in this order or infinite loops...
    -
    - - -

    Expliquons un peu ce fichier de configuration :

    -
      -
    • Tout d’abord, le paragraphe nommé “Certs” contient les déclaration - d’emplacement des certificats SSL.
    • -
    • Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire
    • -
    • Les alias sont définis juste après
    • -
    • Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme “Filtered” et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme “Signed”
    • -
    • Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c’est qu’il n’a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l’état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis
    • -
    • Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n’a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu’il le signe. Le - problème de l’ordre des lignes se pose encore, pour la même raison qu’au - dessus.
    • -
    -

    Nous allons maintenant configurer dovecot. Comme nous l’avons vu, dovecot doit -écouter en LMTP via la socket /var/run/dovecot/lmtp et transmettre les -emails a la boite email de l’utilisateur. Il serait aussi interessant -qu’il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.

    -

    /etc/dovecot/dovecot.conf

    -
    ## Dovecot configuration file
    -
    -# basic config
    -info_log_path = /var/log/dovecot-info.log
    -log_path = /var/log/dovecot.log
    -log_timestamp = "%Y-%m-%d %H:%M:%S "
    -mail_location = maildir:%h/mail
    -
    -# authentication
    -passdb {
    -    driver = pam
    -}
    -userdb {
    -    driver = passwd
    -}
    -
    -# the protocols we use
    -protocols = imap lmtp sieve
    -
    -# ssl config
    -ssl_cert = </etc/certs/exem.pl.cert
    -ssl_key = </etc/certs/exem.pl.key
    -ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
    -ssl = yes
    -
    -## configuring services 
    -# disables imap login without SSL (yes dovecot is dumb that way)
    -service imap-login {
    -    inet_listener imap {
    -        port=0 
    -    }
    -}
    -
    -service lmtp {
    -    unix_listener lmtp {
    -        mode = 0666
    -    }
    -}
    -
    -## configuring protocols
    -# the dovecot lda, we set it to use sieve
    -protocol lda {
    -    mail_plugins = $mail_plugins sieve
    -}
    -
    -protocol lmtp {
    -    postmaster_address =  whoever@exem.pl
    -    mail_plugins = $mail_plugins sieve
    -}
    -
    -plugin {
    -    sieve = ~/.dovecot.sieve
    -    sieve_dir = ~/sieve
    -}
    -
    - - -

    ATTENTION: Sous OpenBSD, remplacez

    -
    passdb {
    -    driver = pam
    -}
    -
    - - -

    par

    -
    passdb {
    -    driver = bsdauth
    -}
    -
    - - -

    pour identifier les utilisateurs système

    -

    Ici aussi, voyons comment ce fichier est structuré :

    -
      -
    • Tout d’abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l’endroit ou seront stockés les mails des utilisateurs.
    • -
    • Nous configurons ensuite la gestion de l’authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)
    • -
    • Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l’IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).
    • -
    • Nous configurons le SSL
    • -
    • Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d’activer IMAPS qu’en activant - IMAP avec. Comme nous ne voulons pas d’IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu’il utilise
    • -
    • Nous configurons maintenant les protocoles, pour faire fonctionner Sieve
    • -
    • enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.
    • -
    -

    Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n’y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis/usr/local/share/examples/amavisd-new/amavisd.conf et ajoutez les -modifications nécessaires a la fin du fichier.

    -

    /etc/amavis/conf.d/99-local.conf (debian) -/etc/amavis.conf (OpenBSD)

    -
    use strict;
    -
    -$enable_dkim_verification = 1;
    -$enable_dkim_signing = 1;
    -dkim_key("exem.pl", "main", "/etc/certs/dkim.key" );
    -
    -@dkim_signature_options_bysender_maps = (
    -    { '.' =>
    -        { ttl => 21*24*3600, c => 'relaxed/simple' }
    -    }
    -);
    -
    -$inet_socket_port = [10024, 10026];
    -$policy_bank{'MYNETS'} = {
    -        originating => 1,
    -        os_fingerprint_method => undef,
    -};
    -
    -$interface_policy{'10026'} = 'ORIGINATING';
    -
    -$policy_bank{'ORIGINATING'} = {
    -        originating => 1,
    -        allow_disclaimers => 1,
    -        virus_admin_maps => ["root\@$mydomain"],
    -        spam_admin_maps => ["root\@$mydomain"],
    -        warnbadhsender => 1,
    -        forward_method => 'smtp:localhost:10027',
    -        smtpd_discard_ehlo_keywords => ['8BITMIME'],
    -        bypass_banned_checks_maps => [1],
    -        terminate_dsn_on_notify_success => 0,
    -};
    -
    -#------------ Do not modify anything below this line -------------
    -1;  # ensure a defined return
    -
    - - -

    A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu’amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l’endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la RFC 4871 -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme “originating” et nous ne vérifierons pas l’OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d’abord, nous réaffirmons qu’ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la RFC - 4871. Nous déclarons l’adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu’il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d’envoi. Et voila!

    -

    Vous avez pu remarquer qu’a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.

    -

    Il nous reste cependant quelques opérations a faire, encore. -Tout d’abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j’ai personnellement utilisé opendkim (un -tutorial) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :

    -
    #rewrite_header Subject *****SPAM*****
    -# report_safe 1
    -required_score 2.0
    -# use_bayes 1
    -# bayes_auto_learn 1
    -# bayes_ignore_header X-Bogosity
    -# bayes_ignore_header X-Spam-Flag
    -# bayes_ignore_header X-Spam-Status
    -ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
    -# shortcircuit USER_IN_WHITELIST       on
    -# shortcircuit USER_IN_DEF_WHITELIST   on
    -# shortcircuit USER_IN_ALL_SPAM_TO     on
    -# shortcircuit SUBJECT_IN_WHITELIST    on
    -# shortcircuit USER_IN_BLACKLIST       on
    -# shortcircuit USER_IN_BLACKLIST_TO    on
    -# shortcircuit SUBJECT_IN_BLACKLIST    on
    -shortcircuit ALL_TRUSTED             off
    -# shortcircuit BAYES_99                spam
    -# shortcircuit BAYES_00                ham
    -
    -endif # Mail::SpamAssassin::Plugin::Shortcircuit
    -
    - - -

    Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.

    -

    Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement

    -

    Bon courage pour votre hosting de mail ensuite…

    -
    -
    -
    -

    Installer FreeBSD sur un serveur Online avec MfsBSD

    -
    - Date - - Thu 28 August 2014 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    J’ai récemment eu l’occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester bhyve) -et n’ayant pour différentes raisons pas eu l’occasion de le faire sur mon serveur auto-hebergé ni sur ce serveur ci, -j’ai commencé a chercher comment le faire sur ce serveur.

    -

    Étant donné que Online ne propose pas directement d’image FreeBSD sur ses serveurs, il m’a fallu -chercher un peu plus loin. Il se trouve que ce post sur les forums -d’online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier.

    -

    J’ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l’on m’a dirigé vers mfsbsd, un projet d’installeur -alternatif, minimaliste et simplifié pour FreeBSD.

    -

    Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l’image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l’image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l’image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l’air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d’installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.

    -

    Utilisez donc ce script ainsi :

    -
    # tout d'abord, wipons le MBR :
    -dd < /dev/zero > /dev/da0 count=1
    -# maintenant, installons le système
    -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c
    -
    - - -

    Avec -g da0 votre disque dur principal, -s 2G la quantité de swap désirée, --p root le nom du zpool, et -c pour activer la compression. D’autres options -sont disponibles, je vous invite a faire un zfsinstall -h si mon setup ne vous -convient pas.

    -

    Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :

    -
    zfs_load="YES"
    -sshd_load="YES
    -hostname="whatever"
    -ifconfig_igb0="DHCP"
    -
    - - -

    Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!

    -

    Voila, c’est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l’IPv6 chez online est… peu -crédible, disons)

    -

    Bon sinon sur d’autres sujets, j’ai mis en place des bots twitter : wxcafe_ebooks, -petitefanfare, -capet_ebooks, -zengisse, -et kim_ebooks. Ils sont tous basés sur ce -code, qui vient de -@m1sp -(github.com/twitter_ebooks). Donc voila.

    -

    A plus

    -
    -
    -
    -

    Mise en place d'un serveur DNS

    -
    - Date - - Mon 24 February 2014 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a http://173.194.45.66, ou a -http://199.16.156.70. Voire même a -http://5.39.76.46).

    -

    Cependant, le DNS est un système qui date de 1984, et les exigences de l’époque -en termes d’expérience utilisateur n’étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.

    -

    Tout d’abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est /, celle de DNS est ., et là ou il convient d’écrire, par exemple,/usr/ et ou la progression se fait de gauche a droite pour le FS, pour DNS le -. n’est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) com, et le domaine -google.com appartient a com, on écrit donc google.com sans écrire le point -a la fin de façon courante.

    -

    Le reverse DNS est une variante du DNS “classique” permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n’a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les “adresses” que l’on query en reverse DNS -sont donc constituées de l’adresse IP, dans le sens contraire a l’ordre -habituel, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire dig PTR -76.46.39.5.in-addr.arpa. La réponse sera, évidemment, wxcafe.net

    -

    Voyons maintenant comment mettre en place son propre serveur DNS. Tout d’abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est dig. Le DNS fonctionne avec des -“enregistrements”, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. dig se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n’importe quelle information : par exemple, dig NS -wxcafe.net devrait vous renvoyer

    -
    ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> NS wxcafe.net
    -;; global options: +cmd
    -;; Got answer:
    -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13846
    -;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    -
    -;; QUESTION SECTION:
    -;wxcafe.net.            IN  NS
    -
    -;; ANSWER SECTION:
    -wxcafe.net.     3600    IN  NS  ns.wxcafe.net.
    -wxcafe.net.     3600    IN  NS  ns.home.wxcafe.net.
    -
    -;; Query time: 60 msec
    -;; SERVER: 10.0.42.1#53(10.0.42.1)
    -;; WHEN: Tue Dec 10 13:31:18 2013
    -;; MSG SIZE  rcvd: 67
    -
    - - -

    Comme vous pouvez le voir, les serveurs DNS principaux pour -wxcafe.net sont ns.wxcafe.net et ns.home.wxcafe.net, -qui sont respectivement des alias pour wxcafe.net et home.wxcafe.net. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l’adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu’il est en train de faire une boucle infinie et -demandera l’adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.

    -

    La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d’écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : named.conf, -named.conf.default-zones, named.conf.local et named.conf.options. -named.conf contient les options par défaut de bind, named.conf.default-zones -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -named.conf.local contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.

    -

    Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l’autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi).

    -

    Examinons tout d’abord les fichiers de configuration de named.named.conf.local contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones wxcafe.net et 76.46.39.5.in-addr.arpa sont gérées -en master, et les zones home.wxcafe.net et 103.177.67.80.in-addr.arpa sont -gérées en slave. Nous n’examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l’un héberge en slave les masters de l’autre. -Le fichier named.conf.local sur wxcafe.net contient donc

    -
    zone "wxcafe.net" {
    -    type master;
    -    file "/etc/bind/master/wxcafe.net";
    -    allow-transfer {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "home.wxcafe.net" {
    -    type slave;
    -    file "/etc/bind/slave/home.wxcafe.net";
    -    masters {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "46.76.39.5.in-addr.arpa" {
    -    type master;
    -    file "/etc/bind/master/46.76.39.5.in-addr.arpa";
    -    allow-transfer {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "103.177.67.80.in-addr.arpa" {
    -    type slave;
    -    file "/etc/bind/slave/103.177.67.80.in-addr.arpa";
    -    masters {
    -        80.67.177.103;
    -    };
    -};
    -
    - - -

    Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans /etc/bind/master/, et les slaves un fichier dans -/etc/bind/slave/, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.

    -

    Voyons maintenant le fichier de zone concernant wxcafe.net, soit -/etc/bind/master/wxcafe.net :

    -
    $TTL 3600    ; 1 hour
    -@               IN SOA ns.wxcafe.net. wxcafe.wxcafe.net. (
    -                        2014011001  ; serial
    -                        3h          ; refresh  
    -                        1h          ; retry
    -                        168h        ; expire
    -                        300         ; negative response ttl
    -                        )
    -
    -; Name servers
    -                IN  NS      ns.wxcafe.net.
    -                IN  NS      ns.home.wxcafe.net.
    -
    -; Mail exchangers
    -                IN  MX  10  wxcafe.net.
    -                IN  SPF "v=spf1 ip4:5.39.76.46 a -all"
    -
    -; Main A/AAAA records
    -                IN  A       5.39.76.46
    -ns              IN  A       5.39.76.46
    -
    -; Aliases
    -data            IN  CNAME   wxcafe.net.
    -;        [...]
    -www             IN  CNAME   wxcafe.net.
    -
    -
    -; home.wxcafe.net. definition
    -$ORIGIN home.wxcafe.net.
    -@               IN  NS      ns.home.wxcafe.net.
    -                IN  NS      ns.wxcafe.net.
    -ns              IN  A       80.67.177.103
    -                IN  A       80.67.177.103
    -
    - - -

    Alors. Expliquons ligne par ligne.
    -Tout d’abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone.
    -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net.
    -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l’ordre :
    - - Le nameserver autoritaire pour le nom de domaine en question,
    - - L’adresse email du responsable de cette zone, avec le premier point - remplacé par un @,

    -

    puis entre parenthèses :
    - - Le numéro de série (“version” du fichier de zone, ici au format - YYYYMMDDNN)
    - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire,
    - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible,
    - - La période d’expire, le temps qu’attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin
    - - La période de TTL négatif, le temps qu’attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable.

    -

    Bon, tout ceci est peut-être un peu confus, mais ce n’est pas le record le plus -important a lire (pour les humains en tout cas). Continuons :

    -

    NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine.

    -

    MX permet d’indiquer ou il convient d’envoyer les emails pour ce domaine. -SPF est un record d’authentification pour les emails. -Les records A désignent l’association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n’est pas encore en IPv6.

    -

    Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d’autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d’Apache, pour le web)

    -

    Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l’adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l’a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.

    -

    Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n’étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c’est pas les mêmes domaines…).

    -

    Voila donc une courte explication de ce qu’est le DNS. Bien entendu, tout n’est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le RFC -1034 et le -RFC 1035. Dans un autre style (bien plus -avancé) le blog de Stéphane Bortzmeyer est interessant -aussi.

    -
    -
    -
    -

    Sed Basics

    -
    - Date - - Sun 18 August 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    sed est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.
    -Or sed a bien plus de possibilités que ça, comme nous allons le voir.

    -

    Tout d’abord, rappelons les bases : sed est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de ed, l’éditeur original.ed est un éditeur de ligne, conçu a l’époque ou les ordinateurs n’étaient pas -personnels et étaient utilisés avec des téléscripteurs, c’est a dire des -machines dépourvues d’écrans et ne permettant donc pas l’utilisation d’éditeurs -dits “visuels”, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. sed est donc une évolution de ed, le -s signifiant stream, sed est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir Flux standards) pour éditer plus d’une ligne a la fois. -En pratique, sed est principalement utilisé sur des fichiers.

    -

    sed a quelques options pratique, notamment -s qui permet d’empêcher -l’affichage systématique des lignes traitées, ou bien -i (pour GNU sed) qui -permet de rediriger l’output dans le fichier d’input. Cela dit, l’intérêt unique -du programme est son langage de manipulation de texte.

    -

    ed, et donc sed, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans sed est

    -
    /[regex]/
    -
    - - -

    qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n’exécuter les commandes qui suivent que sur ces lignes.)

    -


    -La commande sed la plus utilisée est bien entendu le s, qui s’utilise de -la façon suivante :

    -
    s/[old text]/[new text]/[options]
    -
    - - -

    qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant g, -qui permet d’appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.
    -Les exceptions a la “fixité” de [new text] sont particulièrement -intéressantes. En effet, sed utilise un langage de regex plutôt standard, -excepté le fait qu’il permet jusqu’à 9 “holding spaces”, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.

    -

    Par exemple, la commande

    -
    sed 's/\(hello world\) world/\1/'
    -
    - - -

    sur le texte “hello world world” renverrait comme résultat

    -
    hello world
    -
    - - -

    De la même façon, le symbole & dans le texte de remplacement représente le -texte original. Ainsi, la commande

    -
    sed 's/hello world/& world/'
    -
    - - -

    sur le texte “hello world” renverrait comme résultat

    -
    hello world world
    -
    - - -


    -

    Une autre commande utile est p, qui sert a afficher le texte présent dans -l’espace courant :

    -
    /[regex]/p
    -
    - - -

    sed stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j’appelle l’espace courant (pattern space en anglais). La commandep affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu’il ne contienne que les lignes matchant, et le p affiche donc ce dernier.

    -

    Un autre exemple de commande sont c, i et a, qui s’utilisent ainsi :

    -
    c \
    -[text]
    -
    - - -

    De la même façon, pour le i :

    -
    i \
    -[text]
    -
    - - -

    Et de même pour a.

    -

    Ces trois commandes s’utilisent de la même façon pour la bonne raison qu’elles -sont très proches. i sert a insérer du texte avant le pattern space. a -sert a insérer du texte après le pattern space, et enfin c sert a -remplacer tout le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.

    -

    Enfin, dernière commande ne fonctionnant que ligne par ligne, d : - /[regex]/d -d (delete) supprime les contenus du pattern space.

    -

    sed est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.

    -
    -
    -
    -

    Le chiffrement de partitions avec dm-crypt et device-mapper

    -
    - Date - - Wed 10 July 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c’est a dire au fait de passer d’un fichier en -clair a un fichier chiffré dit cyphertext. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l’intégrité d’un système d’exploitation, ou -bien la confidentialité d’un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n’a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d’expliquer les concepts qui entrent en -jeu dans l’utilisation du sous-système du noyau Linux dm_crypt et de -présenter un rapide tutoriel concernant la création d’un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre clé GPG)

    -

    dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s’appuie sur LUKS, un standard de chiffrement -de disques. Comme son nom l’indique, device-mapper est un système qui a pour but -de mapper des block devices. Pour être plus clair, le kernel considère -comme “block device” tout fichier spécial (en gros, les fichiers disques dans/dev/, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d’un “fichier de périphérique” (trad. -Wikipédia), il en “crée” un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)

    -

    Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d’un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.

    -

    D’ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot doit s’appuyer sur une image initrd (l’initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n’est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,…) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l’initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier “cible” est remonté sur la racine, et l’initrd est démonté -est la RAM qu’il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.

    -

    La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n’est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d’attaques : l’une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du vrai boot -que l’initrd présente toujours le même checksum. Cela dit, cette méthode a -l’inconvénient d’intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.
    -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n’est pas possible pour un -attaquant de modifier ce système de fichier, et l’initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l’initrd et du noyau beaucoup plus difficile qu’elle ne le serait sans.

    -

    Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, cryptsetup. Ce dernier était en charge de cryptoloop, -l’ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l’utilisation userspace de dm-crypt, qui pour sa -part est entièrement kernel-space. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/…) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root.

    -

    Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :
    -Tout d’abord, il nous faut créer le fichier qui contiendra l’image. Pour cela, -dans une situation réelle ou l’on cherche a chiffrer un disque, il convient -d’utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire :

    -
    dd bs=1000 count=1000000 if=/dev/urandom of=image.img
    -
    - - -

    Maintenant que notre image est créée, nous pouvons la chiffrer :

    -
    sudo cryptsetup luksFormat image.img
    -
    - - -

    cryptsetup va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.
    -Une fois cela fait, nous allons mapper cette image :

    -
    sudo cryptsetup luksOpen image.img crypto
    -
    - - -

    cryptsetup nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s’est-il passé? En cherchant un peu, nous -voyons qu’il n’y a pas de nouveau disque dans /dev. C’est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n’a rien a voir. On remarque -qu’est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n’est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l’utiliser.

    -
    sudo mkfs.ext4 /dev/mapper/crypto
    -
    - - -

    Maintenant que notre disque est formaté, il peut être monté :

    -
    sudo mount /dev/mapper/crypto /mnt
    -
    - - -

    Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un mount | grep crypto devrait vous donner le résultat -suivant :

    -
    /dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered)
    -
    - - -

    Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité.

    -

    Pour résumer :

    -
      -
    • -

      Pour monter vos partitions :

      -
      sudo cryptsetup luksOpen <fichier chiffré> <nom de disque virtuel>
      -sudo mount /dev/mapper/<nom de disque virtuel> <emplacement>
      -
      - - -
    • -
    • -

      Pour démonter vos partitions :

      -
      sudo umount <emplacement>
      -sudo cryptsetup luksClose <nom de disque virtuel>
      -
      - - -
    • -
    -

    Pour simplifier la vie de tous, j’ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur github.

    -

    Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un dd if=votre_image of=/dev/votre_partition -pour ce faire.

    -
    -
    -
    -

    Monter son propre serveur, partie 1: le serveur et l'apache.

    -
    - Date - - Mon 18 March 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Il y a un certain temps, j’avais parlé du concept du self-hosting. Il -s’agit de posséder son propre serveur, et donc, par extension, ses -données.

    -

    Bien entendu, il n’est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n’est pas le sujet abordé ici.)
    -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l’utilisation que l’on veut en faire ici d’installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c’est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu’une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l’installation simple et -compréhensible).

    -

    La première chose a faire est bien entendu d’obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d’obtenir un serveur, que ce soit en le -louant chez OVH/1&1/n’importe quel autre hébergeur commercial, en -participant a un système d’hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC… Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi…). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.

    -

    Dans cet article, lorsque est précisée le type d’IP a utiliser, il -convient de mettre ce type précisément. Quand le type n’est pas -précisée, libre a vous de choisir ipv4 ou ipv6.

    -

    Bref. Commençons au point ou vous avez un accès root a votre serveur, -n’ayant soit aucun mot de passe, soit un choisi par l’hébergeur, et ou -rien n’est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un passwd, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d’éditer l’entrée DNS pour votre nom de -domaine.

    -

    Cette entrée doit donc pour l’instant ressembler a ca :

    -
        <votre nom de domaine>  NS 1 
    -                            IN MX 1 
    -                            IN A        <IPv4 de votre serveur>
    -                            IN AAAA     <IPv6 de votre serveur>
    -
    - - -

    Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c’est de la magie pour -l’instant, ca sera peut être le sujet d’un autre article), et d’indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.

    -

    root est un utilisateur assez répandu, et il est assez simple de -bruteforcer le mot de passe. (Relativement assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent…) Ainsi, nous allons -arrêter d’utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.
    -Cela se fait en deux temps : tout d’abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l’avenir; puis configurer -OpenSSH pour que celui ci n’accepte que les connections par clés et plus -celles sur root.

    -

    Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu’il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d’être très chiant a -distinguer de l’autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l’utilisation d’useradd plus facilement.)

    -

    Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste adduser <username>, soit utiliser le mode non-interactif -en faisant un adduser --group <username>

    -

    Avec useradd, vous devrez utiliser la commande suivante : useradd -m --N -g <username>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l’ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).

    -

    Il convient maintenant d’ajouter cet utilisateur aux groupes qu’il sera -amené a administrer: usermod <username> -a -G www-data postfix -users staff sudo wheel, puis de changer son mot de passe -passwd. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: echo "%sudo ALL=(ALL) ALL" >> /etc/sudoers
    -Enfin, changeons d’utilisateur : su. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d’administration. Si vous devez encore utiliser root, c’est que -quelque chose ne va pas.

    -

    Vous êtes donc loggés sur le système en tant qu’utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.
    -Tout d’abord, qu’est-ce qu’un login par clé ssh? Il s’agit en fait d’un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d’utiliser plusieurs clés publique pour chaque
    -utilisateur.

    -

    Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d’abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande ssh-keygen -t rsa (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.
    -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c’est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier…) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec unscp ~/.ssh/id_rsa.pub <username>@<votre nom de domaine>:~/ , ou -en la copiant a la main, si ça vous amuse.

    -

    Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (mkdir .ssh), puis -de déplacer ce fichier a la bonne place (mv ~/id_rsa.pub ~/.ssh/authorized_keys). -Testez si ça fonctionne : ouvez un autre terminal, et
    -connectez vous a votre serveur (ssh <username>@<votre nom de -domaine>), et il ne devrait pas vous demander de mot de passe.Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.

    -

    Continuons. Il ne nous reste plus qu’a installer le serveur web, et a le -configurer:

    -
    sudo apt-get install \
    -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \
    -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \
    -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \
    -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \
    -php5-imagick imagemagick libapache2-mod-suphp libruby \
    -libapache2-mod-ruby
    -
    - - -

    (faisons large, on aura besoin de l’excédent plus tard…), puis activons les
    -mods apache en faisant a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest, et faisons en sorte que ces activations -soient prises en compte par apache via un sudo service apache2 -restart

    -

    Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer.

    -

    Pour cela, nous allons faire un simple ln -s /etc/apache2/sites-{available,enabled}/default, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l’éditer, en changeant l’adresse mail au début du document -par la votre, et en changeant AllowOverride none en AllowOverride All, -et enfin redémarrer apache pour qu’il prenne en compte les -modifications, par un sudo service apache2 restart

    -

    Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l’installation du serveur mail (c’est suffisamment complexe pour -prendre un article seul…)

    -
    -
    -
    -

    Mutt ou le client email le meilleur moins mauvais

    -
    - Date - - Wed 02 January 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Les clients mails ont une particularité en commun : ils sont tous -très mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation a la UNIX
    -Cependant, un d’entre eux se démarque par sa moins-mauvais-itude, c’est -le relativement bien connu Outlook Express 2003 Mutt!
    -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, “just sucks less”. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.

    -

    La configuration de mutt se fait dans le fichier .muttrc ou dans -/etc/Muttrc, et il est courant d’utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d’un système d’accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d’offlineimap se fait dans~/.offlineimaprc ou dans rien d’autre en fait, c’est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)
    -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et ce script fait par moi, qui vous permet d’installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.
    -Ensuite, voyons pour la partie configuration :
    -Ma configuration d’offlineimap :

    -
    ## Config file for offlineimap
    -## Originally located in ~/.offlineimaprc
    -## This should not be edited without creating a copy before
    -## Created by Wxcafe (Clément Hertling)
    -## Published under CC-BY-SA
    -
    -[general]
    -# List of accounts to be synced, separated by a comma.
    -accounts = main
    -
    -[Account main]
    -# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
    -localrepository = main-local
    -# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
    -remoterepository = main-remote
    -# Status cache. Default is plain, which eventually becomes huge and slow.
    -status_backend = sqlite              # le type de cache. (plain ou sqlite)
    -
    -[Repository main-local]
    -# Currently, offlineimap only supports maildir and IMAP for local repositories.
    -type = Maildir                        # le type de stockage (Maildir ou IMAP)
    -# Where should the mail be placed?
    -localfolders = ~/Emails/                # le dossier dans lequel vous
    -                                        # voulez que vos emails apparaissent
    -
    -[Repository main-remote]
    -# Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.
    -type = IMAP
    -remotehost = //placeholderhost//        # le serveur de votre messagerie
    -remoteuser = //placeholderusername//    # votre nom d'utilisateur
    -remotepass = //placeholderpassword//    # votre mot de passe
    -cert_fingerprint = //placeholdercert//  # le certificat du serveur (IMAPS only)
    -
    - - -

    Ça devrait être assez simple a lire, j’ai tout bien commenté :3
    -Puis ma config mutt :

    -
    ## Mutt MUA configuration file
    -## This file should not be edited without creating a copy
    -## File Created and edited by Wxcafe (Clément Hertling)
    -## Published under CC-BY-SA
    -
    -# General config for reading (fetched via offlineimap)
    -
    -set mbox_type = Maildir
    -# type de boite mail (voir dans offlineimap, mailbox par defaut)
    -
    -set folder = ~/Email/
    -# dossier root mailbox/imap
    -
    -set spoolfile = +INBOX
    -# dossier d'inbox
    -
    -set mbox = +'All Mail'
    -# dossier ou archiver les emails
    -
    -set copy = yes
    -# yes pour copier les messages dans les differents dossier, no pour...
    -# enfin voila quoi.
    -
    -set header_cache = /.hcache/
    -# dossier ou sont stockés les headers (pour le cache)
    -
    -set record = +Sent
    -# dossier dans lequel sont stockés les messages envoyés
    -
    -set postponed = +Drafts
    -# dossier dans lequel sont stockés les brouillons
    -
    -mailboxes = +INBOX +Drafts +Sent +Trash  +All\ Mail 
    -# liste des dossiers qui vont apparaitre dans la colonne de gauche
    -
    -# General config for sending (using Mutt's native support)
    -
    -set smtp_pass = 'password_placeholder'
    -# votre mot de passe
    -
    -set smtp_url = "smtp://username@whatev.org:465/"
    -# l'url ou envoyer les emails
    -
    -set send_charset = "utf-8"
    -# UTF8, NE PAS CHANGER
    -
    -set signature = ".sign"
    -# vous pouvez mettre votre signature dans .sign
    -
    -set sig_on_top = yes
    -# il est d'usge de mettre no ici. Cependant, je trouve ca plus lisible 
    -# comme ca.
    -
    -set ssl_verify_host = no
    -# mettez yes ici si votre serveur a un certificat configuré correctement
    -
    -set hostname = "wxcafe.net"
    -# mettez l'adresse de votre serveur ici
    -
    -# Misc settings
    -
    -auto_view text/html
    -# la façon de voir les emails par défaut.
    -
    -set date_format = "%y-%m-%d %T"
    -# format de date d'envoi/de reception.
    -
    -set index_format = "%2C | %Z [%D] %-30.30F (%-4.4c) %s"
    -# format de l'index (la présentation de l'interface)
    -# voir http://www.mutt.org/doc/manual/manual-6.html#index_format
    -
    -set sort_alias = alias
    -set reverse_alias = yes 
    -set alias_file = "$HOME/.mutt/aliases"
    -# liste des alias noms/email. a créer et remplir vous même.
    -# format : "alias short_name long_email_adress"
    -source $alias_file
    -
    -set beep = no
    -# ne pas biper. CE SON ME TUE T.T
    -
    -set tilde = yes
    -set sleep_time = 0
    -# ?
    -
    -set sidebar_visible = yes
    -set sidebar_width = 15
    -# parametres de la barre coté gauche
    -
    -set realname = "Clément Hertling (Wxcafé)"
    -set from = "wxcafe@wxcafe.net"
    -set use_from = yes
    -set certificate_file = "$HOME/.mutt/cacert"
    -# parametres d'envoi. mettez vos propres infos a la place des miennes...
    -
    -set edit_headers = yes
    -# vous permet de vois les headers des mails. j'aime, donc je laisse.
    -
    -# Macros
    -
    -# le titre dit tout. index veut dire que la macro est active dans les menus,
    -# pager qu'elle l'est dans la visionneuse, les deux qu'elle l'est dans les 
    -# deux
    -# \C represente la touche Control
    -
    -bind index,pager \Cp sidebar-prev
    -# Control+p -> remonter d'un dossier dans la sidebar
    -
    -bind index,pager \Cn sidebar-next
    -# Control+n -> descendre d'un dossier dans la sidebar
    -
    -bind index,pager \Co sidebar-open
    -# Control+o -> ouvrir le dossier selectionné dans la sidebar
    -
    -macro index,pager d "=Trash" "Trash"
    -# d supprime le message en cours
    -
    -bind pager   previous-line
    -# permet de monter d'une ligne avec la touche up, au lieu de changer de message.
    -
    -bind pager   next-line
    -# permet de descendre d'une ligne avec la touche down, au lieu de changer de 
    -# message
    -
    -bind pager j next-line
    -bind pager k previous-line
    -# raccourcis vim
    -
    -# PGP signing commands
    -
    -set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
    -set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
    -set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
    -set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f"
    -set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f"
    -set pgp_encrypt_only_command="pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
    -set pgp_encrypt_sign_command="pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
    -set pgp_import_command="gpg --no-verbose --import -v %f"
    -set pgp_export_command="gpg --no-verbose --export --armor %r"
    -set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
    -set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r" 
    -set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r" 
    -set pgp_autosign=yes
    -set pgp_sign_as=0x********
    -# remplacez 0x******** par votre identifiant PGP!!!!!
    -
    -set pgp_replyencrypt=no
    -set pgp_timeout=7200
    -set pgp_good_sign="^gpg: Good signature from"
    -
    -# si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis
    -# PGP signing options
    -
    -# Palette for use with the Linux console.  Black background.
    -
    -# Schéma de couleur Rouge et Noir. Commentez si vous voulez le 
    -# défaut noir et blanc.
    -# d'autres schémas sont trouvables sur google et autre.
    -
    -color hdrdefault red black
    -color quoted brightblack black
    -color signature brightblack black
    -color attachment red black
    -color message brightwhite black
    -color error brightred black
    -color indicator black red
    -color status white black
    -color tree white black
    -color normal white black
    -color markers red black
    -color search white black
    -color tilde brightmagenta black
    -color index red black ~F
    -color index red black "~N|~O"
    -
    - - -

    Voila, pour plus d’informations vous pouvez aller voir le manuel de mutt -@ http://www.mutt.org/doc/manual/
    -J’espère que cette configuration “toute faite” vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu’utiliser une configuration toute faire n’aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l’introduction ou a des situations ou il est absolument -nécessaire d’avoir rapidement une configuration fonctionnelle (c’est a -dire, dans le cas d’un client email, euh… jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -Bing Google Yahoo Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!

    -
    -
    -
    -

    Pages

    -
  • A propos
  • -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/category/vidya-games/index.html b/output/category/vidya-games/index.html deleted file mode 100644 index f95f670..0000000 --- a/output/category/vidya-games/index.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - Wxcafé - Vidya Games - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    Manettes : Hori vs. PDP

    -
    - Date - - Sun 19 April 2015 - -
    - By - Wxcafe -
    - Category - Vidya Games -
    - - - - -
    -

    Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d’abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de “choses” -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d’autres. Vous aurez aussi remarqué que le -Gamepad n’est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.

    -

    Cela étant, si comme moi vous avez, euh, “ouvert” le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter l’adaptateur GC pour Wii -U -a votre console.

    -

    Heureusement pour vous, Nintendo a pensé a une solution (et comme d’habitude -avec Nintendo, c’est une solution a moitié satisfaisante…) : les classic -controller, mais en forme de manettes Gamecube.

    -

    Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d’argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.

    -

    Nous allons ici voir deux modèles, un de chacune des boites en question -: PDP et Hori.

    -

    Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus

    -

    Commençons par le modèle de chez Hori :

    -

    Hori_face

    -

    Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.

    -

    Hori_dos

    -

    Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c’est logique puisque c’est comme ça que les -classic controller sont faits, mais c’est décevant tout de même

    -

    Hori_CM

    -

    On peut voir ici que la qualité de l’assemblage n’est pas extraordinaire, et on -remarque une soudure mal faite a l’emplacement du stick gauche.

    -

    Hori_Cstick

    -

    Le stick c n’est pas fixé au reste de la manette. -J’ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n’avaient pas l’air de très bonne qualité, et j’ai préféré abandonner -l’idée plutôt que de casser la manette.

    -

    Hori_coque

    -

    On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d’une Wiimote entière la dedans…

    -
    - -

    Passons maintenant a la manette PDP.

    -

    PDP_face

    -

    Au premier coup d’œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c’est un problème de goût).

    -

    PDP_dos

    -

    Les gâchettes sont des vraies gâchettes! C’est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.

    -

    PDP_CM

    -

    Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon péremptoire perpendiculaire…

    -

    PDP_CF

    -

    Vous l’avez deviné, ces deux “cartes filles” servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de “vraies” gâchettes en cela -qu’elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.

    -

    Quelques photos des gâchettes en question :

    -

    PDP_G_1

    -

    PDP_G_2

    -

    PDP_G_3

    -

    PDP_G_4

    -
    -

    Vous l’aurez compris, je préfère la version PDP de ces “Fight Pad”, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains esttotalement identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.

    -
    -
    -
    -

    Pages

    -
  • A propos
  • -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/feeds/all-fr.atom.xml b/output/feeds/all-fr.atom.xml deleted file mode 100644 index 98d314c..0000000 --- a/output/feeds/all-fr.atom.xml +++ /dev/null @@ -1,2196 +0,0 @@ - -Wxcafé//wxcafe.net/2015-08-22T02:43:00+02:00les NUCs et le HDMI-CEC2015-08-22T02:43:00+02:00Wxcafetag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>SSL - STARTTLS2015-05-16T02:00:00+02:00Wxcafetag:wxcafe.net,2015-05-16:posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>Manettes : Hori vs. PDP2015-04-19T21:59:00+02:00Wxcafetag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>Docker et les ebooks sur Twitter2015-02-28T14:11:00+01:00Wxcafetag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>OpenSMTPd comme serveur mail sous debian2014-11-07T13:04:00+01:00Wxcafétag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>Installer FreeBSD sur un serveur Online avec MfsBSD2014-08-28T12:16:00+02:00Wxcafetag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>SSL ou la sécurité sur l'internet2014-05-30T08:25:00+02:00Wxcafetag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>Mise en place d'un serveur DNS2014-02-24T02:49:00+01:00Wxcafetag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>NAT2014-02-17T05:02:00+01:00wxcafétag:wxcafe.net,2014-02-17:posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>Plan9 from whichever space2013-09-09T11:17:00+02:00Wxcafetag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>Sed Basics2013-08-18T22:57:00+02:00Wxcafetag:wxcafe.net,2013-08-18:posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>Le chiffrement de partitions avec dm-crypt et device-mapper2013-07-10T03:18:00+02:00Wxcafetag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>Redesign du blog, etc2013-06-12T19:14:00+02:00wxcafetag:wxcafe.net,2013-06-12:posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>Comment Saurik a rooté les Google Glass2013-05-06T06:24:00+02:00Wxcafetag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>Monter son propre serveur, partie 1: le serveur et l'apache.2013-03-18T09:51:00+01:00Wxcafetag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>Pourquoi je vais quitter linux pour passer a FreeBSD.2013-02-04T17:41:00+01:00Wxcafetag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>Update et pensées a propos du Raspberry Pi2013-01-27T01:55:00+01:00Wxcafetag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>Update2013-01-05T18:32:00+01:00Wxcafetag:wxcafe.net,2013-01-05:posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>Mutt ou le client email le meilleur moins mauvais2013-01-02T02:12:00+01:00Wxcafetag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p> \ No newline at end of file diff --git a/output/feeds/feed.atom.all.xml b/output/feeds/feed.atom.all.xml deleted file mode 100644 index fd69f54..0000000 --- a/output/feeds/feed.atom.all.xml +++ /dev/null @@ -1,2196 +0,0 @@ - -Wxcafé//wxcafe.net/2015-08-22T02:43:00+02:00les NUCs et le HDMI-CEC2015-08-22T02:43:00+02:00Wxcafetag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>SSL - STARTTLS2015-05-16T02:00:00+02:00Wxcafetag:wxcafe.net,2015-05-16:posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>Manettes : Hori vs. PDP2015-04-19T21:59:00+02:00Wxcafetag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>Docker et les ebooks sur Twitter2015-02-28T14:11:00+01:00Wxcafetag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>OpenSMTPd comme serveur mail sous debian2014-11-07T13:04:00+01:00Wxcafétag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>Installer FreeBSD sur un serveur Online avec MfsBSD2014-08-28T12:16:00+02:00Wxcafetag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>SSL ou la sécurité sur l'internet2014-05-30T08:25:00+02:00Wxcafetag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>Mise en place d'un serveur DNS2014-02-24T02:49:00+01:00Wxcafetag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>NAT2014-02-17T05:02:00+01:00wxcafétag:wxcafe.net,2014-02-17:posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>Plan9 from whichever space2013-09-09T11:17:00+02:00Wxcafetag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>Sed Basics2013-08-18T22:57:00+02:00Wxcafetag:wxcafe.net,2013-08-18:posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>Le chiffrement de partitions avec dm-crypt et device-mapper2013-07-10T03:18:00+02:00Wxcafetag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>Redesign du blog, etc2013-06-12T19:14:00+02:00wxcafetag:wxcafe.net,2013-06-12:posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>Comment Saurik a rooté les Google Glass2013-05-06T06:24:00+02:00Wxcafetag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>Monter son propre serveur, partie 1: le serveur et l'apache.2013-03-18T09:51:00+01:00Wxcafetag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>Pourquoi je vais quitter linux pour passer a FreeBSD.2013-02-04T17:41:00+01:00Wxcafetag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>Update et pensées a propos du Raspberry Pi2013-01-27T01:55:00+01:00Wxcafetag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>Update2013-01-05T18:32:00+01:00Wxcafetag:wxcafe.net,2013-01-05:posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>Mutt ou le client email le meilleur moins mauvais2013-01-02T02:12:00+01:00Wxcafetag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p> \ No newline at end of file diff --git a/output/feeds/feed.atom.xml b/output/feeds/feed.atom.xml deleted file mode 100644 index ecf6fd9..0000000 --- a/output/feeds/feed.atom.xml +++ /dev/null @@ -1,2196 +0,0 @@ - -Wxcafé//wxcafe.net/2015-08-22T02:43:00+02:00les NUCs et le HDMI-CEC2015-08-22T02:43:00+02:00Wxcafetag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>SSL - STARTTLS2015-05-16T02:00:00+02:00Wxcafetag:wxcafe.net,2015-05-16:posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>Manettes : Hori vs. PDP2015-04-19T21:59:00+02:00Wxcafetag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>Docker et les ebooks sur Twitter2015-02-28T14:11:00+01:00Wxcafetag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>OpenSMTPd comme serveur mail sous debian2014-11-07T13:04:00+01:00Wxcafétag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>Installer FreeBSD sur un serveur Online avec MfsBSD2014-08-28T12:16:00+02:00Wxcafetag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>SSL ou la sécurité sur l'internet2014-05-30T08:25:00+02:00Wxcafetag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>Mise en place d'un serveur DNS2014-02-24T02:49:00+01:00Wxcafetag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>NAT2014-02-17T05:02:00+01:00wxcafétag:wxcafe.net,2014-02-17:posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>Plan9 from whichever space2013-09-09T11:17:00+02:00Wxcafetag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>Sed Basics2013-08-18T22:57:00+02:00Wxcafetag:wxcafe.net,2013-08-18:posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>Le chiffrement de partitions avec dm-crypt et device-mapper2013-07-10T03:18:00+02:00Wxcafetag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>Redesign du blog, etc2013-06-12T19:14:00+02:00wxcafetag:wxcafe.net,2013-06-12:posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>Comment Saurik a rooté les Google Glass2013-05-06T06:24:00+02:00Wxcafetag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>Monter son propre serveur, partie 1: le serveur et l'apache.2013-03-18T09:51:00+01:00Wxcafetag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>Pourquoi je vais quitter linux pour passer a FreeBSD.2013-02-04T17:41:00+01:00Wxcafetag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>Update et pensées a propos du Raspberry Pi2013-01-27T01:55:00+01:00Wxcafetag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>Update2013-01-05T18:32:00+01:00Wxcafetag:wxcafe.net,2013-01-05:posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>Mutt ou le client email le meilleur moins mauvais2013-01-02T02:12:00+01:00Wxcafetag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p> \ No newline at end of file diff --git a/output/feeds/feed.hacking.xml b/output/feeds/feed.hacking.xml deleted file mode 100644 index 5801cb5..0000000 --- a/output/feeds/feed.hacking.xml +++ /dev/null @@ -1,140 +0,0 @@ - -Wxcafé//wxcafe.net/2013-05-06T06:24:00+02:00Comment Saurik a rooté les Google Glass2013-05-06T06:24:00+02:00Wxcafetag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p> \ No newline at end of file diff --git a/output/feeds/feed.note.xml b/output/feeds/feed.note.xml deleted file mode 100644 index 479a811..0000000 --- a/output/feeds/feed.note.xml +++ /dev/null @@ -1,409 +0,0 @@ - -Wxcafé//wxcafe.net/2015-08-22T02:43:00+02:00les NUCs et le HDMI-CEC2015-08-22T02:43:00+02:00Wxcafetag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>SSL - STARTTLS2015-05-16T02:00:00+02:00Wxcafetag:wxcafe.net,2015-05-16:posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>Docker et les ebooks sur Twitter2015-02-28T14:11:00+01:00Wxcafetag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>SSL ou la sécurité sur l'internet2014-05-30T08:25:00+02:00Wxcafetag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>Redesign du blog, etc2013-06-12T19:14:00+02:00wxcafetag:wxcafe.net,2013-06-12:posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>Update2013-01-05T18:32:00+01:00Wxcafetag:wxcafe.net,2013-01-05:posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p> \ No newline at end of file diff --git a/output/feeds/feed.oses.xml b/output/feeds/feed.oses.xml deleted file mode 100644 index 79e0295..0000000 --- a/output/feeds/feed.oses.xml +++ /dev/null @@ -1,63 +0,0 @@ - -Wxcafé//wxcafe.net/2013-09-09T11:17:00+02:00Plan9 from whichever space2013-09-09T11:17:00+02:00Wxcafetag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p> \ No newline at end of file diff --git a/output/feeds/feed.ranting.xml b/output/feeds/feed.ranting.xml deleted file mode 100644 index 073f370..0000000 --- a/output/feeds/feed.ranting.xml +++ /dev/null @@ -1,215 +0,0 @@ - -Wxcafé//wxcafe.net/2014-02-17T05:02:00+01:00NAT2014-02-17T05:02:00+01:00wxcafétag:wxcafe.net,2014-02-17:posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>Pourquoi je vais quitter linux pour passer a FreeBSD.2013-02-04T17:41:00+01:00Wxcafetag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>Update et pensées a propos du Raspberry Pi2013-01-27T01:55:00+01:00Wxcafetag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p> \ No newline at end of file diff --git a/output/feeds/feed.rss.all.xml b/output/feeds/feed.rss.all.xml deleted file mode 100644 index e513e85..0000000 --- a/output/feeds/feed.rss.all.xml +++ /dev/null @@ -1,2196 +0,0 @@ - -Wxcafé//wxcafe.net/Sat, 22 Aug 2015 02:43:00 +0200les NUCs et le HDMI-CEC//wxcafe.net/posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>WxcafeSat, 22 Aug 2015 02:43:00 +0200tag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/SSL - STARTTLS//wxcafe.net/posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>WxcafeSat, 16 May 2015 02:00:00 +0200tag:wxcafe.net,2015-05-16:posts/ssl-starttls/Manettes : Hori vs. PDP//wxcafe.net/posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>WxcafeSun, 19 Apr 2015 21:59:00 +0200tag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/Docker et les ebooks sur Twitter//wxcafe.net/posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>WxcafeSat, 28 Feb 2015 14:11:00 +0100tag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/OpenSMTPd comme serveur mail sous debian//wxcafe.net/posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>WxcaféFri, 07 Nov 2014 13:04:00 +0100tag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/Installer FreeBSD sur un serveur Online avec MfsBSD//wxcafe.net/posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>WxcafeThu, 28 Aug 2014 12:16:00 +0200tag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/SSL ou la sécurité sur l'internet//wxcafe.net/posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>WxcafeFri, 30 May 2014 08:25:00 +0200tag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/Mise en place d'un serveur DNS//wxcafe.net/posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>WxcafeMon, 24 Feb 2014 02:49:00 +0100tag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/NAT//wxcafe.net/posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>wxcaféMon, 17 Feb 2014 05:02:00 +0100tag:wxcafe.net,2014-02-17:posts/nat/Plan9 from whichever space//wxcafe.net/posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>WxcafeMon, 09 Sep 2013 11:17:00 +0200tag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/Sed Basics//wxcafe.net/posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>WxcafeSun, 18 Aug 2013 22:57:00 +0200tag:wxcafe.net,2013-08-18:posts/sed-basics/Le chiffrement de partitions avec dm-crypt et device-mapper//wxcafe.net/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>WxcafeWed, 10 Jul 2013 03:18:00 +0200tag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/Redesign du blog, etc//wxcafe.net/posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>wxcafeWed, 12 Jun 2013 19:14:00 +0200tag:wxcafe.net,2013-06-12:posts/redesign-du-blog/Comment Saurik a rooté les Google Glass//wxcafe.net/posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>WxcafeMon, 06 May 2013 06:24:00 +0200tag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/Monter son propre serveur, partie 1: le serveur et l'apache.//wxcafe.net/posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>WxcafeMon, 18 Mar 2013 09:51:00 +0100tag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/Pourquoi je vais quitter linux pour passer a FreeBSD.//wxcafe.net/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>WxcafeMon, 04 Feb 2013 17:41:00 +0100tag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/Update et pensées a propos du Raspberry Pi//wxcafe.net/posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>WxcafeSun, 27 Jan 2013 01:55:00 +0100tag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/Update//wxcafe.net/posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>WxcafeSat, 05 Jan 2013 18:32:00 +0100tag:wxcafe.net,2013-01-05:posts/update/Mutt ou le client email le meilleur moins mauvais//wxcafe.net/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p>WxcafeWed, 02 Jan 2013 02:12:00 +0100tag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/ \ No newline at end of file diff --git a/output/feeds/feed.rss.hacking.xml b/output/feeds/feed.rss.hacking.xml deleted file mode 100644 index 70d1b44..0000000 --- a/output/feeds/feed.rss.hacking.xml +++ /dev/null @@ -1,140 +0,0 @@ - -Wxcafé//wxcafe.net/Mon, 06 May 2013 06:24:00 +0200Comment Saurik a rooté les Google Glass//wxcafe.net/posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>WxcafeMon, 06 May 2013 06:24:00 +0200tag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/ \ No newline at end of file diff --git a/output/feeds/feed.rss.note.xml b/output/feeds/feed.rss.note.xml deleted file mode 100644 index 93df5ce..0000000 --- a/output/feeds/feed.rss.note.xml +++ /dev/null @@ -1,409 +0,0 @@ - -Wxcafé//wxcafe.net/Sat, 22 Aug 2015 02:43:00 +0200les NUCs et le HDMI-CEC//wxcafe.net/posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>WxcafeSat, 22 Aug 2015 02:43:00 +0200tag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/SSL - STARTTLS//wxcafe.net/posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>WxcafeSat, 16 May 2015 02:00:00 +0200tag:wxcafe.net,2015-05-16:posts/ssl-starttls/Docker et les ebooks sur Twitter//wxcafe.net/posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>WxcafeSat, 28 Feb 2015 14:11:00 +0100tag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/SSL ou la sécurité sur l'internet//wxcafe.net/posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>WxcafeFri, 30 May 2014 08:25:00 +0200tag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/Redesign du blog, etc//wxcafe.net/posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>wxcafeWed, 12 Jun 2013 19:14:00 +0200tag:wxcafe.net,2013-06-12:posts/redesign-du-blog/Update//wxcafe.net/posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>WxcafeSat, 05 Jan 2013 18:32:00 +0100tag:wxcafe.net,2013-01-05:posts/update/ \ No newline at end of file diff --git a/output/feeds/feed.rss.oses.xml b/output/feeds/feed.rss.oses.xml deleted file mode 100644 index 764eab1..0000000 --- a/output/feeds/feed.rss.oses.xml +++ /dev/null @@ -1,63 +0,0 @@ - -Wxcafé//wxcafe.net/Mon, 09 Sep 2013 11:17:00 +0200Plan9 from whichever space//wxcafe.net/posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>WxcafeMon, 09 Sep 2013 11:17:00 +0200tag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/ \ No newline at end of file diff --git a/output/feeds/feed.rss.ranting.xml b/output/feeds/feed.rss.ranting.xml deleted file mode 100644 index 53da18e..0000000 --- a/output/feeds/feed.rss.ranting.xml +++ /dev/null @@ -1,215 +0,0 @@ - -Wxcafé//wxcafe.net/Mon, 17 Feb 2014 05:02:00 +0100NAT//wxcafe.net/posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>wxcaféMon, 17 Feb 2014 05:02:00 +0100tag:wxcafe.net,2014-02-17:posts/nat/Pourquoi je vais quitter linux pour passer a FreeBSD.//wxcafe.net/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>WxcafeMon, 04 Feb 2013 17:41:00 +0100tag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/Update et pensées a propos du Raspberry Pi//wxcafe.net/posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>WxcafeSun, 27 Jan 2013 01:55:00 +0100tag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/ \ No newline at end of file diff --git a/output/feeds/feed.rss.tutoriel.xml b/output/feeds/feed.rss.tutoriel.xml deleted file mode 100644 index 785b556..0000000 --- a/output/feeds/feed.rss.tutoriel.xml +++ /dev/null @@ -1,1297 +0,0 @@ - -Wxcafé//wxcafe.net/Fri, 07 Nov 2014 13:04:00 +0100OpenSMTPd comme serveur mail sous debian//wxcafe.net/posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>WxcaféFri, 07 Nov 2014 13:04:00 +0100tag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/Installer FreeBSD sur un serveur Online avec MfsBSD//wxcafe.net/posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>WxcafeThu, 28 Aug 2014 12:16:00 +0200tag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/Mise en place d'un serveur DNS//wxcafe.net/posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>WxcafeMon, 24 Feb 2014 02:49:00 +0100tag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/Sed Basics//wxcafe.net/posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>WxcafeSun, 18 Aug 2013 22:57:00 +0200tag:wxcafe.net,2013-08-18:posts/sed-basics/Le chiffrement de partitions avec dm-crypt et device-mapper//wxcafe.net/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>WxcafeWed, 10 Jul 2013 03:18:00 +0200tag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/Monter son propre serveur, partie 1: le serveur et l'apache.//wxcafe.net/posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>WxcafeMon, 18 Mar 2013 09:51:00 +0100tag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/Mutt ou le client email le meilleur moins mauvais//wxcafe.net/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p>WxcafeWed, 02 Jan 2013 02:12:00 +0100tag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/ \ No newline at end of file diff --git a/output/feeds/feed.rss.vidya-games.xml b/output/feeds/feed.rss.vidya-games.xml deleted file mode 100644 index c801507..0000000 --- a/output/feeds/feed.rss.vidya-games.xml +++ /dev/null @@ -1,82 +0,0 @@ - -Wxcafé//wxcafe.net/Sun, 19 Apr 2015 21:59:00 +0200Manettes : Hori vs. PDP//wxcafe.net/posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>WxcafeSun, 19 Apr 2015 21:59:00 +0200tag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/ \ No newline at end of file diff --git a/output/feeds/feed.rss.xml b/output/feeds/feed.rss.xml deleted file mode 100644 index a3c1487..0000000 --- a/output/feeds/feed.rss.xml +++ /dev/null @@ -1,2196 +0,0 @@ - -Wxcafé//wxcafe.net/Sat, 22 Aug 2015 02:43:00 +0200les NUCs et le HDMI-CEC//wxcafe.net/posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>WxcafeSat, 22 Aug 2015 02:43:00 +0200tag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/SSL - STARTTLS//wxcafe.net/posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>WxcafeSat, 16 May 2015 02:00:00 +0200tag:wxcafe.net,2015-05-16:posts/ssl-starttls/Manettes : Hori vs. PDP//wxcafe.net/posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>WxcafeSun, 19 Apr 2015 21:59:00 +0200tag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/Docker et les ebooks sur Twitter//wxcafe.net/posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>WxcafeSat, 28 Feb 2015 14:11:00 +0100tag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/OpenSMTPd comme serveur mail sous debian//wxcafe.net/posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>WxcaféFri, 07 Nov 2014 13:04:00 +0100tag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/Installer FreeBSD sur un serveur Online avec MfsBSD//wxcafe.net/posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>WxcafeThu, 28 Aug 2014 12:16:00 +0200tag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/SSL ou la sécurité sur l'internet//wxcafe.net/posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>WxcafeFri, 30 May 2014 08:25:00 +0200tag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/Mise en place d'un serveur DNS//wxcafe.net/posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>WxcafeMon, 24 Feb 2014 02:49:00 +0100tag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/NAT//wxcafe.net/posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>wxcaféMon, 17 Feb 2014 05:02:00 +0100tag:wxcafe.net,2014-02-17:posts/nat/Plan9 from whichever space//wxcafe.net/posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>WxcafeMon, 09 Sep 2013 11:17:00 +0200tag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/Sed Basics//wxcafe.net/posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>WxcafeSun, 18 Aug 2013 22:57:00 +0200tag:wxcafe.net,2013-08-18:posts/sed-basics/Le chiffrement de partitions avec dm-crypt et device-mapper//wxcafe.net/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>WxcafeWed, 10 Jul 2013 03:18:00 +0200tag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/Redesign du blog, etc//wxcafe.net/posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>wxcafeWed, 12 Jun 2013 19:14:00 +0200tag:wxcafe.net,2013-06-12:posts/redesign-du-blog/Comment Saurik a rooté les Google Glass//wxcafe.net/posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>WxcafeMon, 06 May 2013 06:24:00 +0200tag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/Monter son propre serveur, partie 1: le serveur et l'apache.//wxcafe.net/posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>WxcafeMon, 18 Mar 2013 09:51:00 +0100tag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/Pourquoi je vais quitter linux pour passer a FreeBSD.//wxcafe.net/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>WxcafeMon, 04 Feb 2013 17:41:00 +0100tag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/Update et pensées a propos du Raspberry Pi//wxcafe.net/posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>WxcafeSun, 27 Jan 2013 01:55:00 +0100tag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/Update//wxcafe.net/posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>WxcafeSat, 05 Jan 2013 18:32:00 +0100tag:wxcafe.net,2013-01-05:posts/update/Mutt ou le client email le meilleur moins mauvais//wxcafe.net/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p>WxcafeWed, 02 Jan 2013 02:12:00 +0100tag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/ \ No newline at end of file diff --git a/output/feeds/feed.tutoriel.xml b/output/feeds/feed.tutoriel.xml deleted file mode 100644 index 2423210..0000000 --- a/output/feeds/feed.tutoriel.xml +++ /dev/null @@ -1,1297 +0,0 @@ - -Wxcafé//wxcafe.net/2014-11-07T13:04:00+01:00OpenSMTPd comme serveur mail sous debian2014-11-07T13:04:00+01:00Wxcafétag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>Installer FreeBSD sur un serveur Online avec MfsBSD2014-08-28T12:16:00+02:00Wxcafetag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>Mise en place d'un serveur DNS2014-02-24T02:49:00+01:00Wxcafetag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>Sed Basics2013-08-18T22:57:00+02:00Wxcafetag:wxcafe.net,2013-08-18:posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>Le chiffrement de partitions avec dm-crypt et device-mapper2013-07-10T03:18:00+02:00Wxcafetag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>Monter son propre serveur, partie 1: le serveur et l'apache.2013-03-18T09:51:00+01:00Wxcafetag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>Mutt ou le client email le meilleur moins mauvais2013-01-02T02:12:00+01:00Wxcafetag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p> \ No newline at end of file diff --git a/output/feeds/feed.vidya-games.xml b/output/feeds/feed.vidya-games.xml deleted file mode 100644 index 743a9ad..0000000 --- a/output/feeds/feed.vidya-games.xml +++ /dev/null @@ -1,82 +0,0 @@ - -Wxcafé//wxcafe.net/2015-04-19T21:59:00+02:00Manettes : Hori vs. PDP2015-04-19T21:59:00+02:00Wxcafetag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p> \ No newline at end of file diff --git a/output/feeds/wxcafe.atom.xml b/output/feeds/wxcafe.atom.xml deleted file mode 100644 index f212a7f..0000000 --- a/output/feeds/wxcafe.atom.xml +++ /dev/null @@ -1,2196 +0,0 @@ - -Wxcafé//wxcafe.net/2015-08-22T02:43:00+02:00les NUCs et le HDMI-CEC2015-08-22T02:43:00+02:00Wxcafetag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>SSL - STARTTLS2015-05-16T02:00:00+02:00Wxcafetag:wxcafe.net,2015-05-16:posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>Manettes : Hori vs. PDP2015-04-19T21:59:00+02:00Wxcafetag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>Docker et les ebooks sur Twitter2015-02-28T14:11:00+01:00Wxcafetag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>OpenSMTPd comme serveur mail sous debian2014-11-07T13:04:00+01:00Wxcafétag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>Installer FreeBSD sur un serveur Online avec MfsBSD2014-08-28T12:16:00+02:00Wxcafetag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>SSL ou la sécurité sur l'internet2014-05-30T08:25:00+02:00Wxcafetag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>Mise en place d'un serveur DNS2014-02-24T02:49:00+01:00Wxcafetag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>NAT2014-02-17T05:02:00+01:00wxcafétag:wxcafe.net,2014-02-17:posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>Plan9 from whichever space2013-09-09T11:17:00+02:00Wxcafetag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>Sed Basics2013-08-18T22:57:00+02:00Wxcafetag:wxcafe.net,2013-08-18:posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>Le chiffrement de partitions avec dm-crypt et device-mapper2013-07-10T03:18:00+02:00Wxcafetag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>Redesign du blog, etc2013-06-12T19:14:00+02:00wxcafetag:wxcafe.net,2013-06-12:posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>Comment Saurik a rooté les Google Glass2013-05-06T06:24:00+02:00Wxcafetag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>Monter son propre serveur, partie 1: le serveur et l'apache.2013-03-18T09:51:00+01:00Wxcafetag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>Pourquoi je vais quitter linux pour passer a FreeBSD.2013-02-04T17:41:00+01:00Wxcafetag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>Update et pensées a propos du Raspberry Pi2013-01-27T01:55:00+01:00Wxcafetag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>Update2013-01-05T18:32:00+01:00Wxcafetag:wxcafe.net,2013-01-05:posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>Mutt ou le client email le meilleur moins mauvais2013-01-02T02:12:00+01:00Wxcafetag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p> \ No newline at end of file diff --git a/output/feeds/wxcafe.rss.xml b/output/feeds/wxcafe.rss.xml deleted file mode 100644 index 42bbb33..0000000 --- a/output/feeds/wxcafe.rss.xml +++ /dev/null @@ -1,2196 +0,0 @@ - -Wxcafé//wxcafe.net/Sat, 22 Aug 2015 02:43:00 +0200les NUCs et le HDMI-CEC//wxcafe.net/posts/nuc-hdmi-cec/<p>J&rsquo;ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas &ldquo;profiter&rdquo; du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc&hellip;) simplement.</p> -<p>Ayant un <a href="https://www.raspberrypi.org/">Raspberry Pi 1</a> qui trainait, j&rsquo;ai -décidé d&rsquo;installer <a href="http://openelec.tv/">OpenELEC</a> dessus et de voir ce que ça -donnait. Le résultat n&rsquo;étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j&rsquo;ai décidé d&rsquo;upgrader le système.</p> -<p>J&rsquo;ai donc acquis un <a href="http://www.amazon.fr/gp/product/B00GPJ83EU">NUC D34010WYK</a> -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -<a href="http://www.amazon.fr/dp/B00WU5F8MS/">adaptateur HDMI-CEC</a> pour celui-ci, et un -<a href="http://www.amazon.fr/gp/product/B00INTR4ZE">SSD mSATA</a>, en me disant que je -pourrais sans trop de problème faire tourner <a href="http://kodi.tv/">Kodi</a> sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L&rsquo;autre -avantage de tourner sur du Intel, c&rsquo;est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).</p> -<p>J&rsquo;ai donc reçu après un certain temps le matériel sus cité, que j&rsquo;ai avidement -monté, avant de me rendre compte que le manuel de l&rsquo;adaptateur Pulse-Eight était -[PDF]<a href="https://www.pulse-eight.com/Download/Get/30">assez médiocre</a>. J&rsquo;ai donc -cherché plusieurs heures, avant de trouver [DE]<a href="http://www.technikaffe.de/anleitung-293-pulse_eight_intel_nuc_hdmi_cec_adapter_im_test">ce -post</a> -expliquant comment brancher l&rsquo;adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l&rsquo;information, et pour moi si je dois remonter ce système.</p> -<p>Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -&ldquo;Front Panel&rdquo;, et un appelé &ldquo;Custom Solution Header&rdquo;. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">Custom Solution - ┌─┬─┬─┬─┬─┐ - │g│ │·│r│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│·│ - └─┴─┴─┴─┴─┘ - - g ➔ fiche grise - r ➔ fiche rouge - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Une fois cela fait, il faut brancher le Front Panel. Heureusement, c&rsquo;est plus -facile, puisqu&rsquo;il n&rsquo;y a qu&rsquo;une seule fiche a brancher ici : la orange.</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Front Panel - ┌─┬─┬─┬─┬─┐ - │·│·│·│·│·│ - ├─┼─┼─┼─┼─┤ - │ │·│o│·│·│ - └─┴─┴─┴─┴─┘ - - o ➔ fiche orange - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> Dual-USB - ┌─┬─┬─┬─┬─┐ - │b│B│v│n│·│ - ├─┼─┼─┼─┼─┤ - │·│·│·│·│ │ - └─┴─┴─┴─┴─┘ - - b ➔ fiche bleue - B ➔ fiche Blanche - v ➔ fiche verte - n ➔ fiche noire - · ➔ pin inutilisé - ➔ espace vide (sans pin) -</pre></div> - - -<p>Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que &ldquo;Deep S4/S5&rdquo; soit <em>dés</em>activé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.</p> -<p>Ne reste plus ensuite qu&rsquo;a installer un système digne de ce nom dessus!</p>WxcafeSat, 22 Aug 2015 02:43:00 +0200tag:wxcafe.net,2015-08-22:posts/nuc-hdmi-cec/SSL - STARTTLS//wxcafe.net/posts/ssl-starttls/<p>Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l&rsquo;histoire d&rsquo;Internet. Sa mise en place pose -problème : les protocoles existants ne s&rsquo;accommodent qu&rsquo;assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n&rsquo;apporte rien d&rsquo;intéressant. Pour palier a ce -problème, deux solutions sont apparues.</p> -<p>Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l&rsquo;extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.</p> -<p>L&rsquo;autre approche qui a été utilisée est une approche d&rsquo;<em>upgrade</em>. La -communication commence en mode non chiffré, puis le client demande l&rsquo;upgrade de -la connexion vers le mode chiffré s&rsquo;il le supporte, les deux machines -machines font un <em>handshake</em> SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la &ldquo;mise -a jour&rdquo; en douceur.</p> -<p>Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service &ndash; laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec <code>STARTTLS</code>, qui <em>upgrade</em> les connexions si nécessaire.<br /> -La réponse est que <code>STARTTLS</code> est plus interessant, pour plusieurs raisons. Tout -d&rsquo;abord, il permet de n&rsquo;utiliser qu&rsquo;un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients &ldquo;anciens&rdquo; (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d&rsquo;éviter aux utilisateurs d&rsquo;avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l&rsquo;activera de lui même s&rsquo;il -voit qu&rsquo;il est disponible.<br /> -Bref, mettez en place du <code>STARTTLS</code>, et pas du SSL. C&rsquo;est mieux pour la sécurité -de tout le monde.</p>WxcafeSat, 16 May 2015 02:00:00 +0200tag:wxcafe.net,2015-05-16:posts/ssl-starttls/Manettes : Hori vs. PDP//wxcafe.net/posts/hori-vs-pdp/<p>Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d&rsquo;abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de &ldquo;choses&rdquo; -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d&rsquo;autres. Vous aurez aussi remarqué que le -Gamepad n&rsquo;est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.</p> -<p>Cela étant, si comme moi vous avez, euh, &ldquo;ouvert&rdquo; le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter <a href="http://www.amazon.com/Super-Smash-GameCube-Adapter-Wii-U/dp/B00L3LQ1FI">l&rsquo;adaptateur GC pour Wii -U</a> -a votre console. </p> -<p>Heureusement pour vous, Nintendo a pensé a une solution (et comme d&rsquo;habitude -avec Nintendo, c&rsquo;est une solution a moitié satisfaisante&hellip;) : les classic -controller, mais en forme de manettes Gamecube.</p> -<p>Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d&rsquo;argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.</p> -<p>Nous allons ici voir deux modèles, un de chacune des boites en question -: <a href="http://www.pdp.com/">PDP</a> et <a href="http://stores.horiusa.com/">Hori</a>. </p> -<p><strong><em>Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus</em></strong></p> -<p>Commençons par le modèle de chez Hori :</p> -<p><a href="//pub.wxcafe.net/img/Hori_face_fd.jpg"><img alt="Hori_face" src="//pub.wxcafe.net/img/Hori_face_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.</p> -<p><a href="//pub.wxcafe.net/img/Hori_dos_fd.jpg"><img alt="Hori_dos" src="//pub.wxcafe.net/img/Hori_dos_ld.jpg" /></a></p> -<p>Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c&rsquo;est logique puisque c&rsquo;est comme ça que les -classic controller sont faits, mais c&rsquo;est décevant tout de même</p> -<p><a href="//pub.wxcafe.net/img/Hori_CM_fd.jpg"><img alt="Hori_CM" src="//pub.wxcafe.net/img/Hori_CM_ld.jpg" /></a></p> -<p>On peut voir ici que la qualité de l&rsquo;assemblage n&rsquo;est pas extraordinaire, et on -remarque une soudure mal faite a l&rsquo;emplacement du stick gauche.</p> -<p><a href="//pub.wxcafe.net/img/Hori_Cstick_fd.jpg"><img alt="Hori_Cstick" src="//pub.wxcafe.net/img/Hori_Cstick_ld.jpg" /></a></p> -<p>Le stick c n&rsquo;est pas fixé au reste de la manette. -J&rsquo;ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n&rsquo;avaient pas l&rsquo;air de très bonne qualité, et j&rsquo;ai préféré abandonner -l&rsquo;idée plutôt que de casser la manette.</p> -<p><a href="//pub.wxcafe.net/img/Hori_coque_fd.jpg"><img alt="Hori_coque" src="//pub.wxcafe.net/img/Hori_coque_ld.jpg" /></a></p> -<p>On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d&rsquo;une Wiimote entière la dedans&hellip;</p> -<hr> - -<p>Passons maintenant a la manette PDP.</p> -<p><a href="//pub.wxcafe.net/img/PDP_face_fd.jpg"><img alt="PDP_face" src="//pub.wxcafe.net/img/PDP_face_ld.jpg" /></a></p> -<p>Au premier coup d&rsquo;œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c&rsquo;est un problème de goût).</p> -<p><a href="//pub.wxcafe.net/img/PDP_dos_fd.jpg"><img alt="PDP_dos" src="//pub.wxcafe.net/img/PDP_dos_ld.jpg" /></a></p> -<p>Les gâchettes sont des vraies gâchettes! C&rsquo;est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.</p> -<p><a href="//pub.wxcafe.net/img/PDP_CM_fd.jpg"><img alt="PDP_CM" src="//pub.wxcafe.net/img/PDP_CM_ld.jpg" /></a></p> -<p>Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon <strike>péremptoire</strike> perpendiculaire&hellip;</p> -<p><a href="//pub.wxcafe.net/img/PDP_CF_fd.jpg"><img alt="PDP_CF" src="//pub.wxcafe.net/img/PDP_CF_ld.jpg" /></a></p> -<p>Vous l&rsquo;avez deviné, ces deux &ldquo;cartes filles&rdquo; servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de &ldquo;vraies&rdquo; gâchettes en cela -qu&rsquo;elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.</p> -<p>Quelques photos des gâchettes en question :</p> -<p><a href="//pub.wxcafe.net/img/PDP_G1_fd.jpg"><img alt="PDP_G_1" src="//pub.wxcafe.net/img/PDP_G1_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G2_fd.jpg"><img alt="PDP_G_2" src="//pub.wxcafe.net/img/PDP_G2_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G3_fd.jpg"><img alt="PDP_G_3" src="//pub.wxcafe.net/img/PDP_G3_ld.jpg" /></a></p> -<p><a href="//pub.wxcafe.net/img/PDP_G4_fd.jpg"><img alt="PDP_G_4" src="//pub.wxcafe.net/img/PDP_G4_ld.jpg" /></a></p> -<hr /> -<p>Vous l&rsquo;aurez compris, je préfère la version PDP de ces &ldquo;Fight Pad&rdquo;, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains est<strong>totalement</strong> identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.</p>WxcafeSun, 19 Apr 2015 21:59:00 +0200tag:wxcafe.net,2015-04-19:posts/hori-vs-pdp/Docker et les ebooks sur Twitter//wxcafe.net/posts/docker-et-les-ebooks-sur-twitter/<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si -ce n&rsquo;est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n&rsquo;est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>, -mais n&rsquo;est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d&rsquo;avoir une machine hôte sur laquelle s&rsquo;exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l&rsquo;hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu&rsquo;avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu&rsquo;à l&rsquo;hôte, puisqu&rsquo;il n&rsquo;est pas vraiment séparé des -invités. </p> -<p>Quoi qu&rsquo;il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. &ldquo;Mais pourquoi utiliser Docker, dans ce cas&rdquo;, vous -demandez-vous peut être, &ldquo;puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?&rdquo;. Et bien -c&rsquo;est très simple : Docker apporte la simplicité de déploiement d&rsquo;applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer -rapidement et facilement un grand nombre d&rsquo;images déjà configurées. </p> -<p>Maintenant que nous avons expliqué rapidement ce qu&rsquo;était Docker, voyons le -rapport avec les ebooks et Twitter.</p> -<p>Les comptes dits &ldquo;ebooks&rdquo; (le nom vient a l&rsquo;origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>, -voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots -twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>, -avec les tweets d&rsquo;un utilisateur &ldquo;source&rdquo; comme corpus, pour produire des tweets -ressemblant a ceux de l&rsquo;utilisateur source. Nous allons voir maintenant comment -en installer un.</p> -<p>C&rsquo;est, comme disent certaines personnes, &ldquo;fun&rdquo;.</p> -<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée -par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l&rsquo;API -twitter et la génération des messages.</p> -<p>Cependant, cela n&rsquo;explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d&rsquo;isoler les bots, et les -containers dockers permettent de les déployer sur n&rsquo;importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j&rsquo;ai créé <a href="https://github.com/wxcafe/ebooks_example">un -repo github</a> qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.</p> -<p>Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l&rsquo;utilisateur source avec <code>ebooks archive &lt;username&gt; &lt;filename&gt;</code> (c&rsquo;est du json) -, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks -consume &lt;filename&gt;</code>. Cela fait, démarrer le bot revient a lancer le container : -<code>docker run -d &lt;container name&gt;</code> Pour plus d&rsquo;informations, allez voir <a href="https://docs.docker.com/articles/basics/">la -documentation Docker</a></p> -<p>Bien entendu, dans l&rsquo;idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 05 * * * cd /usr/local/ebooks/main/ &amp;&amp; /usr/local/bin/ebooks consume corpus/username.json &gt;&gt; /var/log/ebooks/update.log 2&gt;&amp;1 -00 10 * * * docker rm -f bots &gt;/dev/null 2&gt;&amp;1 -00 15 * * * docker rmi bots &gt; /dev/null 2&gt;&amp;1 -00 20 * * * cd /usr/local/ebooks/main/ &amp;&amp; docker build --rm -t bots . &gt;&gt; /var/log/ebooks/build.log 2&gt;&amp;1 -00 25 * * * docker run -d --name bots bots &gt;&gt; /var/log/ebooks/run.log 2&gt;&amp;1 -</pre></div> - - -<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s&rsquo;executent en même temps.</p> -<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n&rsquo;est qu&rsquo;un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des -applications &ldquo;usuelles&rdquo; -dedans</a>, -puisque l&rsquo;overhead de Docker est minimal, et beaucoup d&rsquo;autres applications -existent.</p>WxcafeSat, 28 Feb 2015 14:11:00 +0100tag:wxcafe.net,2015-02-28:posts/docker-et-les-ebooks-sur-twitter/OpenSMTPd comme serveur mail sous debian//wxcafe.net/posts/opensmtpd-debian/<p>J&rsquo;avais dit il y a un certain temps que j&rsquo;allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j&rsquo;ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J&rsquo;ai donc totalement changé d&rsquo;infrastructure quand a la -gestion de mon système de mails.</p> -<p>Ainsi, j&rsquo;ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. <a href="https://opensmtpd.org">OpenSMTPd</a> est un -projet originaire d&rsquo;<a href="http://openbsd.org">OpenBSD</a> qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu&rsquo;a le projet OpenBSD, globalement).</p> -<p>Pour rappel, le système d&rsquo;emails fonctionne d&rsquo;une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.</p> -<p>Si vous avez bien suivi, vous pouvez voir que je n&rsquo;ai pas parlé de récupération -ni de lecture des mails. C&rsquo;est pour une raison simple, qui est que ces taches -sont remplies par d&rsquo;autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).</p> -<p>Or ce qui nous intéresse ici, ce n&rsquo;est pas simplement d&rsquo;envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c&rsquo;est pour -ça que ce tutoriel ne parlera pas que d&rsquo;OpenSMTPd mais aussi de <a href="http://dovecot.org/">Dovecot</a> qui fait office de serveur IMAP et -<a href="http://www.ijs.si/software/amavisd/">amavis</a>/<a href="http://spamassassin.apache.org/">spamassassin</a> -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭────────────────╮ ╭──────────╮ - │╭──────────────&gt;│────&gt; to filter ───&gt;│─╮ │ - mail in ││ │ │ │ amavis │ -───────────&gt;│╯ OpenSMTPd ╭──│&lt;─── from filter&lt;───│&lt;╯ │ - │ │ │ ╰──────────╯ - mail out │ │ │ ╭──────────╮ -&lt;───────────│&lt;────────────┴─&gt;│─────&gt; to MDA ─────&gt;│─────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰────────────────╯ ╰──────────╯ -</pre></div> - - -<p>Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d&rsquo;autres correspondants) sont transmis a OpenSMTPd, qui envoie tout a<code>amavis</code>, qui vérifie a la fois les spams et les malwares pour les mails -venants de l&rsquo;exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.</p> -<p>Voyons comment mettre cela en place. Tout d&rsquo;abord, il faut décider de la façon -dont les différents services vont communiquer.</p> -<p>Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s&rsquo;agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s&rsquo;agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.</p> -<p>Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -<code>/var/run/dovecot/lmtp</code>).</p> -<p>Ainsi, pour reprendre le schéma présenté plus haut :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭───────────╮ - │╭─────────────&gt;│──&gt; SMTP (10026) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10027) &lt;──│&lt;╯ (sign) │ - │ │ │ ╰───────────╯ - SMTP out │ │ │ -25 &lt;────────│&lt;───────────╯ │ - ╰───────────────╯ -</pre></div> - - -<p>Pour les mails sortants; et</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> ╭───────────────╮ ╭────────────╮ - │╭─────────────&gt;│──&gt; SMTP (10024) ──&gt;│─╮ │ - SMTP in ││ │ │ │ amavis │ -────────&gt; 25│╯ OpenSMTPd ╭──│&lt;── SMTP (10025) &lt;──│&lt;╯(filter) │ - │ │ │ ╰────────────╯ - │ │ │ ╭────────────╮ - │ ╰─&gt;│──&gt; LMTP (socket) ─&gt;│───────────&gt;│──&gt; to user&#39;s - │ │ │ dovecot │ mailbox - ╰───────────────╯ ╰────────────╯ -</pre></div> - - -<p>Pour les mails entrants.</p> -<p>Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d&rsquo;autres plateformes, la configuration devrait être sensiblement la même</p> -<p>(Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir <a href="http://wxcafe.net/posts/05/30/14/SSL-ou-la-securite-sur-internet/">ce -post</a>)</p> -<p>Tout d&rsquo;abord, commençons par installer les programmes nécessaires :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new -</pre></div> - - -<p>Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :</p> -<p><code>/etc/smtpd.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># This is the smtpd server system-wide configuration file.</span> -<span style="color: #75715e"># See smtpd.conf(5) for more information.</span> - -<span style="color: #75715e">## Certs</span> -pki exem.pl certificate <span style="color: #e6db74">&quot;/etc/certs/exem.pl.crt&quot;</span> -pki exem.pl key <span style="color: #e6db74">&quot;/etc/certs/exem.pl.key&quot;</span> - -<span style="color: #75715e">## Ports to listen on, and how to listen on them</span> -listen on eth0 port <span style="color: #ae81ff">25</span> tls pki exem.pl hostname exem.pl auth-optional -listen on eth0 port <span style="color: #ae81ff">465</span> tls-require pki exem.pl hostname exem.pl auth mask-source -listen on eth0 port <span style="color: #ae81ff">587</span> tls-require pki exem.pl hostname exem.pl auth mask-source - -<span style="color: #75715e">## Aliases</span> -table aliases file:/etc/aliases - -<span style="color: #75715e"># coming from amavisd, checked for spam/malware</span> -listen on lo port <span style="color: #ae81ff">10025</span> tag Filtered -<span style="color: #75715e"># coming from amavisd, signed with DKIM</span> -listen on lo port <span style="color: #ae81ff">10027</span> tag Signed - -<span style="color: #75715e">## Receiving</span> -<span style="color: #75715e"># if the (incoming) mail has been through amavisd, then we can deliver it</span> -accept tagged Filtered <span style="color: #66d9ef">for</span> any <span style="color: #f8f8f2">alias</span> &lt;aliases&gt; deliver to lmtp <span style="color: #e6db74">&quot;/var/run/dovecot/lmtp&quot;</span> -<span style="color: #75715e"># we directly tranfer incoming mail to amavisd to be checked </span> -accept from any <span style="color: #66d9ef">for</span> domain <span style="color: #e6db74">&quot;exem.pl&quot;</span> relay via <span style="color: #e6db74">&quot;smtp://localhost:10024&quot;</span> -<span style="color: #75715e"># we have to put these lines in this order to avoid infinite loops</span> - -<span style="color: #75715e">## Sending</span> -<span style="color: #75715e"># if the (outgoint) mail has been through amavisd, then we can deliver it</span> -accept tagged Signed <span style="color: #66d9ef">for</span> any relay -<span style="color: #75715e"># we tranfer the outgoing mail to amavisd to be signed</span> -accept <span style="color: #66d9ef">for</span> any relay via <span style="color: #e6db74">&quot;smtp://localhost:10026&quot;</span> -<span style="color: #75715e"># same, we have to put these lines in this order or infinite loops...</span> -</pre></div> - - -<p>Expliquons un peu ce fichier de configuration :</p> -<ul> -<li>Tout d&rsquo;abord, le paragraphe nommé &ldquo;Certs&rdquo; contient les déclaration - d&rsquo;emplacement des certificats SSL.</li> -<li>Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire</li> -<li>Les alias sont définis juste après</li> -<li>Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme &ldquo;Filtered&rdquo; et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme &ldquo;Signed&rdquo;</li> -<li>Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c&rsquo;est qu&rsquo;il n&rsquo;a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l&rsquo;état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis</li> -<li>Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n&rsquo;a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu&rsquo;il le signe. Le - problème de l&rsquo;ordre des lignes se pose encore, pour la même raison qu&rsquo;au - dessus.</li> -</ul> -<p>Nous allons maintenant configurer dovecot. Comme nous l&rsquo;avons vu, dovecot doit -écouter en LMTP via la socket <code>/var/run/dovecot/lmtp</code> et transmettre les -emails a la boite email de l&rsquo;utilisateur. Il serait aussi interessant -qu&rsquo;il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.</p> -<p><code>/etc/dovecot/dovecot.conf</code></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Dovecot configuration file</span> - -<span style="color: #75715e"># basic config</span> -<span style="color: #f8f8f2">info_log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot-info.log -<span style="color: #f8f8f2">log_path</span> <span style="color: #f92672">=</span> /var/log/dovecot.log -<span style="color: #f8f8f2">log_timestamp</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;%Y-%m-%d %H:%M:%S &quot;</span> -<span style="color: #f8f8f2">mail_location</span> <span style="color: #f92672">=</span> maildir:%h/mail - -<span style="color: #75715e"># authentication</span> -passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -userdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> passwd -<span style="color: #f92672">}</span> - -<span style="color: #75715e"># the protocols we use</span> -<span style="color: #f8f8f2">protocols</span> <span style="color: #f92672">=</span> imap lmtp sieve - -<span style="color: #75715e"># ssl config</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.cert -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/exem.pl.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> yes - -<span style="color: #75715e">## configuring services </span> -<span style="color: #75715e"># disables imap login without SSL (yes dovecot is dumb that way)</span> -service imap-login <span style="color: #f92672">{</span> - inet_listener imap <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">port</span><span style="color: #f92672">=</span><span style="color: #ae81ff">0</span> - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -service lmtp <span style="color: #f92672">{</span> - unix_listener lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mode</span> <span style="color: #f92672">=</span> 0666 - <span style="color: #f92672">}</span> -<span style="color: #f92672">}</span> - -<span style="color: #75715e">## configuring protocols</span> -<span style="color: #75715e"># the dovecot lda, we set it to use sieve</span> -protocol lda <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -protocol lmtp <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">postmaster_address</span> <span style="color: #f92672">=</span> whoever@exem.pl - <span style="color: #f8f8f2">mail_plugins</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">$mail_plugins</span> sieve -<span style="color: #f92672">}</span> - -plugin <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">sieve</span> <span style="color: #f92672">=</span> ~/.dovecot.sieve - <span style="color: #f8f8f2">sieve_dir</span> <span style="color: #f92672">=</span> ~/sieve -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>ATTENTION: Sous OpenBSD, remplacez</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> pam -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>par</strong></p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">passdb <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">driver</span> <span style="color: #f92672">=</span> bsdauth -<span style="color: #f92672">}</span> -</pre></div> - - -<p><strong>pour identifier les utilisateurs système</strong></p> -<p>Ici aussi, voyons comment ce fichier est structuré :</p> -<ul> -<li>Tout d&rsquo;abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l&rsquo;endroit ou seront stockés les mails des utilisateurs.</li> -<li>Nous configurons ensuite la gestion de l&rsquo;authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)</li> -<li>Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l&rsquo;IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).</li> -<li>Nous configurons le SSL</li> -<li>Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d&rsquo;activer IMAPS qu&rsquo;en activant - IMAP avec. Comme nous ne voulons pas d&rsquo;IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu&rsquo;il utilise</li> -<li>Nous configurons maintenant les protocoles, pour faire fonctionner Sieve</li> -<li>enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.</li> -</ul> -<p>Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n&rsquo;y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis<code>/usr/local/share/examples/amavisd-new/amavisd.conf</code> et ajoutez les -modifications nécessaires a la fin du fichier.</p> -<p><code>/etc/amavis/conf.d/99-local.conf</code> (debian) -<code>/etc/amavis.conf</code> (OpenBSD)</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #66d9ef">use</span> <span style="color: #f8f8f2">strict;</span> - -<span style="color: #f8f8f2">$enable_dkim_verification</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">$enable_dkim_signing</span> <span style="color: #f92672">=</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">dkim_key(</span><span style="color: #e6db74">&quot;exem.pl&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f8f8f2">,</span> <span style="color: #e6db74">&quot;/etc/certs/dkim.key&quot;</span> <span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">@dkim_signature_options_bysender_maps</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">(</span> - <span style="color: #f8f8f2">{</span> <span style="color: #e6db74">&#39;.&#39;</span> <span style="color: #f92672">=&gt;</span> - <span style="color: #f8f8f2">{</span> <span style="color: #f8f8f2">ttl</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">21</span><span style="color: #f92672">*</span><span style="color: #ae81ff">24</span><span style="color: #f92672">*</span><span style="color: #ae81ff">3600</span><span style="color: #f8f8f2">,</span> <span style="color: #f8f8f2">c</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;relaxed/simple&#39;</span> <span style="color: #f8f8f2">}</span> - <span style="color: #f8f8f2">}</span> -<span style="color: #f8f8f2">);</span> - -<span style="color: #f8f8f2">$inet_socket_port</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">10024</span><span style="color: #f8f8f2">,</span> <span style="color: #ae81ff">10026</span><span style="color: #f8f8f2">];</span> -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;MYNETS&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">os_fingerprint_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">undef,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #f8f8f2">$interface_policy{</span><span style="color: #e6db74">&#39;10026&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">;</span> - -<span style="color: #f8f8f2">$policy_bank{</span><span style="color: #e6db74">&#39;ORIGINATING&#39;</span><span style="color: #f8f8f2">}</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">originating</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">allow_disclaimers</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">virus_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">spam_admin_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&quot;root\@$mydomain&quot;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">warnbadhsender</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">forward_method</span> <span style="color: #f92672">=&gt;</span> <span style="color: #e6db74">&#39;smtp:localhost:10027&#39;</span><span style="color: #f8f8f2">,</span> - <span style="color: #f8f8f2">smtpd_discard_ehlo_keywords</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #e6db74">&#39;8BITMIME&#39;</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">bypass_banned_checks_maps</span> <span style="color: #f92672">=&gt;</span> <span style="color: #f8f8f2">[</span><span style="color: #ae81ff">1</span><span style="color: #f8f8f2">],</span> - <span style="color: #f8f8f2">terminate_dsn_on_notify_success</span> <span style="color: #f92672">=&gt;</span> <span style="color: #ae81ff">0</span><span style="color: #f8f8f2">,</span> -<span style="color: #f8f8f2">};</span> - -<span style="color: #75715e">#------------ Do not modify anything below this line -------------</span> -<span style="color: #ae81ff">1</span><span style="color: #f8f8f2">;</span> <span style="color: #75715e"># ensure a defined return</span> -</pre></div> - - -<p>A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu&rsquo;amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l&rsquo;endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la <a href="https://tools.ietf.org/html/rfc4871">RFC 4871</a> -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme &ldquo;originating&rdquo; et nous ne vérifierons pas l&rsquo;OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d&rsquo;abord, nous réaffirmons qu&rsquo;ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la <a href="https://tools.ietf.org/html/rfc4871">RFC - 4871</a>. Nous déclarons l&rsquo;adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu&rsquo;il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d&rsquo;envoi. Et voila!</p> -<p>Vous avez pu remarquer qu&rsquo;a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.</p> -<p>Il nous reste cependant quelques opérations a faire, encore. -Tout d&rsquo;abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j&rsquo;ai personnellement utilisé opendkim (<a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy">un -tutorial</a>) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">#rewrite_header Subject *****SPAM*****</span> -<span style="color: #75715e"># report_safe 1</span> -<span style="color: #f8f8f2">required_score</span> <span style="color: #ae81ff">2.0</span> -<span style="color: #75715e"># use_bayes 1</span> -<span style="color: #75715e"># bayes_auto_learn 1</span> -<span style="color: #75715e"># bayes_ignore_header X-Bogosity</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Flag</span> -<span style="color: #75715e"># bayes_ignore_header X-Spam-Status</span> -<span style="color: #f8f8f2">ifplugin</span> <span style="color: #f8f8f2">Mail::SpamAssassin::Plugin::Shortcircuit</span> -<span style="color: #75715e"># shortcircuit USER_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_DEF_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_ALL_SPAM_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_WHITELIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST on</span> -<span style="color: #75715e"># shortcircuit USER_IN_BLACKLIST_TO on</span> -<span style="color: #75715e"># shortcircuit SUBJECT_IN_BLACKLIST on</span> -<span style="color: #f8f8f2">shortcircuit</span> <span style="color: #f8f8f2">ALL_TRUSTED</span> <span style="color: #f8f8f2">off</span> -<span style="color: #75715e"># shortcircuit BAYES_99 spam</span> -<span style="color: #75715e"># shortcircuit BAYES_00 ham</span> - -<span style="color: #f8f8f2">endif</span> <span style="color: #75715e"># Mail::SpamAssassin::Plugin::Shortcircuit</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.</p> -<p>Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement</p> -<p>Bon courage pour votre hosting de mail ensuite&hellip;</p>WxcaféFri, 07 Nov 2014 13:04:00 +0100tag:wxcafe.net,2014-11-07:posts/opensmtpd-debian/Installer FreeBSD sur un serveur Online avec MfsBSD//wxcafe.net/posts/freebsd-online-mfsbsd/<p>J&rsquo;ai récemment eu l&rsquo;occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester <a href="http://bhyve.org/">bhyve</a>) -et n&rsquo;ayant pour différentes raisons pas eu l&rsquo;occasion de le faire sur mon <a href="http://home.wxcafe.net">serveur auto-hebergé</a> ni sur <a href="http://wxcafe.net">ce serveur ci</a>, -j&rsquo;ai commencé a chercher comment le faire sur ce serveur.</p> -<p>Étant donné que Online ne propose pas directement d&rsquo;image FreeBSD sur ses serveurs, il m&rsquo;a fallu -chercher un peu plus loin. Il se trouve que <a href="http://forum.online.net/index.php?/topic/3557-installation-de-freebsd-91-amd64-sur-une-dedibox-lt15k-2013/">ce post</a> sur les forums -d&rsquo;online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier. </p> -<p>J&rsquo;ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l&rsquo;on m&rsquo;a dirigé vers <a href="http://mfsbsd.vx.sk/">mfsbsd</a>, un projet d&rsquo;installeur -alternatif, minimaliste et simplifié pour FreeBSD.</p> -<p>Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l&rsquo;image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l&rsquo;image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l&rsquo;image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l&rsquo;air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d&rsquo;installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.</p> -<p>Utilisez donc ce script ainsi : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># tout d&#39;abord, wipons le MBR :</span> -dd &lt; /dev/zero &gt; /dev/da0 <span style="color: #f8f8f2">count</span><span style="color: #f92672">=</span>1 -<span style="color: #75715e"># maintenant, installons le système</span> -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c -</pre></div> - - -<p>Avec <code>-g da0</code> votre disque dur principal, <code>-s 2G</code> la quantité de swap désirée, -<code>-p root</code> le nom du zpool, et <code>-c</code> pour activer la compression. D&rsquo;autres options -sont disponibles, je vous invite a faire un <code>zfsinstall -h</code> si mon setup ne vous -convient pas.</p> -<p>Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">zfs_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES&quot;</span> -<span style="color: #f8f8f2">sshd_load</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;YES</span> -<span style="color: #f8f8f2">hostname</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;whatever&quot;</span> -<span style="color: #f8f8f2">ifconfig_igb0</span><span style="color: #f92672">=</span><span style="color: #e6db74">&quot;DHCP&quot;</span> -</pre></div> - - -<p>Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!</p> -<p>Voila, c&rsquo;est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l&rsquo;IPv6 chez online est&hellip; peu -crédible, disons)</p> -<p>Bon sinon sur d&rsquo;autres sujets, j&rsquo;ai mis en place des bots twitter : <a href="https://twitter.com/wxcafe_ebooks">wxcafe_ebooks</a>, -<a href="https://twitter.com/petitefanfare">petitefanfare</a>, -<a href="https://twitter.com/capet_ebooks">capet_ebooks</a>, -<a href="https://twitter.com/zengisse">zengisse</a>, -et <a href="https://wxcafe.net/kim_ebooks">kim_ebooks</a>. Ils sont tous basés sur <a href="https://github.com/wxcafe/ebooks_example">ce -code</a>, qui vient de -<a href="https://twitter.com/m1sp">@m1sp</a> -(<a href="https://github.com/twitter_ebooks">github.com/twitter_ebooks</a>). Donc voila.</p> -<p>A plus</p>WxcafeThu, 28 Aug 2014 12:16:00 +0200tag:wxcafe.net,2014-08-28:posts/freebsd-online-mfsbsd/SSL ou la sécurité sur l'internet//wxcafe.net/posts/SSL-ou-la-securite-sur-internet/<p><em>Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: <a href="https://www.youtube.com/watch?v=ibF36Yyeehw">More Tricks for Defeating SSL</a>, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -<a href="http://www.thoughtcrime.org/blog/lavabit-critique/">A Critique of Lavabit</a>, -ce qui peut avoir l&rsquo;effet de rendre légèrement parano. Si vous considérez que -c&rsquo;est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)</em></p> -<p>Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.</p> -<p>Cela fait suite aux évènements évoqués dans le <em>Disclaimer</em>, mais aussi a des -doigts sortis d&rsquo;un endroit particulier du corps de l&rsquo;admin/auteur de ce &ldquo;blog&rdquo;, -qui a pris <strong>enfin</strong> les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d&rsquo;un système -fonctionnel utilisant cette compréhension récemment acquise.</p> -<p>Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c&rsquo;est très -simple : il existait auparavant un certificat pour <code>wxcafe.net</code>, un pour -<code>paste.wxcafe.net</code>, un pour <code>mail.wxcafe.net</code>, etc&hellip; Bref, un certificat -différent pour chaque sous-domaine.</p> -<p>Il s&rsquo;avère que c&rsquo;est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d&rsquo;erreur, etc) et pas plus -sécurisé que d&rsquo;avoir un seul certificat wildcard. J&rsquo;ai donc généré un certificat -pour <code>*.wxcafe.net</code> hier, et il sera dorénavant utilisé pour tous les -sous-domaine de <code>wxcafe.net</code>; et un certificat pour <code>wxcafe.net</code>, qui ne matche -pas <code>*.wxcafe.net</code>, et qui sera donc utilisé&hellip; bah pour <code>wxcafe.net</code>.</p> -<p>Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l&rsquo;arrivée sur le site ne commence pas -par une page firefox disant &ldquo;Something&rsquo;s Wrong!&rdquo;, et ces redirections ne seront -donc pas mises en place.</p> -<p>De plus, après la lecture de l&rsquo;article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c&rsquo;est a dire que, même si -quelqu&rsquo;un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.</p> -<p>Bon, maintenant que les explications basiques sont faites, voyons -l&rsquo;implémentation : <br /> -Pour générer la clé, tout d&rsquo;abord, il convient d&rsquo;utiliser les commandes -suivantes: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo openssl genrsa -out example.key 4096 -# nous utilisons ici une clé de <span style="color: #ae81ff">4096</span> bits, la taille est laissée a votre appréciation -sudo openssl req -new -key example.key -out example.csr -# OpenSSL va ici vous demander de nombreuses informations, <span style="color: #e6db74">&quot;Common Name&quot;</span> devant contenir le FQDN -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt -# enfin, nous générons la clé, d<span style="color: #960050; background-color: #1e0010">&#39;</span>une durée de vie de <span style="color: #ae81ff">3</span> ans -</pre></div> - - -<p>Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -<code>*.example.com</code> comme common name. -Une fois la clé générée, il faut dire aux différents services de l&rsquo;utiliser, et -de n&rsquo;utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j&rsquo;utilise :</p> -<h3>apache :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/apache2/mods_enabled/ssl.conf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLProtocol</span> <span style="color: #66d9ef">all</span> -SSLv2 -SSLv3 -<span style="color: #f8f8f2">SSLHonorCipherOrder</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCipherSuite</span> <span style="color: #960050; background-color: #1e0010">&quot;</span>EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \ - EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \ - EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS<span style="color: #960050; background-color: #1e0010">&quot;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/apache2/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">SSLEngine</span> <span style="color: #66d9ef">on</span> -<span style="color: #f8f8f2">SSLCertificateFile</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #f8f8f2">SSLCertificateKeyFile</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>nginx :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/nginx/nginx.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl_protocols</span> <span style="color: #e6db74">TLSv1</span> <span style="color: #e6db74">TLSv1.1</span> <span style="color: #e6db74">TLSv1.2</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_prefer_server_ciphers</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_ciphers</span> <span style="color: #e6db74">&quot;EECDH+ECDSA+AESGCM</span> <span style="color: #e6db74">EECDH+aRSA+AESGCM</span> <span style="color: #e6db74">EECDH+ECDSA+SHA384</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH+ECDSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+SHA384</span> <span style="color: #e6db74">EECDH+aRSA+SHA256</span> <span style="color: #e6db74">EECDH+aRSA+RC4</span> <span style="color: #e6db74">\</span> - <span style="color: #e6db74">EECDH</span> <span style="color: #e6db74">EDH+aRSA</span> <span style="color: #e6db74">RC4</span> <span style="color: #e6db74">!aNULL</span> <span style="color: #e6db74">!eNULL</span> <span style="color: #e6db74">!LOW</span> <span style="color: #e6db74">!3DES</span> <span style="color: #e6db74">!MD5</span> <span style="color: #e6db74">!EXP</span> <span style="color: #e6db74">!PSK</span> <span style="color: #e6db74">!SRP</span> <span style="color: #e6db74">!DSS&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #75715e"># /etc/nginx/sites-enabled/default-ssl</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #66d9ef">ssl</span> <span style="color: #66d9ef">on</span><span style="color: #f8f8f2">;</span> -<span style="color: #66d9ef">ssl_certificate</span> <span style="color: #e6db74">/etc/certs/example.com.crt</span> -<span style="color: #e6db74">ssl_certificate_key</span> <span style="color: #e6db74">/etc/certs/example.com.key</span> -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>prosody (jabber) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">#</span> <span style="color: #f8f8f2">tout</span> <span style="color: #f8f8f2">d</span><span style="color: #e6db74">&#39;abord, lancez la commande suivante :</span> -<span style="color: #f8f8f2">sudo</span> <span style="color: #f8f8f2">openssl</span> <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">-</span><span style="color: #f8f8f2">out</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">certs</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">dh</span><span style="color: #f92672">-</span><span style="color: #ae81ff">2048.</span><span style="color: #f8f8f2">pem</span> <span style="color: #ae81ff">2048</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">ensuite,</span> <span style="color: #f8f8f2">pour</span> <span style="color: #f8f8f2">chaque</span> <span style="color: #f8f8f2">VirtualHost</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f92672">/</span><span style="color: #f8f8f2">etc</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">prosody.conf</span> <span style="color: #f8f8f2">:</span> -<span style="color: #f8f8f2">ssl</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">{</span> - <span style="color: #f8f8f2">dhparam</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/prosody/certs/dh-2048.pem&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">key</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.key&quot;</span><span style="color: #f8f8f2">;</span> - <span style="color: #f8f8f2">certificate</span> <span style="color: #f92672">=</span> <span style="color: #e6db74">&quot;/etc/certs/example.com.crt&quot;</span><span style="color: #f8f8f2">;</span> -<span style="color: #f8f8f2">}</span> -<span style="color: #f92672">#</span> <span style="color: #f8f8f2">la</span> <span style="color: #f8f8f2">cipher</span> <span style="color: #f8f8f2">suite</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">prosody</span> <span style="color: #f8f8f2">utilise</span> <span style="color: #f8f8f2">par</span> <span style="color: #f8f8f2">d</span><span style="color: #960050; background-color: #1e0010">é</span><span style="color: #f8f8f2">faut</span> <span style="color: #f8f8f2">EDH</span> <span style="color: #f8f8f2">et</span> <span style="color: #f8f8f2">EECDH</span> -</pre></div> - - -<h3>postfix (email) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/postfix/main.cf</span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">smtpd_tls_cert_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.crt -<span style="color: #f8f8f2">smtpd_tls_key_file</span> <span style="color: #f92672">=</span> /etc/certs/example.com.key -<span style="color: #f8f8f2">tls_preempt_cipherlist</span> <span style="color: #f92672">=</span> yes -<span style="color: #f8f8f2">smtpd_tls_eecdh_grade</span> <span style="color: #f92672">=</span> strong -<span style="color: #f8f8f2">smtdp_tls_mandatory_ciphers</span> <span style="color: #f92672">=</span> high -<span style="color: #f8f8f2">smtpd_tls_mandatory_exclude_ciphers</span> <span style="color: #f92672">=</span> aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS -<span style="color: #f8f8f2">smtpd_tls_security_level</span> <span style="color: #f92672">=</span> encrypt -<span style="color: #f8f8f2">smtpd_tls_mandatory_protocols</span> <span style="color: #f92672">=</span> !SSLv2, !SSLv3 -<span style="color: #f8f8f2">smtpd_use_tls</span> <span style="color: #f92672">=</span> yes -<span style="color: #75715e"># [...]</span> -</pre></div> - - -<h3>dovecot (imap) :</h3> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e"># /etc/dovecot/dovecot.conf </span> -<span style="color: #75715e"># [...]</span> -<span style="color: #f8f8f2">ssl_cert</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.crt -<span style="color: #f8f8f2">ssl_key</span> <span style="color: #f92672">=</span> &lt;/etc/certs/example.com.key -<span style="color: #f8f8f2">ssl_cipher_list</span> <span style="color: #f92672">=</span> HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL -</pre></div> - - -<p>Voila. Pour d&rsquo;autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.</p> -<p>Cela étant dit, je conseille a tout le monde d&rsquo;aller voir la conférence dans le -disclaimer, et tant qu&rsquo;a faire la conférence du même hacker <a href="https://www.youtube.com/watch?v=8N4sb-SEpcg">SSL and the future -of Authenticity</a> qui parle de son -implémentation d&rsquo;une technologie &ldquo;remplaçant&rdquo; le système de CAs qui existe -actuellement.</p>WxcafeFri, 30 May 2014 08:25:00 +0200tag:wxcafe.net,2014-05-30:posts/SSL-ou-la-securite-sur-internet/Mise en place d'un serveur DNS//wxcafe.net/posts/mise-en-place-dun-serveur-dns/<p>Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a <a href="http://173.194.45.66">http://173.194.45.66</a>, ou a -<a href="http://199.16.156.70">http://199.16.156.70</a>. Voire même a -<a href="http://5.39.76.46">http://5.39.76.46</a>).</p> -<p>Cependant, le DNS est un système qui date de 1984, et les exigences de l&rsquo;époque -en termes d&rsquo;expérience utilisateur n&rsquo;étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.</p> -<p>Tout d&rsquo;abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est <code>/</code>, celle de DNS est <code>.</code>, et là ou il convient d&rsquo;écrire, par exemple,<code>/usr/</code> et ou la progression se fait de gauche a droite pour le FS, pour DNS le -<code>.</code> n&rsquo;est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) <code>com</code>, et le domaine -<code>google.com</code> appartient a <code>com</code>, on écrit donc <code>google.com</code> sans écrire le point -a la fin de façon courante.</p> -<p>Le reverse DNS est une variante du DNS &ldquo;classique&rdquo; permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n&rsquo;a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les &ldquo;adresses&rdquo; que l&rsquo;on query en reverse DNS -sont donc constituées de l&rsquo;adresse IP, <strong><em>dans le sens contraire a l&rsquo;ordre -habituel</em></strong>, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire <code>dig PTR -76.46.39.5.in-addr.arpa</code>. La réponse sera, évidemment, <code>wxcafe.net</code></p> -<p>Voyons maintenant comment mettre en place son propre serveur DNS. Tout d&rsquo;abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est <code>dig</code>. Le DNS fonctionne avec des -&ldquo;enregistrements&rdquo;, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. <code>dig</code> se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n&rsquo;importe quelle information : par exemple, <code>dig NS -wxcafe.net</code> devrait vous renvoyer</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f92672">;</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">DiG</span> <span style="color: #f92672">9</span><span style="color: #a6e22e">.8.4-rpz2</span><span style="color: #f92672">+rl005</span><span style="color: #a6e22e">.12-P1</span> <span style="color: #f92672">&lt;&lt;&gt;&gt;</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">global</span> <span style="color: #f92672">options:</span> <span style="color: #f92672">+cmd</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">Got</span> <span style="color: #f92672">answer:</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">-&gt;&gt;HEADER&lt;&lt;-</span> <span style="color: #f92672">opcode:</span> <span style="color: #f92672">QUERY,</span> <span style="color: #f92672">status:</span> <span style="color: #f92672">NOERROR,</span> <span style="color: #f92672">id:</span> <span style="color: #f92672">13846</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">flags:</span> <span style="color: #f92672">qr</span> <span style="color: #f92672">rd</span> <span style="color: #f92672">ra;</span> <span style="color: #f92672">QUERY:</span> <span style="color: #f92672">1,</span> <span style="color: #f92672">ANSWER:</span> <span style="color: #f92672">2,</span> <span style="color: #f92672">AUTHORITY:</span> <span style="color: #f92672">0,</span> <span style="color: #f92672">ADDITIONAL:</span> <span style="color: #f92672">0</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">QUESTION</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">;wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">ANSWER</span> <span style="color: #f92672">SECTION:</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.wxcafe.net</span><span style="color: #f92672">.</span> -<span style="color: #f92672">wxcafe</span><span style="color: #a6e22e">.net</span><span style="color: #f92672">.</span> <span style="color: #f92672">3600</span> <span style="color: #f92672">IN</span> <span style="color: #f92672">NS</span> <span style="color: #f92672">ns</span><span style="color: #a6e22e">.home.wxcafe.net</span><span style="color: #f92672">.</span> - -<span style="color: #f92672">;;</span> <span style="color: #f92672">Query</span> <span style="color: #f92672">time:</span> <span style="color: #f92672">60</span> <span style="color: #f92672">msec</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">SERVER:</span> <span style="color: #f92672">10</span><span style="color: #a6e22e">.0.42.1#53</span><span style="color: #f92672">(10</span><span style="color: #a6e22e">.0.42.1</span><span style="color: #f92672">)</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">WHEN:</span> <span style="color: #f92672">Tue</span> <span style="color: #f92672">Dec</span> <span style="color: #f92672">10</span> <span style="color: #f92672">13</span><span style="color: #a6e22e">:31:18</span> <span style="color: #f92672">2013</span> -<span style="color: #f92672">;;</span> <span style="color: #f92672">MSG</span> <span style="color: #f92672">SIZE</span> <span style="color: #f92672">rcvd:</span> <span style="color: #f92672">67</span> -</pre></div> - - -<p>Comme vous pouvez le voir, les serveurs DNS principaux pour -<a href="http://wxcafe.net">wxcafe.net</a> sont <code>ns.wxcafe.net</code> et <code>ns.home.wxcafe.net</code>, -qui sont respectivement des alias pour <code>wxcafe.net</code> et <code>home.wxcafe.net</code>. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l&rsquo;adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu&rsquo;il est en train de faire une boucle infinie et -demandera l&rsquo;adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.</p> -<p>La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d&rsquo;écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : <code>named.conf</code>, -<code>named.conf.default-zones</code>, <code>named.conf.local</code> et <code>named.conf.options</code>. -<code>named.conf</code> contient les options par défaut de bind, <code>named.conf.default-zones</code> -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -<code>named.conf.local</code> contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.</p> -<p>Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l&rsquo;autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi). </p> -<p>Examinons tout d&rsquo;abord les fichiers de configuration de named.<code>named.conf.local</code> contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones <code>wxcafe.net</code> et <code>76.46.39.5.in-addr.arpa</code> sont gérées -en master, et les zones <code>home.wxcafe.net</code> et <code>103.177.67.80.in-addr.arpa</code> sont -gérées en slave. Nous n&rsquo;examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l&rsquo;un héberge en slave les masters de l&rsquo;autre. -Le fichier <code>named.conf.local</code> sur wxcafe.net contient donc </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">zone <span style="color: #e6db74">&quot;wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;home.wxcafe.net&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/home.wxcafe.net&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;46.76.39.5.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>master<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/master/46.76.39.5.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - allow-transfer <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> - -zone <span style="color: #e6db74">&quot;103.177.67.80.in-addr.arpa&quot;</span> <span style="color: #f92672">{</span> - <span style="color: #f8f8f2">type </span>slave<span style="color: #f8f8f2">;</span> - file <span style="color: #e6db74">&quot;/etc/bind/slave/103.177.67.80.in-addr.arpa&quot;</span><span style="color: #f8f8f2">;</span> - masters <span style="color: #f92672">{</span> - 80.67.177.103<span style="color: #f8f8f2">;</span> - <span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -<span style="color: #f92672">}</span><span style="color: #f8f8f2">;</span> -</pre></div> - - -<p>Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans <code>/etc/bind/master/</code>, et les slaves un fichier dans -<code>/etc/bind/slave/</code>, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.</p> -<p>Voyons maintenant le fichier de zone concernant wxcafe.net, soit -<code>/etc/bind/master/wxcafe.net</code> : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">$TTL</span> <span style="color: #ae81ff">3600</span> <span style="color: #f8f8f2">;</span> <span style="color: #ae81ff">1</span> <span style="color: #f8f8f2">hour</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SOA</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">(</span> - <span style="color: #ae81ff">2014011001</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">serial</span> - <span style="color: #ae81ff">3</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">refresh</span> - <span style="color: #ae81ff">1</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">retry</span> - <span style="color: #ae81ff">168</span><span style="color: #f8f8f2">h</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">expire</span> - <span style="color: #ae81ff">300</span> <span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">negative</span> <span style="color: #f8f8f2">response</span> <span style="color: #f8f8f2">ttl</span> - <span style="color: #f8f8f2">)</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Name</span> <span style="color: #f8f8f2">servers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Mail</span> <span style="color: #f8f8f2">exchangers</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">MX</span> <span style="color: #ae81ff">10</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">SPF</span> <span style="color: #e6db74">&quot;v=spf1 ip4:5.39.76.46 a -all&quot;</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Main</span> <span style="color: #f8f8f2">A</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">AAAA</span> <span style="color: #f8f8f2">records</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">5.39.76.46</span> - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">Aliases</span> -<span style="color: #f8f8f2">data</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">[</span><span style="color: #f92672">...</span><span style="color: #f8f8f2">]</span> -<span style="color: #f8f8f2">www</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">CNAME</span> <span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - - -<span style="color: #f8f8f2">;</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> <span style="color: #f8f8f2">definition</span> -<span style="color: #f8f8f2">$ORIGIN</span> <span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">@</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">home</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">NS</span> <span style="color: #f8f8f2">ns</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">wxcafe</span><span style="color: #f92672">.</span><span style="color: #f8f8f2">net</span><span style="color: #f92672">.</span> -<span style="color: #f8f8f2">ns</span> <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> - <span style="color: #f8f8f2">IN</span> <span style="color: #f8f8f2">A</span> <span style="color: #ae81ff">80.67.177.103</span> -</pre></div> - - -<p>Alors. Expliquons ligne par ligne.<br /> -Tout d&rsquo;abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone. <br /> -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net. <br /> -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l&rsquo;ordre :<br /> - - Le nameserver autoritaire pour le nom de domaine en question,<br /> - - L&rsquo;adresse email du responsable de cette zone, avec le premier point - remplacé par un @, </p> -<p>puis entre parenthèses :<br /> - - Le numéro de série (&ldquo;version&rdquo; du fichier de zone, ici au format - YYYYMMDDNN) <br /> - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire, <br /> - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible, <br /> - - La période d&rsquo;expire, le temps qu&rsquo;attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin <br /> - - La période de TTL négatif, le temps qu&rsquo;attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable. </p> -<p>Bon, tout ceci est peut-être un peu confus, mais ce n&rsquo;est pas le record le plus -important a lire (pour les humains en tout cas). Continuons : </p> -<p>NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine. </p> -<p>MX permet d&rsquo;indiquer ou il convient d&rsquo;envoyer les emails pour ce domaine. -SPF est un record d&rsquo;authentification pour les emails. -Les records A désignent l&rsquo;association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n&rsquo;est pas encore en IPv6.</p> -<p>Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d&rsquo;autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d&rsquo;Apache, pour le web)</p> -<p>Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l&rsquo;adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l&rsquo;a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.</p> -<p>Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n&rsquo;étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c&rsquo;est pas les mêmes domaines&hellip;).</p> -<p>Voila donc une courte explication de ce qu&rsquo;est le DNS. Bien entendu, tout n&rsquo;est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le <a href="https://www.ietf.org/rfc/rfc1034.txt">RFC -1034</a> et le -<a href="https://www.ietf.org/rfc/rfc1035.txt">RFC 1035</a>. Dans un autre style (bien plus -avancé) le blog de <a href="http://bortzmeyer.org">Stéphane Bortzmeyer</a> est interessant -aussi.</p>WxcafeMon, 24 Feb 2014 02:49:00 +0100tag:wxcafe.net,2014-02-24:posts/mise-en-place-dun-serveur-dns/NAT//wxcafe.net/posts/nat/<p>NAT (Network Address Translation) in a word?<br /> -It&rsquo;s complicated. Very. Don&rsquo;t do it, you&rsquo;d damage your brain. </p> -<p>Bon, sinon, prochain article serieux vite, bisous.</p>wxcaféMon, 17 Feb 2014 05:02:00 +0100tag:wxcafe.net,2014-02-17:posts/nat/Plan9 from whichever space//wxcafe.net/posts/plan-9-from-whichever-space/<p><a href="http://en.wikipedia.org/wiki/Plan_9_from_Outer_Space"><strong>Plan 9 from Outer Space</strong></a> est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l&rsquo;un des pires films jamais sortis. Rempli -d&rsquo;erreur de montage, d&rsquo;effets spéciaux au rabais, et ayant même connu la mort -d&rsquo;un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.</p> -<p><a href="http://plan9.bell-labs.com/plan9/"><strong>Plan 9 from Bell Labs</strong></a> est un OS venant de Bell Labs (comme son nom l&rsquo;indique), -et qui a été pensé comme le successeur d&rsquo;Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu&rsquo;à leur but naturel. Ainsi, c&rsquo;est Plan9 qui a -introduit le concept d&rsquo;UnionFS, le protocole 9P qui permet d&rsquo;acceder a des -ressources appartenant a d&rsquo;autres ordinateurs a distance, un support de -l&rsquo;unicode par défaut et sur tout le système (a l&rsquo;inverse d&rsquo;Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d&rsquo;autres améliorations sur les thèmes de base que propose Unix. </p> -<p>Cependant, Plan9 n&rsquo;a jamais été véritablement utilisé pour quoi que ce soit -d&rsquo;autre que la recherche en systèmes, et c&rsquo;est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d&rsquo;intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme &ldquo;cloud -computing&rdquo; n&rsquo;apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.</p> -<p>En effet, même si l&rsquo;on considère que les nouveautés qu&rsquo;il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu&rsquo;elles sont déjà -conséquentes), lorsqu&rsquo;on les prend ensemble, elles font de Plan9 le système -d&rsquo;exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d&rsquo;un système -distant comme n&rsquo;étant qu&rsquo;une poignée de fichiers permet de le monter comme -n&rsquo;importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s&rsquo;ils sont hétérogènes (c&rsquo;est a dire provenant -de machines différentes), permet d&rsquo;utiliser les ressources d&rsquo;une machine -distante comme si elle était présente localement. Le mécanisme d&rsquo;UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).</p> -<p>Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d&rsquo;ordinateur lorsque le concept même du système est d&rsquo;être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d&rsquo;implémenter très facilement -différents concepts réseaux : en montant le /net d&rsquo;un ordinateur du réseau local -sur celui servant de gateway vers l&rsquo;internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d&rsquo;un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l&rsquo;accès de l&rsquo;ordinateur distant, et les connections entre les -deux sont chiffrées. </p> -<p>Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur &ldquo;puissance&rdquo; de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s&rsquo;est doté du support de jusqu&rsquo;à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu&rsquo;ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu&rsquo;ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l&rsquo;a été X11, et de nombreuses autres -améliorations sur Unix.</p> -<p>Malheureusement, il n&rsquo;a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : &ldquo;worse is better&rdquo;. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 <em>via</em> son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc&hellip;</p>WxcafeMon, 09 Sep 2013 11:17:00 +0200tag:wxcafe.net,2013-09-09:posts/plan-9-from-whichever-space/Sed Basics//wxcafe.net/posts/sed-basics/<p><code>sed</code> est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.<br /> -Or <code>sed</code> a bien plus de possibilités que ça, comme nous allons le voir.</p> -<p>Tout d&rsquo;abord, rappelons les bases : <code>sed</code> est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de <code>ed</code>, l&rsquo;éditeur original.<code>ed</code> est un éditeur de ligne, conçu a l&rsquo;époque ou les ordinateurs n&rsquo;étaient pas -personnels et étaient utilisés avec des <a href="http://fr.wikipedia.org/wiki/telescripteur">téléscripteurs</a>, c&rsquo;est a dire des -machines dépourvues d&rsquo;écrans et ne permettant donc pas l&rsquo;utilisation d&rsquo;éditeurs -dits &ldquo;visuels&rdquo;, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. <code>sed</code> est donc une évolution de <code>ed</code>, le -s signifiant stream, <code>sed</code> est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir <a href="http://fr.wikipedia.org/wiki/Flux_standard">Flux standards</a>) pour éditer plus d&rsquo;une ligne a la fois. -En pratique, <code>sed</code> est principalement utilisé sur des fichiers.</p> -<p><code>sed</code> a quelques options pratique, notamment <code>-s</code> qui permet d&rsquo;empêcher -l&rsquo;affichage systématique des lignes traitées, ou bien <code>-i</code> (pour GNU sed) qui -permet de rediriger l&rsquo;output dans le fichier d&rsquo;input. Cela dit, l&rsquo;intérêt unique -du programme est son langage de manipulation de texte.</p> -<p><code>ed</code>, et donc <code>sed</code>, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans <code>sed</code> est </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/ -</pre></div> - - -<p>qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n&rsquo;exécuter les commandes qui suivent que sur ces lignes.) </p> -<p><br/> -La commande <code>sed</code> la plus utilisée est bien entendu le <strong>s</strong>, qui s&rsquo;utilise de -la façon suivante : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">s</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[old</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[new</span> <span style="color: #f8f8f2">text]</span><span style="color: #f92672">/</span><span style="color: #f8f8f2">[options]</span> -</pre></div> - - -<p>qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant <code>g</code>, -qui permet d&rsquo;appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.<br /> -Les exceptions a la &ldquo;fixité&rdquo; de [new text] sont particulièrement -intéressantes. En effet, <code>sed</code> utilise un langage de regex plutôt standard, -excepté le fait qu&rsquo;il permet jusqu&rsquo;à 9 &ldquo;holding spaces&rdquo;, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.</p> -<p>Par exemple, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/\(hello world\) world/\1/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world -</pre></div> - - -<p>De la même façon, le symbole <code>&amp;</code> dans le texte de remplacement représente le -texte original. Ainsi, la commande </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sed &#39;s/hello world/&amp; world/&#39; -</pre></div> - - -<p>sur le texte &ldquo;hello world&rdquo; renverrait comme résultat</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">hello world world -</pre></div> - - -<p><br/></p> -<p>Une autre commande utile est <strong>p</strong>, qui sert a afficher le texte présent dans -l&rsquo;espace courant :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/[regex]/p -</pre></div> - - -<p><code>sed</code> stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j&rsquo;appelle l&rsquo;espace courant (pattern space en anglais). La commande<code>p</code> affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu&rsquo;il ne contienne que les lignes matchant, et le <strong>p</strong> affiche donc ce dernier.</p> -<p>Un autre exemple de commande sont <strong>c</strong>, <strong>i</strong> et <strong>a</strong>, qui s&rsquo;utilisent ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">c \ -[text] -</pre></div> - - -<p>De la même façon, pour le i : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">i \ -[text] -</pre></div> - - -<p>Et de même pour a. </p> -<p>Ces trois commandes s&rsquo;utilisent de la même façon pour la bonne raison qu&rsquo;elles -sont très proches. <strong>i</strong> sert a insérer du texte <em>avant</em> le pattern space. <strong>a</strong> -sert a insérer du texte <em>après</em> le pattern space, et enfin <strong>c</strong> sert a -remplacer <em>tout</em> le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.</p> -<p>Enfin, dernière commande ne fonctionnant que ligne par ligne, <strong>d</strong> : - /[regex]/d -<strong>d</strong> (delete) supprime les contenus du pattern space.</p> -<p><code>sed</code> est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.</p>WxcafeSun, 18 Aug 2013 22:57:00 +0200tag:wxcafe.net,2013-08-18:posts/sed-basics/Le chiffrement de partitions avec dm-crypt et device-mapper//wxcafe.net/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/<p>Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c&rsquo;est a dire au fait de passer d&rsquo;un fichier <em>en -clair</em> a un fichier chiffré dit <em>cyphertext</em>. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l&rsquo;intégrité d&rsquo;un système d&rsquo;exploitation, ou -bien la confidentialité d&rsquo;un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n&rsquo;a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d&rsquo;expliquer les concepts qui entrent en -jeu dans l&rsquo;utilisation du sous-système du noyau Linux <a href="http://en.wikipedia.org/wiki/dm-crypt"><strong>dm_crypt</strong></a> et de -présenter un rapide tutoriel concernant la création d&rsquo;un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre <a href="http://wxcafe.net/posts/11/19/12/la-cryptographie-avec-pgp-et-principalement-gnupg">clé GPG</a>)</p> -<p>dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s&rsquo;appuie sur <a href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup">LUKS</a>, un standard de chiffrement -de disques. Comme son nom l&rsquo;indique, device-mapper est un système qui a pour but -de <strong>mapper</strong> des <strong>block devices</strong>. Pour être plus clair, le kernel considère -comme &ldquo;block device&rdquo; tout fichier spécial (en gros, les fichiers disques dans<code>/dev/</code>, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d&rsquo;un &ldquo;fichier de périphérique&rdquo; (trad. -Wikipédia), il en &ldquo;crée&rdquo; un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)</p> -<p>Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d&rsquo;un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.</p> -<p>D&rsquo;ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot <strong><em>doit</em></strong> s&rsquo;appuyer sur une image initrd (l&rsquo;initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n&rsquo;est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,&hellip;) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l&rsquo;initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier &ldquo;cible&rdquo; est remonté sur la racine, et l&rsquo;initrd est démonté -est la RAM qu&rsquo;il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.</p> -<p>La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n&rsquo;est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d&rsquo;attaques : l&rsquo;une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du <em>vrai</em> boot -que l&rsquo;initrd présente toujours le même checksum. Cela dit, cette méthode a -l&rsquo;inconvénient d&rsquo;intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.<br /> -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n&rsquo;est pas possible pour un -attaquant de modifier ce système de fichier, et l&rsquo;initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l&rsquo;initrd et du noyau <em>beaucoup</em> plus difficile qu&rsquo;elle ne le serait sans.</p> -<p>Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, <code>cryptsetup</code>. Ce dernier était en charge de cryptoloop, -l&rsquo;ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l&rsquo;utilisation <em>userspace</em> de dm-crypt, qui pour sa -part est entièrement <em>kernel-space</em>. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/&hellip;) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root. </p> -<p>Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :<br /> -Tout d&rsquo;abord, il nous faut créer le fichier qui contiendra l&rsquo;image. Pour cela, -dans une situation réelle ou l&rsquo;on cherche a chiffrer un disque, il convient -d&rsquo;utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">dd bs=1000 count=1000000 if=/dev/urandom of=image.img -</pre></div> - - -<p>Maintenant que notre image est créée, nous pouvons la chiffrer : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksFormat image.img -</pre></div> - - -<p><code>cryptsetup</code> va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.<br /> -Une fois cela fait, nous allons mapper cette image : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen image.img crypto -</pre></div> - - -<p><code>cryptsetup</code> nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s&rsquo;est-il passé? En cherchant un peu, nous -voyons qu&rsquo;il n&rsquo;y a pas de nouveau disque dans /dev. C&rsquo;est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n&rsquo;a rien a voir. On remarque -qu&rsquo;est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n&rsquo;est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l&rsquo;utiliser. </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mkfs.ext4 /dev/mapper/crypto -</pre></div> - - -<p>Maintenant que notre disque est formaté, il peut être monté : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo mount /dev/mapper/crypto /mnt -</pre></div> - - -<p>Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un <code>mount | grep crypto</code> devrait vous donner le résultat -suivant : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">/dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered) -</pre></div> - - -<p>Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité. </p> -<p>Pour résumer :</p> -<ul> -<li> -<p>Pour monter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo cryptsetup luksOpen &lt;fichier chiffré&gt; &lt;nom de disque virtuel&gt; -sudo mount /dev/mapper/&lt;nom de disque virtuel&gt; &lt;emplacement&gt; -</pre></div> - - -</li> -<li> -<p>Pour démonter vos partitions : </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo umount &lt;emplacement&gt; -sudo cryptsetup luksClose &lt;nom de disque virtuel&gt; -</pre></div> - - -</li> -</ul> -<p>Pour simplifier la vie de tous, j&rsquo;ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur <a href="https://github.com/wxcafe/cryptoscripts">github</a>. </p> -<p>Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un <code>dd if=votre_image of=/dev/votre_partition</code> -pour ce faire.</p>WxcafeWed, 10 Jul 2013 03:18:00 +0200tag:wxcafe.net,2013-07-10:posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/Redesign du blog, etc//wxcafe.net/posts/redesign-du-blog/<p>Comme vous avez pu le remarquer, ce blog a &ldquo;un peu&rdquo; changé récemment.</p> -<p>Du coup, expliquons. J&rsquo;ai récemment monté <a href="http://serverporn.fr">serverporn</a>, et ai par la même -occasion découvert <a href="http://getpelican.com">pelican</a>. J&rsquo;ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d&rsquo;utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d&rsquo;un &ldquo;thème&rdquo; -constitué de templates pour les fichiers html et l&rsquo;organisation du projet et -d&rsquo;une partie &ldquo;statique&rdquo; contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html. </p> -<p>Globalement, un thème est constitué ainsi :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #f8f8f2">th</span><span style="color: #960050; background-color: #1e0010">è</span><span style="color: #f8f8f2">me</span> -<span style="color: #960050; background-color: #1e0010">├──</span> <span style="color: #66d9ef">static</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">css</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[css</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">img</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[image</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">js</span> -<span style="color: #960050; background-color: #1e0010">│</span> <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">[javascript</span> <span style="color: #f8f8f2">files]</span> -<span style="color: #960050; background-color: #1e0010">└──</span> <span style="color: #f8f8f2">template</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">base.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">index.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">page.html</span> - <span style="color: #960050; background-color: #1e0010">├─</span> <span style="color: #f8f8f2">[...]</span> - <span style="color: #960050; background-color: #1e0010">└─</span> <span style="color: #f8f8f2">article.html</span> -</pre></div> - - -<p>Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles <code>{{ article.content }}</code>, -par exemple. La syntaxe complète est très bien documentée dans la <a href="http://docs.getpelican.com/en/3.2/themes.html#templates-and-variables">doc</a> de -pelican.</p> -<p>L&rsquo;un des grands avantages de pelican est aussi la facilité qu&rsquo;il offre quand a -la mise a jour du blog.<br /> -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n&rsquo;existant pas la dernière fois, etc&hellip; -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un <code>make html</code> pour mettre a jour le blog.</p> -<p>De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c&rsquo;est moi -qui ait modifié les templates et le css), c&rsquo;est lisible (puisque c&rsquo;est du -python, par opposition au PHP&hellip;), et c&rsquo;est plus &ldquo;efficace&rdquo;. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n&rsquo;ai pas besoin d&rsquo;un accès continu au net, bref, c&rsquo;est plus -efficace.</p> -<p>En ce qui concerne les points négatifs : </p> -<ul> -<li> -<p>Perte des commentaires: - Je vous propose de vous référer a l&rsquo;article de Gordontesos <a href="http://gordon.re/hacktivisme/la-necessite-des-commentaires.html">ici</a> quand a - mon avis sur ce sujet.</p> -</li> -<li> -<p>Perte du bouton flattr: - Il va bientôt être remis, c&rsquo;est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c&rsquo;est assez facile a - faire.</p> -</li> -<li> -<p>Perte du spam: - Pourquoi c&rsquo;est dans les points négatifs, ca?</p> -</li> -<li> -<p>Temps d&rsquo;adaptation et d&rsquo;appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c&rsquo;est parce que j&rsquo;apprend a me servir de ce système - et que j&rsquo;apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d&rsquo;apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.</p> -</li> -</ul> -<p>Voila, c&rsquo;est mon retour d&rsquo;expérience sur pelican. A plus. </p>wxcafeWed, 12 Jun 2013 19:14:00 +0200tag:wxcafe.net,2013-06-12:posts/redesign-du-blog/Comment Saurik a rooté les Google Glass//wxcafe.net/posts/comment-saurik-a-roote-les-google-glass/<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un &ldquo;app store&rdquo; alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente&hellip;), a trouvé intéressant d&rsquo;obtenir un accès root -sur celles-ci, ce qu&rsquo;il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d&rsquo;extraire l&rsquo;OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.</p> -<p>Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n&rsquo;a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :</p> -<p><em>Je tiens tout d&rsquo;abord a préciser que toutes les informations qui vont -suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la -partie &ldquo;How does this exploit work&rdquo;.  Je tente d&rsquo;apporter ma maigre -contribution a cette explication.</em></p> -<p>Donc, d&rsquo;après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d&rsquo;exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.</p> -<p>Saurik a donc cherché un exploit connu pour cette version d&rsquo;android, et -l&rsquo;a appliqué a son problème. L&rsquo;exploit en question est relativement -simple. Depuis la version 4.0 d&rsquo;android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l&rsquo;accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc&hellip; Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l&rsquo;application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l&rsquo;archive gzip.</p> -<p>Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx&ndash;x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s&rsquo;il -fonctionne dans une VM ou sur un véritable appareil. S&rsquo;il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l&rsquo;on cherche pour l&rsquo;instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d&rsquo;android, -dont l&rsquo;application paramètres, et, dans ce cas précis, l&rsquo;application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.</p> -<p>Cependant, un problème reste : le système de restauration d&rsquo;Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d&rsquo;avoir accès directement a /data/local.prop, le -fichier qu&rsquo;on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d&rsquo;écrire dans ce dossier.</p> -<p>Donc, nous allons lancer deux processus en même temps : </p> -<ul> -<li> -<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2&gt;/dev/null -do : -done -</pre></div> - - -</li> -<li> -<p>Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu&rsquo;il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab -</pre></div> - - -<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br /> -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.<br /> -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l&rsquo;âme proprement.<br /> -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.</p> -</li> -</ul> -<p>And voilà! On a écrit ce que l&rsquo;on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu&rsquo;il tourne dans une machine -virtuelle (ce que l&rsquo;on veut, c&rsquo;est en fait &ldquo;ro.kernel.qemu=1&rdquo;, qui -indique au noyau qu&rsquo;il tourne dans qemu, un système de VM).</p> -<p>Il nous reste a rebooter, depuis l&rsquo;ordinateur host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;mount -o remount,rw /system&quot; -</pre></div> - - -<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l&rsquo;appareil :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin -</pre></div> - - -<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;chmod 6755 /system/xbin/su&quot; -</pre></div> - - -<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell &quot;rm /data/local.prop&quot; -</pre></div> - - -<p>Enfin, nous redemarrons a nouveau :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot -</pre></div> - - -<p>Et voila, une paire de google glass rootée!</p> -<p>Il est bon de préciser que cette manipulation n&rsquo;est possible que parce -que les lunettes tournent sous une ancienne version d&rsquo;android, et que ce -bug a été fixé depuis.</p> -<p>Il serait aussi interessant de couvrir les problèmes de vie privée -qu&rsquo;engendrent les Google Glass, et ce sera fait dans un autre billet.</p> -<p>A bientôt!</p>WxcafeMon, 06 May 2013 06:24:00 +0200tag:wxcafe.net,2013-05-06:posts/comment-saurik-a-roote-les-google-glass/Monter son propre serveur, partie 1: le serveur et l'apache.//wxcafe.net/posts/monter-son-propre-serveur-partie-1/<p>Il y a un certain temps, j&rsquo;avais parlé du concept du self-hosting. Il -s&rsquo;agit de posséder son propre serveur, et donc, par extension, ses -données. </p> -<p>Bien entendu, il n&rsquo;est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n&rsquo;est pas le sujet abordé ici.)<br /> -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l&rsquo;utilisation que l&rsquo;on veut en faire ici d&rsquo;installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c&rsquo;est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu&rsquo;une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l&rsquo;installation simple et -compréhensible).</p> -<p>La première chose a faire est bien entendu d&rsquo;obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d&rsquo;obtenir un serveur, que ce soit en le -louant chez OVH/1&amp;1/n&rsquo;importe quel autre hébergeur commercial, en -participant a un système d&rsquo;hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC&hellip; Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi&hellip;). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.</p> -<p>Dans cet article, lorsque est précisée le type d&rsquo;IP a utiliser, il -convient de mettre ce type précisément. Quand le type n&rsquo;est pas -précisée, libre a vous de choisir ipv4 ou ipv6.</p> -<p>Bref. Commençons au point ou vous avez un accès root a votre serveur, -n&rsquo;ayant soit aucun mot de passe, soit un choisi par l&rsquo;hébergeur, et ou -rien n&rsquo;est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un <code>passwd</code>, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d&rsquo;éditer l&rsquo;entrée DNS pour votre nom de -domaine. </p> -<p>Cette entrée doit donc pour l&rsquo;instant ressembler a ca :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"> &lt;votre nom de domaine&gt; NS 1 - IN MX 1 - IN A &lt;IPv4 de votre serveur&gt; - IN AAAA &lt;IPv6 de votre serveur&gt; -</pre></div> - - -<p>Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c&rsquo;est de la magie pour -l&rsquo;instant, ca sera peut être le sujet d&rsquo;un autre article), et d&rsquo;indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.</p> -<p>root est un utilisateur <strong>assez</strong> répandu, et il est assez simple de -bruteforcer le mot de passe. (<em>Relativement</em> assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent&hellip;) Ainsi, nous allons -arrêter d&rsquo;utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.<br /> -Cela se fait en deux temps : tout d&rsquo;abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l&rsquo;avenir; puis configurer -OpenSSH pour que celui ci n&rsquo;accepte que les connections par clés et plus -celles sur root.</p> -<p>Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu&rsquo;il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d&rsquo;être très chiant a -distinguer de l&rsquo;autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l&rsquo;utilisation d&rsquo;useradd plus facilement.)</p> -<p>Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste <code>adduser &lt;username&gt;</code>, soit utiliser le mode non-interactif -en faisant un <code>adduser --group &lt;username&gt;</code></p> -<p>Avec useradd, vous devrez utiliser la commande suivante : <code>useradd -m --N -g &lt;username&gt;</code>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l&rsquo;ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).</p> -<p>Il convient maintenant d&rsquo;ajouter cet utilisateur aux groupes qu&rsquo;il sera -amené a administrer: <code>usermod &lt;username&gt; -a -G www-data postfix -users staff sudo wheel</code>, puis de changer son mot de passe -<code>passwd</code>. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: <code>echo "%sudo ALL=(ALL) ALL" &gt;&gt; /etc/sudoers</code><br /> -Enfin, changeons d&rsquo;utilisateur : <code>su</code>. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d&rsquo;administration. Si vous devez encore utiliser root, c&rsquo;est que -quelque chose ne va pas.</p> -<p>Vous êtes donc loggés sur le système en tant qu&rsquo;utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.<br /> -Tout d&rsquo;abord, qu&rsquo;est-ce qu&rsquo;un login par clé ssh? Il s&rsquo;agit en fait d&rsquo;un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d&rsquo;utiliser plusieurs clés publique pour chaque<br /> -utilisateur.</p> -<p>Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d&rsquo;abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande <code>ssh-keygen -t rsa</code> (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.<br /> -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c&rsquo;est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier&hellip;) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec un<code>scp ~/.ssh/id_rsa.pub &lt;username&gt;@&lt;votre nom de domaine&gt;:~/</code> , ou -en la copiant a la main, si ça vous amuse. </p> -<p>Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (<code>mkdir .ssh</code>), puis -de déplacer ce fichier a la bonne place (<code>mv ~/id_rsa.pub ~/.ssh/authorized_keys</code>). -Testez si ça fonctionne : ouvez un autre terminal, et<br /> -connectez vous a votre serveur (<code>ssh &lt;username&gt;@&lt;votre nom de -domaine&gt;</code>), et il ne devrait pas vous demander de mot de passe.<strong>Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.</strong></p> -<p>Continuons. Il ne nous reste plus qu&rsquo;a installer le serveur web, et a le -configurer: </p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">sudo apt-get install \ -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \ -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \ -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \ -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \ -php5-imagick imagemagick libapache2-mod-suphp libruby \ -libapache2-mod-ruby -</pre></div> - - -<p>(faisons large, on aura besoin de l&rsquo;excédent plus tard&hellip;), puis activons les<br /> -mods apache en faisant <code>a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest</code>, et faisons en sorte que ces activations -soient prises en compte par apache via un <code>sudo service apache2 -restart</code> </p> -<p>Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer. </p> -<p>Pour cela, nous allons faire un simple <code>ln -s /etc/apache2/sites-{available,enabled}/default</code>, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l&rsquo;éditer, en changeant l&rsquo;adresse mail au début du document -par la votre, et en changeant <code>AllowOverride none</code> en <code>AllowOverride All</code>, -et enfin redémarrer apache pour qu&rsquo;il prenne en compte les -modifications, par un <code>sudo service apache2 restart</code> </p> -<p>Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l&rsquo;installation du serveur mail (c&rsquo;est suffisamment complexe pour -prendre un article seul&hellip;)</p>WxcafeMon, 18 Mar 2013 09:51:00 +0100tag:wxcafe.net,2013-03-18:posts/monter-son-propre-serveur-partie-1/Pourquoi je vais quitter linux pour passer a FreeBSD.//wxcafe.net/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/<p><em>This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text <a href="http://data.wxcafe.net/archives/126">here</a></em></p> -<p>Bon, voila. J&rsquo;ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n&rsquo;avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n&rsquo;ai même idée que quelque chose dans mon système d&rsquo;exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l&rsquo;époque, je n&rsquo;avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j&rsquo;ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s&rsquo;accumulant et -mon niveau de compréhension du système s&rsquo;améliorant, j&rsquo;ai commencé a -remarquer que certain bouts de l&rsquo;OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s&rsquo;est faite a -cause de la recrudescence de ces bouts d&rsquo;OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d&rsquo;OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j&rsquo;en ai eu marre de voir unity sur ma machine, et j&rsquo;ai -choisi de passer a Archlinux. C&rsquo;était avant le passage a systemd. Ce -système me convenait bien. Si je n&rsquo;installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c&rsquo;était le moins -envahissant de ceux la.</p> -<p>Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les <em>kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n&rsquo;a pas <strong>vraiment</strong> eu le choix, rapport a la philosophie de la -distribution d&rsquo;avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les </em>kits (bien que ce ne soient -pas les seuls a faire ça&hellip;) ont un problème très précis, qui n&rsquo;importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :</p> -<ol> -<li>Ce qui est petit est beau</li> -<li>Faites en sorte que chaque programme fasse une chose, bien.</li> -<li>Faites un prototype aussi vite que possible</li> -<li>Choisissez la portabilité plutôt que l&rsquo;efficacité</li> -<li>Stockez les données dans des fichiers textes.</li> -<li>Utilisez ce qui existe déjà a votre avantage. [<strong>1</strong>]</li> -<li>Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.</li> -<li>Évitez les UI qui &ldquo;capturent&rdquo; l&rsquo;utilisateur.</li> -<li>Faites de chaque programme un filtre.</li> -</ol> -<p>Alors bien entendu, un système d&rsquo;exploitation est fait pour évoluer, et -on pourrait penser qu&rsquo;UNIX a fait son temps. Cependant, ce n&rsquo;est pas -exactement la façon dont l&rsquo;informatique fonctionne. Effectivement, les -standards, les systèmes d&rsquo;exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n&rsquo;est -pas d&rsquo;UNIX que nous parlons ici. C&rsquo;est de la <em>philosophie</em> UNIX. Et -celle-ci n&rsquo;a pas fait son temps, <strong>elle a fait ses preuves.</strong> La -philosophie UNIX, en plus d&rsquo;être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu&rsquo;au premier jour.<br /> -La philosophie UNIX est aussi et surtout une garantie d&rsquo;utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l&rsquo;informatique<em>sérieusement</em> (je ne dis pas que les autres métiers de l&rsquo;informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).</p> -<p>Tous OS se doit d&rsquo;avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d&rsquo;échanger des informations. C&rsquo;est -efficace, ça respecte le &ldquo;tout est fichier&rdquo;, c&rsquo;est standard, c&rsquo;est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n&rsquo;est explicitement pas faite pour -être utilisée a la ligne de commande mais a l&rsquo;aide d&rsquo;APIs, et un -programme monolithique qui effectue sa tache d&rsquo;une façon complètement -obscure pour l&rsquo;utilisateur. Alors bien sur, il l&rsquo;effectue d&rsquo;une façon -efficace, cette tache. Oui, ça va plus vite qu&rsquo;avant. Oui, c&rsquo;est plus -&ldquo;rangé&rdquo;, ça fait moins &ldquo;fouillis&rdquo;. Mais c&rsquo;est moins efficace. C&rsquo;est<em>beaucoup</em> moins utilisable pour l&rsquo;utilisateur final. C&rsquo;est -horriblement chiant pour les sysadmins, parce qu&rsquo;ils ne peuvent plus -lire facilement les échanges entre programmes. C&rsquo;est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.<br /> -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l&rsquo;utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d&rsquo;en choquer quelques -uns, je préfère avoir un système qui boote <em>légèrement</em> plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C&rsquo;est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n&rsquo;employant plus les -systèmes basiques d&rsquo;UNIX.</p> -<p>Le problème est qu&rsquo;il est facilement visible que la direction prise par -la communauté Linux n&rsquo;est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d&rsquo;accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d&rsquo;autres raisons&hellip;), et on peut -compter sur le fait que les autres distributions l&rsquo;adopteront un jour ou -l&rsquo;autre.</p> -<p>Bon, maintenant que nous avons, si ce n&rsquo;est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu&rsquo;ils me -déplaisent, on pourrait penser qu&rsquo;il suffit de passer a une distribution -n&rsquo;incluant pas systemd, voire a une distribution n&rsquo;incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu&rsquo;OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d&rsquo;ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l&rsquo;init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d&rsquo;exploitation une date -d&rsquo;expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d&rsquo;init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s&rsquo;ouvrent a moi: OpenSolaris et *BSD. Minix n&rsquo;est pas -vraiment un choix, vu le peu de programmes qu&rsquo;il permet de faire -fonctionner et le fait qu&rsquo;il ne soit disponible que sur i386, ce qui -n&rsquo;est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n&rsquo;est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.</p> -<p>OpenSolaris est un système d&rsquo;exploitation tout a fait valable. Je n&rsquo;ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l&rsquo;idée que j&rsquo;ai d&rsquo;un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs &ldquo;release-only&rdquo;), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n&rsquo;importe quoi. Bref, cela -n&rsquo;est pas le sujet. Il convient aussi de voir qu&rsquo;avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n&rsquo;ait pas de très beaux jours devant lui (la <a href="http://hub.opensolaris.org/bin/view/Main/">page d’accueil</a> du -projet affiche d&rsquo;ailleurs un ÉNORME logo Oracle, du meilleur gout.)</p> -<p>Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu&rsquo;OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c&rsquo;est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d&rsquo;être orientées sécurité, et d&rsquo;après ce que j&rsquo;ai pu en voir -DFBSD ressemble aussi au système de l&rsquo;assistance a l&rsquo;user a outrance -décris plus haut. Mais la vérité est que je n&rsquo;ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu&rsquo;entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j&rsquo;aime -pouvoir configurer mes logiciels de façon assez profonde.)</p> -<p>Voila, c&rsquo;est mon avis sur ce &ldquo;problème&rdquo; actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n&rsquo;apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.<br /> -[1]: Je n&rsquo;ai pas trouvé de traduction satisfaisante a &ldquo;software leveraging&rdquo;, mais l&rsquo;idée est la&hellip;*</p>WxcafeMon, 04 Feb 2013 17:41:00 +0100tag:wxcafe.net,2013-02-04:posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/Update et pensées a propos du Raspberry Pi//wxcafe.net/posts/update-et-pensees-a-propos-du-raspberry-pi/<p>Bon.<br /> -J&rsquo;ai annoncé il y a environ 20 jours que j&rsquo;avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, <del>astucieusement</del> nommée -PiRatBox. Il se trouve qu&rsquo;après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n&rsquo;est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.<br /> -Alors, autant il me semble évident qu&rsquo;avec une -alimentation provenant d&rsquo;un port USB a 2A (max), je n&rsquo;avais pas -énormément de chances d&rsquo;avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité. </p> -<p>De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB&hellip;), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu&rsquo;il soit surement possible de la désactiver au niveau du kernel, -il n&rsquo;est pas <strong>simplement</strong> possible de la &ldquo;débrancher&rdquo;. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve. </p> -<p>Bon, je dois avouer n&rsquo;avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple <del>et -bonne</del> raison qu&rsquo;arch utilise systemd et qu&rsquo;il n&rsquo;existe pas de wrapper -systemd pour les daemons piratebox, et que j&rsquo;ai la flemme d&rsquo;en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j&rsquo;utiliserai debian. Le problème d&rsquo;utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l&rsquo;autre, en ce sens que si on installe un package &ldquo;haut&rdquo;, c&rsquo;est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d&rsquo;installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package &ldquo;bas&rdquo;, c&rsquo;est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -&ldquo;hauts&rdquo;, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu&rsquo;il n&rsquo;y a pas de moyen &ldquo;facile&rdquo; de choisir ce qui -sera installé sur le système avant l&rsquo;installation proprement dite -(puisque le moyen &ldquo;universel&rdquo; d&rsquo;installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)</p> -<p>Il y a <strong>énormément</strong> d&rsquo;autres critiques que l&rsquo;ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s&rsquo;arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l&rsquo;OS qui lui même se lance, initialise le hardware, -etc&hellip;, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d&rsquo;une cour d&rsquo;immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe&hellip;), et le moyen le -plus efficace qu&rsquo;aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc&hellip; </p> -<p>Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n&rsquo;est<strong>visiblement</strong> pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c&rsquo;est bien réalisé, sinon je dis non. </p> -<p>Enfin, le projet que j&rsquo;avais est toujours en cours de réalisation. Je -le terminerai dès que j&rsquo;aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu&rsquo;il m&rsquo;a posé, qu&rsquo;il n&rsquo;aurait pas du me poser, m&rsquo;ont -trop agacé pour que j&rsquo;aie envie de le sortir et de jouer avec une fois -sa mission remplie. </p> -<p>Dommage.</p>WxcafeSun, 27 Jan 2013 01:55:00 +0100tag:wxcafe.net,2013-01-27:posts/update-et-pensees-a-propos-du-raspberry-pi/Update//wxcafe.net/posts/update/<p>Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d&rsquo;une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!</p>WxcafeSat, 05 Jan 2013 18:32:00 +0100tag:wxcafe.net,2013-01-05:posts/update/Mutt ou le client email le meilleur moins mauvais//wxcafe.net/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/<p>Les clients mails ont une particularité en commun : ils sont tous -<del>très</del> mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation <strong>a la</strong> UNIX<br /> -Cependant, un d&rsquo;entre eux se démarque par sa moins-mauvais-itude, c&rsquo;est -le relativement bien connu <del>Outlook Express 2003</del> Mutt!<br /> -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, <a href="http://www.mutt.org">&ldquo;just sucks less&rdquo;</a>. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.</p> -<p>La configuration de mutt se fait dans le fichier <code>.muttrc</code> ou dans -<code>/etc/Muttrc</code>, et il est courant d&rsquo;utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d&rsquo;un système d&rsquo;accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d&rsquo;offlineimap se fait dans<code>~/.offlineimaprc</code> ou dans rien d&rsquo;autre en fait, c&rsquo;est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)<br /> -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et <a href="http://data.wxcafe.net/scripts/mutt-sidebar.sh">ce script</a> fait par moi, qui vous permet d&rsquo;installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.<br /> -Ensuite, voyons pour la partie configuration :<br /> -Ma configuration d&rsquo;offlineimap :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Config file for offlineimap</span> -<span style="color: #75715e">## Originally located in ~/.offlineimaprc</span> -<span style="color: #75715e">## This should not be edited without creating a copy before</span> -<span style="color: #75715e">## Created by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #f8f8f2">[general]</span> -<span style="color: #75715e"># List of accounts to be synced, separated by a comma.</span> -<span style="color: #f8f8f2">accounts</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span> - -<span style="color: #f8f8f2">[Account</span> <span style="color: #f8f8f2">main]</span> -<span style="color: #75715e"># Identifier for the local repository; e.g. the maildir to be synced via IMAP.</span> -<span style="color: #f8f8f2">localrepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local</span> -<span style="color: #75715e"># Identifier for the remote repository; i.e. the actual IMAP, usually non-local.</span> -<span style="color: #f8f8f2">remoterepository</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote</span> -<span style="color: #75715e"># Status cache. Default is plain, which eventually becomes huge and slow.</span> -<span style="color: #f8f8f2">status_backend</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">sqlite</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">cache.</span> <span style="color: #f8f8f2">(plain</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">sqlite)</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">local]</span> -<span style="color: #75715e"># Currently, offlineimap only supports maildir and IMAP for local repositories.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">Maildir</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">type</span> <span style="color: #f8f8f2">de</span> <span style="color: #f8f8f2">stockage</span> <span style="color: #f8f8f2">(Maildir</span> <span style="color: #f8f8f2">ou</span> <span style="color: #f8f8f2">IMAP)</span> -<span style="color: #75715e"># Where should the mail be placed?</span> -<span style="color: #f8f8f2">localfolders</span> <span style="color: #f92672">=</span> <span style="color: #f92672">~/</span><span style="color: #f8f8f2">Emails</span><span style="color: #f92672">/</span> <span style="color: #960050; background-color: #1e0010">#</span> <span style="color: #f8f8f2">le</span> <span style="color: #f8f8f2">dossier</span> <span style="color: #f8f8f2">dans</span> <span style="color: #f8f8f2">lequel</span> <span style="color: #f8f8f2">vous</span> - <span style="color: #75715e"># voulez que vos emails apparaissent</span> - -<span style="color: #f8f8f2">[Repository</span> <span style="color: #f8f8f2">main</span><span style="color: #f92672">-</span><span style="color: #f8f8f2">remote]</span> -<span style="color: #75715e"># Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.</span> -<span style="color: #f8f8f2">type</span> <span style="color: #f92672">=</span> <span style="color: #f8f8f2">IMAP</span> -<span style="color: #f8f8f2">remotehost</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderhost// # le serveur de votre messagerie</span> -<span style="color: #f8f8f2">remoteuser</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderusername// # votre nom d&#39;utilisateur</span> -<span style="color: #f8f8f2">remotepass</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholderpassword// # votre mot de passe</span> -<span style="color: #f8f8f2">cert_fingerprint</span> <span style="color: #f92672">=</span> <span style="color: #75715e">//placeholdercert// # le certificat du serveur (IMAPS only)</span> -</pre></div> - - -<p>Ça devrait être assez simple a lire, j&rsquo;ai tout bien commenté :3<br /> -Puis ma config mutt :</p> -<div class="codehilite" style="background: #272822"><pre style="line-height: 125%"><span style="color: #75715e">## Mutt MUA configuration file</span> -<span style="color: #75715e">## This file should not be edited without creating a copy</span> -<span style="color: #75715e">## File Created and edited by Wxcafe (Clément Hertling)</span> -<span style="color: #75715e">## Published under CC-BY-SA</span> - -<span style="color: #960050; background-color: #1e0010">#</span> General config for reading (fetched via offlineimap) - -set mbox_type = Maildir -<span style="color: #960050; background-color: #1e0010">#</span> type de boite mail (voir dans offlineimap, mailbox par defaut) - -set folder = ~/Email/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier root mailbox/imap - -set spoolfile = +INBOX -<span style="color: #960050; background-color: #1e0010">#</span> dossier d&#39;inbox - -set mbox = +&#39;All Mail&#39; -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou archiver les emails - -set copy = yes -<span style="color: #960050; background-color: #1e0010">#</span> yes pour copier les messages dans les differents dossier, no pour... -<span style="color: #960050; background-color: #1e0010">#</span> enfin voila quoi. - -set header_cache = /.hcache/ -<span style="color: #960050; background-color: #1e0010">#</span> dossier ou sont stockés les headers (pour le cache) - -set record = +Sent -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les messages envoyés - -set postponed = +Drafts -<span style="color: #960050; background-color: #1e0010">#</span> dossier dans lequel sont stockés les brouillons - -mailboxes = +INBOX +Drafts +Sent +Trash +All\ Mail -<span style="color: #960050; background-color: #1e0010">#</span> liste des dossiers qui vont apparaitre dans la colonne de gauche - -<span style="color: #960050; background-color: #1e0010">#</span> General config for sending (using Mutt&#39;s native support) - -set smtp_pass = &#39;password_placeholder&#39; -<span style="color: #960050; background-color: #1e0010">#</span> votre mot de passe - -set smtp_url = &quot;smtp://username@whatev.org:465/&quot; -<span style="color: #960050; background-color: #1e0010">#</span> l&#39;url ou envoyer les emails - -set send_charset = &quot;utf-8&quot; -<span style="color: #960050; background-color: #1e0010">#</span> UTF8, NE PAS CHANGER - -set signature = &quot;.sign&quot; -<span style="color: #960050; background-color: #1e0010">#</span> vous pouvez mettre votre signature dans .sign - -set sig_on_top = yes -<span style="color: #960050; background-color: #1e0010">#</span> il est d&#39;usge de mettre no ici. Cependant, je trouve ca plus lisible -<span style="color: #960050; background-color: #1e0010">#</span> comme ca. - -set ssl_verify_host = no -<span style="color: #960050; background-color: #1e0010">#</span> mettez yes ici si votre serveur a un certificat configuré correctement - -set hostname = &quot;wxcafe.net&quot; -<span style="color: #960050; background-color: #1e0010">#</span> mettez l&#39;adresse de votre serveur ici - -<span style="color: #960050; background-color: #1e0010">#</span> Misc settings - -auto_view text/html -<span style="color: #960050; background-color: #1e0010">#</span> la façon de voir les emails par défaut. - -set date_format = &quot;%y-%m-%d %T&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de date d&#39;envoi/de reception. - -set index_format = &quot;%2C | %Z [%D] %-30.30F (%-4.4c) %s&quot; -<span style="color: #960050; background-color: #1e0010">#</span> format de l&#39;index (la présentation de l&#39;interface) -<span style="color: #960050; background-color: #1e0010">#</span> voir http://www.mutt.org/doc/manual/manual-6.html<span style="color: #75715e">#</span><span style="color: #a6e22e">index_format</span> - -set sort_alias = alias -set reverse_alias = yes -set alias_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/aliases&quot; -<span style="color: #960050; background-color: #1e0010">#</span> liste des alias noms/email. a créer et remplir vous même. -<span style="color: #960050; background-color: #1e0010">#</span> format : &quot;alias short_name long_email_adress&quot; -source <span style="color: #f8f8f2">$alias_file</span> - -set beep = no -<span style="color: #960050; background-color: #1e0010">#</span> ne pas biper. CE SON ME TUE T.T - -set tilde = yes -set sleep_time = 0 -<span style="color: #960050; background-color: #1e0010">#</span> ? - -set sidebar_visible = yes -set sidebar_width = 15 -<span style="color: #960050; background-color: #1e0010">#</span> parametres de la barre coté gauche - -set realname = &quot;Clément Hertling (Wxcafé)&quot; -set from = &quot;wxcafe@wxcafe.net&quot; -set use_from = yes -set certificate_file = &quot;<span style="color: #f8f8f2">$HOME</span>/.mutt/cacert&quot; -<span style="color: #960050; background-color: #1e0010">#</span> parametres d&#39;envoi. mettez vos propres infos a la place des miennes... - -set edit_headers = yes -<span style="color: #960050; background-color: #1e0010">#</span> vous permet de vois les headers des mails. j&#39;aime, donc je laisse. - -<span style="color: #960050; background-color: #1e0010">#</span> Macros - -<span style="color: #960050; background-color: #1e0010">#</span> le titre dit tout. index veut dire que la macro est active dans les menus, -<span style="color: #960050; background-color: #1e0010">#</span> pager qu&#39;elle l&#39;est dans la visionneuse, les deux qu&#39;elle l&#39;est dans les -<span style="color: #960050; background-color: #1e0010">#</span> deux -<span style="color: #960050; background-color: #1e0010">#</span> \C represente la touche Control - -bind index,pager \Cp sidebar-prev -<span style="color: #960050; background-color: #1e0010">#</span> Control+p -&gt; remonter d&#39;un dossier dans la sidebar - -bind index,pager \Cn sidebar-next -<span style="color: #960050; background-color: #1e0010">#</span> Control+n -&gt; descendre d&#39;un dossier dans la sidebar - -bind index,pager \Co sidebar-open -<span style="color: #960050; background-color: #1e0010">#</span> Control+o -&gt; ouvrir le dossier selectionné dans la sidebar - -macro index,pager d &quot;=Trash&quot; &quot;Trash&quot; -<span style="color: #960050; background-color: #1e0010">#</span> d supprime le message en cours - -bind pager previous-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de monter d&#39;une ligne avec la touche up, au lieu de changer de message. - -bind pager next-line -<span style="color: #960050; background-color: #1e0010">#</span> permet de descendre d&#39;une ligne avec la touche down, au lieu de changer de -<span style="color: #960050; background-color: #1e0010">#</span> message - -bind pager j next-line -bind pager k previous-line -<span style="color: #960050; background-color: #1e0010">#</span> raccourcis vim - -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing commands - -set pgp_decode_command=&quot;gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f&quot; -set pgp_verify_command=&quot;gpg --no-verbose --batch --output - --verify %s %f&quot; -set pgp_decrypt_command=&quot;gpg --passphrase-fd 0 --no-verbose --batch --output - %f&quot; -set pgp_sign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f&quot; -set pgp_clearsign_command=&quot;gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f&quot; -set pgp_encrypt_only_command=&quot;pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_encrypt_sign_command=&quot;pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f&quot; -set pgp_import_command=&quot;gpg --no-verbose --import -v %f&quot; -set pgp_export_command=&quot;gpg --no-verbose --export --armor %r&quot; -set pgp_verify_key_command=&quot;gpg --no-verbose --batch --fingerprint --check-sigs %r&quot; -set pgp_list_pubring_command=&quot;gpg --no-verbose --batch --with-colons --list-keys %r&quot; -set pgp_list_secring_command=&quot;gpg --no-verbose --batch --with-colons --list-secret-keys %r&quot; -set pgp_autosign=yes -set pgp_sign_as=0x******** -<span style="color: #960050; background-color: #1e0010">#</span> remplacez 0x******** par votre identifiant PGP!!!!! - -set pgp_replyencrypt=no -set pgp_timeout=7200 -set pgp_good_sign=&quot;^gpg: Good signature from&quot; - -<span style="color: #960050; background-color: #1e0010">#</span> si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis -<span style="color: #960050; background-color: #1e0010">#</span> PGP signing options - -<span style="color: #960050; background-color: #1e0010">#</span> Palette for use with the Linux console. Black background. - -<span style="color: #960050; background-color: #1e0010">#</span> Schéma de couleur Rouge et Noir. Commentez si vous voulez le -<span style="color: #960050; background-color: #1e0010">#</span> défaut noir et blanc. -<span style="color: #960050; background-color: #1e0010">#</span> d&#39;autres schémas sont trouvables sur google et autre. - -color hdrdefault red black -color quoted brightblack black -color signature brightblack black -color attachment red black -color message brightwhite black -color error brightred black -color indicator black red -color status white black -color tree white black -color normal white black -color markers red black -color search white black -color tilde brightmagenta black -color index red black ~F -color index red black &quot;~N|~O&quot; -</pre></div> - - -<p>Voila, pour plus d&rsquo;informations vous pouvez aller voir le manuel de mutt -@ <a href="http://www.mutt.org/doc/manual/">http://www.mutt.org/doc/manual/</a><br /> -J&rsquo;espère que cette configuration &ldquo;toute faite&rdquo; vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu&rsquo;utiliser une configuration toute faire n&rsquo;aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l&rsquo;introduction ou a des situations ou il est absolument -nécessaire d&rsquo;avoir rapidement une configuration fonctionnelle (c&rsquo;est a -dire, dans le cas d&rsquo;un client email, euh&hellip; jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -<del>Bing</del> <del>Google</del> <del>Yahoo</del> Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!</p>WxcafeWed, 02 Jan 2013 02:12:00 +0100tag:wxcafe.net,2013-01-02:posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/ \ No newline at end of file diff --git a/output/index.html b/output/index.html deleted file mode 100644 index 54c09c5..0000000 --- a/output/index.html +++ /dev/null @@ -1,1513 +0,0 @@ - - - - - Wxcafé - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    les NUCs et le HDMI-CEC

    -
    - Date - - Sat 22 August 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    J’ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas “profiter” du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc…) simplement.

    -

    Ayant un Raspberry Pi 1 qui trainait, j’ai -décidé d’installer OpenELEC dessus et de voir ce que ça -donnait. Le résultat n’étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j’ai décidé d’upgrader le système.

    -

    J’ai donc acquis un NUC D34010WYK -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -adaptateur HDMI-CEC pour celui-ci, et un -SSD mSATA, en me disant que je -pourrais sans trop de problème faire tourner Kodi sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L’autre -avantage de tourner sur du Intel, c’est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).

    -

    J’ai donc reçu après un certain temps le matériel sus cité, que j’ai avidement -monté, avant de me rendre compte que le manuel de l’adaptateur Pulse-Eight était -[PDF]assez médiocre. J’ai donc -cherché plusieurs heures, avant de trouver [DE]ce -post -expliquant comment brancher l’adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l’information, et pour moi si je dois remonter ce système.

    -

    Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -“Front Panel”, et un appelé “Custom Solution Header”. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :

    -
    Custom Solution
    -  ┌─┬─┬─┬─┬─┐
    -  │g│ │·│r│·│
    -  ├─┼─┼─┼─┼─┤
    -  │·│·│·│·│·│
    -  └─┴─┴─┴─┴─┘
    -
    -  g ➔ fiche grise
    -  r ➔ fiche rouge
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Une fois cela fait, il faut brancher le Front Panel. Heureusement, c’est plus -facile, puisqu’il n’y a qu’une seule fiche a brancher ici : la orange.

    -
      Front Panel
    -  ┌─┬─┬─┬─┬─┐
    -  │·│·│·│·│·│
    -  ├─┼─┼─┼─┼─┤
    -  │ │·│o│·│·│
    -  └─┴─┴─┴─┴─┘
    -
    -  o ➔ fiche orange
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons.

    -
       Dual-USB
    -  ┌─┬─┬─┬─┬─┐
    -  │b│B│v│n│·│
    -  ├─┼─┼─┼─┼─┤
    -  │·│·│·│·│ │
    -  └─┴─┴─┴─┴─┘
    -
    -  b ➔ fiche bleue
    -  B ➔ fiche Blanche
    -  v ➔ fiche verte
    -  n ➔ fiche noire
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que “Deep S4/S5” soit désactivé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.

    -

    Ne reste plus ensuite qu’a installer un système digne de ce nom dessus!

    -
    -
    -
    -

    SSL - STARTTLS

    -
    - Date - - Sat 16 May 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l’histoire d’Internet. Sa mise en place pose -problème : les protocoles existants ne s’accommodent qu’assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n’apporte rien d’intéressant. Pour palier a ce -problème, deux solutions sont apparues.

    -

    Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l’extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.

    -

    L’autre approche qui a été utilisée est une approche d’upgrade. La -communication commence en mode non chiffré, puis le client demande l’upgrade de -la connexion vers le mode chiffré s’il le supporte, les deux machines -machines font un handshake SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la “mise -a jour” en douceur.

    -

    Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service – laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec STARTTLS, qui upgrade les connexions si nécessaire.
    -La réponse est que STARTTLS est plus interessant, pour plusieurs raisons. Tout -d’abord, il permet de n’utiliser qu’un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients “anciens” (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d’éviter aux utilisateurs d’avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l’activera de lui même s’il -voit qu’il est disponible.
    -Bref, mettez en place du STARTTLS, et pas du SSL. C’est mieux pour la sécurité -de tout le monde.

    -
    -
    -
    -

    Manettes : Hori vs. PDP

    -
    - Date - - Sun 19 April 2015 - -
    - By - Wxcafe -
    - Category - Vidya Games -
    - - - - -
    -

    Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d’abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de “choses” -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d’autres. Vous aurez aussi remarqué que le -Gamepad n’est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.

    -

    Cela étant, si comme moi vous avez, euh, “ouvert” le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter l’adaptateur GC pour Wii -U -a votre console.

    -

    Heureusement pour vous, Nintendo a pensé a une solution (et comme d’habitude -avec Nintendo, c’est une solution a moitié satisfaisante…) : les classic -controller, mais en forme de manettes Gamecube.

    -

    Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d’argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.

    -

    Nous allons ici voir deux modèles, un de chacune des boites en question -: PDP et Hori.

    -

    Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus

    -

    Commençons par le modèle de chez Hori :

    -

    Hori_face

    -

    Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.

    -

    Hori_dos

    -

    Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c’est logique puisque c’est comme ça que les -classic controller sont faits, mais c’est décevant tout de même

    -

    Hori_CM

    -

    On peut voir ici que la qualité de l’assemblage n’est pas extraordinaire, et on -remarque une soudure mal faite a l’emplacement du stick gauche.

    -

    Hori_Cstick

    -

    Le stick c n’est pas fixé au reste de la manette. -J’ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n’avaient pas l’air de très bonne qualité, et j’ai préféré abandonner -l’idée plutôt que de casser la manette.

    -

    Hori_coque

    -

    On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d’une Wiimote entière la dedans…

    -
    - -

    Passons maintenant a la manette PDP.

    -

    PDP_face

    -

    Au premier coup d’œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c’est un problème de goût).

    -

    PDP_dos

    -

    Les gâchettes sont des vraies gâchettes! C’est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.

    -

    PDP_CM

    -

    Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon péremptoire perpendiculaire…

    -

    PDP_CF

    -

    Vous l’avez deviné, ces deux “cartes filles” servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de “vraies” gâchettes en cela -qu’elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.

    -

    Quelques photos des gâchettes en question :

    -

    PDP_G_1

    -

    PDP_G_2

    -

    PDP_G_3

    -

    PDP_G_4

    -
    -

    Vous l’aurez compris, je préfère la version PDP de ces “Fight Pad”, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains esttotalement identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.

    -
    -
    -
    -

    Docker et les ebooks sur Twitter

    -
    - Date - - Sat 28 February 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Vous avez peut être déjà entendu parler de Docker. Si -ce n’est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n’est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les Jails, -mais n’est devenu possible sous linux que récemment grâce aux cgroups, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d’avoir une machine hôte sur laquelle s’exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l’hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu’avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu’à l’hôte, puisqu’il n’est pas vraiment séparé des -invités.

    -

    Quoi qu’il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. “Mais pourquoi utiliser Docker, dans ce cas”, vous -demandez-vous peut être, “puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?”. Et bien -c’est très simple : Docker apporte la simplicité de déploiement d’applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le Docker Hub permet aussi de récupérer -rapidement et facilement un grand nombre d’images déjà configurées.

    -

    Maintenant que nous avons expliqué rapidement ce qu’était Docker, voyons le -rapport avec les ebooks et Twitter.

    -

    Les comptes dits “ebooks” (le nom vient a l’origine de horse_ebooks, -voir ici pourquoi) sont des bots -twitter utilisant des Chaines de Markov, -avec les tweets d’un utilisateur “source” comme corpus, pour produire des tweets -ressemblant a ceux de l’utilisateur source. Nous allons voir maintenant comment -en installer un.

    -

    C’est, comme disent certaines personnes, “fun”.

    -

    Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -celle-ci, qui est une lib ruby créée -par @m1sp, qui gère pour nous a la fois l’API -twitter et la génération des messages.

    -

    Cependant, cela n’explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d’isoler les bots, et les -containers dockers permettent de les déployer sur n’importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j’ai créé un -repo github qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.

    -

    Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l’utilisateur source avec ebooks archive <username> <filename> (c’est du json) -, puis vous convertissez le json en fichier utilisable par le bot : ebooks -consume <filename>. Cela fait, démarrer le bot revient a lancer le container : -docker run -d <container name> Pour plus d’informations, allez voir la -documentation Docker

    -

    Bien entendu, dans l’idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron :

    -
    00 00 * * *    /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json >> /var/log/ebooks/update.log 2>&1
    -00 05 * * *    cd /usr/local/ebooks/main/ && /usr/local/bin/ebooks consume corpus/username.json >> /var/log/ebooks/update.log 2>&1
    -00 10 * * *    docker rm -f bots >/dev/null 2>&1
    -00 15 * * *    docker rmi bots  > /dev/null 2>&1
    -00 20 * * *    cd /usr/local/ebooks/main/ && docker build --rm -t bots . >> /var/log/ebooks/build.log 2>&1
    -00 25 * * *    docker run -d --name bots bots >> /var/log/ebooks/run.log 2>&1
    -
    - - -

    Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s’executent en même temps.

    -

    Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n’est qu’un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner des -applications “usuelles” -dedans, -puisque l’overhead de Docker est minimal, et beaucoup d’autres applications -existent.

    -
    -
    -
    -

    OpenSMTPd comme serveur mail sous debian

    -
    - Date - - Fri 07 November 2014 - -
    - By - Wxcafé -
    - Category - Tutoriel -
    - - - - -
    -

    J’avais dit il y a un certain temps que j’allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j’ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J’ai donc totalement changé d’infrastructure quand a la -gestion de mon système de mails.

    -

    Ainsi, j’ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. OpenSMTPd est un -projet originaire d’OpenBSD qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu’a le projet OpenBSD, globalement).

    -

    Pour rappel, le système d’emails fonctionne d’une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.

    -

    Si vous avez bien suivi, vous pouvez voir que je n’ai pas parlé de récupération -ni de lecture des mails. C’est pour une raison simple, qui est que ces taches -sont remplies par d’autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).

    -

    Or ce qui nous intéresse ici, ce n’est pas simplement d’envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c’est pour -ça que ce tutoriel ne parlera pas que d’OpenSMTPd mais aussi de Dovecot qui fait office de serveur IMAP et -amavis/spamassassin -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système

    -
                ╭────────────────╮                    ╭──────────╮
    -            │╭──────────────>│────> to filter ───>│─╮        │
    -  mail in   ││               │                    │ │ amavis │
    -───────────>│╯ OpenSMTPd  ╭──│<─── from filter<───│<╯        │
    -            │             │  │                    ╰──────────╯
    -  mail out  │             │  │                    ╭──────────╮
    -<───────────│<────────────┴─>│─────> to MDA ─────>│─────────>│──> to user's
    -            │                │                    │ dovecot  │     mailbox
    -            ╰────────────────╯                    ╰──────────╯
    -
    - - -

    Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d’autres correspondants) sont transmis a OpenSMTPd, qui envoie tout aamavis, qui vérifie a la fois les spams et les malwares pour les mails -venants de l’exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.

    -

    Voyons comment mettre cela en place. Tout d’abord, il faut décider de la façon -dont les différents services vont communiquer.

    -

    Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s’agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s’agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.

    -

    Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -/var/run/dovecot/lmtp).

    -

    Ainsi, pour reprendre le schéma présenté plus haut :

    -
                ╭───────────────╮                    ╭───────────╮
    -            │╭─────────────>│──> SMTP (10026) ──>│─╮         │
    -  SMTP in   ││              │                    │ │ amavis  │
    -────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10027) <──│<╯ (sign)  │
    -            │            │  │                    ╰───────────╯
    -  SMTP out  │            │  │
    -25 <────────│<───────────╯  │
    -            ╰───────────────╯
    -
    - - -

    Pour les mails sortants; et

    -
                ╭───────────────╮                    ╭────────────╮
    -            │╭─────────────>│──> SMTP (10024) ──>│─╮          │
    -  SMTP in   ││              │                    │ │ amavis   │
    -────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10025) <──│<╯(filter)  │
    -            │            │  │                    ╰────────────╯
    -            │            │  │                    ╭────────────╮
    -            │            ╰─>│──> LMTP (socket) ─>│───────────>│──> to user's
    -            │               │                    │  dovecot   │     mailbox
    -            ╰───────────────╯                    ╰────────────╯
    -
    - - -

    Pour les mails entrants.

    -

    Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d’autres plateformes, la configuration devrait être sensiblement la même

    -

    (Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir ce -post)

    -

    Tout d’abord, commençons par installer les programmes nécessaires :

    -
    sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved
    -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new
    -
    - - -

    Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :

    -

    /etc/smtpd.conf

    -
    # This is the smtpd server system-wide configuration file.
    -# See smtpd.conf(5) for more information.
    -
    -## Certs
    -pki exem.pl certificate "/etc/certs/exem.pl.crt"
    -pki exem.pl key         "/etc/certs/exem.pl.key"
    -
    -## Ports to listen on, and how to listen on them
    -listen on eth0 port 25 tls pki exem.pl hostname exem.pl auth-optional
    -listen on eth0 port 465 tls-require pki exem.pl hostname exem.pl auth mask-source
    -listen on eth0 port 587 tls-require pki exem.pl hostname exem.pl auth mask-source
    -
    -## Aliases
    -table aliases file:/etc/aliases
    -
    -# coming from amavisd, checked for spam/malware
    -listen on lo port 10025 tag Filtered
    -# coming from amavisd, signed with DKIM
    -listen on lo port 10027 tag Signed
    -
    -## Receiving
    -# if the (incoming) mail has been through amavisd, then we can deliver it
    -accept tagged Filtered for any alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
    -# we directly tranfer incoming mail to amavisd to be checked 
    -accept from any for domain "exem.pl" relay via "smtp://localhost:10024"
    -# we have to put these lines in this order to avoid infinite loops
    -
    -## Sending
    -# if the (outgoint) mail has been through amavisd, then we can deliver it
    -accept tagged Signed for any relay
    -# we tranfer the outgoing mail to amavisd to be signed
    -accept for any relay via "smtp://localhost:10026"
    -# same, we have to put these lines in this order or infinite loops...
    -
    - - -

    Expliquons un peu ce fichier de configuration :

    -
      -
    • Tout d’abord, le paragraphe nommé “Certs” contient les déclaration - d’emplacement des certificats SSL.
    • -
    • Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire
    • -
    • Les alias sont définis juste après
    • -
    • Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme “Filtered” et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme “Signed”
    • -
    • Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c’est qu’il n’a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l’état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis
    • -
    • Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n’a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu’il le signe. Le - problème de l’ordre des lignes se pose encore, pour la même raison qu’au - dessus.
    • -
    -

    Nous allons maintenant configurer dovecot. Comme nous l’avons vu, dovecot doit -écouter en LMTP via la socket /var/run/dovecot/lmtp et transmettre les -emails a la boite email de l’utilisateur. Il serait aussi interessant -qu’il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.

    -

    /etc/dovecot/dovecot.conf

    -
    ## Dovecot configuration file
    -
    -# basic config
    -info_log_path = /var/log/dovecot-info.log
    -log_path = /var/log/dovecot.log
    -log_timestamp = "%Y-%m-%d %H:%M:%S "
    -mail_location = maildir:%h/mail
    -
    -# authentication
    -passdb {
    -    driver = pam
    -}
    -userdb {
    -    driver = passwd
    -}
    -
    -# the protocols we use
    -protocols = imap lmtp sieve
    -
    -# ssl config
    -ssl_cert = </etc/certs/exem.pl.cert
    -ssl_key = </etc/certs/exem.pl.key
    -ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
    -ssl = yes
    -
    -## configuring services 
    -# disables imap login without SSL (yes dovecot is dumb that way)
    -service imap-login {
    -    inet_listener imap {
    -        port=0 
    -    }
    -}
    -
    -service lmtp {
    -    unix_listener lmtp {
    -        mode = 0666
    -    }
    -}
    -
    -## configuring protocols
    -# the dovecot lda, we set it to use sieve
    -protocol lda {
    -    mail_plugins = $mail_plugins sieve
    -}
    -
    -protocol lmtp {
    -    postmaster_address =  whoever@exem.pl
    -    mail_plugins = $mail_plugins sieve
    -}
    -
    -plugin {
    -    sieve = ~/.dovecot.sieve
    -    sieve_dir = ~/sieve
    -}
    -
    - - -

    ATTENTION: Sous OpenBSD, remplacez

    -
    passdb {
    -    driver = pam
    -}
    -
    - - -

    par

    -
    passdb {
    -    driver = bsdauth
    -}
    -
    - - -

    pour identifier les utilisateurs système

    -

    Ici aussi, voyons comment ce fichier est structuré :

    -
      -
    • Tout d’abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l’endroit ou seront stockés les mails des utilisateurs.
    • -
    • Nous configurons ensuite la gestion de l’authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)
    • -
    • Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l’IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).
    • -
    • Nous configurons le SSL
    • -
    • Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d’activer IMAPS qu’en activant - IMAP avec. Comme nous ne voulons pas d’IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu’il utilise
    • -
    • Nous configurons maintenant les protocoles, pour faire fonctionner Sieve
    • -
    • enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.
    • -
    -

    Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n’y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis/usr/local/share/examples/amavisd-new/amavisd.conf et ajoutez les -modifications nécessaires a la fin du fichier.

    -

    /etc/amavis/conf.d/99-local.conf (debian) -/etc/amavis.conf (OpenBSD)

    -
    use strict;
    -
    -$enable_dkim_verification = 1;
    -$enable_dkim_signing = 1;
    -dkim_key("exem.pl", "main", "/etc/certs/dkim.key" );
    -
    -@dkim_signature_options_bysender_maps = (
    -    { '.' =>
    -        { ttl => 21*24*3600, c => 'relaxed/simple' }
    -    }
    -);
    -
    -$inet_socket_port = [10024, 10026];
    -$policy_bank{'MYNETS'} = {
    -        originating => 1,
    -        os_fingerprint_method => undef,
    -};
    -
    -$interface_policy{'10026'} = 'ORIGINATING';
    -
    -$policy_bank{'ORIGINATING'} = {
    -        originating => 1,
    -        allow_disclaimers => 1,
    -        virus_admin_maps => ["root\@$mydomain"],
    -        spam_admin_maps => ["root\@$mydomain"],
    -        warnbadhsender => 1,
    -        forward_method => 'smtp:localhost:10027',
    -        smtpd_discard_ehlo_keywords => ['8BITMIME'],
    -        bypass_banned_checks_maps => [1],
    -        terminate_dsn_on_notify_success => 0,
    -};
    -
    -#------------ Do not modify anything below this line -------------
    -1;  # ensure a defined return
    -
    - - -

    A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu’amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l’endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la RFC 4871 -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme “originating” et nous ne vérifierons pas l’OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d’abord, nous réaffirmons qu’ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la RFC - 4871. Nous déclarons l’adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu’il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d’envoi. Et voila!

    -

    Vous avez pu remarquer qu’a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.

    -

    Il nous reste cependant quelques opérations a faire, encore. -Tout d’abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j’ai personnellement utilisé opendkim (un -tutorial) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :

    -
    #rewrite_header Subject *****SPAM*****
    -# report_safe 1
    -required_score 2.0
    -# use_bayes 1
    -# bayes_auto_learn 1
    -# bayes_ignore_header X-Bogosity
    -# bayes_ignore_header X-Spam-Flag
    -# bayes_ignore_header X-Spam-Status
    -ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
    -# shortcircuit USER_IN_WHITELIST       on
    -# shortcircuit USER_IN_DEF_WHITELIST   on
    -# shortcircuit USER_IN_ALL_SPAM_TO     on
    -# shortcircuit SUBJECT_IN_WHITELIST    on
    -# shortcircuit USER_IN_BLACKLIST       on
    -# shortcircuit USER_IN_BLACKLIST_TO    on
    -# shortcircuit SUBJECT_IN_BLACKLIST    on
    -shortcircuit ALL_TRUSTED             off
    -# shortcircuit BAYES_99                spam
    -# shortcircuit BAYES_00                ham
    -
    -endif # Mail::SpamAssassin::Plugin::Shortcircuit
    -
    - - -

    Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.

    -

    Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement

    -

    Bon courage pour votre hosting de mail ensuite…

    -
    -
    -
    -

    Installer FreeBSD sur un serveur Online avec MfsBSD

    -
    - Date - - Thu 28 August 2014 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    J’ai récemment eu l’occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester bhyve) -et n’ayant pour différentes raisons pas eu l’occasion de le faire sur mon serveur auto-hebergé ni sur ce serveur ci, -j’ai commencé a chercher comment le faire sur ce serveur.

    -

    Étant donné que Online ne propose pas directement d’image FreeBSD sur ses serveurs, il m’a fallu -chercher un peu plus loin. Il se trouve que ce post sur les forums -d’online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier.

    -

    J’ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l’on m’a dirigé vers mfsbsd, un projet d’installeur -alternatif, minimaliste et simplifié pour FreeBSD.

    -

    Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l’image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l’image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l’image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l’air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d’installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.

    -

    Utilisez donc ce script ainsi :

    -
    # tout d'abord, wipons le MBR :
    -dd < /dev/zero > /dev/da0 count=1
    -# maintenant, installons le système
    -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c
    -
    - - -

    Avec -g da0 votre disque dur principal, -s 2G la quantité de swap désirée, --p root le nom du zpool, et -c pour activer la compression. D’autres options -sont disponibles, je vous invite a faire un zfsinstall -h si mon setup ne vous -convient pas.

    -

    Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :

    -
    zfs_load="YES"
    -sshd_load="YES
    -hostname="whatever"
    -ifconfig_igb0="DHCP"
    -
    - - -

    Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!

    -

    Voila, c’est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l’IPv6 chez online est… peu -crédible, disons)

    -

    Bon sinon sur d’autres sujets, j’ai mis en place des bots twitter : wxcafe_ebooks, -petitefanfare, -capet_ebooks, -zengisse, -et kim_ebooks. Ils sont tous basés sur ce -code, qui vient de -@m1sp -(github.com/twitter_ebooks). Donc voila.

    -

    A plus

    -
    -
    -
    -

    SSL ou la sécurité sur l'internet

    -
    - Date - - Fri 30 May 2014 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: More Tricks for Defeating SSL, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -A Critique of Lavabit, -ce qui peut avoir l’effet de rendre légèrement parano. Si vous considérez que -c’est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)

    -

    Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.

    -

    Cela fait suite aux évènements évoqués dans le Disclaimer, mais aussi a des -doigts sortis d’un endroit particulier du corps de l’admin/auteur de ce “blog”, -qui a pris enfin les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d’un système -fonctionnel utilisant cette compréhension récemment acquise.

    -

    Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c’est très -simple : il existait auparavant un certificat pour wxcafe.net, un pour -paste.wxcafe.net, un pour mail.wxcafe.net, etc… Bref, un certificat -différent pour chaque sous-domaine.

    -

    Il s’avère que c’est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d’erreur, etc) et pas plus -sécurisé que d’avoir un seul certificat wildcard. J’ai donc généré un certificat -pour *.wxcafe.net hier, et il sera dorénavant utilisé pour tous les -sous-domaine de wxcafe.net; et un certificat pour wxcafe.net, qui ne matche -pas *.wxcafe.net, et qui sera donc utilisé… bah pour wxcafe.net.

    -

    Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l’arrivée sur le site ne commence pas -par une page firefox disant “Something’s Wrong!”, et ces redirections ne seront -donc pas mises en place.

    -

    De plus, après la lecture de l’article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c’est a dire que, même si -quelqu’un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.

    -

    Bon, maintenant que les explications basiques sont faites, voyons -l’implémentation :
    -Pour générer la clé, tout d’abord, il convient d’utiliser les commandes -suivantes:

    -
    sudo openssl genrsa -out example.key 4096
    -# nous utilisons ici une clé de 4096 bits, la taille est laissée a votre appréciation
    -sudo openssl req -new -key example.key -out example.csr
    -# OpenSSL va ici vous demander de nombreuses informations, "Common Name" devant contenir le FQDN
    -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt
    -# enfin, nous générons la clé, d'une durée de vie de 3 ans
    -
    - - -

    Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -*.example.com comme common name. -Une fois la clé générée, il faut dire aux différents services de l’utiliser, et -de n’utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j’utilise :

    -

    apache :

    -
    # /etc/apache2/mods_enabled/ssl.conf
    -# [...]
    -SSLProtocol all -SSLv2 -SSLv3
    -SSLHonorCipherOrder on
    -SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
    -  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
    -  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
    -# [...]
    -# /etc/apache2/sites-enabled/default-ssl
    -# [...]
    -SSLEngine on
    -SSLCertificateFile /etc/certs/example.com.crt
    -SSLCertificateKeyFile /etc/certs/example.com.key
    -# [...]
    -
    - - -

    nginx :

    -
    # /etc/nginx/nginx.conf 
    -# [...]
    -ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    -ssl_prefer_server_ciphers on;
    -ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
    -  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
    -  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
    -# [...]
    -# /etc/nginx/sites-enabled/default-ssl
    -# [...]
    -ssl on;
    -ssl_certificate /etc/certs/example.com.crt
    -ssl_certificate_key /etc/certs/example.com.key
    -# [...]
    -
    - - -

    prosody (jabber) :

    -
    # tout d'abord, lancez la commande suivante :
    -sudo openssl dhparam -out /etc/prosody/certs/dh-2048.pem 2048
    -# ensuite, pour chaque VirtualHost dans /etc/prosody/prosody.conf :
    -ssl = {
    -  dhparam = "/etc/prosody/certs/dh-2048.pem";
    -  key = "/etc/certs/example.com.key";
    -  certificate = "/etc/certs/example.com.crt";
    -}
    -# la cipher suite de prosody utilise par défaut EDH et EECDH
    -
    - - -

    postfix (email) :

    -
    # /etc/postfix/main.cf
    -# [...]
    -smtpd_tls_cert_file = /etc/certs/example.com.crt
    -smtpd_tls_key_file = /etc/certs/example.com.key
    -tls_preempt_cipherlist = yes
    -smtpd_tls_eecdh_grade = strong
    -smtdp_tls_mandatory_ciphers = high
    -smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS
    -smtpd_tls_security_level = encrypt
    -smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
    -smtpd_use_tls = yes
    -# [...]
    -
    - - -

    dovecot (imap) :

    -
    # /etc/dovecot/dovecot.conf 
    -# [...]
    -ssl_cert = </etc/certs/example.com.crt
    -ssl_key = </etc/certs/example.com.key
    -ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
    -
    - - -

    Voila. Pour d’autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.

    -

    Cela étant dit, je conseille a tout le monde d’aller voir la conférence dans le -disclaimer, et tant qu’a faire la conférence du même hacker SSL and the future -of Authenticity qui parle de son -implémentation d’une technologie “remplaçant” le système de CAs qui existe -actuellement.

    -
    -
    -
    -

    Mise en place d'un serveur DNS

    -
    - Date - - Mon 24 February 2014 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a http://173.194.45.66, ou a -http://199.16.156.70. Voire même a -http://5.39.76.46).

    -

    Cependant, le DNS est un système qui date de 1984, et les exigences de l’époque -en termes d’expérience utilisateur n’étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.

    -

    Tout d’abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est /, celle de DNS est ., et là ou il convient d’écrire, par exemple,/usr/ et ou la progression se fait de gauche a droite pour le FS, pour DNS le -. n’est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) com, et le domaine -google.com appartient a com, on écrit donc google.com sans écrire le point -a la fin de façon courante.

    -

    Le reverse DNS est une variante du DNS “classique” permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n’a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les “adresses” que l’on query en reverse DNS -sont donc constituées de l’adresse IP, dans le sens contraire a l’ordre -habituel, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire dig PTR -76.46.39.5.in-addr.arpa. La réponse sera, évidemment, wxcafe.net

    -

    Voyons maintenant comment mettre en place son propre serveur DNS. Tout d’abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est dig. Le DNS fonctionne avec des -“enregistrements”, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. dig se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n’importe quelle information : par exemple, dig NS -wxcafe.net devrait vous renvoyer

    -
    ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> NS wxcafe.net
    -;; global options: +cmd
    -;; Got answer:
    -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13846
    -;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    -
    -;; QUESTION SECTION:
    -;wxcafe.net.            IN  NS
    -
    -;; ANSWER SECTION:
    -wxcafe.net.     3600    IN  NS  ns.wxcafe.net.
    -wxcafe.net.     3600    IN  NS  ns.home.wxcafe.net.
    -
    -;; Query time: 60 msec
    -;; SERVER: 10.0.42.1#53(10.0.42.1)
    -;; WHEN: Tue Dec 10 13:31:18 2013
    -;; MSG SIZE  rcvd: 67
    -
    - - -

    Comme vous pouvez le voir, les serveurs DNS principaux pour -wxcafe.net sont ns.wxcafe.net et ns.home.wxcafe.net, -qui sont respectivement des alias pour wxcafe.net et home.wxcafe.net. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l’adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu’il est en train de faire une boucle infinie et -demandera l’adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.

    -

    La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d’écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : named.conf, -named.conf.default-zones, named.conf.local et named.conf.options. -named.conf contient les options par défaut de bind, named.conf.default-zones -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -named.conf.local contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.

    -

    Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l’autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi).

    -

    Examinons tout d’abord les fichiers de configuration de named.named.conf.local contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones wxcafe.net et 76.46.39.5.in-addr.arpa sont gérées -en master, et les zones home.wxcafe.net et 103.177.67.80.in-addr.arpa sont -gérées en slave. Nous n’examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l’un héberge en slave les masters de l’autre. -Le fichier named.conf.local sur wxcafe.net contient donc

    -
    zone "wxcafe.net" {
    -    type master;
    -    file "/etc/bind/master/wxcafe.net";
    -    allow-transfer {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "home.wxcafe.net" {
    -    type slave;
    -    file "/etc/bind/slave/home.wxcafe.net";
    -    masters {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "46.76.39.5.in-addr.arpa" {
    -    type master;
    -    file "/etc/bind/master/46.76.39.5.in-addr.arpa";
    -    allow-transfer {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "103.177.67.80.in-addr.arpa" {
    -    type slave;
    -    file "/etc/bind/slave/103.177.67.80.in-addr.arpa";
    -    masters {
    -        80.67.177.103;
    -    };
    -};
    -
    - - -

    Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans /etc/bind/master/, et les slaves un fichier dans -/etc/bind/slave/, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.

    -

    Voyons maintenant le fichier de zone concernant wxcafe.net, soit -/etc/bind/master/wxcafe.net :

    -
    $TTL 3600    ; 1 hour
    -@               IN SOA ns.wxcafe.net. wxcafe.wxcafe.net. (
    -                        2014011001  ; serial
    -                        3h          ; refresh  
    -                        1h          ; retry
    -                        168h        ; expire
    -                        300         ; negative response ttl
    -                        )
    -
    -; Name servers
    -                IN  NS      ns.wxcafe.net.
    -                IN  NS      ns.home.wxcafe.net.
    -
    -; Mail exchangers
    -                IN  MX  10  wxcafe.net.
    -                IN  SPF "v=spf1 ip4:5.39.76.46 a -all"
    -
    -; Main A/AAAA records
    -                IN  A       5.39.76.46
    -ns              IN  A       5.39.76.46
    -
    -; Aliases
    -data            IN  CNAME   wxcafe.net.
    -;        [...]
    -www             IN  CNAME   wxcafe.net.
    -
    -
    -; home.wxcafe.net. definition
    -$ORIGIN home.wxcafe.net.
    -@               IN  NS      ns.home.wxcafe.net.
    -                IN  NS      ns.wxcafe.net.
    -ns              IN  A       80.67.177.103
    -                IN  A       80.67.177.103
    -
    - - -

    Alors. Expliquons ligne par ligne.
    -Tout d’abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone.
    -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net.
    -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l’ordre :
    - - Le nameserver autoritaire pour le nom de domaine en question,
    - - L’adresse email du responsable de cette zone, avec le premier point - remplacé par un @,

    -

    puis entre parenthèses :
    - - Le numéro de série (“version” du fichier de zone, ici au format - YYYYMMDDNN)
    - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire,
    - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible,
    - - La période d’expire, le temps qu’attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin
    - - La période de TTL négatif, le temps qu’attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable.

    -

    Bon, tout ceci est peut-être un peu confus, mais ce n’est pas le record le plus -important a lire (pour les humains en tout cas). Continuons :

    -

    NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine.

    -

    MX permet d’indiquer ou il convient d’envoyer les emails pour ce domaine. -SPF est un record d’authentification pour les emails. -Les records A désignent l’association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n’est pas encore en IPv6.

    -

    Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d’autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d’Apache, pour le web)

    -

    Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l’adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l’a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.

    -

    Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n’étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c’est pas les mêmes domaines…).

    -

    Voila donc une courte explication de ce qu’est le DNS. Bien entendu, tout n’est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le RFC -1034 et le -RFC 1035. Dans un autre style (bien plus -avancé) le blog de Stéphane Bortzmeyer est interessant -aussi.

    -
    -
    -
    -

    NAT

    -
    - Date - - Mon 17 February 2014 - -
    - By - wxcafé -
    - Category - Ranting -
    - - - - -
    -

    NAT (Network Address Translation) in a word?
    -It’s complicated. Very. Don’t do it, you’d damage your brain.

    -

    Bon, sinon, prochain article serieux vite, bisous.

    -
    -
    -
    -

    Plan9 from whichever space

    -
    - Date - - Mon 09 September 2013 - -
    - By - Wxcafe -
    - Category - OSes -
    - - - - -
    -

    Plan 9 from Outer Space est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l’un des pires films jamais sortis. Rempli -d’erreur de montage, d’effets spéciaux au rabais, et ayant même connu la mort -d’un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.

    -

    Plan 9 from Bell Labs est un OS venant de Bell Labs (comme son nom l’indique), -et qui a été pensé comme le successeur d’Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu’à leur but naturel. Ainsi, c’est Plan9 qui a -introduit le concept d’UnionFS, le protocole 9P qui permet d’acceder a des -ressources appartenant a d’autres ordinateurs a distance, un support de -l’unicode par défaut et sur tout le système (a l’inverse d’Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d’autres améliorations sur les thèmes de base que propose Unix.

    -

    Cependant, Plan9 n’a jamais été véritablement utilisé pour quoi que ce soit -d’autre que la recherche en systèmes, et c’est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d’intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme “cloud -computing” n’apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.

    -

    En effet, même si l’on considère que les nouveautés qu’il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu’elles sont déjà -conséquentes), lorsqu’on les prend ensemble, elles font de Plan9 le système -d’exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d’un système -distant comme n’étant qu’une poignée de fichiers permet de le monter comme -n’importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s’ils sont hétérogènes (c’est a dire provenant -de machines différentes), permet d’utiliser les ressources d’une machine -distante comme si elle était présente localement. Le mécanisme d’UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).

    -

    Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d’ordinateur lorsque le concept même du système est d’être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d’implémenter très facilement -différents concepts réseaux : en montant le /net d’un ordinateur du réseau local -sur celui servant de gateway vers l’internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d’un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l’accès de l’ordinateur distant, et les connections entre les -deux sont chiffrées.

    -

    Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur “puissance” de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s’est doté du support de jusqu’à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu’ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu’ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l’a été X11, et de nombreuses autres -améliorations sur Unix.

    -

    Malheureusement, il n’a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : “worse is better”. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 via son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc…

    -
    -
    - -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/index2.html b/output/index2.html deleted file mode 100644 index 13abc7c..0000000 --- a/output/index2.html +++ /dev/null @@ -1,1461 +0,0 @@ - - - - - Wxcafé - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    Sed Basics

    -
    - Date - - Sun 18 August 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    sed est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.
    -Or sed a bien plus de possibilités que ça, comme nous allons le voir.

    -

    Tout d’abord, rappelons les bases : sed est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de ed, l’éditeur original.ed est un éditeur de ligne, conçu a l’époque ou les ordinateurs n’étaient pas -personnels et étaient utilisés avec des téléscripteurs, c’est a dire des -machines dépourvues d’écrans et ne permettant donc pas l’utilisation d’éditeurs -dits “visuels”, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. sed est donc une évolution de ed, le -s signifiant stream, sed est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir Flux standards) pour éditer plus d’une ligne a la fois. -En pratique, sed est principalement utilisé sur des fichiers.

    -

    sed a quelques options pratique, notamment -s qui permet d’empêcher -l’affichage systématique des lignes traitées, ou bien -i (pour GNU sed) qui -permet de rediriger l’output dans le fichier d’input. Cela dit, l’intérêt unique -du programme est son langage de manipulation de texte.

    -

    ed, et donc sed, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans sed est

    -
    /[regex]/
    -
    - - -

    qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n’exécuter les commandes qui suivent que sur ces lignes.)

    -


    -La commande sed la plus utilisée est bien entendu le s, qui s’utilise de -la façon suivante :

    -
    s/[old text]/[new text]/[options]
    -
    - - -

    qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant g, -qui permet d’appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.
    -Les exceptions a la “fixité” de [new text] sont particulièrement -intéressantes. En effet, sed utilise un langage de regex plutôt standard, -excepté le fait qu’il permet jusqu’à 9 “holding spaces”, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.

    -

    Par exemple, la commande

    -
    sed 's/\(hello world\) world/\1/'
    -
    - - -

    sur le texte “hello world world” renverrait comme résultat

    -
    hello world
    -
    - - -

    De la même façon, le symbole & dans le texte de remplacement représente le -texte original. Ainsi, la commande

    -
    sed 's/hello world/& world/'
    -
    - - -

    sur le texte “hello world” renverrait comme résultat

    -
    hello world world
    -
    - - -


    -

    Une autre commande utile est p, qui sert a afficher le texte présent dans -l’espace courant :

    -
    /[regex]/p
    -
    - - -

    sed stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j’appelle l’espace courant (pattern space en anglais). La commandep affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu’il ne contienne que les lignes matchant, et le p affiche donc ce dernier.

    -

    Un autre exemple de commande sont c, i et a, qui s’utilisent ainsi :

    -
    c \
    -[text]
    -
    - - -

    De la même façon, pour le i :

    -
    i \
    -[text]
    -
    - - -

    Et de même pour a.

    -

    Ces trois commandes s’utilisent de la même façon pour la bonne raison qu’elles -sont très proches. i sert a insérer du texte avant le pattern space. a -sert a insérer du texte après le pattern space, et enfin c sert a -remplacer tout le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.

    -

    Enfin, dernière commande ne fonctionnant que ligne par ligne, d : - /[regex]/d -d (delete) supprime les contenus du pattern space.

    -

    sed est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.

    -
    -
    -
    -

    Le chiffrement de partitions avec dm-crypt et device-mapper

    -
    - Date - - Wed 10 July 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c’est a dire au fait de passer d’un fichier en -clair a un fichier chiffré dit cyphertext. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l’intégrité d’un système d’exploitation, ou -bien la confidentialité d’un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n’a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d’expliquer les concepts qui entrent en -jeu dans l’utilisation du sous-système du noyau Linux dm_crypt et de -présenter un rapide tutoriel concernant la création d’un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre clé GPG)

    -

    dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s’appuie sur LUKS, un standard de chiffrement -de disques. Comme son nom l’indique, device-mapper est un système qui a pour but -de mapper des block devices. Pour être plus clair, le kernel considère -comme “block device” tout fichier spécial (en gros, les fichiers disques dans/dev/, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d’un “fichier de périphérique” (trad. -Wikipédia), il en “crée” un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)

    -

    Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d’un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.

    -

    D’ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot doit s’appuyer sur une image initrd (l’initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n’est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,…) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l’initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier “cible” est remonté sur la racine, et l’initrd est démonté -est la RAM qu’il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.

    -

    La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n’est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d’attaques : l’une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du vrai boot -que l’initrd présente toujours le même checksum. Cela dit, cette méthode a -l’inconvénient d’intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.
    -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n’est pas possible pour un -attaquant de modifier ce système de fichier, et l’initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l’initrd et du noyau beaucoup plus difficile qu’elle ne le serait sans.

    -

    Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, cryptsetup. Ce dernier était en charge de cryptoloop, -l’ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l’utilisation userspace de dm-crypt, qui pour sa -part est entièrement kernel-space. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/…) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root.

    -

    Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :
    -Tout d’abord, il nous faut créer le fichier qui contiendra l’image. Pour cela, -dans une situation réelle ou l’on cherche a chiffrer un disque, il convient -d’utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire :

    -
    dd bs=1000 count=1000000 if=/dev/urandom of=image.img
    -
    - - -

    Maintenant que notre image est créée, nous pouvons la chiffrer :

    -
    sudo cryptsetup luksFormat image.img
    -
    - - -

    cryptsetup va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.
    -Une fois cela fait, nous allons mapper cette image :

    -
    sudo cryptsetup luksOpen image.img crypto
    -
    - - -

    cryptsetup nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s’est-il passé? En cherchant un peu, nous -voyons qu’il n’y a pas de nouveau disque dans /dev. C’est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n’a rien a voir. On remarque -qu’est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n’est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l’utiliser.

    -
    sudo mkfs.ext4 /dev/mapper/crypto
    -
    - - -

    Maintenant que notre disque est formaté, il peut être monté :

    -
    sudo mount /dev/mapper/crypto /mnt
    -
    - - -

    Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un mount | grep crypto devrait vous donner le résultat -suivant :

    -
    /dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered)
    -
    - - -

    Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité.

    -

    Pour résumer :

    -
      -
    • -

      Pour monter vos partitions :

      -
      sudo cryptsetup luksOpen <fichier chiffré> <nom de disque virtuel>
      -sudo mount /dev/mapper/<nom de disque virtuel> <emplacement>
      -
      - - -
    • -
    • -

      Pour démonter vos partitions :

      -
      sudo umount <emplacement>
      -sudo cryptsetup luksClose <nom de disque virtuel>
      -
      - - -
    • -
    -

    Pour simplifier la vie de tous, j’ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur github.

    -

    Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un dd if=votre_image of=/dev/votre_partition -pour ce faire.

    -
    -
    -
    -

    Redesign du blog, etc

    -
    - Date - - Wed 12 June 2013 - -
    - By - wxcafe -
    - Category - Note -
    - - - - -
    -

    Comme vous avez pu le remarquer, ce blog a “un peu” changé récemment.

    -

    Du coup, expliquons. J’ai récemment monté serverporn, et ai par la même -occasion découvert pelican. J’ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d’utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d’un “thème” -constitué de templates pour les fichiers html et l’organisation du projet et -d’une partie “statique” contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html.

    -

    Globalement, un thème est constitué ainsi :

    -
    thème
    -├── static
    -   ├─ css
    -     └─ [css files]
    -   ├─ img
    -     └─ [image files]
    -   └─ js
    -      └─ [javascript files]
    -└── template
    -    ├─ base.html
    -    ├─ index.html
    -    ├─ page.html
    -    ├─ [...]
    -    └─ article.html
    -
    - - -

    Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles {{ article.content }}, -par exemple. La syntaxe complète est très bien documentée dans la doc de -pelican.

    -

    L’un des grands avantages de pelican est aussi la facilité qu’il offre quand a -la mise a jour du blog.
    -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n’existant pas la dernière fois, etc… -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un make html pour mettre a jour le blog.

    -

    De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c’est moi -qui ait modifié les templates et le css), c’est lisible (puisque c’est du -python, par opposition au PHP…), et c’est plus “efficace”. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n’ai pas besoin d’un accès continu au net, bref, c’est plus -efficace.

    -

    En ce qui concerne les points négatifs :

    -
      -
    • -

      Perte des commentaires: - Je vous propose de vous référer a l’article de Gordontesos ici quand a - mon avis sur ce sujet.

      -
    • -
    • -

      Perte du bouton flattr: - Il va bientôt être remis, c’est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c’est assez facile a - faire.

      -
    • -
    • -

      Perte du spam: - Pourquoi c’est dans les points négatifs, ca?

      -
    • -
    • -

      Temps d’adaptation et d’appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c’est parce que j’apprend a me servir de ce système - et que j’apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d’apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.

      -
    • -
    -

    Voila, c’est mon retour d’expérience sur pelican. A plus.

    -
    -
    -
    -

    Comment Saurik a rooté les Google Glass

    -
    - Date - - Mon 06 May 2013 - -
    - By - Wxcafe -
    - Category - Hacking -
    - - - - -
    -

    Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un “app store” alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente…), a trouvé intéressant d’obtenir un accès root -sur celles-ci, ce qu’il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d’extraire l’OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.

    -

    Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n’a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :

    -

    Je tiens tout d’abord a préciser que toutes les informations qui vont -suivre sont extraites de cet article, et plus précisément de la -partie “How does this exploit work”.  Je tente d’apporter ma maigre -contribution a cette explication.

    -

    Donc, d’après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d’exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.

    -

    Saurik a donc cherché un exploit connu pour cette version d’android, et -l’a appliqué a son problème. L’exploit en question est relativement -simple. Depuis la version 4.0 d’android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l’accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc… Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l’application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l’archive gzip.

    -

    Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx–x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s’il -fonctionne dans une VM ou sur un véritable appareil. S’il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l’on cherche pour l’instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d’android, -dont l’application paramètres, et, dans ce cas précis, l’application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.

    -

    Cependant, un problème reste : le système de restauration d’Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d’avoir accès directement a /data/local.prop, le -fichier qu’on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d’écrire dans ce dossier.

    -

    Donc, nous allons lancer deux processus en même temps :

    -
      -
    • -

      Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :

      -
      while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2>/dev/null
      -do :
      -done
      -
      - - -
    • -
    • -

      Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu’il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l’ordinateur host :

      -
      adb restore exploit.ab
      -
      - - -

      Ces commandes vont fonctionner de concert pour nous donner un accès root :
      -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.
      -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l’âme proprement.
      -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.

      -
    • -
    -

    And voilà! On a écrit ce que l’on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu’il tourne dans une machine -virtuelle (ce que l’on veut, c’est en fait “ro.kernel.qemu=1”, qui -indique au noyau qu’il tourne dans qemu, un système de VM).

    -

    Il nous reste a rebooter, depuis l’ordinateur host :

    -
    adb reboot
    -
    - - -

    Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :

    -
    adb shell "mount -o remount,rw /system"
    -
    - - -

    Nous copions le binaire su vers l’appareil :

    -
    adb push su /system/xbin
    -
    - - -

    Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :

    -
    adb shell "chmod 6755 /system/xbin/su"
    -
    - - -

    Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :

    -
    adb shell "rm /data/local.prop"
    -
    - - -

    Enfin, nous redemarrons a nouveau :

    -
    adb reboot
    -
    - - -

    Et voila, une paire de google glass rootée!

    -

    Il est bon de préciser que cette manipulation n’est possible que parce -que les lunettes tournent sous une ancienne version d’android, et que ce -bug a été fixé depuis.

    -

    Il serait aussi interessant de couvrir les problèmes de vie privée -qu’engendrent les Google Glass, et ce sera fait dans un autre billet.

    -

    A bientôt!

    -
    -
    -
    -

    Monter son propre serveur, partie 1: le serveur et l'apache.

    -
    - Date - - Mon 18 March 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Il y a un certain temps, j’avais parlé du concept du self-hosting. Il -s’agit de posséder son propre serveur, et donc, par extension, ses -données.

    -

    Bien entendu, il n’est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n’est pas le sujet abordé ici.)
    -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l’utilisation que l’on veut en faire ici d’installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c’est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu’une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l’installation simple et -compréhensible).

    -

    La première chose a faire est bien entendu d’obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d’obtenir un serveur, que ce soit en le -louant chez OVH/1&1/n’importe quel autre hébergeur commercial, en -participant a un système d’hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC… Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi…). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.

    -

    Dans cet article, lorsque est précisée le type d’IP a utiliser, il -convient de mettre ce type précisément. Quand le type n’est pas -précisée, libre a vous de choisir ipv4 ou ipv6.

    -

    Bref. Commençons au point ou vous avez un accès root a votre serveur, -n’ayant soit aucun mot de passe, soit un choisi par l’hébergeur, et ou -rien n’est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un passwd, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d’éditer l’entrée DNS pour votre nom de -domaine.

    -

    Cette entrée doit donc pour l’instant ressembler a ca :

    -
        <votre nom de domaine>  NS 1 
    -                            IN MX 1 
    -                            IN A        <IPv4 de votre serveur>
    -                            IN AAAA     <IPv6 de votre serveur>
    -
    - - -

    Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c’est de la magie pour -l’instant, ca sera peut être le sujet d’un autre article), et d’indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.

    -

    root est un utilisateur assez répandu, et il est assez simple de -bruteforcer le mot de passe. (Relativement assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent…) Ainsi, nous allons -arrêter d’utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.
    -Cela se fait en deux temps : tout d’abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l’avenir; puis configurer -OpenSSH pour que celui ci n’accepte que les connections par clés et plus -celles sur root.

    -

    Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu’il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d’être très chiant a -distinguer de l’autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l’utilisation d’useradd plus facilement.)

    -

    Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste adduser <username>, soit utiliser le mode non-interactif -en faisant un adduser --group <username>

    -

    Avec useradd, vous devrez utiliser la commande suivante : useradd -m --N -g <username>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l’ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).

    -

    Il convient maintenant d’ajouter cet utilisateur aux groupes qu’il sera -amené a administrer: usermod <username> -a -G www-data postfix -users staff sudo wheel, puis de changer son mot de passe -passwd. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: echo "%sudo ALL=(ALL) ALL" >> /etc/sudoers
    -Enfin, changeons d’utilisateur : su. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d’administration. Si vous devez encore utiliser root, c’est que -quelque chose ne va pas.

    -

    Vous êtes donc loggés sur le système en tant qu’utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.
    -Tout d’abord, qu’est-ce qu’un login par clé ssh? Il s’agit en fait d’un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d’utiliser plusieurs clés publique pour chaque
    -utilisateur.

    -

    Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d’abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande ssh-keygen -t rsa (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.
    -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c’est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier…) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec unscp ~/.ssh/id_rsa.pub <username>@<votre nom de domaine>:~/ , ou -en la copiant a la main, si ça vous amuse.

    -

    Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (mkdir .ssh), puis -de déplacer ce fichier a la bonne place (mv ~/id_rsa.pub ~/.ssh/authorized_keys). -Testez si ça fonctionne : ouvez un autre terminal, et
    -connectez vous a votre serveur (ssh <username>@<votre nom de -domaine>), et il ne devrait pas vous demander de mot de passe.Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.

    -

    Continuons. Il ne nous reste plus qu’a installer le serveur web, et a le -configurer:

    -
    sudo apt-get install \
    -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \
    -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \
    -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \
    -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \
    -php5-imagick imagemagick libapache2-mod-suphp libruby \
    -libapache2-mod-ruby
    -
    - - -

    (faisons large, on aura besoin de l’excédent plus tard…), puis activons les
    -mods apache en faisant a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest, et faisons en sorte que ces activations -soient prises en compte par apache via un sudo service apache2 -restart

    -

    Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer.

    -

    Pour cela, nous allons faire un simple ln -s /etc/apache2/sites-{available,enabled}/default, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l’éditer, en changeant l’adresse mail au début du document -par la votre, et en changeant AllowOverride none en AllowOverride All, -et enfin redémarrer apache pour qu’il prenne en compte les -modifications, par un sudo service apache2 restart

    -

    Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l’installation du serveur mail (c’est suffisamment complexe pour -prendre un article seul…)

    -
    -
    -
    -

    Pourquoi je vais quitter linux pour passer a FreeBSD.

    -
    - Date - - Mon 04 February 2013 - -
    - By - Wxcafe -
    - Category - Ranting -
    - - - - -
    -

    This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text here

    -

    Bon, voila. J’ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n’avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n’ai même idée que quelque chose dans mon système d’exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l’époque, je n’avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j’ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s’accumulant et -mon niveau de compréhension du système s’améliorant, j’ai commencé a -remarquer que certain bouts de l’OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s’est faite a -cause de la recrudescence de ces bouts d’OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d’OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j’en ai eu marre de voir unity sur ma machine, et j’ai -choisi de passer a Archlinux. C’était avant le passage a systemd. Ce -système me convenait bien. Si je n’installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c’était le moins -envahissant de ceux la.

    -

    Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n’a pas vraiment eu le choix, rapport a la philosophie de la -distribution d’avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les kits (bien que ce ne soient -pas les seuls a faire ça…) ont un problème très précis, qui n’importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :

    -
      -
    1. Ce qui est petit est beau
    2. -
    3. Faites en sorte que chaque programme fasse une chose, bien.
    4. -
    5. Faites un prototype aussi vite que possible
    6. -
    7. Choisissez la portabilité plutôt que l’efficacité
    8. -
    9. Stockez les données dans des fichiers textes.
    10. -
    11. Utilisez ce qui existe déjà a votre avantage. [1]
    12. -
    13. Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.
    14. -
    15. Évitez les UI qui “capturent” l’utilisateur.
    16. -
    17. Faites de chaque programme un filtre.
    18. -
    -

    Alors bien entendu, un système d’exploitation est fait pour évoluer, et -on pourrait penser qu’UNIX a fait son temps. Cependant, ce n’est pas -exactement la façon dont l’informatique fonctionne. Effectivement, les -standards, les systèmes d’exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n’est -pas d’UNIX que nous parlons ici. C’est de la philosophie UNIX. Et -celle-ci n’a pas fait son temps, elle a fait ses preuves. La -philosophie UNIX, en plus d’être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu’au premier jour.
    -La philosophie UNIX est aussi et surtout une garantie d’utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l’informatiquesérieusement (je ne dis pas que les autres métiers de l’informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).

    -

    Tous OS se doit d’avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d’échanger des informations. C’est -efficace, ça respecte le “tout est fichier”, c’est standard, c’est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n’est explicitement pas faite pour -être utilisée a la ligne de commande mais a l’aide d’APIs, et un -programme monolithique qui effectue sa tache d’une façon complètement -obscure pour l’utilisateur. Alors bien sur, il l’effectue d’une façon -efficace, cette tache. Oui, ça va plus vite qu’avant. Oui, c’est plus -“rangé”, ça fait moins “fouillis”. Mais c’est moins efficace. C’estbeaucoup moins utilisable pour l’utilisateur final. C’est -horriblement chiant pour les sysadmins, parce qu’ils ne peuvent plus -lire facilement les échanges entre programmes. C’est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.
    -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l’utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d’en choquer quelques -uns, je préfère avoir un système qui boote légèrement plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C’est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n’employant plus les -systèmes basiques d’UNIX.

    -

    Le problème est qu’il est facilement visible que la direction prise par -la communauté Linux n’est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d’accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d’autres raisons…), et on peut -compter sur le fait que les autres distributions l’adopteront un jour ou -l’autre.

    -

    Bon, maintenant que nous avons, si ce n’est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu’ils me -déplaisent, on pourrait penser qu’il suffit de passer a une distribution -n’incluant pas systemd, voire a une distribution n’incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu’OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d’ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l’init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d’exploitation une date -d’expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d’init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s’ouvrent a moi: OpenSolaris et *BSD. Minix n’est pas -vraiment un choix, vu le peu de programmes qu’il permet de faire -fonctionner et le fait qu’il ne soit disponible que sur i386, ce qui -n’est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n’est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.

    -

    OpenSolaris est un système d’exploitation tout a fait valable. Je n’ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l’idée que j’ai d’un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs “release-only”), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n’importe quoi. Bref, cela -n’est pas le sujet. Il convient aussi de voir qu’avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n’ait pas de très beaux jours devant lui (la page d’accueil du -projet affiche d’ailleurs un ÉNORME logo Oracle, du meilleur gout.)

    -

    Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu’OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c’est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d’être orientées sécurité, et d’après ce que j’ai pu en voir -DFBSD ressemble aussi au système de l’assistance a l’user a outrance -décris plus haut. Mais la vérité est que je n’ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu’entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j’aime -pouvoir configurer mes logiciels de façon assez profonde.)

    -

    Voila, c’est mon avis sur ce “problème” actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n’apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.
    -[1]: Je n’ai pas trouvé de traduction satisfaisante a “software leveraging”, mais l’idée est la…*

    -
    -
    -
    -

    Update et pensées a propos du Raspberry Pi

    -
    - Date - - Sun 27 January 2013 - -
    - By - Wxcafe -
    - Category - Ranting -
    - - - - -
    -

    Bon.
    -J’ai annoncé il y a environ 20 jours que j’avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, astucieusement nommée -PiRatBox. Il se trouve qu’après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n’est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.
    -Alors, autant il me semble évident qu’avec une -alimentation provenant d’un port USB a 2A (max), je n’avais pas -énormément de chances d’avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité.

    -

    De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB…), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu’il soit surement possible de la désactiver au niveau du kernel, -il n’est pas simplement possible de la “débrancher”. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve.

    -

    Bon, je dois avouer n’avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple et -bonne raison qu’arch utilise systemd et qu’il n’existe pas de wrapper -systemd pour les daemons piratebox, et que j’ai la flemme d’en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j’utiliserai debian. Le problème d’utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l’autre, en ce sens que si on installe un package “haut”, c’est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d’installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package “bas”, c’est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -“hauts”, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu’il n’y a pas de moyen “facile” de choisir ce qui -sera installé sur le système avant l’installation proprement dite -(puisque le moyen “universel” d’installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)

    -

    Il y a énormément d’autres critiques que l’ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s’arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l’OS qui lui même se lance, initialise le hardware, -etc…, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d’une cour d’immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe…), et le moyen le -plus efficace qu’aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc…

    -

    Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n’estvisiblement pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c’est bien réalisé, sinon je dis non.

    -

    Enfin, le projet que j’avais est toujours en cours de réalisation. Je -le terminerai dès que j’aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu’il m’a posé, qu’il n’aurait pas du me poser, m’ont -trop agacé pour que j’aie envie de le sortir et de jouer avec une fois -sa mission remplie.

    -

    Dommage.

    -
    -
    -
    -

    Update

    -
    - Date - - Sat 05 January 2013 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d’une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!

    -
    -
    -
    -

    Mutt ou le client email le meilleur moins mauvais

    -
    - Date - - Wed 02 January 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Les clients mails ont une particularité en commun : ils sont tous -très mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation a la UNIX
    -Cependant, un d’entre eux se démarque par sa moins-mauvais-itude, c’est -le relativement bien connu Outlook Express 2003 Mutt!
    -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, “just sucks less”. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.

    -

    La configuration de mutt se fait dans le fichier .muttrc ou dans -/etc/Muttrc, et il est courant d’utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d’un système d’accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d’offlineimap se fait dans~/.offlineimaprc ou dans rien d’autre en fait, c’est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)
    -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et ce script fait par moi, qui vous permet d’installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.
    -Ensuite, voyons pour la partie configuration :
    -Ma configuration d’offlineimap :

    -
    ## Config file for offlineimap
    -## Originally located in ~/.offlineimaprc
    -## This should not be edited without creating a copy before
    -## Created by Wxcafe (Clément Hertling)
    -## Published under CC-BY-SA
    -
    -[general]
    -# List of accounts to be synced, separated by a comma.
    -accounts = main
    -
    -[Account main]
    -# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
    -localrepository = main-local
    -# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
    -remoterepository = main-remote
    -# Status cache. Default is plain, which eventually becomes huge and slow.
    -status_backend = sqlite              # le type de cache. (plain ou sqlite)
    -
    -[Repository main-local]
    -# Currently, offlineimap only supports maildir and IMAP for local repositories.
    -type = Maildir                        # le type de stockage (Maildir ou IMAP)
    -# Where should the mail be placed?
    -localfolders = ~/Emails/                # le dossier dans lequel vous
    -                                        # voulez que vos emails apparaissent
    -
    -[Repository main-remote]
    -# Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.
    -type = IMAP
    -remotehost = //placeholderhost//        # le serveur de votre messagerie
    -remoteuser = //placeholderusername//    # votre nom d'utilisateur
    -remotepass = //placeholderpassword//    # votre mot de passe
    -cert_fingerprint = //placeholdercert//  # le certificat du serveur (IMAPS only)
    -
    - - -

    Ça devrait être assez simple a lire, j’ai tout bien commenté :3
    -Puis ma config mutt :

    -
    ## Mutt MUA configuration file
    -## This file should not be edited without creating a copy
    -## File Created and edited by Wxcafe (Clément Hertling)
    -## Published under CC-BY-SA
    -
    -# General config for reading (fetched via offlineimap)
    -
    -set mbox_type = Maildir
    -# type de boite mail (voir dans offlineimap, mailbox par defaut)
    -
    -set folder = ~/Email/
    -# dossier root mailbox/imap
    -
    -set spoolfile = +INBOX
    -# dossier d'inbox
    -
    -set mbox = +'All Mail'
    -# dossier ou archiver les emails
    -
    -set copy = yes
    -# yes pour copier les messages dans les differents dossier, no pour...
    -# enfin voila quoi.
    -
    -set header_cache = /.hcache/
    -# dossier ou sont stockés les headers (pour le cache)
    -
    -set record = +Sent
    -# dossier dans lequel sont stockés les messages envoyés
    -
    -set postponed = +Drafts
    -# dossier dans lequel sont stockés les brouillons
    -
    -mailboxes = +INBOX +Drafts +Sent +Trash  +All\ Mail 
    -# liste des dossiers qui vont apparaitre dans la colonne de gauche
    -
    -# General config for sending (using Mutt's native support)
    -
    -set smtp_pass = 'password_placeholder'
    -# votre mot de passe
    -
    -set smtp_url = "smtp://username@whatev.org:465/"
    -# l'url ou envoyer les emails
    -
    -set send_charset = "utf-8"
    -# UTF8, NE PAS CHANGER
    -
    -set signature = ".sign"
    -# vous pouvez mettre votre signature dans .sign
    -
    -set sig_on_top = yes
    -# il est d'usge de mettre no ici. Cependant, je trouve ca plus lisible 
    -# comme ca.
    -
    -set ssl_verify_host = no
    -# mettez yes ici si votre serveur a un certificat configuré correctement
    -
    -set hostname = "wxcafe.net"
    -# mettez l'adresse de votre serveur ici
    -
    -# Misc settings
    -
    -auto_view text/html
    -# la façon de voir les emails par défaut.
    -
    -set date_format = "%y-%m-%d %T"
    -# format de date d'envoi/de reception.
    -
    -set index_format = "%2C | %Z [%D] %-30.30F (%-4.4c) %s"
    -# format de l'index (la présentation de l'interface)
    -# voir http://www.mutt.org/doc/manual/manual-6.html#index_format
    -
    -set sort_alias = alias
    -set reverse_alias = yes 
    -set alias_file = "$HOME/.mutt/aliases"
    -# liste des alias noms/email. a créer et remplir vous même.
    -# format : "alias short_name long_email_adress"
    -source $alias_file
    -
    -set beep = no
    -# ne pas biper. CE SON ME TUE T.T
    -
    -set tilde = yes
    -set sleep_time = 0
    -# ?
    -
    -set sidebar_visible = yes
    -set sidebar_width = 15
    -# parametres de la barre coté gauche
    -
    -set realname = "Clément Hertling (Wxcafé)"
    -set from = "wxcafe@wxcafe.net"
    -set use_from = yes
    -set certificate_file = "$HOME/.mutt/cacert"
    -# parametres d'envoi. mettez vos propres infos a la place des miennes...
    -
    -set edit_headers = yes
    -# vous permet de vois les headers des mails. j'aime, donc je laisse.
    -
    -# Macros
    -
    -# le titre dit tout. index veut dire que la macro est active dans les menus,
    -# pager qu'elle l'est dans la visionneuse, les deux qu'elle l'est dans les 
    -# deux
    -# \C represente la touche Control
    -
    -bind index,pager \Cp sidebar-prev
    -# Control+p -> remonter d'un dossier dans la sidebar
    -
    -bind index,pager \Cn sidebar-next
    -# Control+n -> descendre d'un dossier dans la sidebar
    -
    -bind index,pager \Co sidebar-open
    -# Control+o -> ouvrir le dossier selectionné dans la sidebar
    -
    -macro index,pager d "=Trash" "Trash"
    -# d supprime le message en cours
    -
    -bind pager   previous-line
    -# permet de monter d'une ligne avec la touche up, au lieu de changer de message.
    -
    -bind pager   next-line
    -# permet de descendre d'une ligne avec la touche down, au lieu de changer de 
    -# message
    -
    -bind pager j next-line
    -bind pager k previous-line
    -# raccourcis vim
    -
    -# PGP signing commands
    -
    -set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
    -set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
    -set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
    -set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f"
    -set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f"
    -set pgp_encrypt_only_command="pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
    -set pgp_encrypt_sign_command="pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
    -set pgp_import_command="gpg --no-verbose --import -v %f"
    -set pgp_export_command="gpg --no-verbose --export --armor %r"
    -set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
    -set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r" 
    -set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r" 
    -set pgp_autosign=yes
    -set pgp_sign_as=0x********
    -# remplacez 0x******** par votre identifiant PGP!!!!!
    -
    -set pgp_replyencrypt=no
    -set pgp_timeout=7200
    -set pgp_good_sign="^gpg: Good signature from"
    -
    -# si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis
    -# PGP signing options
    -
    -# Palette for use with the Linux console.  Black background.
    -
    -# Schéma de couleur Rouge et Noir. Commentez si vous voulez le 
    -# défaut noir et blanc.
    -# d'autres schémas sont trouvables sur google et autre.
    -
    -color hdrdefault red black
    -color quoted brightblack black
    -color signature brightblack black
    -color attachment red black
    -color message brightwhite black
    -color error brightred black
    -color indicator black red
    -color status white black
    -color tree white black
    -color normal white black
    -color markers red black
    -color search white black
    -color tilde brightmagenta black
    -color index red black ~F
    -color index red black "~N|~O"
    -
    - - -

    Voila, pour plus d’informations vous pouvez aller voir le manuel de mutt -@ http://www.mutt.org/doc/manual/
    -J’espère que cette configuration “toute faite” vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu’utiliser une configuration toute faire n’aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l’introduction ou a des situations ou il est absolument -nécessaire d’avoir rapidement une configuration fonctionnelle (c’est a -dire, dans le cas d’un client email, euh… jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -Bing Google Yahoo Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!

    -
    -
    - -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/pages/about/index.html b/output/pages/about/index.html deleted file mode 100644 index 36ef273..0000000 --- a/output/pages/about/index.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - A propos - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -

    A propos

    -

    Wxcafé, c’est moi.

    -

    Je m’appelle Clément Hertling, je suis né en 1995, et je suis étudiant en DUT aParis 12 (UPEC). Je vis actuellement a Villejuif, près de -Paris, en France.

    -

    Je suis enthousiaste dès qu’il s’agit de jouer avec des ordinateurs, que ce soit -avec des systèmes d’exploitations (et particulièrement les UNIX-like : Linux, -*BSD, OS X, Plan 9, …), mais aussi avec le réseau et son administration -(principalement couches 2 et 3, routage et commutation).
    -Je suis aussi intéressé par le hardware, que ce soit de l’embarqué ou bien des -serveurs, et dans une moindre mesure par l’électronique. Je fais un peu (et de -plus en plus) de programmation, principalement en python et en Rust. Je -m’intéresse beaucoup a la théorie de la programmation, toutefois, et notamment -de plus en plus a la programmation fonctionnelle et a la théorie des types.
    -On peut probablement en conclure que j’aime travailler avec la technologie. -J’aime aussi écrire a propos de ce que je fais, et de mes pensées sur la -technologie en général, et c’est ce que je fais (parfois) ici.

    -

    Vous pouvez aussi me lire sur Twitter. Les liens sont dans la -barre a droite. Si vous voulez me rencontrer en vrai, vous pouvez m’envoyer un -email.

    -

    Wxcafé, that’s me.

    -

    I’m Clément Hertling, I was born in 1995, and I’m a student in a technical -formation at Paris 12 (UPEC). I live in Villejuif, near -Paris, France.

    -

    I’m pretty enthusiastic when it’s about playing with computers, whether that -means operating systems (and more specifically UNIX-like OSes : Linux, *BSD, -OS X, Plan 9, …), or networks and their administration (generally speaking, -layer 2 and 3, routing and switching).
    -I’m also interested in hardware, be it embedded systems or servers, and to a -smaller extent in electronics. I also do a bit of (but more and more) -programming, mostly in python and Rust. I’m very interested in CS theory, -though, and very much so in functionnal programming and type theory.
    -You could conclude that I like tech, and working in this domain. I also enjoy -writing about what I do and about my ideas on tech in general, and that’s what I -(sometimes) do here.

    -

    You can also read my thoughts on twitter. The links are in the sidebar. If you -want to meet me, you can send me an email.

    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/SSL-ou-la-securite-sur-internet/index.html b/output/posts/SSL-ou-la-securite-sur-internet/index.html deleted file mode 100644 index cf02f69..0000000 --- a/output/posts/SSL-ou-la-securite-sur-internet/index.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - SSL ou la sécurité sur l'internet - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - SSL ou la sécurité sur l'internet -

    -
    -
    -
    -
    - Date - - Fri 30 May 2014 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Disclaimer: Ce billet est écrit après le visionnage de la conférence de Moxie -Marlinspike suivante: More Tricks for Defeating SSL, -présentée a la DefCon 17 (en 2011), et la lecture du billet suivant: -A Critique of Lavabit, -ce qui peut avoir l’effet de rendre légèrement parano. Si vous considérez que -c’est le cas ici, veuillez ne pas tenir compte de ce billet (et vous pouvez dès -a présent dire coucou aux différentes personnes qui écoutent votre connection)

    -

    Si vous venez ici souvent (vous devriez), et que vous utilisez SSL pour vous -connecter a ce site (vous devriez, vraiment, dans ce cas), vous avez peut être -remarqué quelque chose récemment : il se trouve que le certificat qui permet de -desservir ce site a changé.

    -

    Cela fait suite aux évènements évoqués dans le Disclaimer, mais aussi a des -doigts sortis d’un endroit particulier du corps de l’admin/auteur de ce “blog”, -qui a pris enfin les 5 minutes nécessaires a la compréhension superficielle -du fonctionnement de SSL, et les 10 nécessaires a la mise en place d’un système -fonctionnel utilisant cette compréhension récemment acquise.

    -

    Bref, le certificat a changé. Mais de quelle façon, vous demandez vous peut -être (ou pas, mais bon, je vais expliquer de toute façon). Et bien c’est très -simple : il existait auparavant un certificat pour wxcafe.net, un pour -paste.wxcafe.net, un pour mail.wxcafe.net, etc… Bref, un certificat -différent pour chaque sous-domaine.

    -

    Il s’avère que c’est a la fois très peu pratique a utiliser (les utilisateurs -doivent ajouter chaque certificat a leur navigateur séparément, chaque -changement de sous-domaine conduit a un message d’erreur, etc) et pas plus -sécurisé que d’avoir un seul certificat wildcard. J’ai donc généré un certificat -pour *.wxcafe.net hier, et il sera dorénavant utilisé pour tous les -sous-domaine de wxcafe.net; et un certificat pour wxcafe.net, qui ne matche -pas *.wxcafe.net, et qui sera donc utilisé… bah pour wxcafe.net.

    -

    Il serait préférable de faire des redirections automatiques des adresses http -vers les adresses https, cependant, étant donné que le certificat est -self-signed, il me semble préférable que l’arrivée sur le site ne commence pas -par une page firefox disant “Something’s Wrong!”, et ces redirections ne seront -donc pas mises en place.

    -

    De plus, après la lecture de l’article de blog sur Lavabit dont le lien est plus -haut, il semble intéressant (et assez important) de faire en sorte que le -serveur utilise en priorité (et si possible, uniquement) des ciphers supportant -PFS, soit EDH et EECDH (Ephemeral Diffie-Helmann et la version Elliptic Curves -de ce même algorithme). Cela permet de faire en sorte que toutes les -communications avec ce serveur soient future-proof, c’est a dire que, même si -quelqu’un récupérait la clé privée, elle ne serait pas utile pour déchiffrer les -communications passées.

    -

    Bon, maintenant que les explications basiques sont faites, voyons -l’implémentation :
    -Pour générer la clé, tout d’abord, il convient d’utiliser les commandes -suivantes:

    -
    sudo openssl genrsa -out example.key 4096
    -# nous utilisons ici une clé de 4096 bits, la taille est laissée a votre appréciation
    -sudo openssl req -new -key example.key -out example.csr
    -# OpenSSL va ici vous demander de nombreuses informations, "Common Name" devant contenir le FQDN
    -sudo openssl X509 -req -days 1095 -in example.csr -signkey example.key -out example.crt
    -# enfin, nous générons la clé, d'une durée de vie de 3 ans
    -
    - - -

    Bien entendu, si vous voulez utiliser une clé wildcard, il vous faut préciser -*.example.com comme common name. -Une fois la clé générée, il faut dire aux différents services de l’utiliser, et -de n’utiliser que des ciphers PFS. La méthode dépend donc du service. -Je vais lister ici les methodes pour quelques services que j’utilise :

    -

    apache :

    -
    # /etc/apache2/mods_enabled/ssl.conf
    -# [...]
    -SSLProtocol all -SSLv2 -SSLv3
    -SSLHonorCipherOrder on
    -SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
    -  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
    -  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
    -# [...]
    -# /etc/apache2/sites-enabled/default-ssl
    -# [...]
    -SSLEngine on
    -SSLCertificateFile /etc/certs/example.com.crt
    -SSLCertificateKeyFile /etc/certs/example.com.key
    -# [...]
    -
    - - -

    nginx :

    -
    # /etc/nginx/nginx.conf 
    -# [...]
    -ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    -ssl_prefer_server_ciphers on;
    -ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 \
    -  EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 \
    -  EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
    -# [...]
    -# /etc/nginx/sites-enabled/default-ssl
    -# [...]
    -ssl on;
    -ssl_certificate /etc/certs/example.com.crt
    -ssl_certificate_key /etc/certs/example.com.key
    -# [...]
    -
    - - -

    prosody (jabber) :

    -
    # tout d'abord, lancez la commande suivante :
    -sudo openssl dhparam -out /etc/prosody/certs/dh-2048.pem 2048
    -# ensuite, pour chaque VirtualHost dans /etc/prosody/prosody.conf :
    -ssl = {
    -  dhparam = "/etc/prosody/certs/dh-2048.pem";
    -  key = "/etc/certs/example.com.key";
    -  certificate = "/etc/certs/example.com.crt";
    -}
    -# la cipher suite de prosody utilise par défaut EDH et EECDH
    -
    - - -

    postfix (email) :

    -
    # /etc/postfix/main.cf
    -# [...]
    -smtpd_tls_cert_file = /etc/certs/example.com.crt
    -smtpd_tls_key_file = /etc/certs/example.com.key
    -tls_preempt_cipherlist = yes
    -smtpd_tls_eecdh_grade = strong
    -smtdp_tls_mandatory_ciphers = high
    -smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, MD5, LOW, 3DES, EXP, PSK, SRP, DSS
    -smtpd_tls_security_level = encrypt
    -smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
    -smtpd_use_tls = yes
    -# [...]
    -
    - - -

    dovecot (imap) :

    -
    # /etc/dovecot/dovecot.conf 
    -# [...]
    -ssl_cert = </etc/certs/example.com.crt
    -ssl_key = </etc/certs/example.com.key
    -ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
    -
    - - -

    Voila. Pour d’autres protocoles/services, je vous invite a RTFM^W vous reporter -au manuel approprié.

    -

    Cela étant dit, je conseille a tout le monde d’aller voir la conférence dans le -disclaimer, et tant qu’a faire la conférence du même hacker SSL and the future -of Authenticity qui parle de son -implémentation d’une technologie “remplaçant” le système de CAs qui existe -actuellement.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/comment-saurik-a-roote-les-google-glass/index.html b/output/posts/comment-saurik-a-roote-les-google-glass/index.html deleted file mode 100644 index b42eac6..0000000 --- a/output/posts/comment-saurik-a-roote-les-google-glass/index.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - Comment Saurik a rooté les Google Glass - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Comment Saurik a rooté les Google Glass -

    -
    -
    -
    -
    - Date - - Mon 06 May 2013 - -
    - By - Wxcafe -
    - Category - Hacking -
    - - - - -
    -

    Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu -pour avoir développé Cydia, un “app store” alternatif pour les iTrucs), -après avoir reçu une paire de Google glass de la part de Google (de -façon assez évidente…), a trouvé intéressant d’obtenir un accès root -sur celles-ci, ce qu’il a accompli très rapidement. Des démentis de la -part de Google et de certains autres sites sont vite arrivés, disant que -les lunettes possédaient un bootloader débloqué et que de fait, le root -était facile a obtenir : il suffisait de débloquer le bootloader, -d’extraire l’OS, de le rooter hors-fonctionnement, puis de le -réinstaller, rooté, sur les lunettes.

    -

    Le fait est que de débloquer le bootloader laisse une trace permanente -sur les lunettes, et que Saurik n’a pas utilisé cette technique pour -rooter sa paire. Voyons comment il a fait :

    -

    Je tiens tout d’abord a préciser que toutes les informations qui vont -suivre sont extraites de cet article, et plus précisément de la -partie “How does this exploit work”.  Je tente d’apporter ma maigre -contribution a cette explication.

    -

    Donc, d’après les témoignages des quelques utilisateurs de Glass dans le -monde, il semblerait que ces dernières fonctionnent avec un système -d’exploitation Android, avec une nouvelle interface, mais avec les mêmes -outils internes: un kernel Linux, des outils userland GNU et une machine -virtuelle Java Dalvik pour les applications.

    -

    Saurik a donc cherché un exploit connu pour cette version d’android, et -l’a appliqué a son problème. L’exploit en question est relativement -simple. Depuis la version 4.0 d’android, le système permet la sauvegarde -des données des différentes applications, une a une, via ADB (Android -Debug Bridge, un protocole USB permettant l’accès a de nombreuses -fonctions avancées des machines fonctionnant sous android, dont, entre -autre, un shell, un accès au logs de debugging, etc… Cette -fonctionnalité est bien entendu désactivable.) Ce backup est très simple : -il crée un fichier .tgz contenant le dossier de configuration de -l’application. Lors de la restauration, le système supprime la -configuration existante, puis la remplace par celle dans l’archive gzip.

    -

    Le problème de sécurité vient du fait que les applications android -voient leurs données stockées dans /data/data/identifiant/, et que -/data/ a pour permissions drwxrwx–x  27  system  system, ce qui -signifie que seul system et les membres du groupe system peuvent lire -dessus. Or, le fichier /data/local.prop définit de nombreux paramètres -au démarrage, et notamment un qui permet au système de déterminer s’il -fonctionne dans une VM ou sur un véritable appareil. S’il fonctionne sur -une machine virtuelle, il donne les droits root a tout utilisateur se -connectant via ADB, ce qui est ce que l’on cherche pour l’instant. Le -fait que /data/ appartienne a system veut dire que le programme de -restauration doit être setuid pour accéder aux données a l’intérieur qui -appartiennent a root (soit toutes les applications système d’android, -dont l’application paramètres, et, dans ce cas précis, l’application de -log système présente sur les google glass de test. Ainsi, nous avons un -processus tournant en tant que root, qui va écrire sur une partition qui -nous intéresse des données que nous possédons.

    -

    Cependant, un problème reste : le système de restauration d’Android -vérifie les données avant de restaurer, et ne restaure pas les symlinks, -ce qui nous empêche d’avoir accès directement a /data/local.prop, le -fichier qu’on cherche a modifier. Cela dit, il nous reste une -possiblité. Plaçons un dossier world-writable dans le fichier de backup, -et nous pourrons écrire dedans pendant quelques secondes, le temps que -la restauration se termine et que le système remette les permissions en -place. Ainsi, nous pouvons créer le fichier -/data/local/com.google.glass.logging/whatev/x, lien vers -/data/local.prop, et nous avons un toujours un processus tournant en -tant que root qui est en train d’écrire dans ce dossier.

    -

    Donc, nous allons lancer deux processus en même temps :

    -
      -
    • -

      Le premier tentera en boucle de créer le symlink. Il sera consitué de - la commande suivante, depuis un shell sur les lunettes :

      -
      while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2>/dev/null
      -do :
      -done
      -
      - - -
    • -
    • -

      Le deuxième sera le processus de restauration de notre exploit. Celui - ci, pour une plus grande chance de réussite, devra être suffisamment - lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x, - pour qu’il crée whatev, prenne du temps a copier bigfile, puis écrive - dans x après que le symlink soit effectif. La commande sera, depuis - l’ordinateur host :

      -
      adb restore exploit.ab
      -
      - - -

      Ces commandes vont fonctionner de concert pour nous donner un accès root :
      -- Le processus de restauration va créer le dossier whatev, qui sera - world-readable. Il va commencer a copier le fichier bigfile.
      -- Le processus de symlink va créer le lien - /data/data/com.google.glass.logging/whatev/x, pointant vers - /data/local.prop, puis rendre l’âme proprement.
      -- Le processus de restauration, ayant enfin fini de copier - whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui - est lié a /data/local.prop. Comme le processus est setuid root, il ne se - rendra compte de rien, et écrira tout dans /data/local.prop.

      -
    • -
    -

    And voilà! On a écrit ce que l’on veut dans /data/local.prop, ce qui -nous permet de faire croire a android qu’il tourne dans une machine -virtuelle (ce que l’on veut, c’est en fait “ro.kernel.qemu=1”, qui -indique au noyau qu’il tourne dans qemu, un système de VM).

    -

    Il nous reste a rebooter, depuis l’ordinateur host :

    -
    adb reboot
    -
    - - -

    Puis nous remontons la partitions système en lecture/écriture (r/w), -depuis le host :

    -
    adb shell "mount -o remount,rw /system"
    -
    - - -

    Nous copions le binaire su vers l’appareil :

    -
    adb push su /system/xbin
    -
    - - -

    Nous donnons les bonnes permissions a ce binaire, afin de pouvoir -l’exécuter plus tard :

    -
    adb shell "chmod 6755 /system/xbin/su"
    -
    - - -

    Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir -redémarrer normalement :

    -
    adb shell "rm /data/local.prop"
    -
    - - -

    Enfin, nous redemarrons a nouveau :

    -
    adb reboot
    -
    - - -

    Et voila, une paire de google glass rootée!

    -

    Il est bon de préciser que cette manipulation n’est possible que parce -que les lunettes tournent sous une ancienne version d’android, et que ce -bug a été fixé depuis.

    -

    Il serait aussi interessant de couvrir les problèmes de vie privée -qu’engendrent les Google Glass, et ce sera fait dans un autre billet.

    -

    A bientôt!

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/docker-et-les-ebooks-sur-twitter/index.html b/output/posts/docker-et-les-ebooks-sur-twitter/index.html deleted file mode 100644 index 41067c6..0000000 --- a/output/posts/docker-et-les-ebooks-sur-twitter/index.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - Docker et les ebooks sur Twitter - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Docker et les ebooks sur Twitter -

    -
    -
    -
    -
    - Date - - Sat 28 February 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Vous avez peut être déjà entendu parler de Docker. Si -ce n’est pas le cas, voila les bases : Docker est un système de containers. Les -containers sont une forme particulière de virtualisation, ou le kernel n’est pas -virtualisé, mais ou les processus du système hôte sont séparés de ceux des -systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les Jails, -mais n’est devenu possible sous linux que récemment grâce aux cgroups, -qui permettent justement de séparer des groupes de processus. Le principe de -Docker est donc d’avoir une machine hôte sur laquelle s’exécutent plusieurs -conteneurs Dockers, chacun séparé des autres et de l’hôte, mais utilisant tous -le même kernel. Cela pose quelques questions en terme de sécurités, puisque la -séparation est bien plus fine qu’avec de la virtualisation classique. En effet, -ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la -capacité de remonter jusqu’à l’hôte, puisqu’il n’est pas vraiment séparé des -invités.

    -

    Quoi qu’il en soit, Docker permet donc de virtualiser a moindre coût des -systèmes GNU/Linux. “Mais pourquoi utiliser Docker, dans ce cas”, vous -demandez-vous peut être, “puisque Xen peut faire la même chose, et plus -(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?”. Et bien -c’est très simple : Docker apporte la simplicité de déploiement d’applications. -Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui -permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une -commande. Le Docker Hub permet aussi de récupérer -rapidement et facilement un grand nombre d’images déjà configurées.

    -

    Maintenant que nous avons expliqué rapidement ce qu’était Docker, voyons le -rapport avec les ebooks et Twitter.

    -

    Les comptes dits “ebooks” (le nom vient a l’origine de horse_ebooks, -voir ici pourquoi) sont des bots -twitter utilisant des Chaines de Markov, -avec les tweets d’un utilisateur “source” comme corpus, pour produire des tweets -ressemblant a ceux de l’utilisateur source. Nous allons voir maintenant comment -en installer un.

    -

    C’est, comme disent certaines personnes, “fun”.

    -

    Il existe de nombreuses librairies écrites pour créer ce genre de bots, -cependant dans ce cas nous nous concentrerons sur -celle-ci, qui est une lib ruby créée -par @m1sp, qui gère pour nous a la fois l’API -twitter et la génération des messages.

    -

    Cependant, cela n’explique toujours pas le lien avec Docker. Ce lien est très -simple : nous utilisons un container pour faire tourner les bots. Depuis la -version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une -seule instance. Cependant, il est toujours plus sûr d’isoler les bots, et les -containers dockers permettent de les déployer sur n’importe quelle machine -(celleux qui ont déjà tenté de mettre en place une application basée sur ruby -sauront le problème que cela pose habituellement). Pour ce faire, j’ai créé un -repo github qui contient toutes les -pièces nécessaires pour mettre cela en place : le bot en lui même, les deux -Dockerfiles, etc.

    -

    Le fonctionnement du bot est -simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de -l’utilisateur source avec ebooks archive <username> <filename> (c’est du json) -, puis vous convertissez le json en fichier utilisable par le bot : ebooks -consume <filename>. Cela fait, démarrer le bot revient a lancer le container : -docker run -d <container name> Pour plus d’informations, allez voir la -documentation Docker

    -

    Bien entendu, dans l’idéal il faudrait mettre a jour les corpus de chaque -utilisateur régulièrement. Cela est très simple a mettre en place avec un simple -script cron :

    -
    00 00 * * *    /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json >> /var/log/ebooks/update.log 2>&1
    -00 05 * * *    cd /usr/local/ebooks/main/ && /usr/local/bin/ebooks consume corpus/username.json >> /var/log/ebooks/update.log 2>&1
    -00 10 * * *    docker rm -f bots >/dev/null 2>&1
    -00 15 * * *    docker rmi bots  > /dev/null 2>&1
    -00 20 * * *    cd /usr/local/ebooks/main/ && docker build --rm -t bots . >> /var/log/ebooks/build.log 2>&1
    -00 25 * * *    docker run -d --name bots bots >> /var/log/ebooks/run.log 2>&1
    -
    - - -

    Les 5 minutes entre chaque commande sont laissées pour empécher que deux -commandes ne s’executent en même temps.

    -

    Et voila, vous avez un container Docker qui fait tourner une application en ruby -toute sale, et votre système hôte reste propre. Bien sûr, ce n’est qu’un exemple -des possibilités de Docker : par exemple, on peut aussi faire tourner des -applications “usuelles” -dedans, -puisque l’overhead de Docker est minimal, et beaucoup d’autres applications -existent.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/freebsd-online-mfsbsd/index.html b/output/posts/freebsd-online-mfsbsd/index.html deleted file mode 100644 index 4a8fc48..0000000 --- a/output/posts/freebsd-online-mfsbsd/index.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - Installer FreeBSD sur un serveur Online avec MfsBSD - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Installer FreeBSD sur un serveur Online avec MfsBSD -

    -
    -
    -
    -
    - Date - - Thu 28 August 2014 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    J’ai récemment eu l’occasion de louer un serveur chez Online.net (filiale de Illiad) -Voulant depuis pas mal de temps gérer un serveur sous FreeBSD (et tester bhyve) -et n’ayant pour différentes raisons pas eu l’occasion de le faire sur mon serveur auto-hebergé ni sur ce serveur ci, -j’ai commencé a chercher comment le faire sur ce serveur.

    -

    Étant donné que Online ne propose pas directement d’image FreeBSD sur ses serveurs, il m’a fallu -chercher un peu plus loin. Il se trouve que ce post sur les forums -d’online explique une procédure, mais celle-ci ne fonctionnait pas pour mon serveur en particulier.

    -

    J’ai donc cherché un peu sur internet, puis demandé sur irc (#freebsd-fr@freenode), -ou l’on m’a dirigé vers mfsbsd, un projet d’installeur -alternatif, minimaliste et simplifié pour FreeBSD.

    -

    Pour installer FreeBSD sur votre serveur, donc, il vous faudra accéder a une -console KVM (dans mon cas personnel, iLO). Cela doit être faisable depuis le -panel Online. Une fois cela fait, lancez une console, puis téléchargez l’image -mfsbsd. Dans la console iLO, choisissez de booter sur une image CD/DVD, puis -choisissez l’image mfsbsd. Ensuite, rebootez le serveur. Choisissez de booter -sur l’image CD/DVD (F11 puis 1). Une fois ceci fait, un FreeBSD a l’air tout -a fait classique va démarrer. Une fois ceci fait, la partie importante arrive: -mfsbsd contient un script d’installation root-on-zfs, nommé logiquement -zfsinstall, qui va se charger de tout le travail pour nous.

    -

    Utilisez donc ce script ainsi :

    -
    # tout d'abord, wipons le MBR :
    -dd < /dev/zero > /dev/da0 count=1
    -# maintenant, installons le système
    -zfsinstall -g da0 -u ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RELEASE/ -s 2G -p root -c
    -
    - - -

    Avec -g da0 votre disque dur principal, -s 2G la quantité de swap désirée, --p root le nom du zpool, et -c pour activer la compression. D’autres options -sont disponibles, je vous invite a faire un zfsinstall -h si mon setup ne vous -convient pas.

    -

    Une fois ceci fait, faites un chroot dans /mnt (ou doit se trouver le nouveau -système) et éditez /etc/rc.conf :

    -
    zfs_load="YES"
    -sshd_load="YES
    -hostname="whatever"
    -ifconfig_igb0="DHCP"
    -
    - - -

    Remplacez whatever par votre hostname, et igb0 par le nom de votre interface -physique connectée a internet. Quittez le chroot, rebootez, et voila, vous avez -maintenant un système FreeBSD tout propre installé sur zfs a découvrir et -utiliser!

    -

    Voila, c’est la fin de ce tutoriel. -(Cela dit, bon courage pour tester bhyve, vu que l’IPv6 chez online est… peu -crédible, disons)

    -

    Bon sinon sur d’autres sujets, j’ai mis en place des bots twitter : wxcafe_ebooks, -petitefanfare, -capet_ebooks, -zengisse, -et kim_ebooks. Ils sont tous basés sur ce -code, qui vient de -@m1sp -(github.com/twitter_ebooks). Donc voila.

    -

    A plus

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/hori-vs-pdp/index.html b/output/posts/hori-vs-pdp/index.html deleted file mode 100644 index e13f189..0000000 --- a/output/posts/hori-vs-pdp/index.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - Manettes : Hori vs. PDP - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Manettes : Hori vs. PDP -

    -
    -
    -
    -
    - Date - - Sun 19 April 2015 - -
    - By - Wxcafe -
    - Category - Vidya Games -
    - - - - -
    -

    Si vous avez comme moi une Wii U et Smash 4, vous vous êtes probablement rendus -compte de quelques petits trucs : tout d’abord, Smash est bien plus drôle -a plusieurs. Ensuite, la Wii U peut être contrôlée avec énormément de “choses” -: sans trop réflechir, il y a le Wii U Gamepad, les Wiimotes, les Pro -Controllers pour Wii et Wii U, et d’autres. Vous aurez aussi remarqué que le -Gamepad n’est pas du tout un moyen de jouer a Smash acceptable, ni les wiimotes. -Les pro controllers fonctionnent, mais ne valent pas les bonnes vieilles -manettes Gamecube.

    -

    Cela étant, si comme moi vous avez, euh, “ouvert” le mode vWii de votre Wii U, -vous avez surement un disque dur/une clé USB connecté au dos de votre Wii U, et -donc pas assez de ports libres pour connecter l’adaptateur GC pour Wii -U -a votre console.

    -

    Heureusement pour vous, Nintendo a pensé a une solution (et comme d’habitude -avec Nintendo, c’est une solution a moitié satisfaisante…) : les classic -controller, mais en forme de manettes Gamecube.

    -

    Nintendo a donc filé ses licences et ses designs a deux boites, qui se sont -empressées de faire des manettes et de ramasser des brouettes d’argent, en -faisant des manettes Gamecube qui se connectent a des Wiimotes.

    -

    Nous allons ici voir deux modèles, un de chacune des boites en question -: PDP et Hori.

    -

    Toutes les photos présentes dans cet article sont disponibles en plus grande -taille en cliquant dessus

    -

    Commençons par le modèle de chez Hori :

    -

    Hori_face

    -

    Comme vous pouvez le voir, la manette ressemble beaucoup a une véritable manette -de Gamecube : a part le bouton Turbo et le bouton Home, le reste est -parfaitement identique a une véritable manette Gamecube. A noter que les boutons -centraux (Home, Start, Select, et Turbo) sont en caoutchouc mou et pas en -plastique dur.

    -

    Hori_dos

    -

    Nous voyons déjà le premier gros problème de cette manette : les gâchettes ne -sont en réalité que des boutons : c’est logique puisque c’est comme ça que les -classic controller sont faits, mais c’est décevant tout de même

    -

    Hori_CM

    -

    On peut voir ici que la qualité de l’assemblage n’est pas extraordinaire, et on -remarque une soudure mal faite a l’emplacement du stick gauche.

    -

    Hori_Cstick

    -

    Le stick c n’est pas fixé au reste de la manette. -J’ai essayé de démonter plus avant les différentes parties de la manette, mais -les câbles n’avaient pas l’air de très bonne qualité, et j’ai préféré abandonner -l’idée plutôt que de casser la manette.

    -

    Hori_coque

    -

    On peut voir que la coque est complètement vide, et que les gâchettes sont bien -en réalité de simple boutons. Il y aurait presque la place de mettre la carte -mère d’une Wiimote entière la dedans…

    -
    - -

    Passons maintenant a la manette PDP.

    -

    PDP_face

    -

    Au premier coup d’œil, on remarque que la manette PDP ressemble beaucoup moins -a une manette gamecube. Cependant, la prise en main est exactement la même. On -regrettera tout de même les sticks, pas aussi agréables que ceux de la Gamecube, -et les boutons transparents (mais c’est un problème de goût).

    -

    PDP_dos

    -

    Les gâchettes sont des vraies gâchettes! C’est impossible normalement, mais PDP -a été très intelligent sur le coup, comme on va le voir juste après.

    -

    PDP_CM

    -

    Comme vous pouvez le voir, la qualité générale est bien meilleure, avec bien -moins de colle, et pas de soudage raté. Toutes les cartes filles sont bien -attachées a la carte mère, et la structure en plastique est renforcée. Mais -surtout, on peut voir deux cartes filles qui sortent de façon étrange de la -carte mère, de façon péremptoire perpendiculaire…

    -

    PDP_CF

    -

    Vous l’avez deviné, ces deux “cartes filles” servent en réalité de connecteurs -aux boutons situés sur les gâchettes, qui sont de “vraies” gâchettes en cela -qu’elles sont faites de la même manière que les vraies (avec un ressort, etc) -mais qui sont en réalité des boutons (évidemment, puisque cette manette est en -fait un classic controller), par opposition aux véritables gâchettes -analogiques.

    -

    Quelques photos des gâchettes en question :

    -

    PDP_G_1

    -

    PDP_G_2

    -

    PDP_G_3

    -

    PDP_G_4

    -
    -

    Vous l’aurez compris, je préfère la version PDP de ces “Fight Pad”, la finition -semble plus solide, les gâchettes sont parfaites, les boutons centraux ne sont -pas en caoutchouc cheap, et bien que les sticks soient moins confortables, le -reste est parfait. Si vous préférez avoir une manette dont la prise en mains esttotalement identique a celle des manettes Gamecube, cependant, la version -Hori vous conviendra probablement mieux, a part les gâchettes, malheureusement.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/index.html b/output/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/index.html deleted file mode 100644 index 9cff5d0..0000000 --- a/output/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/index.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - Le chiffrement de partitions avec dm-crypt et device-mapper - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Le chiffrement de partitions avec dm-crypt et device-mapper -

    -
    -
    -
    -
    - Date - - Wed 10 July 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Le chiffrement en tant que concept informatique est traditionnellement associé -au chiffrement de fichiers, c’est a dire au fait de passer d’un fichier en -clair a un fichier chiffré dit cyphertext. Cependant, il ne se limite pas a -ça, et peut aussi servir a garantir l’intégrité d’un système d’exploitation, ou -bien la confidentialité d’un support de stockage, par exemple. Nous allons ici -voir comment mettre en place un système de ce type sous GNU/Linux. Cet article -n’a pas pour but de vous apprendre a mettre en place un système basé sur une -procédure de boot sécurisée, mais plutôt d’expliquer les concepts qui entrent en -jeu dans l’utilisation du sous-système du noyau Linux dm_crypt et de -présenter un rapide tutoriel concernant la création d’un support chiffré sur -lequel garder vos informations confidentielles (par exemple, votre clé GPG)

    -

    dm-crypt est un sous-système de device-mapper, qui est lui-même un sous-système -du noyau Linux, et s’appuie sur LUKS, un standard de chiffrement -de disques. Comme son nom l’indique, device-mapper est un système qui a pour but -de mapper des block devices. Pour être plus clair, le kernel considère -comme “block device” tout fichier spécial (en gros, les fichiers disques dans/dev/, les systèmes de fichiers type LVM, les RAID logiciels, et, dans le -cas qui nous intéresse, les systèmes de fichier chiffrés). Son mode de -fonctionnement est simple : a partir d’un “fichier de périphérique” (trad. -Wikipédia), il en “crée” un nouveau, virtuel, ayant des propriétés différentes. -Par exemple, un disque partitionné via LVM apparaîtra comme un seul disque dans -/dev, et device-mapper est requis pour pouvoir en voir les partitions (qui -apparaîtront donc dans /dev/mapper)

    -

    Ainsi, dans le cas qui nous intéresse ici, device-mapper prend un système de -fichier chiffré, crée un périphérique virtuel non chiffré dans /dev/mapper, et -déchiffre a la volée tous les accès disques a ce périphérique non chiffré en les -traduisant sur le système de fichier chiffré, le tout de manière tout a fait -transparente pour les applications utilisant le disque en question. Cela induit -bien entendu une baisse de performance relativement significative dans le cas -d’un chiffrement du système de fichier root, mais quasiment insignifiante dans -le cas de chiffrement de partitions de données.

    -

    D’ailleurs, certain-e-s se demandent peut-être comment le système peut démarrer -si le système de fichier root est chiffré. Dans ce cas précis, la procédure de -boot doit s’appuyer sur une image initrd (l’initrd est un système de -fichier minimal qui sert uniquement a initialiser le système. Les kernels de -base de la plupart des distributions GNU/Linux en utilisent un dans tous les -cas, pour des raisons de compatibilité) et sur une partition de boot qui elle -n’est pas chiffrée. Ainsi, le bootloader de niveau 2 (grub, syslinux,…) charge -en mémoire le kernel depuis la partition de boot, puis ce dernier décompresse et -charge l’initrd en RAM, celui-ci a son tour lance un script permettant de -charger les modules nécessaires a la suite du boot (que ce soit pour un boot -sans disque root local, ou bien comme ici avec un système chiffré), puis le -système de fichier “cible” est remonté sur la racine, et l’initrd est démonté -est la RAM qu’il occupait est libérée, puis la procédure de boot normale reprend -depuis le système de fichier maintenant monté sur la racine.

    -

    La méthode la plus évidente pour contourner le chiffrement du disque est alors -de remplacer le fichier compressé initrd dans /boot, qui n’est pas chiffrée, par -un autre modifié, copiant par exemple la phrase de passe permettant de -déchiffrer la partition cible. Plusieurs méthodes permettent de se prémunir -contre ce genre d’attaques : l’une des plus simple est de faire un checksum du -fichier initrd utilisé et reconnu comme sûr, et de vérifier lors du vrai boot -que l’initrd présente toujours le même checksum. Cela dit, cette méthode a -l’inconvénient d’intervenir après les faits, et de nécessiter au moins un accès -a un fichier initrd reconnu comme sûr.
    -Une autre approche consisterait a placer le système de fichier /boot sur un -périphérique dédié, protégé en écriture de façon matérielle (par exemple, une -carte SD) ou, de façon encore plus efficace, sur un périphérique chiffré et -protégé en écriture de façon matérielle. Ainsi, il n’est pas possible pour un -attaquant de modifier ce système de fichier, et l’initrd est alors toujours de -confiance. Cependant, cela a pour conséquence de rendre la mise a jour de -l’initrd et du noyau beaucoup plus difficile qu’elle ne le serait sans.

    -

    Pour en revenir aux systèmes de fichiers chiffrés, leur gestion est faite par un -programme dédié, cryptsetup. Ce dernier était en charge de cryptoloop, -l’ancien sous-système de chiffrement du kernel Linux (déprécié depuis), et est -maintenant responsable de l’utilisation userspace de dm-crypt, qui pour sa -part est entièrement kernel-space. Cryptsetup permet ainsi le chiffrement, la -manipulation (montage/démontage/…) et la gestion de clé des systèmes de fichier -LUKS. Cryptsetup est cependant conçu pour être utilisé en tant que root, et les -utilisateurs qui veulent monter de systèmes de fichiers chiffrés devront ainsi -obligatoirement être capables de le faire en tant que root.

    -

    Voyons comment il faudrait procéder pour créer une image disque chiffrée de 1Go :
    -Tout d’abord, il nous faut créer le fichier qui contiendra l’image. Pour cela, -dans une situation réelle ou l’on cherche a chiffrer un disque, il convient -d’utiliser /dev/urandom comme source, pour éviter la détection du système de -fichier chiffré sur le disque. -Ici, par exemple, nous allons faire :

    -
    dd bs=1000 count=1000000 if=/dev/urandom of=image.img
    -
    - - -

    Maintenant que notre image est créée, nous pouvons la chiffrer :

    -
    sudo cryptsetup luksFormat image.img
    -
    - - -

    cryptsetup va alors nous demander si nous sommes absolument surs de vouloir -formater ce disque (nous allons donc valider en tapant YES), puis une -passphrase. Il convient ici de choisir une passphrase particulièrement sûre, -puisque toute personne ayant accès a la passphrase aura aussi accès au disque et -donc a vos secrets.
    -Une fois cela fait, nous allons mapper cette image :

    -
    sudo cryptsetup luksOpen image.img crypto
    -
    - - -

    cryptsetup nous redemande la passphrase, charge pendant quelques secondes, -puis nous redonne le prompt. Que s’est-il passé? En cherchant un peu, nous -voyons qu’il n’y a pas de nouveau disque dans /dev. C’est tout a fait normal. En -effet, cryptsetup (et par lui, device-mapper et dm-crypt) ne monte pas les -systèmes de fichiers chiffrés, il les mappe, et ça n’a rien a voir. On remarque -qu’est apparu dans /dev/mapper le fichier crypto. Ce fichier est le disque -virtuel qui correspond a notre image. Il se comporte comme toute partition, et -peut donc être monté, formaté, etc (il ne peut cependant pas être partitionné. -Il se comporte en effet comme une partition, et non comme un véritable disque.) -Bon, ceci fait, notre disque virtuel n’est pas formaté. Il nous reviens donc de -le faire, pour pouvoir l’utiliser.

    -
    sudo mkfs.ext4 /dev/mapper/crypto
    -
    - - -

    Maintenant que notre disque est formaté, il peut être monté :

    -
    sudo mount /dev/mapper/crypto /mnt
    -
    - - -

    Et voila, nous avons un système de fichier fonctionnel et chiffré! Si vous -voulez vérifier, un mount | grep crypto devrait vous donner le résultat -suivant :

    -
    /dev/mapper/crypto on /mnt type ext4 (rw,relatime,data=ordered)
    -
    - - -

    Vous pouvez maintenant commencer a stocker tous vos secrets sur ce fichier, ils -sont (en fonction de votre passphrase) en sécurité.

    -

    Pour résumer :

    -
      -
    • -

      Pour monter vos partitions :

      -
      sudo cryptsetup luksOpen <fichier chiffré> <nom de disque virtuel>
      -sudo mount /dev/mapper/<nom de disque virtuel> <emplacement>
      -
      - - -
    • -
    • -

      Pour démonter vos partitions :

      -
      sudo umount <emplacement>
      -sudo cryptsetup luksClose <nom de disque virtuel>
      -
      - - -
    • -
    -

    Pour simplifier la vie de tous, j’ai créé deux petits scripts vous permettant de -créer et de monter/démonter vos images/disques chiffré-e-s en une seule -commande. Ils se trouvent sur github.

    -

    Par ailleurs, si vous comptez transferer votre image disque sur un véritable -disque (ou clé usb, ou autre), il est préférable de créer une partition de -taille appropriée et de faire un dd if=votre_image of=/dev/votre_partition -pour ce faire.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/mise-en-place-dun-serveur-dns/index.html b/output/posts/mise-en-place-dun-serveur-dns/index.html deleted file mode 100644 index b0bc068..0000000 --- a/output/posts/mise-en-place-dun-serveur-dns/index.html +++ /dev/null @@ -1,420 +0,0 @@ - - - - - Mise en place d'un serveur DNS - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Mise en place d'un serveur DNS -

    -
    -
    -
    -
    - Date - - Mon 24 February 2014 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Le DNS (Domain Name System) est le service permettant la résolution des noms de -domaines en différentes informations : adresses IPv4, adresses IPv6, certificats -DNSSEC ou IPsec, localisation géographique, ou encore texte. En général, le DNS -est utilisé pour résoudre des noms de domaines en adresses IP, et ainsi pour -simplifier la vie de tous les utilisateurs (je doute que tout le monde retienne -de se connecter a http://173.194.45.66, ou a -http://199.16.156.70. Voire même a -http://5.39.76.46).

    -

    Cependant, le DNS est un système qui date de 1984, et les exigences de l’époque -en termes d’expérience utilisateur n’étaient pas forcément aussi importantes que -de nos jours. La configuration des serveurs DNS peut ainsi être assez -contre intuitive. -Cela étant dit, comprendre le fonctionnement de DNS et contrôler ses -enregistrements est important.

    -

    Tout d’abord, une petite explication théorique. Le DNS fonctionne de la même -façon que le système de fichiers : en arborescence. Cependant, là ou la racine -du FS est /, celle de DNS est ., et là ou il convient d’écrire, par exemple,/usr/ et ou la progression se fait de gauche a droite pour le FS, pour DNS le -. n’est pas obligatoire et la progression se fait de droite a gauche. Par -exemple, le tld(top level domain, domaine de haut niveau) com, et le domaine -google.com appartient a com, on écrit donc google.com sans écrire le point -a la fin de façon courante.

    -

    Le reverse DNS est une variante du DNS “classique” permettant de résoudre les -adresses IP en nom de domaine. Ainsi, 5.39.46.76 a pour domaine wxcafe.net. -Cependant, le reverse DNS n’a, par définition, pas de TLD sur lequel se diriger -quand on lui adresse une query. Les “adresses” que l’on query en reverse DNS -sont donc constituées de l’adresse IP, dans le sens contraire a l’ordre -habituel, et du faux domaine .in-addr.arpa -Par exemple, pour connaitre le reverse de 5.39.46.76, il faudra faire dig PTR -76.46.39.5.in-addr.arpa. La réponse sera, évidemment, wxcafe.net

    -

    Voyons maintenant comment mettre en place son propre serveur DNS. Tout d’abord, -quelques informations. DNS fonctionne sur le port 53 en UDP, et la commande -utilisée pour faire des tests DNS est dig. Le DNS fonctionne avec des -“enregistrements”, records en anglais. Par exemple, un record A indique une -adresse IP, un record NS indique un Serveur de nom, etc. dig se base sur ces -records : par défaut, il ira chercher le(s) record(s) A correspondant(s) au nom -de domaine que vous donnez en argument, mais en précisant un autre type de -record, vous pouvez obtenir n’importe quelle information : par exemple, dig NS -wxcafe.net devrait vous renvoyer

    -
    ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> NS wxcafe.net
    -;; global options: +cmd
    -;; Got answer:
    -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13846
    -;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    -
    -;; QUESTION SECTION:
    -;wxcafe.net.            IN  NS
    -
    -;; ANSWER SECTION:
    -wxcafe.net.     3600    IN  NS  ns.wxcafe.net.
    -wxcafe.net.     3600    IN  NS  ns.home.wxcafe.net.
    -
    -;; Query time: 60 msec
    -;; SERVER: 10.0.42.1#53(10.0.42.1)
    -;; WHEN: Tue Dec 10 13:31:18 2013
    -;; MSG SIZE  rcvd: 67
    -
    - - -

    Comme vous pouvez le voir, les serveurs DNS principaux pour -wxcafe.net sont ns.wxcafe.net et ns.home.wxcafe.net, -qui sont respectivement des alias pour wxcafe.net et home.wxcafe.net. Ainsi, -chacun fait autorité pour lui même, et le problème évident est que le résolveur -ne peut résoudre la query si il est renvoyé encore et encore vers le même -serveur. Il convient donc de définir dans le même fichier de configuration -l’adresse de ces deux serveurs. Ainsi, le résolveur, au bout de son deuxième -loop, se rendra compte qu’il est en train de faire une boucle infinie et -demandera l’adresse au serveur auquel il est connecté. La première indication de -direction se fait grâce au serveur du TLD.

    -

    La configuration de bind est assez simple dans le principe, le plus complexe -étant en fait d’écrire les fichiers de zone. -La configuration de bind sous debian se fait dans le dossier /etc/bind/. Il -existe 4 fichiers de configuration principaux : named.conf, -named.conf.default-zones, named.conf.local et named.conf.options. -named.conf contient les options par défaut de bind, named.conf.default-zones -les déclarations des zones par défaut (auxquelles il vaut mieux ne pas toucher), -named.conf.local contient les déclarations de vos zones, et -named.conf.options contient les options que vous rajoutez pour changer le -comportement de bind.

    -

    Pour commencer, il convient de préciser que nous allons parler ici du cas dans -lequel se trouve wxcafe.net: deux domaines dont nous voulons faire l’autorité, -deux serveurs DNS, et un service de résolution récursive limitée a quelques IPs -(notamment mon accès chez moi).

    -

    Examinons tout d’abord les fichiers de configuration de named.named.conf.local contient les définitions des zones forward et reverse. -Sur wxcafe.net, les zones wxcafe.net et 76.46.39.5.in-addr.arpa sont gérées -en master, et les zones home.wxcafe.net et 103.177.67.80.in-addr.arpa sont -gérées en slave. Nous n’examinerons ici que les déclarations de zones sur ce -serveur, et pas sur home., car elles sont sensiblement les mêmes. La différence -principale étant que l’un héberge en slave les masters de l’autre. -Le fichier named.conf.local sur wxcafe.net contient donc

    -
    zone "wxcafe.net" {
    -    type master;
    -    file "/etc/bind/master/wxcafe.net";
    -    allow-transfer {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "home.wxcafe.net" {
    -    type slave;
    -    file "/etc/bind/slave/home.wxcafe.net";
    -    masters {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "46.76.39.5.in-addr.arpa" {
    -    type master;
    -    file "/etc/bind/master/46.76.39.5.in-addr.arpa";
    -    allow-transfer {
    -        80.67.177.103;
    -    };
    -};
    -
    -zone "103.177.67.80.in-addr.arpa" {
    -    type slave;
    -    file "/etc/bind/slave/103.177.67.80.in-addr.arpa";
    -    masters {
    -        80.67.177.103;
    -    };
    -};
    -
    - - -

    Cela devrait être relativement clair. Globalement, les zones master ont un -fichier dans /etc/bind/master/, et les slaves un fichier dans -/etc/bind/slave/, les masters autorisent le transfert vers home.wxcafe.net -tandis que les slaves déclarent home.wxcafe.net comme master, et le reste est -assez parlant.

    -

    Voyons maintenant le fichier de zone concernant wxcafe.net, soit -/etc/bind/master/wxcafe.net :

    -
    $TTL 3600    ; 1 hour
    -@               IN SOA ns.wxcafe.net. wxcafe.wxcafe.net. (
    -                        2014011001  ; serial
    -                        3h          ; refresh  
    -                        1h          ; retry
    -                        168h        ; expire
    -                        300         ; negative response ttl
    -                        )
    -
    -; Name servers
    -                IN  NS      ns.wxcafe.net.
    -                IN  NS      ns.home.wxcafe.net.
    -
    -; Mail exchangers
    -                IN  MX  10  wxcafe.net.
    -                IN  SPF "v=spf1 ip4:5.39.76.46 a -all"
    -
    -; Main A/AAAA records
    -                IN  A       5.39.76.46
    -ns              IN  A       5.39.76.46
    -
    -; Aliases
    -data            IN  CNAME   wxcafe.net.
    -;        [...]
    -www             IN  CNAME   wxcafe.net.
    -
    -
    -; home.wxcafe.net. definition
    -$ORIGIN home.wxcafe.net.
    -@               IN  NS      ns.home.wxcafe.net.
    -                IN  NS      ns.wxcafe.net.
    -ns              IN  A       80.67.177.103
    -                IN  A       80.67.177.103
    -
    - - -

    Alors. Expliquons ligne par ligne.
    -Tout d’abord, le TTL (time to live) est un paramètre définissant le temps -pendant lequel les serveurs récursif (qui font un cache des données) doivent -cacher ce fichier de zone.
    -Le @ est un raccourci pour exprimer le nom de domaine courant. Ici, donc, -wxcafe.net.
    -Maintenant, nous arrivons a un record important : SOA (Start of Authority). -Ce record prend de nombreux arguments, dans l’ordre :
    - - Le nameserver autoritaire pour le nom de domaine en question,
    - - L’adresse email du responsable de cette zone, avec le premier point - remplacé par un @,

    -

    puis entre parenthèses :
    - - Le numéro de série (“version” du fichier de zone, ici au format - YYYYMMDDNN)
    - - La période de refresh, période entre chaque mise a jour du nameserver - authoritaire secondaire,
    - - La période de retry, le temps entre chaque essai de mise a jour si le - nameserveur authoritaire primaire est indisponible,
    - - La période d’expire, le temps qu’attendra le serveur autoritaire - secondaire avant de supprimer les informations de son cache si le primaire - reste indisponible, et enfin
    - - La période de TTL négatif, le temps qu’attendra le serveur secondaire - avant de ne plus offrir les informations de cette zone si le serveur - primaire est injoignable.

    -

    Bon, tout ceci est peut-être un peu confus, mais ce n’est pas le record le plus -important a lire (pour les humains en tout cas). Continuons :

    -

    NS (nameserver) permet de désigner les différents nameservers faisant autorité -pour ce domaine.

    -

    MX permet d’indiquer ou il convient d’envoyer les emails pour ce domaine. -SPF est un record d’authentification pour les emails. -Les records A désignent l’association entre un nom de domaine et une adresse -IPv4. Les records AAAA font de même pour les IPv6, mais malheureusement ce site -n’est pas encore en IPv6.

    -

    Les CNAME (canonical name) sont en quelque sorte des alias, ils permettent de -mettre en place des domaines exactement semblables a d’autre (ce qui permet par -exemple de filtrer ensuite avec les Virtual Hosts d’Apache, pour le web)

    -

    Enfin, la partie qui suit commence avec une déclaration $ORIGIN, ce qui permet -de changer la valeur du @ et des noms de domaine non complets (qui ne se -terminent pas avec un .). Ainsi, la partie suivant définit les nameservers et -l’adresse IP principale de home.wxcafe.net et de ns.home.wxcafe.net. Comme on -l’a vu, étant donné que ce nom de domaine est géré par un autre serveur DNS, -cela permet de rediriger les requêtes nous parvenant et demandant un domaine se -trouvant sous home.wxcafe.net.

    -

    Les autres fichiers de zone sont sensiblement similaires, avec les quelques -différences n’étant en fin de compte que des différences de valeurs (dues au -fait que, eh bah, c’est pas les mêmes domaines…).

    -

    Voila donc une courte explication de ce qu’est le DNS. Bien entendu, tout n’est -pas expliqué ici, je ne suis passé que sur ce qui est en place au niveau de -wxcafe.net, et encore, rapidement. Si vous voulez en savoir plus, vous pouvez -aller vous renseigner directement a la source : le RFC -1034 et le -RFC 1035. Dans un autre style (bien plus -avancé) le blog de Stéphane Bortzmeyer est interessant -aussi.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/monter-son-propre-serveur-partie-1/index.html b/output/posts/monter-son-propre-serveur-partie-1/index.html deleted file mode 100644 index 4bf1f61..0000000 --- a/output/posts/monter-son-propre-serveur-partie-1/index.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - Monter son propre serveur, partie 1: le serveur et l'apache. - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Monter son propre serveur, partie 1: le serveur et l'apache. -

    -
    -
    -
    -
    - Date - - Mon 18 March 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Il y a un certain temps, j’avais parlé du concept du self-hosting. Il -s’agit de posséder son propre serveur, et donc, par extension, ses -données.

    -

    Bien entendu, il n’est pas nécessaire pour cela de posséder -physiquement son propre serveur (encore que ce soit possible, mais ce -n’est pas le sujet abordé ici.)
    -Nous expliquerons ici les étapes nécessaires pour arriver a avoir un -serveur utilisable, du moment ou vous arrivez sur le système fraichement -installé, au moment ou vous possédez un serveur avec tous les paquets -nécessaires a l’utilisation que l’on veut en faire ici d’installés. -Cette partie va consister a paramétrer le système (ici un debian -squeeze. Il est bien sur possible de faire la même chose avec a peu près -toutes les distributions Linux disponibles, tout comme avec les BSD et -tous les autres systèmes UNIX, mais je vais ici me limiter a debian 6.0.x -squeeze, parce que c’est une distribution simple a utiliser comme -serveur, stable, et facile a configurer (puisqu’une bonne partie de la -configuration est déjà faite et incluse dans le paquet), donc adaptée au -but de cet article, a savoir rendre l’installation simple et -compréhensible).

    -

    La première chose a faire est bien entendu d’obtenir le serveur en lui -même. Cette partie de la chose ne sera pas traitée dans cet article. Il -existe en effet un nombre infini d’obtenir un serveur, que ce soit en le -louant chez OVH/1&1/n’importe quel autre hébergeur commercial, en -participant a un système d’hébergement collaboratif (je vous laisse -chercher), en achetant un serveur et en le faisant fonctionner de chez -vous, en utilisant un vieux PC… Bref, les possibilités sont multiples. -Dès lors que vous avez accès a un système debian serveur, peu importe sur -quel matériel il fonctionne, et a priori peu importe aussi la manière -dont vous y accédez, le résultat est le même (et la procédure aussi…). -Dans cet article, nous parlerons de la configuration de base, du moment -ou vous avez le serveur vierge dans les mains au moment ou vous -installez le serveur http.

    -

    Dans cet article, lorsque est précisée le type d’IP a utiliser, il -convient de mettre ce type précisément. Quand le type n’est pas -précisée, libre a vous de choisir ipv4 ou ipv6.

    -

    Bref. Commençons au point ou vous avez un accès root a votre serveur, -n’ayant soit aucun mot de passe, soit un choisi par l’hébergeur, et ou -rien n’est configuré. Connectez vous a celui-ci (ssh root@). Commencez -donc par faire un passwd, pour mettre au plus vite un mot de passe -solide sur le compte root. Continuons en allant vite mettre en place le -nom de domaine. Pour cela, votre registrar doit vous fournir une -interface vous permettant d’éditer l’entrée DNS pour votre nom de -domaine.

    -

    Cette entrée doit donc pour l’instant ressembler a ca :

    -
        <votre nom de domaine>  NS 1 
    -                            IN MX 1 
    -                            IN A        <IPv4 de votre serveur>
    -                            IN AAAA     <IPv6 de votre serveur>
    -
    - - -

    Cela vous permet de rediriger tout le trafic se référant a votre nom de -domaine vers votre ip (le fonctionnement exact du DNS est assez -compliqué a expliquer, donc on va dire que c’est de la magie pour -l’instant, ca sera peut être le sujet d’un autre article), et d’indiquer -que les mails @votre-nom-de-domai.ne doivent aussi être redirigés vers -votre serveur, ce qui est un bon début. Faisons un petit point sécurité -ici : pour accéder a votre serveur, il vous suffit actuellement de taper -le mot de passe root.

    -

    root est un utilisateur assez répandu, et il est assez simple de -bruteforcer le mot de passe. (Relativement assez simple, en fonction -du nombre de caractères, ça prend plus ou moins de temps, et si vous -avez suffisamment de caractères, ça peut prendre un temps assez -conséquent. Cela dit, il vaut mieux être prudent…) Ainsi, nous allons -arrêter d’utiliser root et nous allons commencer a utiliser des couples -clés publiques/privées pour nous connecter au serveur.
    -Cela se fait en deux temps : tout d’abord, créer un nouvel utilisateur, -grâce auquel nous administrerons le serveur a l’avenir; puis configurer -OpenSSH pour que celui ci n’accepte que les connections par clés et plus -celles sur root.

    -

    Commençons par ajouter un utilisateur. Si vous êtes sous debian, cela se -fait avec adduser, qui est interactif (vous ne devriez pas avoir de -problème avec, puisqu’il crée tout les dossiers et fichiers nécessaires, -et vous pose toutes les questions utiles pour vous aider.) sinon, vous -devrez utiliser useradd, qui est (en plus d’être très chiant a -distinguer de l’autre, bien plus chiant a utiliser. (adduser est en fait -un simple script permettant l’utilisation d’useradd plus facilement.)

    -

    Avec adduser, vous pouvez soit utiliser le mode interactif en tapant -juste adduser <username>, soit utiliser le mode non-interactif -en faisant un adduser --group <username>

    -

    Avec useradd, vous devrez utiliser la commande suivante : useradd -m --N -g <username>. Cette commande ajoutera un utilisateur, créera -son dossier principal dans /home/, et l’ajoutera au groupe du même nom -que lui (ce qui est en général nécessaire pour des questions de vie -privée).

    -

    Il convient maintenant d’ajouter cet utilisateur aux groupes qu’il sera -amené a administrer: usermod <username> -a -G www-data postfix -users staff sudo wheel, puis de changer son mot de passe -passwd. Enfin, ajoutons le aux utilisateurs autorisés a utiliser -sudo: echo "%sudo ALL=(ALL) ALL" >> /etc/sudoers
    -Enfin, changeons d’utilisateur : su. A ce point, vous avec un -utilisateur complètement fonctionnel et utilisable pour toutes les -taches d’administration. Si vous devez encore utiliser root, c’est que -quelque chose ne va pas.

    -

    Vous êtes donc loggés sur le système en tant qu’utilisateur normal. Nous -allons maintenant passer a la phase 2 du plan : désactiver le login ssh -root et le login ssh par mot de passe.
    -Tout d’abord, qu’est-ce qu’un login par clé ssh? Il s’agit en fait d’un -système assez semblable a celui vous permettant de chiffrer vos mail : -vous avec une clé publique et une clé privée sur le client, et la clé -publique est aussi sur le serveur. Lorsque vous vous connectez, openssh -vérifie que vous possédez la clé privée qui correspond a la clé publique -stockée sur le serveur (pour votre utilisateur, bien entendu). Il est -également possible d’utiliser plusieurs clés publique pour chaque
    -utilisateur.

    -

    Bref, maintenant que nous avons la théorie, passons a la pratique : tout -d’abord, il nous faut générer un couple de clés publique/privée sur le -client. Openssh fait ça via la commande ssh-keygen -t rsa (le -t -rsa précise a ssh que nous voulons un chiffrement rsa, qui est -suffisamment solide pour cette utilisation.) Entrez les informations que -ssh-keygen vous demande. Trois fichiers devraient maintenant se trouver -dans votre dossier .ssh/ : id_rsa, id_rsa.pub, et known_hosts.
    -known_hosts liste les serveurs auxquels vous vous êtes connectés déjà -une fois (pour éviter les attaques MITM, mais bref). Non, ce qui nous -intéresse ici c’est id_rsa et id_rsa.pub . id_rsa contient votre clé -privée, sauvegardez la sur une clé USB ou notez la sur un bout de -papier, si vous la perdez, vous ne pourrez plus vous connecter au -serveur. (planquez la clé usb/le bout de papier…) id_rsa.pub, quand a -lui, contient votre clé publique. Copiez la sur le serveur, avec unscp ~/.ssh/id_rsa.pub <username>@<votre nom de domaine>:~/ , ou -en la copiant a la main, si ça vous amuse.

    -

    Vous avez maintenant un fichier id_rsa.pub dans votre dossier personnel -sur le serveur, il faut le mettre a un endroit ou openssh le reconnaitra. -Il est donc nécessaire de créer le dossier .ssh (mkdir .ssh), puis -de déplacer ce fichier a la bonne place (mv ~/id_rsa.pub ~/.ssh/authorized_keys). -Testez si ça fonctionne : ouvez un autre terminal, et
    -connectez vous a votre serveur (ssh <username>@<votre nom de -domaine>), et il ne devrait pas vous demander de mot de passe.Si -il vous en demande un, NE PASSEZ PAS A LA SUITE. Quelque chose a foiré, -donc vérifiez que vous avez suivi correctement les instruction -ci-dessus.

    -

    Continuons. Il ne nous reste plus qu’a installer le serveur web, et a le -configurer:

    -
    sudo apt-get install \
    -apache2 apache2.2-common apache2-doc apache2-mpm-prefork \
    -apache2-utils libexpat1 ssl-cert libapache2-mod-php5 \
    -php5 php5-common php5-gd php5-cgi libapache2-mod-fcgid \
    -apache2-suexec php-pear php-auth php5-mcrypt mcrypt \
    -php5-imagick imagemagick libapache2-mod-suphp libruby \
    -libapache2-mod-ruby
    -
    - - -

    (faisons large, on aura besoin de l’excédent plus tard…), puis activons les
    -mods apache en faisant a2enmod suexec rewrite ssl actions include -dav_fs dav auth_digest, et faisons en sorte que ces activations -soient prises en compte par apache via un sudo service apache2 -restart

    -

    Le serveur fonctionne, maintenant, il est necessaire de lui expliquer -comment fonctionner sur notre nom de domaine et ou trouver les fichiers -a envoyer.

    -

    Pour cela, nous allons faire un simple ln -s /etc/apache2/sites-{available,enabled}/default, car apache est assez -sympa pour nous filer un fichier de configuration par défaut. Il nous -faut encore l’éditer, en changeant l’adresse mail au début du document -par la votre, et en changeant AllowOverride none en AllowOverride All, -et enfin redémarrer apache pour qu’il prenne en compte les -modifications, par un sudo service apache2 restart

    -

    Et maintenant, il vous reste a apprendre le html, parce que ca y est, -votre serveur est fonctionnel! Voila voila. Dans la prochaine partie, on -verra l’installation du serveur mail (c’est suffisamment complexe pour -prendre un article seul…)

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/index.html b/output/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/index.html deleted file mode 100644 index 0a472ae..0000000 --- a/output/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/index.html +++ /dev/null @@ -1,453 +0,0 @@ - - - - - Mutt ou le client email le <del>meilleur</del> moins mauvais - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Mutt ou le client email le meilleur moins mauvais -

    -
    -
    -
    -
    - Date - - Wed 02 January 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    Les clients mails ont une particularité en commun : ils sont tous -très mauvais. Cela pour nombre de raisons, mais la principale reste -que leurs interfaces/raccourcis claviers ne sont pas efficaces pour une -utilisation a la UNIX
    -Cependant, un d’entre eux se démarque par sa moins-mauvais-itude, c’est -le relativement bien connu Outlook Express 2003 Mutt!
    -Mutt est un client mail en ligne de commande, qui, comme le dit sa page -d’accueil, “just sucks less”. Dans les faits, mutt est assez -chiant a configurer mais particulièrement pratique a utiliser après.

    -

    La configuration de mutt se fait dans le fichier .muttrc ou dans -/etc/Muttrc, et il est courant d’utiliser offlineimap en -conjonction avec celui ci, de façon a accéder aux mails même sans accès -internet (mutt dispose d’un système d’accès IMAP/POP et SMTP, mais ne -crée pas de cache, ce qui empêche la consultation des emails sans -connexion internet.) La configuration d’offlineimap se fait dans~/.offlineimaprc ou dans rien d’autre en fait, c’est une config -par user. Offlineimap est un petit logiciel en python qui synchronise un -dossier en Maildir avec un serveur IMAP, ce qui tombe bien puisque -justement mutt accepte les dossiers au format Maildir. (De plus, cela va -tout a fait dans le sens de la libération des données en cela que vous -possédez vos mails en local.)
    -Bref, passons aux choses serieuses : le code. Déjà, installez -offlineimap et ce script fait par moi, qui vous permet d’installer -mutt avec le patch sidebar, qui crée un listing des dossiers sur la -partie gauche.
    -Ensuite, voyons pour la partie configuration :
    -Ma configuration d’offlineimap :

    -
    ## Config file for offlineimap
    -## Originally located in ~/.offlineimaprc
    -## This should not be edited without creating a copy before
    -## Created by Wxcafe (Clément Hertling)
    -## Published under CC-BY-SA
    -
    -[general]
    -# List of accounts to be synced, separated by a comma.
    -accounts = main
    -
    -[Account main]
    -# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
    -localrepository = main-local
    -# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
    -remoterepository = main-remote
    -# Status cache. Default is plain, which eventually becomes huge and slow.
    -status_backend = sqlite              # le type de cache. (plain ou sqlite)
    -
    -[Repository main-local]
    -# Currently, offlineimap only supports maildir and IMAP for local repositories.
    -type = Maildir                        # le type de stockage (Maildir ou IMAP)
    -# Where should the mail be placed?
    -localfolders = ~/Emails/                # le dossier dans lequel vous
    -                                        # voulez que vos emails apparaissent
    -
    -[Repository main-remote]
    -# Remote repos can be IMAP or Gmail, the latter being a preconfigured IMAP.
    -type = IMAP
    -remotehost = //placeholderhost//        # le serveur de votre messagerie
    -remoteuser = //placeholderusername//    # votre nom d'utilisateur
    -remotepass = //placeholderpassword//    # votre mot de passe
    -cert_fingerprint = //placeholdercert//  # le certificat du serveur (IMAPS only)
    -
    - - -

    Ça devrait être assez simple a lire, j’ai tout bien commenté :3
    -Puis ma config mutt :

    -
    ## Mutt MUA configuration file
    -## This file should not be edited without creating a copy
    -## File Created and edited by Wxcafe (Clément Hertling)
    -## Published under CC-BY-SA
    -
    -# General config for reading (fetched via offlineimap)
    -
    -set mbox_type = Maildir
    -# type de boite mail (voir dans offlineimap, mailbox par defaut)
    -
    -set folder = ~/Email/
    -# dossier root mailbox/imap
    -
    -set spoolfile = +INBOX
    -# dossier d'inbox
    -
    -set mbox = +'All Mail'
    -# dossier ou archiver les emails
    -
    -set copy = yes
    -# yes pour copier les messages dans les differents dossier, no pour...
    -# enfin voila quoi.
    -
    -set header_cache = /.hcache/
    -# dossier ou sont stockés les headers (pour le cache)
    -
    -set record = +Sent
    -# dossier dans lequel sont stockés les messages envoyés
    -
    -set postponed = +Drafts
    -# dossier dans lequel sont stockés les brouillons
    -
    -mailboxes = +INBOX +Drafts +Sent +Trash  +All\ Mail 
    -# liste des dossiers qui vont apparaitre dans la colonne de gauche
    -
    -# General config for sending (using Mutt's native support)
    -
    -set smtp_pass = 'password_placeholder'
    -# votre mot de passe
    -
    -set smtp_url = "smtp://username@whatev.org:465/"
    -# l'url ou envoyer les emails
    -
    -set send_charset = "utf-8"
    -# UTF8, NE PAS CHANGER
    -
    -set signature = ".sign"
    -# vous pouvez mettre votre signature dans .sign
    -
    -set sig_on_top = yes
    -# il est d'usge de mettre no ici. Cependant, je trouve ca plus lisible 
    -# comme ca.
    -
    -set ssl_verify_host = no
    -# mettez yes ici si votre serveur a un certificat configuré correctement
    -
    -set hostname = "wxcafe.net"
    -# mettez l'adresse de votre serveur ici
    -
    -# Misc settings
    -
    -auto_view text/html
    -# la façon de voir les emails par défaut.
    -
    -set date_format = "%y-%m-%d %T"
    -# format de date d'envoi/de reception.
    -
    -set index_format = "%2C | %Z [%D] %-30.30F (%-4.4c) %s"
    -# format de l'index (la présentation de l'interface)
    -# voir http://www.mutt.org/doc/manual/manual-6.html#index_format
    -
    -set sort_alias = alias
    -set reverse_alias = yes 
    -set alias_file = "$HOME/.mutt/aliases"
    -# liste des alias noms/email. a créer et remplir vous même.
    -# format : "alias short_name long_email_adress"
    -source $alias_file
    -
    -set beep = no
    -# ne pas biper. CE SON ME TUE T.T
    -
    -set tilde = yes
    -set sleep_time = 0
    -# ?
    -
    -set sidebar_visible = yes
    -set sidebar_width = 15
    -# parametres de la barre coté gauche
    -
    -set realname = "Clément Hertling (Wxcafé)"
    -set from = "wxcafe@wxcafe.net"
    -set use_from = yes
    -set certificate_file = "$HOME/.mutt/cacert"
    -# parametres d'envoi. mettez vos propres infos a la place des miennes...
    -
    -set edit_headers = yes
    -# vous permet de vois les headers des mails. j'aime, donc je laisse.
    -
    -# Macros
    -
    -# le titre dit tout. index veut dire que la macro est active dans les menus,
    -# pager qu'elle l'est dans la visionneuse, les deux qu'elle l'est dans les 
    -# deux
    -# \C represente la touche Control
    -
    -bind index,pager \Cp sidebar-prev
    -# Control+p -> remonter d'un dossier dans la sidebar
    -
    -bind index,pager \Cn sidebar-next
    -# Control+n -> descendre d'un dossier dans la sidebar
    -
    -bind index,pager \Co sidebar-open
    -# Control+o -> ouvrir le dossier selectionné dans la sidebar
    -
    -macro index,pager d "=Trash" "Trash"
    -# d supprime le message en cours
    -
    -bind pager   previous-line
    -# permet de monter d'une ligne avec la touche up, au lieu de changer de message.
    -
    -bind pager   next-line
    -# permet de descendre d'une ligne avec la touche down, au lieu de changer de 
    -# message
    -
    -bind pager j next-line
    -bind pager k previous-line
    -# raccourcis vim
    -
    -# PGP signing commands
    -
    -set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
    -set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
    -set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
    -set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f"
    -set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f"
    -set pgp_encrypt_only_command="pgpewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
    -set pgp_encrypt_sign_command="pgpewrap gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust --encrypt-to 0x******** -- -r %r -- %f"
    -set pgp_import_command="gpg --no-verbose --import -v %f"
    -set pgp_export_command="gpg --no-verbose --export --armor %r"
    -set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
    -set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r" 
    -set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r" 
    -set pgp_autosign=yes
    -set pgp_sign_as=0x********
    -# remplacez 0x******** par votre identifiant PGP!!!!!
    -
    -set pgp_replyencrypt=no
    -set pgp_timeout=7200
    -set pgp_good_sign="^gpg: Good signature from"
    -
    -# si vous ne comptez pas utiliser PGP, commentez toute cette section, depuis
    -# PGP signing options
    -
    -# Palette for use with the Linux console.  Black background.
    -
    -# Schéma de couleur Rouge et Noir. Commentez si vous voulez le 
    -# défaut noir et blanc.
    -# d'autres schémas sont trouvables sur google et autre.
    -
    -color hdrdefault red black
    -color quoted brightblack black
    -color signature brightblack black
    -color attachment red black
    -color message brightwhite black
    -color error brightred black
    -color indicator black red
    -color status white black
    -color tree white black
    -color normal white black
    -color markers red black
    -color search white black
    -color tilde brightmagenta black
    -color index red black ~F
    -color index red black "~N|~O"
    -
    - - -

    Voila, pour plus d’informations vous pouvez aller voir le manuel de mutt -@ http://www.mutt.org/doc/manual/
    -J’espère que cette configuration “toute faite” vous aidera a commencer -a utiliser mutt. Il est tout de fois important de se souvenir -qu’utiliser une configuration toute faire n’aide pas a comprendre un -programme ou un système, et que cette façon de faire devrait être -réservée a l’introduction ou a des situations ou il est absolument -nécessaire d’avoir rapidement une configuration fonctionnelle (c’est a -dire, dans le cas d’un client email, euh… jamais?). Je vous invite -donc a relire les annotations dont sont parsemés les fichiers de -configuration en question, et surtout a lire le manuel, a chercher sur -Bing Google Yahoo Seeks, et globalement -a tenter de comprendre les configurations en question et a les améliorer!

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/nat/index.html b/output/posts/nat/index.html deleted file mode 100644 index aad9b10..0000000 --- a/output/posts/nat/index.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - NAT - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - NAT -

    -
    -
    -
    -
    - Date - - Mon 17 February 2014 - -
    - By - wxcafé -
    - Category - Ranting -
    - - - - -
    -

    NAT (Network Address Translation) in a word?
    -It’s complicated. Very. Don’t do it, you’d damage your brain.

    -

    Bon, sinon, prochain article serieux vite, bisous.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/nuc-hdmi-cec/index.html b/output/posts/nuc-hdmi-cec/index.html deleted file mode 100644 index 1148053..0000000 --- a/output/posts/nuc-hdmi-cec/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - les NUCs et le HDMI-CEC - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - les NUCs et le HDMI-CEC -

    -
    -
    -
    -
    - Date - - Sat 22 August 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    J’ai récemment récupéré une télé. Ce post ne se centrant pas sur cette télé, -passons rapidement sur ce qui y est lié : ne souhaitant pas “profiter” du -paysage audiovisuel français (ou PAF), et ayant nombre de films et séries acquis -tout a fait légalement (hmm hmm) stockés sur mon serveur local, je souhaitais -brancher sur ma télévision un système me permettant de regarder ces films et -séries, et possiblement quelques sources de vidéos en ligne (Youtube, Netflix, -etc…) simplement.

    -

    Ayant un Raspberry Pi 1 qui trainait, j’ai -décidé d’installer OpenELEC dessus et de voir ce que ça -donnait. Le résultat n’étant pas satisfaisant (a cause des difficultés du RPi -a faire fonctionner tout ça), j’ai décidé d’upgrader le système.

    -

    J’ai donc acquis un NUC D34010WYK -(attention, les nouveaux modèles ne fonctionnent pas pour ce qui suit), un -adaptateur HDMI-CEC pour celui-ci, et un -SSD mSATA, en me disant que je -pourrais sans trop de problème faire tourner Kodi sur un -debian, avec en plus Steam pour faire du streaming depuis mon desktop. L’autre -avantage de tourner sur du Intel, c’est de pouvoir mater Netflix (puisque le -plugin kodi approprié utilise chrome, et ne fonctionne (a ma connaissance) que -sur x86).

    -

    J’ai donc reçu après un certain temps le matériel sus cité, que j’ai avidement -monté, avant de me rendre compte que le manuel de l’adaptateur Pulse-Eight était -[PDF]assez médiocre. J’ai donc -cherché plusieurs heures, avant de trouver [DE]ce -post -expliquant comment brancher l’adaptateur. Je vais donc résumer ici le processus, -ce qui devrait rendre la tache a la fois plus simple pour les autres personnes -cherchant l’information, et pour moi si je dois remonter ce système.

    -

    Pour faire simple, le NUC présente trois headers séparés : un dual-USB, un dit -“Front Panel”, et un appelé “Custom Solution Header”. Les trois sont utilisés -ici. La première chose a faire est de brancher les fiches grises et rouges sur -le Custom Solution Header: le branchement doit être fait ainsi :

    -
    Custom Solution
    -  ┌─┬─┬─┬─┬─┐
    -  │g│ │·│r│·│
    -  ├─┼─┼─┼─┼─┤
    -  │·│·│·│·│·│
    -  └─┴─┴─┴─┴─┘
    -
    -  g ➔ fiche grise
    -  r ➔ fiche rouge
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Une fois cela fait, il faut brancher le Front Panel. Heureusement, c’est plus -facile, puisqu’il n’y a qu’une seule fiche a brancher ici : la orange.

    -
      Front Panel
    -  ┌─┬─┬─┬─┬─┐
    -  │·│·│·│·│·│
    -  ├─┼─┼─┼─┼─┤
    -  │ │·│o│·│·│
    -  └─┴─┴─┴─┴─┘
    -
    -  o ➔ fiche orange
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Enfin, il faut encore brancher les fiches restantes sur le header dual-USB. -Étant donné que ce header contient deux fois les pins nécessaires a un -branchement USB, il est possible de brancher les cables de plusieurs façons.

    -
       Dual-USB
    -  ┌─┬─┬─┬─┬─┐
    -  │b│B│v│n│·│
    -  ├─┼─┼─┼─┼─┤
    -  │·│·│·│·│ │
    -  └─┴─┴─┴─┴─┘
    -
    -  b ➔ fiche bleue
    -  B ➔ fiche Blanche
    -  v ➔ fiche verte
    -  n ➔ fiche noire
    -  · ➔ pin inutilisé
    -    ➔ espace vide (sans pin)
    -
    - - -

    Tous les branchements étant effectués, il faut maintenant remonter la bête -(attention a ne pas déranger les branchements avec les antennes Wifi, par -exemple), la brancher, et vérifier que tout démarre bien. Il faut aussi changer -un paramètre dans le BIOS intel : dans Power➔Secondary Power Settings, il faut -que “Deep S4/S5” soit désactivé. Ceci permettant a la connection HDMI-CEC de -démarrer et le NUC.

    -

    Ne reste plus ensuite qu’a installer un système digne de ce nom dessus!

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/opensmtpd-debian/index.html b/output/posts/opensmtpd-debian/index.html deleted file mode 100644 index 927344b..0000000 --- a/output/posts/opensmtpd-debian/index.html +++ /dev/null @@ -1,564 +0,0 @@ - - - - - OpenSMTPd comme serveur mail sous debian - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - OpenSMTPd comme serveur mail sous debian -

    -
    -
    -
    -
    - Date - - Fri 07 November 2014 - -
    - By - Wxcafé -
    - Category - Tutoriel -
    - - - - -
    -

    J’avais dit il y a un certain temps que j’allais écrire un tutoriel expliquant -comment gérer ses mails soi-même. Il se trouve que j’ai récemment décidé de -changer le serveur qui héberge (entre autres) ce blog, et que ce dernier héberge -aussi mes emails. J’ai donc totalement changé d’infrastructure quand a la -gestion de mon système de mails.

    -

    Ainsi, j’ai décidé de passer de Postfix a OpenSMTPd, changement que je voulais -effectuer depuis un certain temps. OpenSMTPd est un -projet originaire d’OpenBSD qui a pour but de fournir un -serveur SMTP fiable, simple, rapide, et surtout sécurisé (les même buts que ceux -qu’a le projet OpenBSD, globalement).

    -

    Pour rappel, le système d’emails fonctionne d’une façon très simple : votre MUA -(Mail User Agent, ou client email) contacte le MTA (Mail Transport Agent, ou -serveur SMTP) de votre fournisseur email, qui contacte le MTA du fournisseur du -destinataire, qui lui même contacte le MDA (Mail Delivery Agent) qui délivre le -mail au destinataire.

    -

    Si vous avez bien suivi, vous pouvez voir que je n’ai pas parlé de récupération -ni de lecture des mails. C’est pour une raison simple, qui est que ces taches -sont remplies par d’autres services encore (IMAP/POP pour la récupération depuis -le serveur, des yeux pour la lecture).

    -

    Or ce qui nous intéresse ici, ce n’est pas simplement d’envoyer et de recevoir -des emails mais bien aussi de pouvoir les récupérer et les lire, et c’est pour -ça que ce tutoriel ne parlera pas que d’OpenSMTPd mais aussi de Dovecot qui fait office de serveur IMAP et -amavis/spamassassin -pour filtrer les mails entrants et sortants. -Le schéma suivant explique la façon dont les mails sont gérés sur le système

    -
                ╭────────────────╮                    ╭──────────╮
    -            │╭──────────────>│────> to filter ───>│─╮        │
    -  mail in   ││               │                    │ │ amavis │
    -───────────>│╯ OpenSMTPd  ╭──│<─── from filter<───│<╯        │
    -            │             │  │                    ╰──────────╯
    -  mail out  │             │  │                    ╭──────────╮
    -<───────────│<────────────┴─>│─────> to MDA ─────>│─────────>│──> to user's
    -            │                │                    │ dovecot  │     mailbox
    -            ╰────────────────╯                    ╰──────────╯
    -
    - - -

    Normalement, ceci devrait être a peu près clair. -Pour expliquer vite fait, les emails entrants (venant des utilisateurs mais -aussi d’autres correspondants) sont transmis a OpenSMTPd, qui envoie tout aamavis, qui vérifie a la fois les spams et les malwares pour les mails -venants de l’exterieur, et qui signe avec DKIM pour les mails venants de -nos utilisateurs, puis qui rentransmet les mails filtrés/signés a OpenSMTPd, -qui a ce moment-ci trie en fonction de la destination : les mails gérés -par le domaine vont via dovecot dans les boites mail des destinataires -locaux, les mails exterieurs vont directement vers le MTA du serveur -distant.

    -

    Voyons comment mettre cela en place. Tout d’abord, il faut décider de la façon -dont les différents services vont communiquer.

    -

    Déjà, amavis étant configuré par défaut pour écouter (en SMTP) sur le port -10024 et répondre sur le port 10025 quand il s’agit de filtrer et -écouter sur le port 10026 et répondre sur le port 10027 quand il s’agit de -signer, nous allons profiter de cette configuration et donc lui parler en SMTP -sur ces ports.

    -

    Quand a Dovecot, nous allons lui transmettre les emails en LMTP (Local Mail -Transfer Protocol), non pas sur un port mais via un socket (dans ce cas précis, -/var/run/dovecot/lmtp).

    -

    Ainsi, pour reprendre le schéma présenté plus haut :

    -
                ╭───────────────╮                    ╭───────────╮
    -            │╭─────────────>│──> SMTP (10026) ──>│─╮         │
    -  SMTP in   ││              │                    │ │ amavis  │
    -────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10027) <──│<╯ (sign)  │
    -            │            │  │                    ╰───────────╯
    -  SMTP out  │            │  │
    -25 <────────│<───────────╯  │
    -            ╰───────────────╯
    -
    - - -

    Pour les mails sortants; et

    -
                ╭───────────────╮                    ╭────────────╮
    -            │╭─────────────>│──> SMTP (10024) ──>│─╮          │
    -  SMTP in   ││              │                    │ │ amavis   │
    -────────> 25│╯ OpenSMTPd ╭──│<── SMTP (10025) <──│<╯(filter)  │
    -            │            │  │                    ╰────────────╯
    -            │            │  │                    ╭────────────╮
    -            │            ╰─>│──> LMTP (socket) ─>│───────────>│──> to user's
    -            │               │                    │  dovecot   │     mailbox
    -            ╰───────────────╯                    ╰────────────╯
    -
    - - -

    Pour les mails entrants.

    -

    Maintenant que la théorie est claire, mettons en place tout cela. Je me baserai -ici sur le fait que vous utilisiez une plateforme Debian ou OpenBSD. Pour -d’autres plateformes, la configuration devrait être sensiblement la même

    -

    (Vous aurez besoin de certificats SSL pour ce guide, même auto-signés. -Si vous ne savez pas comment en créer, vous pouvez aller voir ce -post)

    -

    Tout d’abord, commençons par installer les programmes nécessaires :

    -
    sudo apt-get install opensmtpd dovecot dovecot-pigeonhole amavisd-new dovecot-managesieved
    -sudo pkg_add dovecot dovecot-pigeonhole amavisd-new
    -
    - - -

    Continuons en configurant OpenSMTPd tel que nous avons vu plus haut :

    -

    /etc/smtpd.conf

    -
    # This is the smtpd server system-wide configuration file.
    -# See smtpd.conf(5) for more information.
    -
    -## Certs
    -pki exem.pl certificate "/etc/certs/exem.pl.crt"
    -pki exem.pl key         "/etc/certs/exem.pl.key"
    -
    -## Ports to listen on, and how to listen on them
    -listen on eth0 port 25 tls pki exem.pl hostname exem.pl auth-optional
    -listen on eth0 port 465 tls-require pki exem.pl hostname exem.pl auth mask-source
    -listen on eth0 port 587 tls-require pki exem.pl hostname exem.pl auth mask-source
    -
    -## Aliases
    -table aliases file:/etc/aliases
    -
    -# coming from amavisd, checked for spam/malware
    -listen on lo port 10025 tag Filtered
    -# coming from amavisd, signed with DKIM
    -listen on lo port 10027 tag Signed
    -
    -## Receiving
    -# if the (incoming) mail has been through amavisd, then we can deliver it
    -accept tagged Filtered for any alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
    -# we directly tranfer incoming mail to amavisd to be checked 
    -accept from any for domain "exem.pl" relay via "smtp://localhost:10024"
    -# we have to put these lines in this order to avoid infinite loops
    -
    -## Sending
    -# if the (outgoint) mail has been through amavisd, then we can deliver it
    -accept tagged Signed for any relay
    -# we tranfer the outgoing mail to amavisd to be signed
    -accept for any relay via "smtp://localhost:10026"
    -# same, we have to put these lines in this order or infinite loops...
    -
    - - -

    Expliquons un peu ce fichier de configuration :

    -
      -
    • Tout d’abord, le paragraphe nommé “Certs” contient les déclaration - d’emplacement des certificats SSL.
    • -
    • Ensuite, le paragraphe contenant les ports externes sur lesquels nous écoutons : - port 25 avec TLS optionel et ports 465 et 587 avec TLS obligatoire
    • -
    • Les alias sont définis juste après
    • -
    • Le paragraphe suivant contient les ports locaux sur lesquels nous écoutons : - 10025 (port de sortie du filtre de amavis) dont on taggue les mails sortants - comme “Filtered” et 10027 (port de sortie des mails signés par amavis) dont on - taggue les mails sortants comme “Signed”
    • -
    • Nous avons ensuite le paragraphe qui traite les mails rentrants. Si le mail - traité est taggué comme Filtered, alors il a été vérifié par amavis, et on - peut donc le transmettre au destinataire. Sinon, c’est qu’il n’a pas encore - été vérifié par amavis, donc on lui transmet pour analyse (sur le port 10024 - donc). Il est important de mettre les déclarations dans ce sens, car la - première règle qui matche l’état du paquet est appliquée. Ici, la deuxième - ligne matchant tous les mails arrivant et la première seulement ceux filtrés, - inverser leur sens voudrait dire que les mails seraient toujours renvoyés a - amavis
    • -
    • Enfin, le dernier paragraphe traite les mails sortants. De la même façon que - pour le paragraphe précédent, si le mail sortant est déjà taggué comme Signed - on le transmet au MTA du destinataire, sinon il n’a pas encore été signé par - DKIM par amavis et on le transmet donc a amavis pour qu’il le signe. Le - problème de l’ordre des lignes se pose encore, pour la même raison qu’au - dessus.
    • -
    -

    Nous allons maintenant configurer dovecot. Comme nous l’avons vu, dovecot doit -écouter en LMTP via la socket /var/run/dovecot/lmtp et transmettre les -emails a la boite email de l’utilisateur. Il serait aussi interessant -qu’il nous permette de récuperer les mails. Pour cette configuration, on ne -mettra en place que du IMAPS. Cependant, si vous voulez mettre en place du -POP3[s], différents guides sont trouvables facilement sur internet.

    -

    /etc/dovecot/dovecot.conf

    -
    ## Dovecot configuration file
    -
    -# basic config
    -info_log_path = /var/log/dovecot-info.log
    -log_path = /var/log/dovecot.log
    -log_timestamp = "%Y-%m-%d %H:%M:%S "
    -mail_location = maildir:%h/mail
    -
    -# authentication
    -passdb {
    -    driver = pam
    -}
    -userdb {
    -    driver = passwd
    -}
    -
    -# the protocols we use
    -protocols = imap lmtp sieve
    -
    -# ssl config
    -ssl_cert = </etc/certs/exem.pl.cert
    -ssl_key = </etc/certs/exem.pl.key
    -ssl_cipher_list = HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL
    -ssl = yes
    -
    -## configuring services 
    -# disables imap login without SSL (yes dovecot is dumb that way)
    -service imap-login {
    -    inet_listener imap {
    -        port=0 
    -    }
    -}
    -
    -service lmtp {
    -    unix_listener lmtp {
    -        mode = 0666
    -    }
    -}
    -
    -## configuring protocols
    -# the dovecot lda, we set it to use sieve
    -protocol lda {
    -    mail_plugins = $mail_plugins sieve
    -}
    -
    -protocol lmtp {
    -    postmaster_address =  whoever@exem.pl
    -    mail_plugins = $mail_plugins sieve
    -}
    -
    -plugin {
    -    sieve = ~/.dovecot.sieve
    -    sieve_dir = ~/sieve
    -}
    -
    - - -

    ATTENTION: Sous OpenBSD, remplacez

    -
    passdb {
    -    driver = pam
    -}
    -
    - - -

    par

    -
    passdb {
    -    driver = bsdauth
    -}
    -
    - - -

    pour identifier les utilisateurs système

    -

    Ici aussi, voyons comment ce fichier est structuré :

    -
      -
    • Tout d’abord, les configurations de base : ou iront les logs, comment formater - leur datation, et l’endroit ou seront stockés les mails des utilisateurs.
    • -
    • Nous configurons ensuite la gestion de l’authentification des utilisateurs. - Ici nous identifions les utilisateurs avec le fichier /etc/passwd et leurs - mots de passe avec PAM (ou BSDAuth)
    • -
    • Nous configurons ensuite les protocoles que nous servons. Ici, nous voulons de - l’IMAPS, du LMTP local et Sieve (qui sert pour trier les messages).
    • -
    • Nous configurons le SSL
    • -
    • Le section suivante contient la configuration des services. Nous avons en - premier lieu le service IMAP, dont la configuration sert uniquement a - désactiver IMAP. En effet, dovecot ne permet d’activer IMAPS qu’en activant - IMAP avec. Comme nous ne voulons pas d’IMAP sans SSL, nous le désactivons. - La configuration de lmtp sert a attribuer des permissions plus correctes au - fifo qu’il utilise
    • -
    • Nous configurons maintenant les protocoles, pour faire fonctionner Sieve
    • -
    • enfin, nous configurons le plugin sieve en lui indiquant quel fichier et - quel dossier utiliser pour sa configuration.
    • -
    -

    Enfin, il nous reste a configurer amavis. Comme expliqué, amavis va nous servir -a deux choses : signer les emails sortants, et filtrer les emails entrants. Il -doit donc écouter sur les port 10026 pour les signatures et 10024 pour le -filtrage, et répondre respectivement sur les ports 10027 et 10025 (le tout, en -SMTP. Comme toutes les transactions se font sur le loopback, il n’y a aucun -risque a utiliser des protocoles non chiffrés. -Pour OpenBSD, pensez a copier la configuration par défaut depuis/usr/local/share/examples/amavisd-new/amavisd.conf et ajoutez les -modifications nécessaires a la fin du fichier.

    -

    /etc/amavis/conf.d/99-local.conf (debian) -/etc/amavis.conf (OpenBSD)

    -
    use strict;
    -
    -$enable_dkim_verification = 1;
    -$enable_dkim_signing = 1;
    -dkim_key("exem.pl", "main", "/etc/certs/dkim.key" );
    -
    -@dkim_signature_options_bysender_maps = (
    -    { '.' =>
    -        { ttl => 21*24*3600, c => 'relaxed/simple' }
    -    }
    -);
    -
    -$inet_socket_port = [10024, 10026];
    -$policy_bank{'MYNETS'} = {
    -        originating => 1,
    -        os_fingerprint_method => undef,
    -};
    -
    -$interface_policy{'10026'} = 'ORIGINATING';
    -
    -$policy_bank{'ORIGINATING'} = {
    -        originating => 1,
    -        allow_disclaimers => 1,
    -        virus_admin_maps => ["root\@$mydomain"],
    -        spam_admin_maps => ["root\@$mydomain"],
    -        warnbadhsender => 1,
    -        forward_method => 'smtp:localhost:10027',
    -        smtpd_discard_ehlo_keywords => ['8BITMIME'],
    -        bypass_banned_checks_maps => [1],
    -        terminate_dsn_on_notify_success => 0,
    -};
    -
    -#------------ Do not modify anything below this line -------------
    -1;  # ensure a defined return
    -
    - - -

    A nouveau, expliquons ce fichier : -- le premier paragraphe définit que nous voulons qu’amavis signe les emails - sortants, vérifie la signature DKIM des emails rentrants, et l’endroit ou se - trouve la clé privée servant a signer les emails. -- le second définit les options DKIM que nous souhaitons utiliser comme défaut. - Je vous invite a consulter la RFC 4871 -- nous définissons ensuite les ports sur lesquels nous allons écouter, puis les - paramètres que nous utiliserons pour les emails venant de nos utilisateurs : - ils seront traités comme “originating” et nous ne vérifierons pas l’OS duquel - ils viennent. -- nous savons que les emails venants du port 10026 sont sortants, nous les - traitons donc comme tel -- le paragraphe suivant décrit le traitement que nous faisons subir aux emails - sortants : tout d’abord, nous réaffirmons qu’ils viennent bien de notre - serveur. Nous autorisons les disclaimers (voire encore une fois la RFC - 4871. Nous déclarons l’adresse a - prévenir en cas de spam/virus venants de notre système, et que nous voulons - être prévenus. Nous déclarons ou envoyer les mails une fois signés et filtrés, - puis qu’il est nécessaire de convertir les emails au format 7 bits avant de - les envoyer au MTA, que nous autorisons tous les types et noms de fichiers, et - les notifications de succès d’envoi. Et voila!

    -

    Vous avez pu remarquer qu’a aucun moment nous ne configurions ni la signature -des emails sortants ni le filtrage des emails entrants. Ces paramètres sont en -fait inclus par défaut dans amavis.

    -

    Il nous reste cependant quelques opérations a faire, encore. -Tout d’abord, il nous faut générer notre clé DKIM. Pour cela, il existe -différentes méthodes, j’ai personnellement utilisé opendkim (un -tutorial) -mais de nombreuses autre méthodes existent. -Il nous reste encore a configurer spamassassin :

    -
    #rewrite_header Subject *****SPAM*****
    -# report_safe 1
    -required_score 2.0
    -# use_bayes 1
    -# bayes_auto_learn 1
    -# bayes_ignore_header X-Bogosity
    -# bayes_ignore_header X-Spam-Flag
    -# bayes_ignore_header X-Spam-Status
    -ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
    -# shortcircuit USER_IN_WHITELIST       on
    -# shortcircuit USER_IN_DEF_WHITELIST   on
    -# shortcircuit USER_IN_ALL_SPAM_TO     on
    -# shortcircuit SUBJECT_IN_WHITELIST    on
    -# shortcircuit USER_IN_BLACKLIST       on
    -# shortcircuit USER_IN_BLACKLIST_TO    on
    -# shortcircuit SUBJECT_IN_BLACKLIST    on
    -shortcircuit ALL_TRUSTED             off
    -# shortcircuit BAYES_99                spam
    -# shortcircuit BAYES_00                ham
    -
    -endif # Mail::SpamAssassin::Plugin::Shortcircuit
    -
    - - -

    Comme vous pouvez le voir, les modifications se résument globalement a baisser -le required_score pour ma part.

    -

    Pour finir, activez les services nécessaires : opensmtpd, dovecot, amavisd, et -spamassassin, et tout devrait fonctionner parfaitement

    -

    Bon courage pour votre hosting de mail ensuite…

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/plan-9-from-whichever-space/index.html b/output/posts/plan-9-from-whichever-space/index.html deleted file mode 100644 index fd948e8..0000000 --- a/output/posts/plan-9-from-whichever-space/index.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - Plan9 from whichever space - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Plan9 from whichever space -

    -
    -
    -
    -
    - Date - - Mon 09 September 2013 - -
    - By - Wxcafe -
    - Category - OSes -
    - - - - -
    -

    Plan 9 from Outer Space est un film de série Z, produit en 1959 par Edward D. -Wood. Il est assez connu comme étant l’un des pires films jamais sortis. Rempli -d’erreur de montage, d’effets spéciaux au rabais, et ayant même connu la mort -d’un acteur, il a ainsi atteint le statut de film culte grâce a sa médiocrité.

    -

    Plan 9 from Bell Labs est un OS venant de Bell Labs (comme son nom l’indique), -et qui a été pensé comme le successeur d’Unix. Il est conçu comme une poursuite -des concepts unixiens jusqu’à leur but naturel. Ainsi, c’est Plan9 qui a -introduit le concept d’UnionFS, le protocole 9P qui permet d’acceder a des -ressources appartenant a d’autres ordinateurs a distance, un support de -l’unicode par défaut et sur tout le système (a l’inverse d’Unix, qui fonctionne -a la base en ASCII), un support de ProcFS amélioré, une interface graphique par -défaut, et d’autres améliorations sur les thèmes de base que propose Unix.

    -

    Cependant, Plan9 n’a jamais été véritablement utilisé pour quoi que ce soit -d’autre que la recherche en systèmes, et c’est dommage, parce que Plan9 a -quelque chose de très intéressant à proposer. En effet, en ces jours d’intérêt -grandissant pour le klaoude et la délocalisation a la fois du processing et des -données, et bien que Plan9 ait été créé bien avant que le terme “cloud -computing” n’apparaisse pour la première fois, il semble que ce système ait été -conçu pour apporter cette délocalisation tant rêvée.

    -

    En effet, même si l’on considère que les nouveautés qu’il apporte par rapport a -Unix ne sont pas extraordinaires en soit (alors qu’elles sont déjà -conséquentes), lorsqu’on les prend ensemble, elles font de Plan9 le système -d’exploitation ultime en terme de partage de ressources et de données. -Ainsi, le fait que 9P permette de considérer toutes les ressources d’un système -distant comme n’étant qu’une poignée de fichiers permet de le monter comme -n’importe quel système de fichier. Le fait que chaque utilisateur puisse accéder -a plusieurs namespaces de façon transparente (et donc de démarrer, arrêter et -gérer des processus sur chacun de ces namespaces) et que chaque namespace puisse -interagir avec les autres, même s’ils sont hétérogènes (c’est a dire provenant -de machines différentes), permet d’utiliser les ressources d’une machine -distante comme si elle était présente localement. Le mécanisme d’UnionFS permet -de rendre tout ça utilisable, en montant plusieurs systèmes de fichiers sur le -même point de montage, en même temps, et de pouvoir ainsi accéder aux fichiers -de plusieurs machines a la fois (ce qui permet une délocalisation des données -bien plus poussée que Dropbox ou Google Drive, et ce en kernelspace).

    -

    Le réseau fait donc partie intégrante de Plan9, et il devient plus difficile de -parler d’ordinateur lorsque le concept même du système est d’être composé de -clusters eux mêmes composés de machines hétérogènes. Le système de fichier -virtuel /net fourni par le kernel de Plan9 permet d’implémenter très facilement -différents concepts réseaux : en montant le /net d’un ordinateur du réseau local -sur celui servant de gateway vers l’internet, on crée un NAT vers cet ordinateur -du réseau local. En montant le /net d’un ordinateur distant sur un ordinateur -local via le protocole 9P sécurisé, on crée un VPN : les connections locales se -font en utilisant l’accès de l’ordinateur distant, et les connections entre les -deux sont chiffrées.

    -

    Bref, bien avant les clusters de Raspberry Pi qui utilisent une api python pour -partager leur “puissance” de calcul en userspace, des superordinateurs pour -lesquels le noyau Linux s’est doté du support de jusqu’à 4096 CPUs, des OS tels -JoliOS qui promettent une integration du klaoude alors qu’ils ne sont en fait -que des navigateurs web a peine améliorés et des services de stockage en ligne -qui promettent un accès universel a toutes nos données alors qu’ils ne proposent -que de les garder a disposition par le web, Plan9 promettait une technologie de -partage des ressources système et de données, une intégration du réseau dans le -système particulièrement poussée, un environnement graphique supporté par le -basesystem et non greffé par dessus comme l’a été X11, et de nombreuses autres -améliorations sur Unix.

    -

    Malheureusement, il n’a jamais été adopté de façon véritablement significative, -et ce pour une raison très Unixiènne : “worse is better”. En effet, le parc de -machines Unix déjà installées était suffisamment performant et fonctionnel pour -que des solutions soient développées au dessus du système pour remplir les -mêmes fonctions que remplit Plan9 via son kernel, tels le nouveau ProcFS de -Linux, FUSE, etc…

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/index.html b/output/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/index.html deleted file mode 100644 index 51dd5ef..0000000 --- a/output/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/index.html +++ /dev/null @@ -1,351 +0,0 @@ - - - - - Pourquoi je vais quitter linux pour passer a FreeBSD. - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Pourquoi je vais quitter linux pour passer a FreeBSD. -

    -
    -
    -
    -
    - Date - - Mon 04 February 2013 - -
    - By - Wxcafe -
    - Category - Ranting -
    - - - - -
    -

    This is subject to debate, and as most of the actors in this field are -not French-speaker, there is an English version of this text here

    -

    Bon, voila. J’ai passé le cap. Je suis sous GNU/Linux depuis un certain -temps, maintenant, et depuis un certain temps je remarque des -changements malvenus. Bien entendu, au début, je n’avais pas les -connaissances nécessaires pour comprendre ne serait-ce que ces -modifications existaient. Et puis certaines sont arrivées avant que je -n’ai même idée que quelque chose dans mon système d’exploitation avait -cette fonction la. Par exemple, udev, ou policykit/consolekit/. A -l’époque, je n’avais aucune idée de la façon dont les disques étaient -montés sur mon système. Le premier système non-Windows que j’ai utilisé -fut Ubuntu 9.10 Karmic Koala, et il était encore trop tôt pour que je -cherche a démonter le système pour comprendre comment il fonctionnait en -profondeur. Cependant, avec le temps, les connaissances s’accumulant et -mon niveau de compréhension du système s’améliorant, j’ai commencé a -remarquer que certain bouts de l’OS ne collaient pas exactement avec les -autres. Bien sur, je ne saurais dire si cette réalisation s’est faite a -cause de la recrudescence de ces bouts d’OS, ou bien juste a cause de ma -compréhension plus poussée. Toujours est-il que ces petits bouts d’OS ne -s’adaptant pas au reste du système se faisaient de plus en plus visible. -Et puis, un jour, j’en ai eu marre de voir unity sur ma machine, et j’ai -choisi de passer a Archlinux. C’était avant le passage a systemd. Ce -système me convenait bien. Si je n’installais pas Gnome, ce que je ne -comptais pas faire, il ne me forçait pas a installer un *kit -quelconque, ni dbus. Oui, udev était toujours la, mais c’était le moins -envahissant de ceux la.

    -

    Mais Archlinux est passé a systemd. Attention hein, je ne critique ici -ni systemd, ni udev, ni même les kit, et surtout pas Archlinux. Les -premiers sont probablement très efficaces dans leur domaine, et le -second n’a pas vraiment eu le choix, rapport a la philosophie de la -distribution d’avoir au plus vite les dernières versions de tout. -Cependant, systemd, tout comme udev et les kits (bien que ce ne soient -pas les seuls a faire ça…) ont un problème très précis, qui n’importe -pas a tout le monde, mais qui est très gênant pour ceux a qui il -importe, et ce problème est que ces systèmes ne respectent absolument -pas la philosophie UNIX. La philosophie UNIX, pour rappel, se résume en -ces 9 principes :

    -
      -
    1. Ce qui est petit est beau
    2. -
    3. Faites en sorte que chaque programme fasse une chose, bien.
    4. -
    5. Faites un prototype aussi vite que possible
    6. -
    7. Choisissez la portabilité plutôt que l’efficacité
    8. -
    9. Stockez les données dans des fichiers textes.
    10. -
    11. Utilisez ce qui existe déjà a votre avantage. [1]
    12. -
    13. Utilisez des scripts shells pour faciliter la portabilité et la - réutilisation.
    14. -
    15. Évitez les UI qui “capturent” l’utilisateur.
    16. -
    17. Faites de chaque programme un filtre.
    18. -
    -

    Alors bien entendu, un système d’exploitation est fait pour évoluer, et -on pourrait penser qu’UNIX a fait son temps. Cependant, ce n’est pas -exactement la façon dont l’informatique fonctionne. Effectivement, les -standards, les systèmes d’exploitation, les logiciels, tout doit évoluer -- ou mourir - et UNIX ne fait pas exception a la règle. Mais ce n’est -pas d’UNIX que nous parlons ici. C’est de la philosophie UNIX. Et -celle-ci n’a pas fait son temps, elle a fait ses preuves. La -philosophie UNIX, en plus d’être efficace sur le papier, a aussi 44 ans -de tests derrière elle, et fonctionne aussi bien qu’au premier jour.
    -La philosophie UNIX est aussi et surtout une garantie d’utilisabilité -et de simplicité pour les administrateurs systèmes, pour les -développeurs, bref pour tous ceux qui font de l’informatiquesérieusement (je ne dis pas que les autres métiers de l’informatique -ne sont pas sérieux, je prend juste ceux-ci comme exemples parce que ce -sont ceux qui sont les plus proches du système).

    -

    Tous OS se doit d’avoir un système standardisé pour faire communiquer -les programmes entre eux. UNIX a un système de pipes, des sortes de -fichiers spéciaux permettant d’échanger des informations. C’est -efficace, ça respecte le “tout est fichier”, c’est standard, c’est -simple a comprendre, bref, ça fonctionne parfaitement. Dbus vient -remplacer ça, avec une interface qui n’est explicitement pas faite pour -être utilisée a la ligne de commande mais a l’aide d’APIs, et un -programme monolithique qui effectue sa tache d’une façon complètement -obscure pour l’utilisateur. Alors bien sur, il l’effectue d’une façon -efficace, cette tache. Oui, ça va plus vite qu’avant. Oui, c’est plus -“rangé”, ça fait moins “fouillis”. Mais c’est moins efficace. C’estbeaucoup moins utilisable pour l’utilisateur final. C’est -horriblement chiant pour les sysadmins, parce qu’ils ne peuvent plus -lire facilement les échanges entre programmes. C’est peu pratique, en -fin de compte. Et ça ne respecte pas du tout la philosophie UNIX.
    -Systemd prend le même parti de créer une interface unifiée, accessible -via des appels a des APIs uniquement, complètement obscure, extrêmement -abstraite, bien entendu monolithique, et très peu ouverte a la -modification par l’utilisateur final. Alors oui, il parait que ça -augmente la vitesse de boot. Eh bien, au risque d’en choquer quelques -uns, je préfère avoir un système qui boote légèrement plus lentement -et que je puisse modifier facilement, et qui soit ouvert, compréhensible -et distribué. C’est presque comme si les projets freedesktop.org avaient -pour but de remplacer la base UNIX de linux en créant un système -concurrent, bâtard, bâti sur le kernel Linux mais n’employant plus les -systèmes basiques d’UNIX.

    -

    Le problème est qu’il est facilement visible que la direction prise par -la communauté Linux n’est pas celle du retour sur les systèmes UNIX ni -celle du développement de solutions respectant la philosophie UNIX, mais -remises au gout du jour (?), mais est bien d’accepter et de pousser les -changements apportés par les projets freedesktop.org directement dans le -cœur du système lui même. Ainsi, Fedora (très près de Red Hat, dont font -partie de nombreux développeurs de ces projets), a déjà adopté tous ces -changements (archlinux aussi, mais pour d’autres raisons…), et on peut -compter sur le fait que les autres distributions l’adopteront un jour ou -l’autre.

    -

    Bon, maintenant que nous avons, si ce n’est démontré la nocivité de ces -systèmes, tout du moins exprimé les raisons qui font qu’ils me -déplaisent, on pourrait penser qu’il suffit de passer a une distribution -n’incluant pas systemd, voire a une distribution n’incluant pas du tout -de contenus freedesktop.org, et de vivre avec le fait de ne pas être sur -archlinux. Cependant, avec un peu de réflexion, on voit que si des -distributions comme archlinux et Fedora ont adopté systemd (et -qu’OpenSUSE est en train de l’intégrer), il est probable que cela -devienne un standard au fil des années, et que seuls survivent systemd -et upstart, le gestionnaire de démarrage d’ubuntu, qui ne changera -probablement pas (je les vois mal revenir en arrière sur ce point.) -Toujours est-il que l’init héritée du System V semble condamnée a mourir -sous Linux. Il pourrait être judicieux de passer sous debian squeeze, -qui ne recevra probablement jamais la mise a jour, ou a wheezy, qui ne -la recevra probablement que dans 2/3 ans. Cependant, cette période est -toujours trop courte, et met sur mon système d’exploitation une date -d’expiration, chose qui ne me plait que moyennement. Non, la solution -est de passer sous un système autre, qui ait son propre système d’init -(ou qui ne risque pas de passer sous systemd). Dans ce cas, deux options -principales s’ouvrent a moi: OpenSolaris et *BSD. Minix n’est pas -vraiment un choix, vu le peu de programmes qu’il permet de faire -fonctionner et le fait qu’il ne soit disponible que sur i386, ce qui -n’est pas vraiment avantageux au vu de mon système en x86_64. Haiku -n’est pas un choix non plus, puisque le but est de rester dans une -optique UNIX.

    -

    OpenSolaris est un système d’exploitation tout a fait valable. Je n’ai -en théorie aucun problème sur cet OS, sauf que certains choix de design -ne correspondent pas du tout a l’idée que j’ai d’un OS. En effet, -OpenSolaris ressemble assez a Debian dans sa vision du fonctionnement de -ses outils, avec des paquets modifiés pour les rendre plus simples a -utiliser (fichiers de configuration fournis par défaut, par exemple, et -autres patchs “release-only”), et une tendance a faire des scripts et -des outils installés par défaut pour tout et n’importe quoi. Bref, cela -n’est pas le sujet. Il convient aussi de voir qu’avec la récente -acquisition de Sun par Oracle, il est possible que le projet OpenSolaris -n’ait pas de très beaux jours devant lui (la page d’accueil du -projet affiche d’ailleurs un ÉNORME logo Oracle, du meilleur gout.)

    -

    Il reste donc *BSD. Pourquoi choisir FreeBSD plutôt qu’OpenBSD, NetBSD -ou DragonFlyBSD (pour ne citer que les plus connus) ? Et bien c’est -simple : pour aucune raison particulière. OpenBSD et NetBSD ont pour -réputation d’être orientées sécurité, et d’après ce que j’ai pu en voir -DFBSD ressemble aussi au système de l’assistance a l’user a outrance -décris plus haut. Mais la vérité est que je n’ai pas fait suffisamment -de recherches et que FreeBSD ne va me voir arriver que par hasard, parce -qu’entre toutes les BSD ca me semble la plus sympa et la plus agréable a -utiliser, plus le fait que le système de ports me convient bien (j’aime -pouvoir configurer mes logiciels de façon assez profonde.)

    -

    Voila, c’est mon avis sur ce “problème” actuel du monde de Linux. Bien -entendu, je continuerai a utiliser Linux, et je ne peux qu’espérer que -les systèmes tels que systemd ou dbus ne disparaissent, ou tout du moins -n’apparaissent jamais chez certaines distributions, créant de ce fait un -choix pour les utilisateurs.
    -[1]: Je n’ai pas trouvé de traduction satisfaisante a “software leveraging”, mais l’idée est la…*

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/redesign-du-blog/index.html b/output/posts/redesign-du-blog/index.html deleted file mode 100644 index 7e07b1b..0000000 --- a/output/posts/redesign-du-blog/index.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - Redesign du blog, etc - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Redesign du blog, etc -

    -
    -
    -
    -
    - Date - - Wed 12 June 2013 - -
    - By - wxcafe -
    - Category - Note -
    - - - - -
    -

    Comme vous avez pu le remarquer, ce blog a “un peu” changé récemment.

    -

    Du coup, expliquons. J’ai récemment monté serverporn, et ai par la même -occasion découvert pelican. J’ai tout de suite accroché a ce générateur de -site statique en python, du fait de son efficacité, de sa facilité d’utilisation -et de sa grande customisation. En gros, pelican est un logiciel qui prend des -fichiers markdown ou reStructuredText, les passe a la moulinette d’un “thème” -constitué de templates pour les fichiers html et l’organisation du projet et -d’une partie “statique” contenant le css, et les autres fichiers nécessaires au -projet, et en fait des pages html.

    -

    Globalement, un thème est constitué ainsi :

    -
    thème
    -├── static
    -   ├─ css
    -     └─ [css files]
    -   ├─ img
    -     └─ [image files]
    -   └─ js
    -      └─ [javascript files]
    -└── template
    -    ├─ base.html
    -    ├─ index.html
    -    ├─ page.html
    -    ├─ [...]
    -    └─ article.html
    -
    - - -

    Sachant que les fichiers .html sont en réalité des fichiers suivant la syntaxe -django, et utilisent des variables particulières telles {{ article.content }}, -par exemple. La syntaxe complète est très bien documentée dans la doc de -pelican.

    -

    L’un des grands avantages de pelican est aussi la facilité qu’il offre quand a -la mise a jour du blog.
    -En effet, il offre un système de Makefiles permettant, grâce a de nombreuses -cibles de compilation, de régénérer le site entier, de ne générer que les -fichiers modifiés depuis la dernière génération, de générer uniquement les -fichiers n’existant pas la dernière fois, etc… -La gestion du projet en devient donc très simple, puisque après avoir écrit un -article, il suffit de faire un make html pour mettre a jour le blog.

    -

    De plus, le système de wordpress commençait a ne plus me convenir, du fait du -manque de customisation, du fait que ça soit du PHP (beurk), etc. La, avec -pelican, je contrôle bien plus ce qui est mis sur le serveur (puisque c’est moi -qui ait modifié les templates et le css), c’est lisible (puisque c’est du -python, par opposition au PHP…), et c’est plus “efficace”. Le markdown est -très pratique, je peux utiliser mon éditeur de texte de prédilection pour faire -les articles, je n’ai pas besoin d’un accès continu au net, bref, c’est plus -efficace.

    -

    En ce qui concerne les points négatifs :

    -
      -
    • -

      Perte des commentaires: - Je vous propose de vous référer a l’article de Gordontesos ici quand a - mon avis sur ce sujet.

      -
    • -
    • -

      Perte du bouton flattr: - Il va bientôt être remis, c’est juste un manque de temps de ma part, mais vu - que toutes les pages passent par les mêmes templates, c’est assez facile a - faire.

      -
    • -
    • -

      Perte du spam: - Pourquoi c’est dans les points négatifs, ca?

      -
    • -
    • -

      Temps d’adaptation et d’appréhension du système: - Oui, pendant encore un certain temps, il y aura des glitchs plus ou moins - réguliers sur le blog, c’est parce que j’apprend a me servir de ce système - et que j’apprend du css et du html. Ca arrive, ca passera, mais dans tous - les cas ca me permet d’apprendre plein de choses, donc je mets plutôt ca - dans la catëgorie positive.

      -
    • -
    -

    Voila, c’est mon retour d’expérience sur pelican. A plus.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/sed-basics/index.html b/output/posts/sed-basics/index.html deleted file mode 100644 index e9431d4..0000000 --- a/output/posts/sed-basics/index.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - Sed Basics - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Sed Basics -

    -
    -
    -
    -
    - Date - - Sun 18 August 2013 - -
    - By - Wxcafe -
    - Category - Tutoriel -
    - - - - -
    -

    sed est un outil Unix très largement utilisé et très pratique pour manipuler -le texte (ce qui se montre relativement indispensable dans un environnement -Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu -connu en détail, et la plupart du temps une seule fonction est utilisée : le -remplacement de texte.
    -Or sed a bien plus de possibilités que ça, comme nous allons le voir.

    -

    Tout d’abord, rappelons les bases : sed est un programme Unix de base, mais -aussi un langage de manipulation de texte dérivé de ed, l’éditeur original.ed est un éditeur de ligne, conçu a l’époque ou les ordinateurs n’étaient pas -personnels et étaient utilisés avec des téléscripteurs, c’est a dire des -machines dépourvues d’écrans et ne permettant donc pas l’utilisation d’éditeurs -dits “visuels”, tels que vim, emacs, et globalement tous les éditeurs ayant un -curseur et affichant plusieurs lignes. sed est donc une évolution de ed, le -s signifiant stream, sed est un éditeur de flux, prenant donc avantage du -concept Unixien de flux de données (voir Flux standards) pour éditer plus d’une ligne a la fois. -En pratique, sed est principalement utilisé sur des fichiers.

    -

    sed a quelques options pratique, notamment -s qui permet d’empêcher -l’affichage systématique des lignes traitées, ou bien -i (pour GNU sed) qui -permet de rediriger l’output dans le fichier d’input. Cela dit, l’intérêt unique -du programme est son langage de manipulation de texte.

    -

    ed, et donc sed, utilise un langage basé sur les séparations (en général des -/). Ainsi, la commande de base dans sed est

    -
    /[regex]/
    -
    - - -

    qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de -n’exécuter les commandes qui suivent que sur ces lignes.)

    -


    -La commande sed la plus utilisée est bien entendu le s, qui s’utilise de -la façon suivante :

    -
    s/[old text]/[new text]/[options]
    -
    - - -

    qui se propose donc de remplacer (substitute) [old text] (qui peut être une -regex) par [new text] (qui doit être un texte fixe, avec quelques -exceptions), en appliquant [options], la plus connue des options étant g, -qui permet d’appliquer la commande affectée a toutes les occurrences du texte -matché sur la/les lignes concernée-s.
    -Les exceptions a la “fixité” de [new text] sont particulièrement -intéressantes. En effet, sed utilise un langage de regex plutôt standard, -excepté le fait qu’il permet jusqu’à 9 “holding spaces”, qui sont délimités par -\( et \), et qui sont représentées dans le texte de remplacement par \1 à -\9.

    -

    Par exemple, la commande

    -
    sed 's/\(hello world\) world/\1/'
    -
    - - -

    sur le texte “hello world world” renverrait comme résultat

    -
    hello world
    -
    - - -

    De la même façon, le symbole & dans le texte de remplacement représente le -texte original. Ainsi, la commande

    -
    sed 's/hello world/& world/'
    -
    - - -

    sur le texte “hello world” renverrait comme résultat

    -
    hello world world
    -
    - - -


    -

    Une autre commande utile est p, qui sert a afficher le texte présent dans -l’espace courant :

    -
    /[regex]/p
    -
    - - -

    sed stocke en effet la ligne sur laquelle il travaille dans un espace mémoire -dédié, que j’appelle l’espace courant (pattern space en anglais). La commandep affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit -le pattern space de façon a ce qu’il ne contienne que les lignes matchant, et le p affiche donc ce dernier.

    -

    Un autre exemple de commande sont c, i et a, qui s’utilisent ainsi :

    -
    c \
    -[text]
    -
    - - -

    De la même façon, pour le i :

    -
    i \
    -[text]
    -
    - - -

    Et de même pour a.

    -

    Ces trois commandes s’utilisent de la même façon pour la bonne raison qu’elles -sont très proches. i sert a insérer du texte avant le pattern space. a -sert a insérer du texte après le pattern space, et enfin c sert a -remplacer tout le pattern space. Les trois utilisent [text] comme -remplacement ou insert. -Attention, les insertions se font sur la ligne précédant ou suivant le pattern -space, et non sur la ligne en question.

    -

    Enfin, dernière commande ne fonctionnant que ligne par ligne, d : - /[regex]/d -d (delete) supprime les contenus du pattern space.

    -

    sed est un outil puissant, mais complexe. Dans un prochain article, je -parlerai des commandes multilignes et des labels.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/ssl-starttls/index.html b/output/posts/ssl-starttls/index.html deleted file mode 100644 index 35c8d2d..0000000 --- a/output/posts/ssl-starttls/index.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - SSL - STARTTLS - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - SSL - STARTTLS -

    -
    -
    -
    -
    - Date - - Sat 16 May 2015 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Le chiffrement SSL pour les services en ligne est un problème relativement -récent, par rapport a l’histoire d’Internet. Sa mise en place pose -problème : les protocoles existants ne s’accommodent qu’assez mal de recevoir -soudainement un flot de données chiffrées, mais développer de nouveaux -protocoles est complexe et n’apporte rien d’intéressant. Pour palier a ce -problème, deux solutions sont apparues.

    -

    Le première consiste à faire écouter les services sur un -autre port, dans un tunnel SSL. De cette façon, le service existant écoute -normalement, mais il ne répond pas directement aux requêtes. A la place, un -tunnel SSL est mis en place, et les requêtes et les réponses passent dans le -tunnel (ou elles apparaissent donc chiffrées pour l’extérieur). Cela permet de -proposer un service chiffré en modifiant de façon minimale le programme, au prix -de devoir aussi changer tous les clients, et de devoir les orienter sur un autre -port.

    -

    L’autre approche qui a été utilisée est une approche d’upgrade. La -communication commence en mode non chiffré, puis le client demande l’upgrade de -la connexion vers le mode chiffré s’il le supporte, les deux machines -machines font un handshake SSL et la communication continue a travers le -tunnel SSL. Le service peut continuer a écouter sur son port habituel, et seuls -les clients capables de passer en SSL le feront, ce qui permet de faire la “mise -a jour” en douceur.

    -

    Il est souvent demandé quelle est la meilleure méthode pour mettre en place un -service – laisser un port pour le SSL et un pour le trafic non chiffré, ou bien -un seul, avec STARTTLS, qui upgrade les connexions si nécessaire.
    -La réponse est que STARTTLS est plus interessant, pour plusieurs raisons. Tout -d’abord, il permet de n’utiliser qu’un seul port : ça permet de simplifier la -configuration du firewall. En plus de ça, il permet aux clients “anciens” (ceux -qui ne supportent pas SSL, donc ceux qui devraient être changés) de toujours se -connecter, même si cela signifie que leurs informations seront transmises en -clair. Surtout, il permet d’éviter aux utilisateurs d’avoir a configurer leurs -clients. Si le client supporte le chiffrement, il l’activera de lui même s’il -voit qu’il est disponible.
    -Bref, mettez en place du STARTTLS, et pas du SSL. C’est mieux pour la sécurité -de tout le monde.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/update-et-pensees-a-propos-du-raspberry-pi/index.html b/output/posts/update-et-pensees-a-propos-du-raspberry-pi/index.html deleted file mode 100644 index c09842e..0000000 --- a/output/posts/update-et-pensees-a-propos-du-raspberry-pi/index.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - Update et pensées a propos du Raspberry Pi - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Update et pensées a propos du Raspberry Pi -

    -
    -
    -
    -
    - Date - - Sun 27 January 2013 - -
    - By - Wxcafe -
    - Category - Ranting -
    - - - - -
    -

    Bon.
    -J’ai annoncé il y a environ 20 jours que j’avais pour projet de faire -une Piratebox basée sur un Raspberry Pi, astucieusement nommée -PiRatBox. Il se trouve qu’après de nombreux essais, un problème -récurrent apparait: le Raspberry Pi n’est pas capable de fournir assez -de courant par défaut pour faire fonctionner a la fois un disque dur et -une antenne WiFi.
    -Alors, autant il me semble évident qu’avec une -alimentation provenant d’un port USB a 2A (max), je n’avais pas -énormément de chances d’avoir 2A sur chacun des ports host du Raspi, -autant avoir moins de 250 mA sur chacun de ces ports me semble un tout -petit peu exagéré en terme de rentabilité.

    -

    De même, le fait de ne pas pouvoir désactiver le port Ethernet (ne me -servant a rien) (vous savez, celui qui est monté en USB…), qui -consomme énormément, est assez louche. Il devrait toujours être possible -de désactiver une device USB, me semble-t-il, au niveau logiciel. La, -bien qu’il soit surement possible de la désactiver au niveau du kernel, -il n’est pas simplement possible de la “débrancher”. Ce qui est bien -chiant, étant donné le besoin évident de puissance électrique dans -lequel on se retrouve.

    -

    Bon, je dois avouer n’avoir pas testé de lancer les différents services -composant le système des piratebox sous arch, pour la simple et -bonne raison qu’arch utilise systemd et qu’il n’existe pas de wrapper -systemd pour les daemons piratebox, et que j’ai la flemme d’en faire, -parce que systemd est une horreur a utiliser avec les scripts init. Donc -non, j’utiliserai debian. Le problème d’utiliser debian dans ce cas -précis est que apt/dpkg a une gestion des dépendances dans un sens mais -pas dans l’autre, en ce sens que si on installe un package “haut”, c’est -a dire dépendant de plusieurs autres packages, apt/dpkg se charge -efficacement d’installer toutes les dépendances nécessaires, tandis que -si on désinstalle un package “bas”, c’est a dire sur lequel de nombreux -autres packages dépendent, apt/dpkg ne désinstalle pas ces packages -“hauts”, ce qui pose un vrai problème quand on se retrouve sur un -Raspberry Pi, puisqu’il n’y a pas de moyen “facile” de choisir ce qui -sera installé sur le système avant l’installation proprement dite -(puisque le moyen “universel” d’installation sur Raspberry Pi est le dd -vers la SD qui sert de disque système.)

    -

    Il y a énormément d’autres critiques que l’ont pourrait faire -concernant le Raspberry Pi. Son système de démarrage a s’arracher les -cheveux, par exemple. En effet, plutôt que de faire comme tout pc -normalement constitué ou la partie calcul démarre, lance le bootloader, -cherche le kernel de l’OS qui lui même se lance, initialise le hardware, -etc…, a un système bâtard du au fait que la puce au centre de la carte -est a la base une puce graphique a laquelle on a greffé un cœur de -calcul (probablement au fond d’une cour d’immeuble, dans les quartiers -pauvres de Bratislava, vu la propreté de la greffe…), et le moyen le -plus efficace qu’aient trouvé les personnes ayant implémenté cette -atrocité de gérer le boot est donc de faire démarrer le cœur graphique -en premier, ce dernier exécute un code propriétaire pour démarrer le -cœur de calcul, qui a son tour lance le bootloader qui cherche le kernel -etc…

    -

    Ce qui non seulement complique énormément le boot, non seulement ajoute -du code propriétaire a un projet se disant libre, mais en plus n’estvisiblement pas fait pour être utilisé de cette manière. Le hack, -oui, mais uniquement quand c’est bien réalisé, sinon je dis non.

    -

    Enfin, le projet que j’avais est toujours en cours de réalisation. Je -le terminerai dès que j’aurai récupéré les outils nécessaires pour -monter mon alimentation personnalisée pour le Raspberry Pi. Et une fois -que cela sera fait, ce Raspi restera une Piratebox pour le reste de sa -vie. Les problèmes qu’il m’a posé, qu’il n’aurait pas du me poser, m’ont -trop agacé pour que j’aie envie de le sortir et de jouer avec une fois -sa mission remplie.

    -

    Dommage.

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/posts/update/index.html b/output/posts/update/index.html deleted file mode 100644 index 03d9164..0000000 --- a/output/posts/update/index.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - Update - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -

    - Update -

    -
    -
    -
    -
    - Date - - Sat 05 January 2013 - -
    - By - Wxcafe -
    - Category - Note -
    - - - - -
    -

    Juste une petite note pour annoncer le prochain article, consacré a la -fabrication d’une PirateBox basée sur un Raspberry Pi. Voila, a bientôt -sur le blog!

    -
    -
    -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/tags.html b/output/tags.html deleted file mode 100644 index 4988969..0000000 --- a/output/tags.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - Wxcafé - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
      - -
    -
    - -
    -
    - -
    - - \ No newline at end of file diff --git a/output/theme/css/bootstrap-responsive.css b/output/theme/css/bootstrap-responsive.css deleted file mode 100644 index 09e88ce..0000000 --- a/output/theme/css/bootstrap-responsive.css +++ /dev/null @@ -1,1109 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -@-ms-viewport { - width: device-width; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.564102564102564%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.7624309392265194%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: none; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/output/theme/css/bootstrap.css b/output/theme/css/bootstrap.css deleted file mode 100644 index 8d6d244..0000000 --- a/output/theme/css/bootstrap.css +++ /dev/null @@ -1,6180 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -.summary { - font-family: Arial; - font-size: 16px; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover, -a:focus { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -a.muted:hover, -a.muted:focus { - color: #808080; -} - -.text-warning { - color: #c09853; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} - -.text-error { - color: #b94a48; -} - -a.text-error:hover, -a.text-error:focus { - color: #953b39; -} - -.text-info { - color: #3a87ad; -} - -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} - -.text-success { - color: #468847; -} - -a.text-success:hover, -a.text-success:focus { - color: #356635; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 38.5px; -} - -h2 { - font-size: 31.5px; -} - -h3 { - font-size: 24.5px; -} - -h4 { - font-size: 17.5px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11.9px; -} - -h1 small { - font-size: 24.5px; -} - -h2 small { - font-size: 17.5px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - padding-right: 5px; - padding-left: 5px; - *zoom: 1; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Liberation Mono, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.article > h1 { - font-family : Oswald, Helvetica Neue, Helvetica, Arial, sans-serif; -} - -code { - padding: 2px 4px; - color: #d14; - white-space: nowrap; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #121212; - border: 1px solid #212121; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; -<<<<<<< HEAD - color: #f8f8f2; -======= - color: inherit; ->>>>>>> origin/master - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555555; - vertical-align: middle; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} - -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table tbody tr.success > td { - background-color: #dff0d8; -} - -.table tbody tr.error > td { - background-color: #f2dede; -} - -.table tbody tr.warning > td { - background-color: #fcf8e3; -} - -.table tbody tr.info > td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover > td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/focus/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:focus > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > li > a:focus > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:focus > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"], -.dropdown-submenu:focus > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - width: 16px; - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 12px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -moz-linear-gradient(top, #444444, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover, -.btn-link:focus { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 10.5px; -} - -.btn-group > .btn-small { - font-size: 11.9px; -} - -.btn-group > .btn-large { - font-size: 17.5px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert, -.alert h4 { - color: #c09853; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success h4 { - color: #468847; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger h4, -.alert-error h4 { - color: #b94a48; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info h4 { - color: #3a87ad; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777777; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover, -.navbar-link:focus { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #ffffff; -} - -.navbar-inverse .brand { - color: #999999; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-topleft: 3px; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-bottomright: 3px; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-title:empty { - display: none; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.677px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding-right: 9px; - padding-left: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} - -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} - -.carousel-indicators .active { - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit li { - line-height: 30px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/output/theme/css/extra.css b/output/theme/css/extra.css deleted file mode 100644 index d3460d2..0000000 --- a/output/theme/css/extra.css +++ /dev/null @@ -1,7 +0,0 @@ -pre { - color: #ededdd !important; -} - -body { - font-size: 16px; -} diff --git a/output/theme/css/font-awesome.css b/output/theme/css/font-awesome.css deleted file mode 100644 index db4fd90..0000000 --- a/output/theme/css/font-awesome.css +++ /dev/null @@ -1,1268 +0,0 @@ -/*! - * Font Awesome 3.1.0 - * the iconic font designed for Bootstrap - * ------------------------------------------------------- - * The full suite of pictographic icons, examples, and documentation - * can be found at: http://fontawesome.io - * - * License - * ------------------------------------------------------- - * - The Font Awesome font is licensed under the SIL Open Font License v1.1 - - * http://scripts.sil.org/OFL - * - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License - - * http://opensource.org/licenses/mit-license.html - * - Font Awesome documentation licensed under CC BY 3.0 License - - * http://creativecommons.org/licenses/by/3.0/ - * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: - * "Font Awesome by Dave Gandy - http://fontawesome.io" - - * Contact - * ------------------------------------------------------- - * Email: dave@fontawesome.io - * Twitter: http://twitter.com/fortaweso_me - * Work: Lead Product Designer @ http://kyruus.com - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../font/fontawesome-webfont.eot?v=3.1.0'); - src: url('../font/fontawesome-webfont.eot?#iefix&v=3.1.0') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.1.0') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.1.0') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.1.0') format('svg'); - font-weight: normal; - font-style: normal; -} -/* FONT AWESOME CORE - * -------------------------- */ -[class^="icon-"], -[class*=" icon-"] { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - text-decoration: inherit; - -webkit-font-smoothing: antialiased; - *margin-right: .3em; -} -[class^="icon-"]:before, -[class*=" icon-"]:before { - text-decoration: inherit; - display: inline-block; - speak: none; -} -/* makes the font 33% larger relative to the icon container */ -.icon-large:before { - vertical-align: -10%; - font-size: 1.3333333333333333em; -} -/* makes sure icons active on rollover in links */ -a [class^="icon-"], -a [class*=" icon-"], -a [class^="icon-"]:before, -a [class*=" icon-"]:before { - display: inline; -} -/* increased font size for icon-large */ -[class^="icon-"].icon-fixed-width, -[class*=" icon-"].icon-fixed-width { - display: inline-block; - width: 1.2857142857142858em; - text-align: center; -} -[class^="icon-"].icon-fixed-width.icon-large, -[class*=" icon-"].icon-fixed-width.icon-large { - width: 1.5714285714285714em; -} -ul.icons-ul { - list-style-type: none; - text-indent: -0.7142857142857143em; - margin-left: 2.142857142857143em; -} -ul.icons-ul > li .icon-li { - width: 0.7142857142857143em; - display: inline-block; - text-align: center; -} -[class^="icon-"].hide, -[class*=" icon-"].hide { - display: none; -} -.icon-muted { - color: #eeeeee; -} -.icon-light { - color: #ffffff; -} -.icon-dark { - color: #333333; -} -.icon-border { - border: solid 1px #eeeeee; - padding: .2em .25em .15em; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.icon-2x { - font-size: 2em; -} -.icon-2x.icon-border { - border-width: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.icon-3x { - font-size: 3em; -} -.icon-3x.icon-border { - border-width: 3px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.icon-4x { - font-size: 4em; -} -.icon-4x.icon-border { - border-width: 4px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.icon-5x { - font-size: 5em; -} -.icon-5x.icon-border { - border-width: 5px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - border-radius: 7px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -[class^="icon-"].pull-left, -[class*=" icon-"].pull-left { - margin-right: .3em; -} -[class^="icon-"].pull-right, -[class*=" icon-"].pull-right { - margin-left: .3em; -} -/* BOOTSTRAP SPECIFIC CLASSES - * -------------------------- */ -/* Bootstrap 2.0 sprites.less reset */ -[class^="icon-"], -[class*=" icon-"] { - display: inline; - width: auto; - height: auto; - line-height: normal; - vertical-align: baseline; - background-image: none; - background-position: 0% 0%; - background-repeat: repeat; - margin-top: 0; -} -/* more sprites.less reset */ -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"] { - background-image: none; -} -/* keeps Bootstrap styles with and without icons the same */ -.btn [class^="icon-"].icon-large, -.nav [class^="icon-"].icon-large, -.btn [class*=" icon-"].icon-large, -.nav [class*=" icon-"].icon-large { - line-height: .9em; -} -.btn [class^="icon-"].icon-spin, -.nav [class^="icon-"].icon-spin, -.btn [class*=" icon-"].icon-spin, -.nav [class*=" icon-"].icon-spin { - display: inline-block; -} -.nav-tabs [class^="icon-"], -.nav-pills [class^="icon-"], -.nav-tabs [class*=" icon-"], -.nav-pills [class*=" icon-"], -.nav-tabs [class^="icon-"].icon-large, -.nav-pills [class^="icon-"].icon-large, -.nav-tabs [class*=" icon-"].icon-large, -.nav-pills [class*=" icon-"].icon-large { - line-height: .9em; -} -.btn [class^="icon-"].pull-left.icon-2x, -.btn [class*=" icon-"].pull-left.icon-2x, -.btn [class^="icon-"].pull-right.icon-2x, -.btn [class*=" icon-"].pull-right.icon-2x { - margin-top: .18em; -} -.btn [class^="icon-"].icon-spin.icon-large, -.btn [class*=" icon-"].icon-spin.icon-large { - line-height: .8em; -} -.btn.btn-small [class^="icon-"].pull-left.icon-2x, -.btn.btn-small [class*=" icon-"].pull-left.icon-2x, -.btn.btn-small [class^="icon-"].pull-right.icon-2x, -.btn.btn-small [class*=" icon-"].pull-right.icon-2x { - margin-top: .25em; -} -.btn.btn-large [class^="icon-"], -.btn.btn-large [class*=" icon-"] { - margin-top: 0; -} -.btn.btn-large [class^="icon-"].pull-left.icon-2x, -.btn.btn-large [class*=" icon-"].pull-left.icon-2x, -.btn.btn-large [class^="icon-"].pull-right.icon-2x, -.btn.btn-large [class*=" icon-"].pull-right.icon-2x { - margin-top: .05em; -} -.btn.btn-large [class^="icon-"].pull-left.icon-2x, -.btn.btn-large [class*=" icon-"].pull-left.icon-2x { - margin-right: .2em; -} -.btn.btn-large [class^="icon-"].pull-right.icon-2x, -.btn.btn-large [class*=" icon-"].pull-right.icon-2x { - margin-left: .2em; -} -/* EXTRAS - * -------------------------- */ -/* Stacked and layered icon */ -.icon-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: -35%; -} -.icon-stack [class^="icon-"], -.icon-stack [class*=" icon-"] { - display: block; - text-align: center; - position: absolute; - width: 100%; - height: 100%; - font-size: 1em; - line-height: inherit; - *line-height: 2em; -} -.icon-stack .icon-stack-base { - font-size: 2em; - *line-height: 1em; -} -/* Animated rotating icon */ -.icon-spin { - display: inline-block; - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - -webkit-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; -} -@-moz-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(359deg); - } -} -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - } -} -@-o-keyframes spin { - 0% { - -o-transform: rotate(0deg); - } - 100% { - -o-transform: rotate(359deg); - } -} -@-ms-keyframes spin { - 0% { - -ms-transform: rotate(0deg); - } - 100% { - -ms-transform: rotate(359deg); - } -} -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(359deg); - } -} -/* Icon rotations and mirroring */ -.icon-rotate-90:before { - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -} -.icon-rotate-180:before { - -webkit-transform: rotate(180deg); - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -o-transform: rotate(180deg); - transform: rotate(180deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -} -.icon-rotate-270:before { - -webkit-transform: rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); - transform: rotate(270deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -} -.icon-flip-horizontal:before { - -webkit-transform: scale(-1, 1); - -moz-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - -o-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.icon-flip-vertical:before { - -webkit-transform: scale(1, -1); - -moz-transform: scale(1, -1); - -ms-transform: scale(1, -1); - -o-transform: scale(1, -1); - transform: scale(1, -1); -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.icon-glass:before { - content: "\f000"; -} -.icon-music:before { - content: "\f001"; -} -.icon-search:before { - content: "\f002"; -} -.icon-envelope:before { - content: "\f003"; -} -.icon-heart:before { - content: "\f004"; -} -.icon-star:before { - content: "\f005"; -} -.icon-star-empty:before { - content: "\f006"; -} -.icon-user:before { - content: "\f007"; -} -.icon-film:before { - content: "\f008"; -} -.icon-th-large:before { - content: "\f009"; -} -.icon-th:before { - content: "\f00a"; -} -.icon-th-list:before { - content: "\f00b"; -} -.icon-ok:before { - content: "\f00c"; -} -.icon-remove:before { - content: "\f00d"; -} -.icon-zoom-in:before { - content: "\f00e"; -} -.icon-zoom-out:before { - content: "\f010"; -} -.icon-off:before { - content: "\f011"; -} -.icon-signal:before { - content: "\f012"; -} -.icon-cog:before { - content: "\f013"; -} -.icon-trash:before { - content: "\f014"; -} -.icon-home:before { - content: "\f015"; -} -.icon-file:before { - content: "\f016"; -} -.icon-time:before { - content: "\f017"; -} -.icon-road:before { - content: "\f018"; -} -.icon-download-alt:before { - content: "\f019"; -} -.icon-download:before { - content: "\f01a"; -} -.icon-upload:before { - content: "\f01b"; -} -.icon-inbox:before { - content: "\f01c"; -} -.icon-play-circle:before { - content: "\f01d"; -} -.icon-repeat:before, -.icon-rotate-right:before { - content: "\f01e"; -} -/* F020 doesn't work in Safari. all shifted one down */ -.icon-refresh:before { - content: "\f021"; -} -.icon-list-alt:before { - content: "\f022"; -} -.icon-lock:before { - content: "\f023"; -} -.icon-flag:before { - content: "\f024"; -} -.icon-headphones:before { - content: "\f025"; -} -.icon-volume-off:before { - content: "\f026"; -} -.icon-volume-down:before { - content: "\f027"; -} -.icon-volume-up:before { - content: "\f028"; -} -.icon-qrcode:before { - content: "\f029"; -} -.icon-barcode:before { - content: "\f02a"; -} -.icon-tag:before { - content: "\f02b"; -} -.icon-tags:before { - content: "\f02c"; -} -.icon-book:before { - content: "\f02d"; -} -.icon-bookmark:before { - content: "\f02e"; -} -.icon-print:before { - content: "\f02f"; -} -.icon-camera:before { - content: "\f030"; -} -.icon-font:before { - content: "\f031"; -} -.icon-bold:before { - content: "\f032"; -} -.icon-italic:before { - content: "\f033"; -} -.icon-text-height:before { - content: "\f034"; -} -.icon-text-width:before { - content: "\f035"; -} -.icon-align-left:before { - content: "\f036"; -} -.icon-align-center:before { - content: "\f037"; -} -.icon-align-right:before { - content: "\f038"; -} -.icon-align-justify:before { - content: "\f039"; -} -.icon-list:before { - content: "\f03a"; -} -.icon-indent-left:before { - content: "\f03b"; -} -.icon-indent-right:before { - content: "\f03c"; -} -.icon-facetime-video:before { - content: "\f03d"; -} -.icon-picture:before { - content: "\f03e"; -} -.icon-pencil:before { - content: "\f040"; -} -.icon-map-marker:before { - content: "\f041"; -} -.icon-adjust:before { - content: "\f042"; -} -.icon-tint:before { - content: "\f043"; -} -.icon-edit:before { - content: "\f044"; -} -.icon-share:before { - content: "\f045"; -} -.icon-check:before { - content: "\f046"; -} -.icon-move:before { - content: "\f047"; -} -.icon-step-backward:before { - content: "\f048"; -} -.icon-fast-backward:before { - content: "\f049"; -} -.icon-backward:before { - content: "\f04a"; -} -.icon-play:before { - content: "\f04b"; -} -.icon-pause:before { - content: "\f04c"; -} -.icon-stop:before { - content: "\f04d"; -} -.icon-forward:before { - content: "\f04e"; -} -.icon-fast-forward:before { - content: "\f050"; -} -.icon-step-forward:before { - content: "\f051"; -} -.icon-eject:before { - content: "\f052"; -} -.icon-chevron-left:before { - content: "\f053"; -} -.icon-chevron-right:before { - content: "\f054"; -} -.icon-plus-sign:before { - content: "\f055"; -} -.icon-minus-sign:before { - content: "\f056"; -} -.icon-remove-sign:before { - content: "\f057"; -} -.icon-ok-sign:before { - content: "\f058"; -} -.icon-question-sign:before { - content: "\f059"; -} -.icon-info-sign:before { - content: "\f05a"; -} -.icon-screenshot:before { - content: "\f05b"; -} -.icon-remove-circle:before { - content: "\f05c"; -} -.icon-ok-circle:before { - content: "\f05d"; -} -.icon-ban-circle:before { - content: "\f05e"; -} -.icon-arrow-left:before { - content: "\f060"; -} -.icon-arrow-right:before { - content: "\f061"; -} -.icon-arrow-up:before { - content: "\f062"; -} -.icon-arrow-down:before { - content: "\f063"; -} -.icon-share-alt:before, -.icon-mail-forward:before { - content: "\f064"; -} -.icon-resize-full:before { - content: "\f065"; -} -.icon-resize-small:before { - content: "\f066"; -} -.icon-plus:before { - content: "\f067"; -} -.icon-minus:before { - content: "\f068"; -} -.icon-asterisk:before { - content: "\f069"; -} -.icon-exclamation-sign:before { - content: "\f06a"; -} -.icon-gift:before { - content: "\f06b"; -} -.icon-leaf:before { - content: "\f06c"; -} -.icon-fire:before { - content: "\f06d"; -} -.icon-eye-open:before { - content: "\f06e"; -} -.icon-eye-close:before { - content: "\f070"; -} -.icon-warning-sign:before { - content: "\f071"; -} -.icon-plane:before { - content: "\f072"; -} -.icon-calendar:before { - content: "\f073"; -} -.icon-random:before { - content: "\f074"; -} -.icon-comment:before { - content: "\f075"; -} -.icon-magnet:before { - content: "\f076"; -} -.icon-chevron-up:before { - content: "\f077"; -} -.icon-chevron-down:before { - content: "\f078"; -} -.icon-retweet:before { - content: "\f079"; -} -.icon-shopping-cart:before { - content: "\f07a"; -} -.icon-folder-close:before { - content: "\f07b"; -} -.icon-folder-open:before { - content: "\f07c"; -} -.icon-resize-vertical:before { - content: "\f07d"; -} -.icon-resize-horizontal:before { - content: "\f07e"; -} -.icon-bar-chart:before { - content: "\f080"; -} -.icon-twitter-sign:before { - content: "\f081"; -} -.icon-facebook-sign:before { - content: "\f082"; -} -.icon-camera-retro:before { - content: "\f083"; -} -.icon-key:before { - content: "\f084"; -} -.icon-cogs:before { - content: "\f085"; -} -.icon-comments:before { - content: "\f086"; -} -.icon-thumbs-up:before { - content: "\f087"; -} -.icon-thumbs-down:before { - content: "\f088"; -} -.icon-star-half:before { - content: "\f089"; -} -.icon-heart-empty:before { - content: "\f08a"; -} -.icon-signout:before { - content: "\f08b"; -} -.icon-linkedin-sign:before { - content: "\f08c"; -} -.icon-pushpin:before { - content: "\f08d"; -} -.icon-external-link:before { - content: "\f08e"; -} -.icon-signin:before { - content: "\f090"; -} -.icon-trophy:before { - content: "\f091"; -} -.icon-github-sign:before { - content: "\f092"; -} -.icon-upload-alt:before { - content: "\f093"; -} -.icon-lemon:before { - content: "\f094"; -} -.icon-phone:before { - content: "\f095"; -} -.icon-check-empty:before { - content: "\f096"; -} -.icon-bookmark-empty:before { - content: "\f097"; -} -.icon-phone-sign:before { - content: "\f098"; -} -.icon-twitter:before { - content: "\f099"; -} -.icon-facebook:before { - content: "\f09a"; -} -.icon-github:before { - content: "\f09b"; -} -.icon-unlock:before { - content: "\f09c"; -} -.icon-credit-card:before { - content: "\f09d"; -} -.icon-rss:before { - content: "\f09e"; -} -.icon-hdd:before { - content: "\f0a0"; -} -.icon-bullhorn:before { - content: "\f0a1"; -} -.icon-bell:before { - content: "\f0a2"; -} -.icon-certificate:before { - content: "\f0a3"; -} -.icon-hand-right:before { - content: "\f0a4"; -} -.icon-hand-left:before { - content: "\f0a5"; -} -.icon-hand-up:before { - content: "\f0a6"; -} -.icon-hand-down:before { - content: "\f0a7"; -} -.icon-circle-arrow-left:before { - content: "\f0a8"; -} -.icon-circle-arrow-right:before { - content: "\f0a9"; -} -.icon-circle-arrow-up:before { - content: "\f0aa"; -} -.icon-circle-arrow-down:before { - content: "\f0ab"; -} -.icon-globe:before { - content: "\f0ac"; -} -.icon-wrench:before { - content: "\f0ad"; -} -.icon-tasks:before { - content: "\f0ae"; -} -.icon-filter:before { - content: "\f0b0"; -} -.icon-briefcase:before { - content: "\f0b1"; -} -.icon-fullscreen:before { - content: "\f0b2"; -} -.icon-group:before { - content: "\f0c0"; -} -.icon-link:before { - content: "\f0c1"; -} -.icon-cloud:before { - content: "\f0c2"; -} -.icon-beaker:before { - content: "\f0c3"; -} -.icon-cut:before { - content: "\f0c4"; -} -.icon-copy:before { - content: "\f0c5"; -} -.icon-paper-clip:before { - content: "\f0c6"; -} -.icon-save:before { - content: "\f0c7"; -} -.icon-sign-blank:before { - content: "\f0c8"; -} -.icon-reorder:before { - content: "\f0c9"; -} -.icon-list-ul:before { - content: "\f0ca"; -} -.icon-list-ol:before { - content: "\f0cb"; -} -.icon-strikethrough:before { - content: "\f0cc"; -} -.icon-underline:before { - content: "\f0cd"; -} -.icon-table:before { - content: "\f0ce"; -} -.icon-magic:before { - content: "\f0d0"; -} -.icon-truck:before { - content: "\f0d1"; -} -.icon-pinterest:before { - content: "\f0d2"; -} -.icon-pinterest-sign:before { - content: "\f0d3"; -} -.icon-google-plus-sign:before { - content: "\f0d4"; -} -.icon-google-plus:before { - content: "\f0d5"; -} -.icon-money:before { - content: "\f0d6"; -} -.icon-caret-down:before { - content: "\f0d7"; -} -.icon-caret-up:before { - content: "\f0d8"; -} -.icon-caret-left:before { - content: "\f0d9"; -} -.icon-caret-right:before { - content: "\f0da"; -} -.icon-columns:before { - content: "\f0db"; -} -.icon-sort:before { - content: "\f0dc"; -} -.icon-sort-down:before { - content: "\f0dd"; -} -.icon-sort-up:before { - content: "\f0de"; -} -.icon-envelope-alt:before { - content: "\f0e0"; -} -.icon-linkedin:before { - content: "\f0e1"; -} -.icon-undo:before, -.icon-rotate-left:before { - content: "\f0e2"; -} -.icon-legal:before { - content: "\f0e3"; -} -.icon-dashboard:before { - content: "\f0e4"; -} -.icon-comment-alt:before { - content: "\f0e5"; -} -.icon-comments-alt:before { - content: "\f0e6"; -} -.icon-bolt:before { - content: "\f0e7"; -} -.icon-sitemap:before { - content: "\f0e8"; -} -.icon-umbrella:before { - content: "\f0e9"; -} -.icon-paste:before { - content: "\f0ea"; -} -.icon-lightbulb:before { - content: "\f0eb"; -} -.icon-exchange:before { - content: "\f0ec"; -} -.icon-cloud-download:before { - content: "\f0ed"; -} -.icon-cloud-upload:before { - content: "\f0ee"; -} -.icon-user-md:before { - content: "\f0f0"; -} -.icon-stethoscope:before { - content: "\f0f1"; -} -.icon-suitcase:before { - content: "\f0f2"; -} -.icon-bell-alt:before { - content: "\f0f3"; -} -.icon-coffee:before { - content: "\f0f4"; -} -.icon-food:before { - content: "\f0f5"; -} -.icon-file-alt:before { - content: "\f0f6"; -} -.icon-building:before { - content: "\f0f7"; -} -.icon-hospital:before { - content: "\f0f8"; -} -.icon-ambulance:before { - content: "\f0f9"; -} -.icon-medkit:before { - content: "\f0fa"; -} -.icon-fighter-jet:before { - content: "\f0fb"; -} -.icon-beer:before { - content: "\f0fc"; -} -.icon-h-sign:before { - content: "\f0fd"; -} -.icon-plus-sign-alt:before { - content: "\f0fe"; -} -.icon-double-angle-left:before { - content: "\f100"; -} -.icon-double-angle-right:before { - content: "\f101"; -} -.icon-double-angle-up:before { - content: "\f102"; -} -.icon-double-angle-down:before { - content: "\f103"; -} -.icon-angle-left:before { - content: "\f104"; -} -.icon-angle-right:before { - content: "\f105"; -} -.icon-angle-up:before { - content: "\f106"; -} -.icon-angle-down:before { - content: "\f107"; -} -.icon-desktop:before { - content: "\f108"; -} -.icon-laptop:before { - content: "\f109"; -} -.icon-tablet:before { - content: "\f10a"; -} -.icon-mobile-phone:before { - content: "\f10b"; -} -.icon-circle-blank:before { - content: "\f10c"; -} -.icon-quote-left:before { - content: "\f10d"; -} -.icon-quote-right:before { - content: "\f10e"; -} -.icon-spinner:before { - content: "\f110"; -} -.icon-circle:before { - content: "\f111"; -} -.icon-reply:before, -.icon-mail-reply:before { - content: "\f112"; -} -.icon-folder-close-alt:before { - content: "\f114"; -} -.icon-folder-open-alt:before { - content: "\f115"; -} -.icon-expand-alt:before { - content: "\f116"; -} -.icon-collapse-alt:before { - content: "\f117"; -} -.icon-smile:before { - content: "\f118"; -} -.icon-frown:before { - content: "\f119"; -} -.icon-meh:before { - content: "\f11a"; -} -.icon-gamepad:before { - content: "\f11b"; -} -.icon-keyboard:before { - content: "\f11c"; -} -.icon-flag-alt:before { - content: "\f11d"; -} -.icon-flag-checkered:before { - content: "\f11e"; -} -.icon-terminal:before { - content: "\f120"; -} -.icon-code:before { - content: "\f121"; -} -.icon-reply-all:before { - content: "\f122"; -} -.icon-mail-reply-all:before { - content: "\f122"; -} -.icon-star-half-full:before, -.icon-star-half-empty:before { - content: "\f123"; -} -.icon-location-arrow:before { - content: "\f124"; -} -.icon-crop:before { - content: "\f125"; -} -.icon-code-fork:before { - content: "\f126"; -} -.icon-unlink:before { - content: "\f127"; -} -.icon-question:before { - content: "\f128"; -} -.icon-info:before { - content: "\f129"; -} -.icon-exclamation:before { - content: "\f12a"; -} -.icon-superscript:before { - content: "\f12b"; -} -.icon-subscript:before { - content: "\f12c"; -} -.icon-eraser:before { - content: "\f12d"; -} -.icon-puzzle-piece:before { - content: "\f12e"; -} -.icon-microphone:before { - content: "\f130"; -} -.icon-microphone-off:before { - content: "\f131"; -} -.icon-shield:before { - content: "\f132"; -} -.icon-calendar-empty:before { - content: "\f133"; -} -.icon-fire-extinguisher:before { - content: "\f134"; -} -.icon-rocket:before { - content: "\f135"; -} -.icon-maxcdn:before { - content: "\f136"; -} -.icon-chevron-sign-left:before { - content: "\f137"; -} -.icon-chevron-sign-right:before { - content: "\f138"; -} -.icon-chevron-sign-up:before { - content: "\f139"; -} -.icon-chevron-sign-down:before { - content: "\f13a"; -} -.icon-html5:before { - content: "\f13b"; -} -.icon-css3:before { - content: "\f13c"; -} -.icon-anchor:before { - content: "\f13d"; -} -.icon-unlock-alt:before { - content: "\f13e"; -} -.icon-bullseye:before { - content: "\f140"; -} -.icon-ellipsis-horizontal:before { - content: "\f141"; -} -.icon-ellipsis-vertical:before { - content: "\f142"; -} -.icon-rss-sign:before { - content: "\f143"; -} -.icon-play-sign:before { - content: "\f144"; -} -.icon-ticket:before { - content: "\f145"; -} -.icon-minus-sign-alt:before { - content: "\f146"; -} -.icon-check-minus:before { - content: "\f147"; -} -.icon-level-up:before { - content: "\f148"; -} -.icon-level-down:before { - content: "\f149"; -} -.icon-check-sign:before { - content: "\f14a"; -} -.icon-edit-sign:before { - content: "\f14b"; -} -.icon-external-link-sign:before { - content: "\f14c"; -} -.icon-share-sign:before { - content: "\f14d"; -} diff --git a/output/theme/css/pygments.css b/output/theme/css/pygments.css deleted file mode 100644 index cad0533..0000000 --- a/output/theme/css/pygments.css +++ /dev/null @@ -1,70 +0,0 @@ -.highlight .hll { background-color: #ffffcc } -.highlight { background: #1B1D1E; color: #F8F8F2; background-color: #1B1D1E } -.highlight .c { color: #7E8E91; background-color: #1B1D1E } /* Comment */ -.highlight .err { color: #F8F8F2; background-color: #1B1D1E } /* Error */ -.highlight .g { color: #F8F8F2; background-color: #1B1D1E } /* Generic */ -.highlight .k { color: #F92672; font-weight: bold; background-color: #1B1D1E } /* Keyword */ -.highlight .l { color: #F8F8F2; background-color: #1B1D1E } /* Literal */ -.highlight .n { color: #F8F8F2; background-color: #1B1D1E } /* Name */ -.highlight .o { color: #F8F8F2; background-color: #1B1D1E } /* Operator */ -.highlight .x { color: #F8F8F2; background-color: #1B1D1E } /* Other */ -.highlight .p { color: #F8F8F2; background-color: #1B1D1E } /* Punctuation */ -.highlight .cm { color: #7E8E91; background-color: #1B1D1E } /* Comment.Multiline */ -.highlight .cp { color: #A6E22E; background-color: #1B1D1E } /* Comment.Preproc */ -.highlight .c1 { color: #7E8E91; background-color: #1B1D1E } /* Comment.Single */ -.highlight .cs { color: #7E8E91; background-color: #1B1D1E } /* Comment.Special */ -.highlight .gd { color: #960050; background-color: #1E0010 } /* Generic.Deleted */ -.highlight .ge { color: #808080; text-decoration: underline; background-color: #1B1D1E } /* Generic.Emph */ -.highlight .gr { color: #960050; background-color: #1E0010 } /* Generic.Error */ -.highlight .gh { color: #ef5939; background-color: #1B1D1E } /* Generic.Heading */ -.highlight .gi { color: #F8F8F2; background-color: #13354A } /* Generic.Inserted */ -.highlight .go { color: #465457; background-color: #1B1D1E } /* Generic.Output */ -.highlight .gp { color: #F8F8F2; background-color: #1B1D1E } /* Generic.Prompt */ -.highlight .gs { color: #F8F8F2; background-color: #1B1D1E } /* Generic.Strong */ -.highlight .gu { color: #ef5939; background-color: #1B1D1E } /* Generic.Subheading */ -.highlight .gt { color: #F92672; font-weight: bold; background-color: #232526 } /* Generic.Traceback */ -.highlight .kc { color: #F92672; font-weight: bold; background-color: #1B1D1E } /* Keyword.Constant */ -.highlight .kd { color: #F92672; font-weight: bold; background-color: #1B1D1E } /* Keyword.Declaration */ -.highlight .kn { color: #F92672; font-weight: bold; background-color: #1B1D1E } /* Keyword.Namespace */ -.highlight .kp { color: #F92672; font-weight: bold; background-color: #1B1D1E } /* Keyword.Pseudo */ -.highlight .kr { color: #F92672; font-weight: bold; background-color: #1B1D1E } /* Keyword.Reserved */ -.highlight .kt { color: #66D9EF; background-color: #1B1D1E } /* Keyword.Type */ -.highlight .ld { color: #F8F8F2; background-color: #1B1D1E } /* Literal.Date */ -.highlight .m { color: #AE81FF; background-color: #1B1D1E } /* Literal.Number */ -.highlight .s { color: #E6DB74; background-color: #1B1D1E } /* Literal.String */ -.highlight .na { color: #A6E22E; background-color: #1B1D1E } /* Name.Attribute */ -.highlight .nb { color: #F8F8F2; background-color: #1B1D1E } /* Name.Builtin */ -.highlight .nc { color: #F8F8F2; background-color: #1B1D1E } /* Name.Class */ -.highlight .no { color: #AE81FF; font-weight: bold; background-color: #1B1D1E } /* Name.Constant */ -.highlight .nd { color: #F8F8F2; background-color: #1B1D1E } /* Name.Decorator */ -.highlight .ni { color: #66D9EF; font-style: italic; background-color: #1B1D1E } /* Name.Entity */ -.highlight .ne { color: #A6E22E; font-weight: bold; background-color: #1B1D1E } /* Name.Exception */ -.highlight .nf { color: #A6E22E; background-color: #1B1D1E } /* Name.Function */ -.highlight .nl { color: #E6DB74; background-color: #1B1D1E } /* Name.Label */ -.highlight .nn { color: #F8F8F2; background-color: #1B1D1E } /* Name.Namespace */ -.highlight .nx { color: #F8F8F2; background-color: #1B1D1E } /* Name.Other */ -.highlight .py { color: #F8F8F2; background-color: #1B1D1E } /* Name.Property */ -.highlight .nt { color: #F92672; font-weight: bold; background-color: #1B1D1E } /* Name.Tag */ -.highlight .nv { color: #FD971F; background-color: #1B1D1E } /* Name.Variable */ -.highlight .ow { color: #F92672; background-color: #1B1D1E } /* Operator.Word */ -.highlight .w { color: #F8F8F2; background-color: #1B1D1E } /* Text.Whitespace */ -.highlight .mf { color: #AE81FF; background-color: #1B1D1E } /* Literal.Number.Float */ -.highlight .mh { color: #AE81FF; background-color: #1B1D1E } /* Literal.Number.Hex */ -.highlight .mi { color: #AE81FF; background-color: #1B1D1E } /* Literal.Number.Integer */ -.highlight .mo { color: #AE81FF; background-color: #1B1D1E } /* Literal.Number.Oct */ -.highlight .sb { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Backtick */ -.highlight .sc { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Char */ -.highlight .sd { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Doc */ -.highlight .s2 { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Double */ -.highlight .se { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Escape */ -.highlight .sh { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Heredoc */ -.highlight .si { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Interpol */ -.highlight .sx { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Other */ -.highlight .sr { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Regex */ -.highlight .s1 { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Single */ -.highlight .ss { color: #E6DB74; background-color: #1B1D1E } /* Literal.String.Symbol */ -.highlight .bp { color: #F8F8F2; background-color: #1B1D1E } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #FD971F; background-color: #1B1D1E } /* Name.Variable.Class */ -.highlight .vg { color: #FD971F; background-color: #1B1D1E } /* Name.Variable.Global */ -.highlight .vi { color: #FD971F; background-color: #1B1D1E } /* Name.Variable.Instance */ -.highlight .il { color: #AE81FF; background-color: #1B1D1E } /* Literal.Number.Integer.Long */ diff --git a/output/theme/css/pygments.css.bak b/output/theme/css/pygments.css.bak deleted file mode 100644 index 7deb905..0000000 --- a/output/theme/css/pygments.css.bak +++ /dev/null @@ -1,70 +0,0 @@ -.highlight .hll { background-color: #ffffcc } -.highlight { background: #121212; color: #F8F8F2; background-color: #121212 } -.highlight .c { color: #7E8E91; background-color: #121212 } /* Comment */ -.highlight .err { color: #F8F8F2; background-color: #121212 } /* Error */ -.highlight .g { color: #F8F8F2; background-color: #121212 } /* Generic */ -.highlight .k { color: #F92672; font-weight: bold; background-color: #121212 } /* Keyword */ -.highlight .l { color: #F8F8F2; background-color: #121212 } /* Literal */ -.highlight .n { color: #F8F8F2; background-color: #121212 } /* Name */ -.highlight .o { color: #F8F8F2; background-color: #121212 } /* Operator */ -.highlight .x { color: #F8F8F2; background-color: #121212 } /* Other */ -.highlight .p { color: #F8F8F2; background-color: #121212 } /* Punctuation */ -.highlight .cm { color: #7E8E91; background-color: #121212 } /* Comment.Multiline */ -.highlight .cp { color: #A6E22E; background-color: #121212 } /* Comment.Preproc */ -.highlight .c1 { color: #7E8E91; background-color: #121212 } /* Comment.Single */ -.highlight .cs { color: #7E8E91; background-color: #121212 } /* Comment.Special */ -.highlight .gd { color: #960050; background-color: #1E0010 } /* Generic.Deleted */ -.highlight .ge { color: #808080; text-decoration: underline; background-color: #121212 } /* Generic.Emph */ -.highlight .gr { color: #960050; background-color: #1E0010 } /* Generic.Error */ -.highlight .gh { color: #ef5939; background-color: #121212 } /* Generic.Heading */ -.highlight .gi { color: #F8F8F2; background-color: #13354A } /* Generic.Inserted */ -.highlight .go { color: #465457; background-color: #121212 } /* Generic.Output */ -.highlight .gp { color: #F8F8F2; background-color: #121212 } /* Generic.Prompt */ -.highlight .gs { color: #F8F8F2; background-color: #121212 } /* Generic.Strong */ -.highlight .gu { color: #ef5939; background-color: #121212 } /* Generic.Subheading */ -.highlight .gt { color: #F92672; font-weight: bold; background-color: #232526 } /* Generic.Traceback */ -.highlight .kc { color: #F92672; font-weight: bold; background-color: #121212 } /* Keyword.Constant */ -.highlight .kd { color: #F92672; font-weight: bold; background-color: #121212 } /* Keyword.Declaration */ -.highlight .kn { color: #F92672; font-weight: bold; background-color: #121212 } /* Keyword.Namespace */ -.highlight .kp { color: #F92672; font-weight: bold; background-color: #121212 } /* Keyword.Pseudo */ -.highlight .kr { color: #F92672; font-weight: bold; background-color: #121212 } /* Keyword.Reserved */ -.highlight .kt { color: #66D9EF; background-color: #121212 } /* Keyword.Type */ -.highlight .ld { color: #F8F8F2; background-color: #121212 } /* Literal.Date */ -.highlight .m { color: #AE81FF; background-color: #121212 } /* Literal.Number */ -.highlight .s { color: #E6DB74; background-color: #121212 } /* Literal.String */ -.highlight .na { color: #A6E22E; background-color: #121212 } /* Name.Attribute */ -.highlight .nb { color: #F8F8F2; background-color: #121212 } /* Name.Builtin */ -.highlight .nc { color: #F8F8F2; background-color: #121212 } /* Name.Class */ -.highlight .no { color: #AE81FF; font-weight: bold; background-color: #121212 } /* Name.Constant */ -.highlight .nd { color: #F8F8F2; background-color: #121212 } /* Name.Decorator */ -.highlight .ni { color: #66D9EF; font-style: italic; background-color: #121212 } /* Name.Entity */ -.highlight .ne { color: #A6E22E; font-weight: bold; background-color: #121212 } /* Name.Exception */ -.highlight .nf { color: #A6E22E; background-color: #121212 } /* Name.Function */ -.highlight .nl { color: #E6DB74; background-color: #121212 } /* Name.Label */ -.highlight .nn { color: #F8F8F2; background-color: #121212 } /* Name.Namespace */ -.highlight .nx { color: #F8F8F2; background-color: #121212 } /* Name.Other */ -.highlight .py { color: #F8F8F2; background-color: #121212 } /* Name.Property */ -.highlight .nt { color: #F92672; font-weight: bold; background-color: #121212 } /* Name.Tag */ -.highlight .nv { color: #FD971F; background-color: #121212 } /* Name.Variable */ -.highlight .ow { color: #F92672; background-color: #121212 } /* Operator.Word */ -.highlight .w { color: #F8F8F2; background-color: #121212 } /* Text.Whitespace */ -.highlight .mf { color: #AE81FF; background-color: #121212 } /* Literal.Number.Float */ -.highlight .mh { color: #AE81FF; background-color: #121212 } /* Literal.Number.Hex */ -.highlight .mi { color: #AE81FF; background-color: #121212 } /* Literal.Number.Integer */ -.highlight .mo { color: #AE81FF; background-color: #121212 } /* Literal.Number.Oct */ -.highlight .sb { color: #E6DB74; background-color: #121212 } /* Literal.String.Backtick */ -.highlight .sc { color: #E6DB74; background-color: #121212 } /* Literal.String.Char */ -.highlight .sd { color: #E6DB74; background-color: #121212 } /* Literal.String.Doc */ -.highlight .s2 { color: #E6DB74; background-color: #121212 } /* Literal.String.Double */ -.highlight .se { color: #E6DB74; background-color: #121212 } /* Literal.String.Escape */ -.highlight .sh { color: #E6DB74; background-color: #121212 } /* Literal.String.Heredoc */ -.highlight .si { color: #E6DB74; background-color: #121212 } /* Literal.String.Interpol */ -.highlight .sx { color: #E6DB74; background-color: #121212 } /* Literal.String.Other */ -.highlight .sr { color: #E6DB74; background-color: #121212 } /* Literal.String.Regex */ -.highlight .s1 { color: #E6DB74; background-color: #121212 } /* Literal.String.Single */ -.highlight .ss { color: #E6DB74; background-color: #121212 } /* Literal.String.Symbol */ -.highlight .bp { color: #F8F8F2; background-color: #121212 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #FD971F; background-color: #121212 } /* Name.Variable.Class */ -.highlight .vg { color: #FD971F; background-color: #121212 } /* Name.Variable.Global */ -.highlight .vi { color: #FD971F; background-color: #121212 } /* Name.Variable.Instance */ -.highlight .il { color: #AE81FF; background-color: #121212 } /* Literal.Number.Integer.Long */ diff --git a/output/theme/font/FontAwesome.otf b/output/theme/font/FontAwesome.otf deleted file mode 100644 index 7012545..0000000 Binary files a/output/theme/font/FontAwesome.otf and /dev/null differ diff --git a/output/theme/font/font-awesome-ie7.css b/output/theme/font/font-awesome-ie7.css deleted file mode 100644 index 645ff1e..0000000 --- a/output/theme/font/font-awesome-ie7.css +++ /dev/null @@ -1,1197 +0,0 @@ -/*! - * Font Awesome 3.2.0 - * the iconic font designed for Bootstrap - * ------------------------------------------------------------------------------ - * The full suite of pictographic icons, examples, and documentation can be - * found at http://fontawesome.io. Stay up to date on Twitter at - * http://twitter.com/fontawesome. - * - * License - * ------------------------------------------------------------------------------ - * - The Font Awesome font is licensed under SIL OFL 1.1 - - * http://scripts.sil.org/OFL - * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - - * http://opensource.org/licenses/mit-license.html - * - Font Awesome documentation licensed under CC BY 3.0 - - * http://creativecommons.org/licenses/by/3.0/ - * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: - * "Font Awesome by Dave Gandy - http://fontawesome.io" - * - * Author - Dave Gandy - * ------------------------------------------------------------------------------ - * Email: dave@fontawesome.io - * Twitter: http://twitter.com/byscuits - * Work: Lead Product Designer @ Kyruus - http://kyruus.com - */ -.icon-large { - font-size: 1.3333333333333333em; - margin-top: -4px; - padding-top: 3px; - margin-bottom: -4px; - padding-bottom: 3px; - vertical-align: middle; -} -.nav [class^="icon-"], -.nav [class*=" icon-"] { - vertical-align: inherit; - margin-top: -4px; - padding-top: 3px; - margin-bottom: -4px; - padding-bottom: 3px; -} -.nav [class^="icon-"].icon-large, -.nav [class*=" icon-"].icon-large { - vertical-align: -25%; -} -.nav-pills [class^="icon-"].icon-large, -.nav-tabs [class^="icon-"].icon-large, -.nav-pills [class*=" icon-"].icon-large, -.nav-tabs [class*=" icon-"].icon-large { - line-height: .75em; - margin-top: -7px; - padding-top: 5px; - margin-bottom: -5px; - padding-bottom: 4px; -} -.btn [class^="icon-"].pull-left, -.btn [class*=" icon-"].pull-left, -.btn [class^="icon-"].pull-right, -.btn [class*=" icon-"].pull-right { - vertical-align: inherit; -} -.btn [class^="icon-"].icon-large, -.btn [class*=" icon-"].icon-large { - margin-top: -0.5em; -} -a [class^="icon-"], -a [class*=" icon-"] { - cursor: pointer; -} -.icon-glass { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-music { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-search { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-envelope-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-heart { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-star { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-star-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-user { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-film { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-th-large { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-th { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-th-list { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ok { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-remove { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-zoom-in { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-zoom-out { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-off { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-power-off { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-signal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-cog { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-trash { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-home { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-file-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-time { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-road { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-download-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-download { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-upload { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-inbox { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-play-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-repeat { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-rotate-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-refresh { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-list-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-lock { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-flag { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-headphones { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-volume-off { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-volume-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-volume-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-qrcode { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-barcode { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-tag { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-tags { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-book { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bookmark { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-print { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-camera { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-font { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bold { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-italic { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-text-height { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-text-width { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-align-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-align-center { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-align-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-align-justify { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-list { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-indent-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-indent-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-facetime-video { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-picture { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-pencil { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-map-marker { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-adjust { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-tint { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-edit { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-share { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-check { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-move { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-step-backward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-fast-backward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-backward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-play { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-pause { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-stop { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-forward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-fast-forward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-step-forward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-eject { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-plus-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-minus-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-remove-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ok-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-question-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-info-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-screenshot { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-remove-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ok-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ban-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-arrow-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-arrow-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-arrow-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-arrow-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-share-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-mail-forward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-resize-full { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-resize-small { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-plus { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-minus { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-asterisk { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-exclamation-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-gift { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-leaf { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-fire { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-eye-open { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-eye-close { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-warning-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-plane { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-calendar { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-random { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-comment { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-magnet { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-retweet { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-shopping-cart { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-folder-close { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-folder-open { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-resize-vertical { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-resize-horizontal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bar-chart { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-twitter-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-facebook-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-camera-retro { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-key { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-cogs { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-comments { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-thumbs-up-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-thumbs-down-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-star-half { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-heart-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-signout { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-linkedin-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-pushpin { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-external-link { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-signin { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-trophy { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-github-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-upload-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-lemon { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-phone { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-check-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-unchecked { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bookmark-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-phone-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-twitter { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-facebook { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-github { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-unlock { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-credit-card { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-rss { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-hdd { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bullhorn { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bell { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-certificate { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-hand-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-hand-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-hand-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-hand-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-circle-arrow-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-circle-arrow-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-circle-arrow-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-circle-arrow-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-globe { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-wrench { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-tasks { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-filter { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-briefcase { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-fullscreen { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-group { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-link { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-cloud { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-beaker { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-cut { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-copy { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-paper-clip { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-paperclip { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-save { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sign-blank { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-reorder { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-list-ul { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-list-ol { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-strikethrough { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-underline { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-table { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-magic { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-truck { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-pinterest { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-pinterest-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-google-plus-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-google-plus { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-money { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-caret-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-caret-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-caret-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-caret-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-columns { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-envelope { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-linkedin { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-undo { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-rotate-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-legal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-dashboard { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-comment-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-comments-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bolt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sitemap { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-umbrella { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-paste { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-lightbulb { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-exchange { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-cloud-download { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-cloud-upload { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-user-md { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-stethoscope { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-suitcase { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bell-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-coffee { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-food { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-file-text-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-building { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-hospital { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ambulance { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-medkit { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-fighter-jet { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-beer { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-h-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-plus-sign-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-double-angle-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-double-angle-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-double-angle-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-double-angle-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-angle-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-angle-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-angle-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-angle-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-desktop { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-laptop { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-tablet { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-mobile-phone { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-circle-blank { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-quote-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-quote-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-spinner { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-reply { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-mail-reply { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-github-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-folder-close-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-folder-open-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-expand-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-collapse-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-smile { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-frown { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-meh { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-gamepad { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-keyboard { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-flag-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-flag-checkered { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-terminal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-code { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-reply-all { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-mail-reply-all { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-star-half-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-star-half-full { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-location-arrow { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-crop { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-code-fork { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-unlink { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-question { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-info { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-exclamation { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-superscript { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-subscript { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-eraser { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-puzzle-piece { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-microphone { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-microphone-off { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-shield { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-calendar-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-fire-extinguisher { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-rocket { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-maxcdn { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-sign-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-sign-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-sign-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-chevron-sign-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-html5 { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-css3 { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-anchor { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-unlock-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bullseye { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ellipsis-horizontal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ellipsis-vertical { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-rss-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-play-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-ticket { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-minus-sign-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-check-minus { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-level-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-level-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-check-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-edit-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-external-link-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-share-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-compass { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-collapse { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-collapse-top { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-expand { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-eur { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-euro { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-gbp { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-usd { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-dollar { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-inr { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-rupee { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-jpy { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-yen { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-cny { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-renminbi { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-krw { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-won { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-btc { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bitcoin { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-file { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-file-text { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-by-alphabet { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-by-alphabet-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-by-attributes { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-by-attributes-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-by-order { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sort-by-order-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-thumbs-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-thumbs-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-youtube-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-youtube { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-xing { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-xing-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-youtube-play { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-dropbox { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-stackexchange { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-instagram { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-flickr { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-adn { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bitbucket { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bitbucket-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-tumblr { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-tumblr-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-long-arrow-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-long-arrow-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-long-arrow-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-long-arrow-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-apple { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-windows { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-android { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-linux { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-dribble { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-skype { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-foursquare { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-trello { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-female { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-male { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-gittip { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-sun { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-moon { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-archive { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-bug { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-vk { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-weibo { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} -.icon-renren { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); -} diff --git a/output/theme/font/font-awesome-ie7.min.css b/output/theme/font/font-awesome-ie7.min.css deleted file mode 100644 index 13410b2..0000000 --- a/output/theme/font/font-awesome-ie7.min.css +++ /dev/null @@ -1,382 +0,0 @@ -.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;} -.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;} -.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;} -.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;} -.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;} -a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;} -.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dribble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} diff --git a/output/theme/font/font-awesome.css b/output/theme/font/font-awesome.css deleted file mode 100644 index f9d4aa3..0000000 --- a/output/theme/font/font-awesome.css +++ /dev/null @@ -1,1471 +0,0 @@ -/*! - * Font Awesome 3.2.0 - * the iconic font designed for Bootstrap - * ------------------------------------------------------------------------------ - * The full suite of pictographic icons, examples, and documentation can be - * found at http://fontawesome.io. Stay up to date on Twitter at - * http://twitter.com/fontawesome. - * - * License - * ------------------------------------------------------------------------------ - * - The Font Awesome font is licensed under SIL OFL 1.1 - - * http://scripts.sil.org/OFL - * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - - * http://opensource.org/licenses/mit-license.html - * - Font Awesome documentation licensed under CC BY 3.0 - - * http://creativecommons.org/licenses/by/3.0/ - * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: - * "Font Awesome by Dave Gandy - http://fontawesome.io" - * - * Author - Dave Gandy - * ------------------------------------------------------------------------------ - * Email: dave@fontawesome.io - * Twitter: http://twitter.com/byscuits - * Work: Lead Product Designer @ Kyruus - http://kyruus.com - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../font/fontawesome-webfont.eot?v=3.2.0'); - src: url('../font/fontawesome-webfont.eot?#iefix&v=3.2.0') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.2.0') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.2.0') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.0') format('svg'); - font-weight: normal; - font-style: normal; -} -/* FONT AWESOME CORE - * -------------------------- */ -[class^="icon-"], -[class*=" icon-"] { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - text-decoration: inherit; - -webkit-font-smoothing: antialiased; - *margin-right: .3em; -} -[class^="icon-"]:before, -[class*=" icon-"]:before { - text-decoration: inherit; - display: inline-block; - cursor: default; - speak: none; -} -/* makes the font 33% larger relative to the icon container */ -.icon-large:before { - vertical-align: -10%; - font-size: 1.3333333333333333em; -} -/* makes sure icons active on rollover in links */ -a [class^="icon-"], -a [class*=" icon-"] { - display: inline; -} -/* increased font size for icon-large */ -[class^="icon-"].icon-fixed-width, -[class*=" icon-"].icon-fixed-width { - display: inline-block; - width: 1.1428571428571428em; - text-align: right; - padding-right: 0.2857142857142857em; -} -[class^="icon-"].icon-fixed-width.icon-large, -[class*=" icon-"].icon-fixed-width.icon-large { - width: 1.4285714285714286em; -} -.icons-ul { - margin-left: 2.142857142857143em; - list-style-type: none; -} -.icons-ul > li { - position: relative; -} -.icons-ul .icon-li { - position: absolute; - left: -2.142857142857143em; - width: 2.142857142857143em; - text-align: center; - line-height: inherit; -} -[class^="icon-"].hide, -[class*=" icon-"].hide { - display: none; -} -.icon-muted { - color: #eeeeee; -} -.icon-light { - color: #ffffff; -} -.icon-dark { - color: #333333; -} -.icon-border { - border: solid 1px #eeeeee; - padding: .2em .25em .15em; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.icon-2x { - font-size: 2em; -} -.icon-2x.icon-border { - border-width: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.icon-3x { - font-size: 3em; -} -.icon-3x.icon-border { - border-width: 3px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.icon-4x { - font-size: 4em; -} -.icon-4x.icon-border { - border-width: 4px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.icon-5x { - font-size: 5em; -} -.icon-5x.icon-border { - border-width: 5px; - -webkit-border-radius: 7px; - -moz-border-radius: 7px; - border-radius: 7px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -[class^="icon-"].pull-left, -[class*=" icon-"].pull-left { - margin-right: .3em; -} -[class^="icon-"].pull-right, -[class*=" icon-"].pull-right { - margin-left: .3em; -} -/* BOOTSTRAP SPECIFIC CLASSES - * -------------------------- */ -/* Bootstrap 2.0 sprites.less reset */ -[class^="icon-"], -[class*=" icon-"] { - display: inline; - width: auto; - height: auto; - line-height: normal; - vertical-align: baseline; - background-image: none; - background-position: 0% 0%; - background-repeat: repeat; - margin-top: 0; -} -/* more sprites.less reset */ -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"] { - background-image: none; -} -/* keeps Bootstrap styles with and without icons the same */ -.btn [class^="icon-"].icon-large, -.nav [class^="icon-"].icon-large, -.btn [class*=" icon-"].icon-large, -.nav [class*=" icon-"].icon-large { - line-height: .9em; -} -.btn [class^="icon-"].icon-spin, -.nav [class^="icon-"].icon-spin, -.btn [class*=" icon-"].icon-spin, -.nav [class*=" icon-"].icon-spin { - display: inline-block; -} -.nav-tabs [class^="icon-"], -.nav-pills [class^="icon-"], -.nav-tabs [class*=" icon-"], -.nav-pills [class*=" icon-"], -.nav-tabs [class^="icon-"].icon-large, -.nav-pills [class^="icon-"].icon-large, -.nav-tabs [class*=" icon-"].icon-large, -.nav-pills [class*=" icon-"].icon-large { - line-height: .9em; -} -.btn [class^="icon-"].pull-left.icon-2x, -.btn [class*=" icon-"].pull-left.icon-2x, -.btn [class^="icon-"].pull-right.icon-2x, -.btn [class*=" icon-"].pull-right.icon-2x { - margin-top: .18em; -} -.btn [class^="icon-"].icon-spin.icon-large, -.btn [class*=" icon-"].icon-spin.icon-large { - line-height: .8em; -} -.btn.btn-small [class^="icon-"].pull-left.icon-2x, -.btn.btn-small [class*=" icon-"].pull-left.icon-2x, -.btn.btn-small [class^="icon-"].pull-right.icon-2x, -.btn.btn-small [class*=" icon-"].pull-right.icon-2x { - margin-top: .25em; -} -.btn.btn-large [class^="icon-"], -.btn.btn-large [class*=" icon-"] { - margin-top: 0; -} -.btn.btn-large [class^="icon-"].pull-left.icon-2x, -.btn.btn-large [class*=" icon-"].pull-left.icon-2x, -.btn.btn-large [class^="icon-"].pull-right.icon-2x, -.btn.btn-large [class*=" icon-"].pull-right.icon-2x { - margin-top: .05em; -} -.btn.btn-large [class^="icon-"].pull-left.icon-2x, -.btn.btn-large [class*=" icon-"].pull-left.icon-2x { - margin-right: .2em; -} -.btn.btn-large [class^="icon-"].pull-right.icon-2x, -.btn.btn-large [class*=" icon-"].pull-right.icon-2x { - margin-left: .2em; -} -/* EXTRAS - * -------------------------- */ -/* Stacked and layered icon */ -.icon-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: -35%; -} -.icon-stack [class^="icon-"], -.icon-stack [class*=" icon-"] { - display: block; - text-align: center; - position: absolute; - width: 100%; - height: 100%; - font-size: 1em; - line-height: inherit; - *line-height: 2em; -} -.icon-stack .icon-stack-base { - font-size: 2em; - *line-height: 1em; -} -/* Animated rotating icon */ -.icon-spin { - display: inline-block; - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - -webkit-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; -} -a .icon-spin { - display: inline-block; - text-decoration: none; -} -@-moz-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(359deg); - } -} -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - } -} -@-o-keyframes spin { - 0% { - -o-transform: rotate(0deg); - } - 100% { - -o-transform: rotate(359deg); - } -} -@-ms-keyframes spin { - 0% { - -ms-transform: rotate(0deg); - } - 100% { - -ms-transform: rotate(359deg); - } -} -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(359deg); - } -} -/* Icon rotations and mirroring */ -.icon-rotate-90:before { - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -} -.icon-rotate-180:before { - -webkit-transform: rotate(180deg); - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -o-transform: rotate(180deg); - transform: rotate(180deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -} -.icon-rotate-270:before { - -webkit-transform: rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); - transform: rotate(270deg); - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -} -.icon-flip-horizontal:before { - -webkit-transform: scale(-1, 1); - -moz-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - -o-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.icon-flip-vertical:before { - -webkit-transform: scale(1, -1); - -moz-transform: scale(1, -1); - -ms-transform: scale(1, -1); - -o-transform: scale(1, -1); - transform: scale(1, -1); -} -/* ensure rotation occurs inside anchor tags */ -a .icon-rotate-90:before, -a .icon-rotate-180:before, -a .icon-rotate-270:before, -a .icon-flip-horizontal:before, -a .icon-flip-vertical:before { - display: inline-block; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.icon-glass:before { - content: "\f000"; -} -.icon-music:before { - content: "\f001"; -} -.icon-search:before { - content: "\f002"; -} -.icon-envelope-alt:before { - content: "\f003"; -} -.icon-heart:before { - content: "\f004"; -} -.icon-star:before { - content: "\f005"; -} -.icon-star-empty:before { - content: "\f006"; -} -.icon-user:before { - content: "\f007"; -} -.icon-film:before { - content: "\f008"; -} -.icon-th-large:before { - content: "\f009"; -} -.icon-th:before { - content: "\f00a"; -} -.icon-th-list:before { - content: "\f00b"; -} -.icon-ok:before { - content: "\f00c"; -} -.icon-remove:before { - content: "\f00d"; -} -.icon-zoom-in:before { - content: "\f00e"; -} -.icon-zoom-out:before { - content: "\f010"; -} -.icon-power-off:before, -.icon-off:before { - content: "\f011"; -} -.icon-signal:before { - content: "\f012"; -} -.icon-cog:before { - content: "\f013"; -} -.icon-trash:before { - content: "\f014"; -} -.icon-home:before { - content: "\f015"; -} -.icon-file-alt:before { - content: "\f016"; -} -.icon-time:before { - content: "\f017"; -} -.icon-road:before { - content: "\f018"; -} -.icon-download-alt:before { - content: "\f019"; -} -.icon-download:before { - content: "\f01a"; -} -.icon-upload:before { - content: "\f01b"; -} -.icon-inbox:before { - content: "\f01c"; -} -.icon-play-circle:before { - content: "\f01d"; -} -.icon-rotate-right:before, -.icon-repeat:before { - content: "\f01e"; -} -.icon-refresh:before { - content: "\f021"; -} -.icon-list-alt:before { - content: "\f022"; -} -.icon-lock:before { - content: "\f023"; -} -.icon-flag:before { - content: "\f024"; -} -.icon-headphones:before { - content: "\f025"; -} -.icon-volume-off:before { - content: "\f026"; -} -.icon-volume-down:before { - content: "\f027"; -} -.icon-volume-up:before { - content: "\f028"; -} -.icon-qrcode:before { - content: "\f029"; -} -.icon-barcode:before { - content: "\f02a"; -} -.icon-tag:before { - content: "\f02b"; -} -.icon-tags:before { - content: "\f02c"; -} -.icon-book:before { - content: "\f02d"; -} -.icon-bookmark:before { - content: "\f02e"; -} -.icon-print:before { - content: "\f02f"; -} -.icon-camera:before { - content: "\f030"; -} -.icon-font:before { - content: "\f031"; -} -.icon-bold:before { - content: "\f032"; -} -.icon-italic:before { - content: "\f033"; -} -.icon-text-height:before { - content: "\f034"; -} -.icon-text-width:before { - content: "\f035"; -} -.icon-align-left:before { - content: "\f036"; -} -.icon-align-center:before { - content: "\f037"; -} -.icon-align-right:before { - content: "\f038"; -} -.icon-align-justify:before { - content: "\f039"; -} -.icon-list:before { - content: "\f03a"; -} -.icon-indent-left:before { - content: "\f03b"; -} -.icon-indent-right:before { - content: "\f03c"; -} -.icon-facetime-video:before { - content: "\f03d"; -} -.icon-picture:before { - content: "\f03e"; -} -.icon-pencil:before { - content: "\f040"; -} -.icon-map-marker:before { - content: "\f041"; -} -.icon-adjust:before { - content: "\f042"; -} -.icon-tint:before { - content: "\f043"; -} -.icon-edit:before { - content: "\f044"; -} -.icon-share:before { - content: "\f045"; -} -.icon-check:before { - content: "\f046"; -} -.icon-move:before { - content: "\f047"; -} -.icon-step-backward:before { - content: "\f048"; -} -.icon-fast-backward:before { - content: "\f049"; -} -.icon-backward:before { - content: "\f04a"; -} -.icon-play:before { - content: "\f04b"; -} -.icon-pause:before { - content: "\f04c"; -} -.icon-stop:before { - content: "\f04d"; -} -.icon-forward:before { - content: "\f04e"; -} -.icon-fast-forward:before { - content: "\f050"; -} -.icon-step-forward:before { - content: "\f051"; -} -.icon-eject:before { - content: "\f052"; -} -.icon-chevron-left:before { - content: "\f053"; -} -.icon-chevron-right:before { - content: "\f054"; -} -.icon-plus-sign:before { - content: "\f055"; -} -.icon-minus-sign:before { - content: "\f056"; -} -.icon-remove-sign:before { - content: "\f057"; -} -.icon-ok-sign:before { - content: "\f058"; -} -.icon-question-sign:before { - content: "\f059"; -} -.icon-info-sign:before { - content: "\f05a"; -} -.icon-screenshot:before { - content: "\f05b"; -} -.icon-remove-circle:before { - content: "\f05c"; -} -.icon-ok-circle:before { - content: "\f05d"; -} -.icon-ban-circle:before { - content: "\f05e"; -} -.icon-arrow-left:before { - content: "\f060"; -} -.icon-arrow-right:before { - content: "\f061"; -} -.icon-arrow-up:before { - content: "\f062"; -} -.icon-arrow-down:before { - content: "\f063"; -} -.icon-mail-forward:before, -.icon-share-alt:before { - content: "\f064"; -} -.icon-resize-full:before { - content: "\f065"; -} -.icon-resize-small:before { - content: "\f066"; -} -.icon-plus:before { - content: "\f067"; -} -.icon-minus:before { - content: "\f068"; -} -.icon-asterisk:before { - content: "\f069"; -} -.icon-exclamation-sign:before { - content: "\f06a"; -} -.icon-gift:before { - content: "\f06b"; -} -.icon-leaf:before { - content: "\f06c"; -} -.icon-fire:before { - content: "\f06d"; -} -.icon-eye-open:before { - content: "\f06e"; -} -.icon-eye-close:before { - content: "\f070"; -} -.icon-warning-sign:before { - content: "\f071"; -} -.icon-plane:before { - content: "\f072"; -} -.icon-calendar:before { - content: "\f073"; -} -.icon-random:before { - content: "\f074"; -} -.icon-comment:before { - content: "\f075"; -} -.icon-magnet:before { - content: "\f076"; -} -.icon-chevron-up:before { - content: "\f077"; -} -.icon-chevron-down:before { - content: "\f078"; -} -.icon-retweet:before { - content: "\f079"; -} -.icon-shopping-cart:before { - content: "\f07a"; -} -.icon-folder-close:before { - content: "\f07b"; -} -.icon-folder-open:before { - content: "\f07c"; -} -.icon-resize-vertical:before { - content: "\f07d"; -} -.icon-resize-horizontal:before { - content: "\f07e"; -} -.icon-bar-chart:before { - content: "\f080"; -} -.icon-twitter-sign:before { - content: "\f081"; -} -.icon-facebook-sign:before { - content: "\f082"; -} -.icon-camera-retro:before { - content: "\f083"; -} -.icon-key:before { - content: "\f084"; -} -.icon-cogs:before { - content: "\f085"; -} -.icon-comments:before { - content: "\f086"; -} -.icon-thumbs-up-alt:before { - content: "\f087"; -} -.icon-thumbs-down-alt:before { - content: "\f088"; -} -.icon-star-half:before { - content: "\f089"; -} -.icon-heart-empty:before { - content: "\f08a"; -} -.icon-signout:before { - content: "\f08b"; -} -.icon-linkedin-sign:before { - content: "\f08c"; -} -.icon-pushpin:before { - content: "\f08d"; -} -.icon-external-link:before { - content: "\f08e"; -} -.icon-signin:before { - content: "\f090"; -} -.icon-trophy:before { - content: "\f091"; -} -.icon-github-sign:before { - content: "\f092"; -} -.icon-upload-alt:before { - content: "\f093"; -} -.icon-lemon:before { - content: "\f094"; -} -.icon-phone:before { - content: "\f095"; -} -.icon-unchecked:before, -.icon-check-empty:before { - content: "\f096"; -} -.icon-bookmark-empty:before { - content: "\f097"; -} -.icon-phone-sign:before { - content: "\f098"; -} -.icon-twitter:before { - content: "\f099"; -} -.icon-facebook:before { - content: "\f09a"; -} -.icon-github:before { - content: "\f09b"; -} -.icon-unlock:before { - content: "\f09c"; -} -.icon-credit-card:before { - content: "\f09d"; -} -.icon-rss:before { - content: "\f09e"; -} -.icon-hdd:before { - content: "\f0a0"; -} -.icon-bullhorn:before { - content: "\f0a1"; -} -.icon-bell:before { - content: "\f0a2"; -} -.icon-certificate:before { - content: "\f0a3"; -} -.icon-hand-right:before { - content: "\f0a4"; -} -.icon-hand-left:before { - content: "\f0a5"; -} -.icon-hand-up:before { - content: "\f0a6"; -} -.icon-hand-down:before { - content: "\f0a7"; -} -.icon-circle-arrow-left:before { - content: "\f0a8"; -} -.icon-circle-arrow-right:before { - content: "\f0a9"; -} -.icon-circle-arrow-up:before { - content: "\f0aa"; -} -.icon-circle-arrow-down:before { - content: "\f0ab"; -} -.icon-globe:before { - content: "\f0ac"; -} -.icon-wrench:before { - content: "\f0ad"; -} -.icon-tasks:before { - content: "\f0ae"; -} -.icon-filter:before { - content: "\f0b0"; -} -.icon-briefcase:before { - content: "\f0b1"; -} -.icon-fullscreen:before { - content: "\f0b2"; -} -.icon-group:before { - content: "\f0c0"; -} -.icon-link:before { - content: "\f0c1"; -} -.icon-cloud:before { - content: "\f0c2"; -} -.icon-beaker:before { - content: "\f0c3"; -} -.icon-cut:before { - content: "\f0c4"; -} -.icon-copy:before { - content: "\f0c5"; -} -.icon-paperclip:before, -.icon-paper-clip:before { - content: "\f0c6"; -} -.icon-save:before { - content: "\f0c7"; -} -.icon-sign-blank:before { - content: "\f0c8"; -} -.icon-reorder:before { - content: "\f0c9"; -} -.icon-list-ul:before { - content: "\f0ca"; -} -.icon-list-ol:before { - content: "\f0cb"; -} -.icon-strikethrough:before { - content: "\f0cc"; -} -.icon-underline:before { - content: "\f0cd"; -} -.icon-table:before { - content: "\f0ce"; -} -.icon-magic:before { - content: "\f0d0"; -} -.icon-truck:before { - content: "\f0d1"; -} -.icon-pinterest:before { - content: "\f0d2"; -} -.icon-pinterest-sign:before { - content: "\f0d3"; -} -.icon-google-plus-sign:before { - content: "\f0d4"; -} -.icon-google-plus:before { - content: "\f0d5"; -} -.icon-money:before { - content: "\f0d6"; -} -.icon-caret-down:before { - content: "\f0d7"; -} -.icon-caret-up:before { - content: "\f0d8"; -} -.icon-caret-left:before { - content: "\f0d9"; -} -.icon-caret-right:before { - content: "\f0da"; -} -.icon-columns:before { - content: "\f0db"; -} -.icon-sort:before { - content: "\f0dc"; -} -.icon-sort-down:before { - content: "\f0dd"; -} -.icon-sort-up:before { - content: "\f0de"; -} -.icon-envelope:before { - content: "\f0e0"; -} -.icon-linkedin:before { - content: "\f0e1"; -} -.icon-rotate-left:before, -.icon-undo:before { - content: "\f0e2"; -} -.icon-legal:before { - content: "\f0e3"; -} -.icon-dashboard:before { - content: "\f0e4"; -} -.icon-comment-alt:before { - content: "\f0e5"; -} -.icon-comments-alt:before { - content: "\f0e6"; -} -.icon-bolt:before { - content: "\f0e7"; -} -.icon-sitemap:before { - content: "\f0e8"; -} -.icon-umbrella:before { - content: "\f0e9"; -} -.icon-paste:before { - content: "\f0ea"; -} -.icon-lightbulb:before { - content: "\f0eb"; -} -.icon-exchange:before { - content: "\f0ec"; -} -.icon-cloud-download:before { - content: "\f0ed"; -} -.icon-cloud-upload:before { - content: "\f0ee"; -} -.icon-user-md:before { - content: "\f0f0"; -} -.icon-stethoscope:before { - content: "\f0f1"; -} -.icon-suitcase:before { - content: "\f0f2"; -} -.icon-bell-alt:before { - content: "\f0f3"; -} -.icon-coffee:before { - content: "\f0f4"; -} -.icon-food:before { - content: "\f0f5"; -} -.icon-file-text-alt:before { - content: "\f0f6"; -} -.icon-building:before { - content: "\f0f7"; -} -.icon-hospital:before { - content: "\f0f8"; -} -.icon-ambulance:before { - content: "\f0f9"; -} -.icon-medkit:before { - content: "\f0fa"; -} -.icon-fighter-jet:before { - content: "\f0fb"; -} -.icon-beer:before { - content: "\f0fc"; -} -.icon-h-sign:before { - content: "\f0fd"; -} -.icon-plus-sign-alt:before { - content: "\f0fe"; -} -.icon-double-angle-left:before { - content: "\f100"; -} -.icon-double-angle-right:before { - content: "\f101"; -} -.icon-double-angle-up:before { - content: "\f102"; -} -.icon-double-angle-down:before { - content: "\f103"; -} -.icon-angle-left:before { - content: "\f104"; -} -.icon-angle-right:before { - content: "\f105"; -} -.icon-angle-up:before { - content: "\f106"; -} -.icon-angle-down:before { - content: "\f107"; -} -.icon-desktop:before { - content: "\f108"; -} -.icon-laptop:before { - content: "\f109"; -} -.icon-tablet:before { - content: "\f10a"; -} -.icon-mobile-phone:before { - content: "\f10b"; -} -.icon-circle-blank:before { - content: "\f10c"; -} -.icon-quote-left:before { - content: "\f10d"; -} -.icon-quote-right:before { - content: "\f10e"; -} -.icon-spinner:before { - content: "\f110"; -} -.icon-circle:before { - content: "\f111"; -} -.icon-mail-reply:before, -.icon-reply:before { - content: "\f112"; -} -.icon-github-alt:before { - content: "\f113"; -} -.icon-folder-close-alt:before { - content: "\f114"; -} -.icon-folder-open-alt:before { - content: "\f115"; -} -.icon-expand-alt:before { - content: "\f116"; -} -.icon-collapse-alt:before { - content: "\f117"; -} -.icon-smile:before { - content: "\f118"; -} -.icon-frown:before { - content: "\f119"; -} -.icon-meh:before { - content: "\f11a"; -} -.icon-gamepad:before { - content: "\f11b"; -} -.icon-keyboard:before { - content: "\f11c"; -} -.icon-flag-alt:before { - content: "\f11d"; -} -.icon-flag-checkered:before { - content: "\f11e"; -} -.icon-terminal:before { - content: "\f120"; -} -.icon-code:before { - content: "\f121"; -} -.icon-reply-all:before { - content: "\f122"; -} -.icon-mail-reply-all:before { - content: "\f122"; -} -.icon-star-half-full:before, -.icon-star-half-empty:before { - content: "\f123"; -} -.icon-location-arrow:before { - content: "\f124"; -} -.icon-crop:before { - content: "\f125"; -} -.icon-code-fork:before { - content: "\f126"; -} -.icon-unlink:before { - content: "\f127"; -} -.icon-question:before { - content: "\f128"; -} -.icon-info:before { - content: "\f129"; -} -.icon-exclamation:before { - content: "\f12a"; -} -.icon-superscript:before { - content: "\f12b"; -} -.icon-subscript:before { - content: "\f12c"; -} -.icon-eraser:before { - content: "\f12d"; -} -.icon-puzzle-piece:before { - content: "\f12e"; -} -.icon-microphone:before { - content: "\f130"; -} -.icon-microphone-off:before { - content: "\f131"; -} -.icon-shield:before { - content: "\f132"; -} -.icon-calendar-empty:before { - content: "\f133"; -} -.icon-fire-extinguisher:before { - content: "\f134"; -} -.icon-rocket:before { - content: "\f135"; -} -.icon-maxcdn:before { - content: "\f136"; -} -.icon-chevron-sign-left:before { - content: "\f137"; -} -.icon-chevron-sign-right:before { - content: "\f138"; -} -.icon-chevron-sign-up:before { - content: "\f139"; -} -.icon-chevron-sign-down:before { - content: "\f13a"; -} -.icon-html5:before { - content: "\f13b"; -} -.icon-css3:before { - content: "\f13c"; -} -.icon-anchor:before { - content: "\f13d"; -} -.icon-unlock-alt:before { - content: "\f13e"; -} -.icon-bullseye:before { - content: "\f140"; -} -.icon-ellipsis-horizontal:before { - content: "\f141"; -} -.icon-ellipsis-vertical:before { - content: "\f142"; -} -.icon-rss-sign:before { - content: "\f143"; -} -.icon-play-sign:before { - content: "\f144"; -} -.icon-ticket:before { - content: "\f145"; -} -.icon-minus-sign-alt:before { - content: "\f146"; -} -.icon-check-minus:before { - content: "\f147"; -} -.icon-level-up:before { - content: "\f148"; -} -.icon-level-down:before { - content: "\f149"; -} -.icon-check-sign:before { - content: "\f14a"; -} -.icon-edit-sign:before { - content: "\f14b"; -} -.icon-external-link-sign:before { - content: "\f14c"; -} -.icon-share-sign:before { - content: "\f14d"; -} -.icon-compass:before { - content: "\f14e"; -} -.icon-collapse:before { - content: "\f150"; -} -.icon-collapse-top:before { - content: "\f151"; -} -.icon-expand:before { - content: "\f152"; -} -.icon-euro:before, -.icon-eur:before { - content: "\f153"; -} -.icon-gbp:before { - content: "\f154"; -} -.icon-dollar:before, -.icon-usd:before { - content: "\f155"; -} -.icon-rupee:before, -.icon-inr:before { - content: "\f156"; -} -.icon-yen:before, -.icon-jpy:before { - content: "\f157"; -} -.icon-renminbi:before, -.icon-cny:before { - content: "\f158"; -} -.icon-won:before, -.icon-krw:before { - content: "\f159"; -} -.icon-bitcoin:before, -.icon-btc:before { - content: "\f15a"; -} -.icon-file:before { - content: "\f15b"; -} -.icon-file-text:before { - content: "\f15c"; -} -.icon-sort-by-alphabet:before { - content: "\f15d"; -} -.icon-sort-by-alphabet-alt:before { - content: "\f15e"; -} -.icon-sort-by-attributes:before { - content: "\f160"; -} -.icon-sort-by-attributes-alt:before { - content: "\f161"; -} -.icon-sort-by-order:before { - content: "\f162"; -} -.icon-sort-by-order-alt:before { - content: "\f163"; -} -.icon-thumbs-up:before { - content: "\f164"; -} -.icon-thumbs-down:before { - content: "\f165"; -} -.icon-youtube-sign:before { - content: "\f166"; -} -.icon-youtube:before { - content: "\f167"; -} -.icon-xing:before { - content: "\f168"; -} -.icon-xing-sign:before { - content: "\f169"; -} -.icon-youtube-play:before { - content: "\f16a"; -} -.icon-dropbox:before { - content: "\f16b"; -} -.icon-stackexchange:before { - content: "\f16c"; -} -.icon-instagram:before { - content: "\f16d"; -} -.icon-flickr:before { - content: "\f16e"; -} -.icon-adn:before { - content: "\f170"; -} -.icon-bitbucket:before { - content: "\f171"; -} -.icon-bitbucket-sign:before { - content: "\f172"; -} -.icon-tumblr:before { - content: "\f173"; -} -.icon-tumblr-sign:before { - content: "\f174"; -} -.icon-long-arrow-down:before { - content: "\f175"; -} -.icon-long-arrow-up:before { - content: "\f176"; -} -.icon-long-arrow-left:before { - content: "\f177"; -} -.icon-long-arrow-right:before { - content: "\f178"; -} -.icon-apple:before { - content: "\f179"; -} -.icon-windows:before { - content: "\f17a"; -} -.icon-android:before { - content: "\f17b"; -} -.icon-linux:before { - content: "\f17c"; -} -.icon-dribble:before { - content: "\f17d"; -} -.icon-skype:before { - content: "\f17e"; -} -.icon-foursquare:before { - content: "\f180"; -} -.icon-trello:before { - content: "\f181"; -} -.icon-female:before { - content: "\f182"; -} -.icon-male:before { - content: "\f183"; -} -.icon-gittip:before { - content: "\f184"; -} -.icon-sun:before { - content: "\f185"; -} -.icon-moon:before { - content: "\f186"; -} -.icon-archive:before { - content: "\f187"; -} -.icon-bug:before { - content: "\f188"; -} -.icon-vk:before { - content: "\f189"; -} -.icon-weibo:before { - content: "\f18a"; -} -.icon-renren:before { - content: "\f18b"; -} diff --git a/output/theme/font/font-awesome.min.css b/output/theme/font/font-awesome.min.css deleted file mode 100644 index 8f7fbfe..0000000 --- a/output/theme/font/font-awesome.min.css +++ /dev/null @@ -1,402 +0,0 @@ -@font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.2.0');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.2.0') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.2.0') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.2.0') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.0') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;} -[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;cursor:default;speak:none;} -.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;} -a [class^="icon-"],a [class*=" icon-"]{display:inline;} -[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;} -.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;} -.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;} -[class^="icon-"].hide,[class*=" icon-"].hide{display:none;} -.icon-muted{color:#eeeeee;} -.icon-light{color:#ffffff;} -.icon-dark{color:#333333;} -.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;} -.pull-right{float:right;} -.pull-left{float:left;} -[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;} -[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;} -[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;} -.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;} -.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;} -.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;} -.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;} -.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;} -.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;} -.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;} -.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;} -.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;} -.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;} -.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;} -.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;} -.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;} -a .icon-spin{display:inline-block;text-decoration:none;} -@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);} -.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);} -.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);} -.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);} -.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);} -a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;} -.icon-glass:before{content:"\f000";} -.icon-music:before{content:"\f001";} -.icon-search:before{content:"\f002";} -.icon-envelope-alt:before{content:"\f003";} -.icon-heart:before{content:"\f004";} -.icon-star:before{content:"\f005";} -.icon-star-empty:before{content:"\f006";} -.icon-user:before{content:"\f007";} -.icon-film:before{content:"\f008";} -.icon-th-large:before{content:"\f009";} -.icon-th:before{content:"\f00a";} -.icon-th-list:before{content:"\f00b";} -.icon-ok:before{content:"\f00c";} -.icon-remove:before{content:"\f00d";} -.icon-zoom-in:before{content:"\f00e";} -.icon-zoom-out:before{content:"\f010";} -.icon-power-off:before,.icon-off:before{content:"\f011";} -.icon-signal:before{content:"\f012";} -.icon-cog:before{content:"\f013";} -.icon-trash:before{content:"\f014";} -.icon-home:before{content:"\f015";} -.icon-file-alt:before{content:"\f016";} -.icon-time:before{content:"\f017";} -.icon-road:before{content:"\f018";} -.icon-download-alt:before{content:"\f019";} -.icon-download:before{content:"\f01a";} -.icon-upload:before{content:"\f01b";} -.icon-inbox:before{content:"\f01c";} -.icon-play-circle:before{content:"\f01d";} -.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";} -.icon-refresh:before{content:"\f021";} -.icon-list-alt:before{content:"\f022";} -.icon-lock:before{content:"\f023";} -.icon-flag:before{content:"\f024";} -.icon-headphones:before{content:"\f025";} -.icon-volume-off:before{content:"\f026";} -.icon-volume-down:before{content:"\f027";} -.icon-volume-up:before{content:"\f028";} -.icon-qrcode:before{content:"\f029";} -.icon-barcode:before{content:"\f02a";} -.icon-tag:before{content:"\f02b";} -.icon-tags:before{content:"\f02c";} -.icon-book:before{content:"\f02d";} -.icon-bookmark:before{content:"\f02e";} -.icon-print:before{content:"\f02f";} -.icon-camera:before{content:"\f030";} -.icon-font:before{content:"\f031";} -.icon-bold:before{content:"\f032";} -.icon-italic:before{content:"\f033";} -.icon-text-height:before{content:"\f034";} -.icon-text-width:before{content:"\f035";} -.icon-align-left:before{content:"\f036";} -.icon-align-center:before{content:"\f037";} -.icon-align-right:before{content:"\f038";} -.icon-align-justify:before{content:"\f039";} -.icon-list:before{content:"\f03a";} -.icon-indent-left:before{content:"\f03b";} -.icon-indent-right:before{content:"\f03c";} -.icon-facetime-video:before{content:"\f03d";} -.icon-picture:before{content:"\f03e";} -.icon-pencil:before{content:"\f040";} -.icon-map-marker:before{content:"\f041";} -.icon-adjust:before{content:"\f042";} -.icon-tint:before{content:"\f043";} -.icon-edit:before{content:"\f044";} -.icon-share:before{content:"\f045";} -.icon-check:before{content:"\f046";} -.icon-move:before{content:"\f047";} -.icon-step-backward:before{content:"\f048";} -.icon-fast-backward:before{content:"\f049";} -.icon-backward:before{content:"\f04a";} -.icon-play:before{content:"\f04b";} -.icon-pause:before{content:"\f04c";} -.icon-stop:before{content:"\f04d";} -.icon-forward:before{content:"\f04e";} -.icon-fast-forward:before{content:"\f050";} -.icon-step-forward:before{content:"\f051";} -.icon-eject:before{content:"\f052";} -.icon-chevron-left:before{content:"\f053";} -.icon-chevron-right:before{content:"\f054";} -.icon-plus-sign:before{content:"\f055";} -.icon-minus-sign:before{content:"\f056";} -.icon-remove-sign:before{content:"\f057";} -.icon-ok-sign:before{content:"\f058";} -.icon-question-sign:before{content:"\f059";} -.icon-info-sign:before{content:"\f05a";} -.icon-screenshot:before{content:"\f05b";} -.icon-remove-circle:before{content:"\f05c";} -.icon-ok-circle:before{content:"\f05d";} -.icon-ban-circle:before{content:"\f05e";} -.icon-arrow-left:before{content:"\f060";} -.icon-arrow-right:before{content:"\f061";} -.icon-arrow-up:before{content:"\f062";} -.icon-arrow-down:before{content:"\f063";} -.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";} -.icon-resize-full:before{content:"\f065";} -.icon-resize-small:before{content:"\f066";} -.icon-plus:before{content:"\f067";} -.icon-minus:before{content:"\f068";} -.icon-asterisk:before{content:"\f069";} -.icon-exclamation-sign:before{content:"\f06a";} -.icon-gift:before{content:"\f06b";} -.icon-leaf:before{content:"\f06c";} -.icon-fire:before{content:"\f06d";} -.icon-eye-open:before{content:"\f06e";} -.icon-eye-close:before{content:"\f070";} -.icon-warning-sign:before{content:"\f071";} -.icon-plane:before{content:"\f072";} -.icon-calendar:before{content:"\f073";} -.icon-random:before{content:"\f074";} -.icon-comment:before{content:"\f075";} -.icon-magnet:before{content:"\f076";} -.icon-chevron-up:before{content:"\f077";} -.icon-chevron-down:before{content:"\f078";} -.icon-retweet:before{content:"\f079";} -.icon-shopping-cart:before{content:"\f07a";} -.icon-folder-close:before{content:"\f07b";} -.icon-folder-open:before{content:"\f07c";} -.icon-resize-vertical:before{content:"\f07d";} -.icon-resize-horizontal:before{content:"\f07e";} -.icon-bar-chart:before{content:"\f080";} -.icon-twitter-sign:before{content:"\f081";} -.icon-facebook-sign:before{content:"\f082";} -.icon-camera-retro:before{content:"\f083";} -.icon-key:before{content:"\f084";} -.icon-cogs:before{content:"\f085";} -.icon-comments:before{content:"\f086";} -.icon-thumbs-up-alt:before{content:"\f087";} -.icon-thumbs-down-alt:before{content:"\f088";} -.icon-star-half:before{content:"\f089";} -.icon-heart-empty:before{content:"\f08a";} -.icon-signout:before{content:"\f08b";} -.icon-linkedin-sign:before{content:"\f08c";} -.icon-pushpin:before{content:"\f08d";} -.icon-external-link:before{content:"\f08e";} -.icon-signin:before{content:"\f090";} -.icon-trophy:before{content:"\f091";} -.icon-github-sign:before{content:"\f092";} -.icon-upload-alt:before{content:"\f093";} -.icon-lemon:before{content:"\f094";} -.icon-phone:before{content:"\f095";} -.icon-unchecked:before,.icon-check-empty:before{content:"\f096";} -.icon-bookmark-empty:before{content:"\f097";} -.icon-phone-sign:before{content:"\f098";} -.icon-twitter:before{content:"\f099";} -.icon-facebook:before{content:"\f09a";} -.icon-github:before{content:"\f09b";} -.icon-unlock:before{content:"\f09c";} -.icon-credit-card:before{content:"\f09d";} -.icon-rss:before{content:"\f09e";} -.icon-hdd:before{content:"\f0a0";} -.icon-bullhorn:before{content:"\f0a1";} -.icon-bell:before{content:"\f0a2";} -.icon-certificate:before{content:"\f0a3";} -.icon-hand-right:before{content:"\f0a4";} -.icon-hand-left:before{content:"\f0a5";} -.icon-hand-up:before{content:"\f0a6";} -.icon-hand-down:before{content:"\f0a7";} -.icon-circle-arrow-left:before{content:"\f0a8";} -.icon-circle-arrow-right:before{content:"\f0a9";} -.icon-circle-arrow-up:before{content:"\f0aa";} -.icon-circle-arrow-down:before{content:"\f0ab";} -.icon-globe:before{content:"\f0ac";} -.icon-wrench:before{content:"\f0ad";} -.icon-tasks:before{content:"\f0ae";} -.icon-filter:before{content:"\f0b0";} -.icon-briefcase:before{content:"\f0b1";} -.icon-fullscreen:before{content:"\f0b2";} -.icon-group:before{content:"\f0c0";} -.icon-link:before{content:"\f0c1";} -.icon-cloud:before{content:"\f0c2";} -.icon-beaker:before{content:"\f0c3";} -.icon-cut:before{content:"\f0c4";} -.icon-copy:before{content:"\f0c5";} -.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";} -.icon-save:before{content:"\f0c7";} -.icon-sign-blank:before{content:"\f0c8";} -.icon-reorder:before{content:"\f0c9";} -.icon-list-ul:before{content:"\f0ca";} -.icon-list-ol:before{content:"\f0cb";} -.icon-strikethrough:before{content:"\f0cc";} -.icon-underline:before{content:"\f0cd";} -.icon-table:before{content:"\f0ce";} -.icon-magic:before{content:"\f0d0";} -.icon-truck:before{content:"\f0d1";} -.icon-pinterest:before{content:"\f0d2";} -.icon-pinterest-sign:before{content:"\f0d3";} -.icon-google-plus-sign:before{content:"\f0d4";} -.icon-google-plus:before{content:"\f0d5";} -.icon-money:before{content:"\f0d6";} -.icon-caret-down:before{content:"\f0d7";} -.icon-caret-up:before{content:"\f0d8";} -.icon-caret-left:before{content:"\f0d9";} -.icon-caret-right:before{content:"\f0da";} -.icon-columns:before{content:"\f0db";} -.icon-sort:before{content:"\f0dc";} -.icon-sort-down:before{content:"\f0dd";} -.icon-sort-up:before{content:"\f0de";} -.icon-envelope:before{content:"\f0e0";} -.icon-linkedin:before{content:"\f0e1";} -.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";} -.icon-legal:before{content:"\f0e3";} -.icon-dashboard:before{content:"\f0e4";} -.icon-comment-alt:before{content:"\f0e5";} -.icon-comments-alt:before{content:"\f0e6";} -.icon-bolt:before{content:"\f0e7";} -.icon-sitemap:before{content:"\f0e8";} -.icon-umbrella:before{content:"\f0e9";} -.icon-paste:before{content:"\f0ea";} -.icon-lightbulb:before{content:"\f0eb";} -.icon-exchange:before{content:"\f0ec";} -.icon-cloud-download:before{content:"\f0ed";} -.icon-cloud-upload:before{content:"\f0ee";} -.icon-user-md:before{content:"\f0f0";} -.icon-stethoscope:before{content:"\f0f1";} -.icon-suitcase:before{content:"\f0f2";} -.icon-bell-alt:before{content:"\f0f3";} -.icon-coffee:before{content:"\f0f4";} -.icon-food:before{content:"\f0f5";} -.icon-file-text-alt:before{content:"\f0f6";} -.icon-building:before{content:"\f0f7";} -.icon-hospital:before{content:"\f0f8";} -.icon-ambulance:before{content:"\f0f9";} -.icon-medkit:before{content:"\f0fa";} -.icon-fighter-jet:before{content:"\f0fb";} -.icon-beer:before{content:"\f0fc";} -.icon-h-sign:before{content:"\f0fd";} -.icon-plus-sign-alt:before{content:"\f0fe";} -.icon-double-angle-left:before{content:"\f100";} -.icon-double-angle-right:before{content:"\f101";} -.icon-double-angle-up:before{content:"\f102";} -.icon-double-angle-down:before{content:"\f103";} -.icon-angle-left:before{content:"\f104";} -.icon-angle-right:before{content:"\f105";} -.icon-angle-up:before{content:"\f106";} -.icon-angle-down:before{content:"\f107";} -.icon-desktop:before{content:"\f108";} -.icon-laptop:before{content:"\f109";} -.icon-tablet:before{content:"\f10a";} -.icon-mobile-phone:before{content:"\f10b";} -.icon-circle-blank:before{content:"\f10c";} -.icon-quote-left:before{content:"\f10d";} -.icon-quote-right:before{content:"\f10e";} -.icon-spinner:before{content:"\f110";} -.icon-circle:before{content:"\f111";} -.icon-mail-reply:before,.icon-reply:before{content:"\f112";} -.icon-github-alt:before{content:"\f113";} -.icon-folder-close-alt:before{content:"\f114";} -.icon-folder-open-alt:before{content:"\f115";} -.icon-expand-alt:before{content:"\f116";} -.icon-collapse-alt:before{content:"\f117";} -.icon-smile:before{content:"\f118";} -.icon-frown:before{content:"\f119";} -.icon-meh:before{content:"\f11a";} -.icon-gamepad:before{content:"\f11b";} -.icon-keyboard:before{content:"\f11c";} -.icon-flag-alt:before{content:"\f11d";} -.icon-flag-checkered:before{content:"\f11e";} -.icon-terminal:before{content:"\f120";} -.icon-code:before{content:"\f121";} -.icon-reply-all:before{content:"\f122";} -.icon-mail-reply-all:before{content:"\f122";} -.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";} -.icon-location-arrow:before{content:"\f124";} -.icon-crop:before{content:"\f125";} -.icon-code-fork:before{content:"\f126";} -.icon-unlink:before{content:"\f127";} -.icon-question:before{content:"\f128";} -.icon-info:before{content:"\f129";} -.icon-exclamation:before{content:"\f12a";} -.icon-superscript:before{content:"\f12b";} -.icon-subscript:before{content:"\f12c";} -.icon-eraser:before{content:"\f12d";} -.icon-puzzle-piece:before{content:"\f12e";} -.icon-microphone:before{content:"\f130";} -.icon-microphone-off:before{content:"\f131";} -.icon-shield:before{content:"\f132";} -.icon-calendar-empty:before{content:"\f133";} -.icon-fire-extinguisher:before{content:"\f134";} -.icon-rocket:before{content:"\f135";} -.icon-maxcdn:before{content:"\f136";} -.icon-chevron-sign-left:before{content:"\f137";} -.icon-chevron-sign-right:before{content:"\f138";} -.icon-chevron-sign-up:before{content:"\f139";} -.icon-chevron-sign-down:before{content:"\f13a";} -.icon-html5:before{content:"\f13b";} -.icon-css3:before{content:"\f13c";} -.icon-anchor:before{content:"\f13d";} -.icon-unlock-alt:before{content:"\f13e";} -.icon-bullseye:before{content:"\f140";} -.icon-ellipsis-horizontal:before{content:"\f141";} -.icon-ellipsis-vertical:before{content:"\f142";} -.icon-rss-sign:before{content:"\f143";} -.icon-play-sign:before{content:"\f144";} -.icon-ticket:before{content:"\f145";} -.icon-minus-sign-alt:before{content:"\f146";} -.icon-check-minus:before{content:"\f147";} -.icon-level-up:before{content:"\f148";} -.icon-level-down:before{content:"\f149";} -.icon-check-sign:before{content:"\f14a";} -.icon-edit-sign:before{content:"\f14b";} -.icon-external-link-sign:before{content:"\f14c";} -.icon-share-sign:before{content:"\f14d";} -.icon-compass:before{content:"\f14e";} -.icon-collapse:before{content:"\f150";} -.icon-collapse-top:before{content:"\f151";} -.icon-expand:before{content:"\f152";} -.icon-euro:before,.icon-eur:before{content:"\f153";} -.icon-gbp:before{content:"\f154";} -.icon-dollar:before,.icon-usd:before{content:"\f155";} -.icon-rupee:before,.icon-inr:before{content:"\f156";} -.icon-yen:before,.icon-jpy:before{content:"\f157";} -.icon-renminbi:before,.icon-cny:before{content:"\f158";} -.icon-won:before,.icon-krw:before{content:"\f159";} -.icon-bitcoin:before,.icon-btc:before{content:"\f15a";} -.icon-file:before{content:"\f15b";} -.icon-file-text:before{content:"\f15c";} -.icon-sort-by-alphabet:before{content:"\f15d";} -.icon-sort-by-alphabet-alt:before{content:"\f15e";} -.icon-sort-by-attributes:before{content:"\f160";} -.icon-sort-by-attributes-alt:before{content:"\f161";} -.icon-sort-by-order:before{content:"\f162";} -.icon-sort-by-order-alt:before{content:"\f163";} -.icon-thumbs-up:before{content:"\f164";} -.icon-thumbs-down:before{content:"\f165";} -.icon-youtube-sign:before{content:"\f166";} -.icon-youtube:before{content:"\f167";} -.icon-xing:before{content:"\f168";} -.icon-xing-sign:before{content:"\f169";} -.icon-youtube-play:before{content:"\f16a";} -.icon-dropbox:before{content:"\f16b";} -.icon-stackexchange:before{content:"\f16c";} -.icon-instagram:before{content:"\f16d";} -.icon-flickr:before{content:"\f16e";} -.icon-adn:before{content:"\f170";} -.icon-bitbucket:before{content:"\f171";} -.icon-bitbucket-sign:before{content:"\f172";} -.icon-tumblr:before{content:"\f173";} -.icon-tumblr-sign:before{content:"\f174";} -.icon-long-arrow-down:before{content:"\f175";} -.icon-long-arrow-up:before{content:"\f176";} -.icon-long-arrow-left:before{content:"\f177";} -.icon-long-arrow-right:before{content:"\f178";} -.icon-apple:before{content:"\f179";} -.icon-windows:before{content:"\f17a";} -.icon-android:before{content:"\f17b";} -.icon-linux:before{content:"\f17c";} -.icon-dribble:before{content:"\f17d";} -.icon-skype:before{content:"\f17e";} -.icon-foursquare:before{content:"\f180";} -.icon-trello:before{content:"\f181";} -.icon-female:before{content:"\f182";} -.icon-male:before{content:"\f183";} -.icon-gittip:before{content:"\f184";} -.icon-sun:before{content:"\f185";} -.icon-moon:before{content:"\f186";} -.icon-archive:before{content:"\f187";} -.icon-bug:before{content:"\f188";} -.icon-vk:before{content:"\f189";} -.icon-weibo:before{content:"\f18a";} -.icon-renren:before{content:"\f18b";} diff --git a/output/theme/font/fontawesome-webfont.eot b/output/theme/font/fontawesome-webfont.eot deleted file mode 100755 index 0662cb9..0000000 Binary files a/output/theme/font/fontawesome-webfont.eot and /dev/null differ diff --git a/output/theme/font/fontawesome-webfont.svg b/output/theme/font/fontawesome-webfont.svg deleted file mode 100755 index 2edb4ec..0000000 --- a/output/theme/font/fontawesome-webfont.svg +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/output/theme/font/fontawesome-webfont.svgz b/output/theme/font/fontawesome-webfont.svgz deleted file mode 100644 index 2a73cd7..0000000 Binary files a/output/theme/font/fontawesome-webfont.svgz and /dev/null differ diff --git a/output/theme/font/fontawesome-webfont.ttf b/output/theme/font/fontawesome-webfont.ttf deleted file mode 100755 index d365924..0000000 Binary files a/output/theme/font/fontawesome-webfont.ttf and /dev/null differ diff --git a/output/theme/font/fontawesome-webfont.woff b/output/theme/font/fontawesome-webfont.woff deleted file mode 100755 index b9bd17e..0000000 Binary files a/output/theme/font/fontawesome-webfont.woff and /dev/null differ diff --git a/output/theme/img/favicon.ico b/output/theme/img/favicon.ico deleted file mode 100644 index 2e2d468..0000000 Binary files a/output/theme/img/favicon.ico and /dev/null differ diff --git a/output/theme/img/glyphicons-halflings-white.png b/output/theme/img/glyphicons-halflings-white.png deleted file mode 100644 index a20760b..0000000 Binary files a/output/theme/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/output/theme/img/glyphicons-halflings.png b/output/theme/img/glyphicons-halflings.png deleted file mode 100644 index 92d4445..0000000 Binary files a/output/theme/img/glyphicons-halflings.png and /dev/null differ diff --git a/output/theme/js/autosidebar.js b/output/theme/js/autosidebar.js deleted file mode 100644 index b9cef7e..0000000 --- a/output/theme/js/autosidebar.js +++ /dev/null @@ -1,30 +0,0 @@ -jQuery.fn.justtext = function() { - return $(this).clone() - .children() - .remove() - .end() - .text(); - -}; - -$(document).ready(function(){ - $("h1").each(function(){ - $("#sidebar").append( - "
  • "+$(this).children()[0].justtext()+"

  • " - ); - ul = $("