From 975c2f275b4e5b0af84b9357a742a3d10beb6a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wxcaf=C3=A9=20=28Cl=C3=A9ment=20Hertling=29?= Date: Thu, 3 Sep 2015 20:33:41 +0200 Subject: [PATCH] gitignore update... --- __pycache__/pelicanconf.cpython-34.pyc | Bin 1701 -> 0 bytes output/archives.html | 213 - output/author/wxcafe.html | 1513 ---- output/author/wxcafe2.html | 1461 ---- output/authors.html | 0 output/categories.html | 177 - output/category/hacking/index.html | 333 - output/category/note/index.html | 712 -- output/category/oses/index.html | 256 - output/category/ranting/index.html | 452 -- output/category/tutoriel/index.html | 1622 ----- output/category/vidya-games/index.html | 275 - output/feeds/all-fr.atom.xml | 2196 ------ output/feeds/feed.atom.all.xml | 2196 ------ output/feeds/feed.atom.xml | 2196 ------ output/feeds/feed.hacking.xml | 140 - output/feeds/feed.note.xml | 409 -- output/feeds/feed.oses.xml | 63 - output/feeds/feed.ranting.xml | 215 - output/feeds/feed.rss.all.xml | 2196 ------ output/feeds/feed.rss.hacking.xml | 140 - output/feeds/feed.rss.note.xml | 409 -- output/feeds/feed.rss.oses.xml | 63 - output/feeds/feed.rss.ranting.xml | 215 - output/feeds/feed.rss.tutoriel.xml | 1297 ---- output/feeds/feed.rss.vidya-games.xml | 82 - output/feeds/feed.rss.xml | 2196 ------ output/feeds/feed.tutoriel.xml | 1297 ---- output/feeds/feed.vidya-games.xml | 82 - output/feeds/wxcafe.atom.xml | 2196 ------ output/feeds/wxcafe.rss.xml | 2196 ------ output/index.html | 1513 ---- output/index2.html | 1461 ---- output/pages/about/index.html | 207 - .../index.html | 340 - .../index.html | 339 - .../index.html | 275 - output/posts/freebsd-online-mfsbsd/index.html | 256 - output/posts/hori-vs-pdp/index.html | 281 - .../index.html | 349 - .../mise-en-place-dun-serveur-dns/index.html | 420 -- .../index.html | 360 - .../index.html | 453 -- output/posts/nat/index.html | 203 - output/posts/nuc-hdmi-cec/index.html | 287 - output/posts/opensmtpd-debian/index.html | 564 -- .../plan-9-from-whichever-space/index.html | 262 - .../index.html | 351 - output/posts/redesign-du-blog/index.html | 274 - output/posts/sed-basics/index.html | 300 - output/posts/ssl-starttls/index.html | 234 - .../index.html | 262 - output/posts/update/index.html | 203 - output/tags.html | 172 - output/theme/css/bootstrap-responsive.css | 1109 --- output/theme/css/bootstrap.css | 6180 ----------------- output/theme/css/extra.css | 7 - output/theme/css/font-awesome.css | 1268 ---- output/theme/css/pygments.css | 70 - output/theme/css/pygments.css.bak | 70 - output/theme/font/FontAwesome.otf | Bin 61896 -> 0 bytes output/theme/font/font-awesome-ie7.css | 1197 ---- output/theme/font/font-awesome-ie7.min.css | 382 - output/theme/font/font-awesome.css | 1471 ---- output/theme/font/font-awesome.min.css | 402 -- output/theme/font/fontawesome-webfont.eot | Bin 37405 -> 0 bytes output/theme/font/fontawesome-webfont.svg | 399 -- output/theme/font/fontawesome-webfont.svgz | Bin 21845 -> 0 bytes output/theme/font/fontawesome-webfont.ttf | Bin 79076 -> 0 bytes output/theme/font/fontawesome-webfont.woff | Bin 43572 -> 0 bytes output/theme/img/favicon.ico | Bin 69182 -> 0 bytes .../theme/img/glyphicons-halflings-white.png | Bin 4352 -> 0 bytes output/theme/img/glyphicons-halflings.png | Bin 4352 -> 0 bytes output/theme/js/autosidebar.js | 30 - output/theme/js/bootstrap.min.js | 6 - output/theme/js/jquery-1.7.2.min.js | 4 - 76 files changed, 48759 deletions(-) delete mode 100644 __pycache__/pelicanconf.cpython-34.pyc delete mode 100644 output/archives.html delete mode 100644 output/author/wxcafe.html delete mode 100644 output/author/wxcafe2.html delete mode 100644 output/authors.html delete mode 100644 output/categories.html delete mode 100644 output/category/hacking/index.html delete mode 100644 output/category/note/index.html delete mode 100644 output/category/oses/index.html delete mode 100644 output/category/ranting/index.html delete mode 100644 output/category/tutoriel/index.html delete mode 100644 output/category/vidya-games/index.html delete mode 100644 output/feeds/all-fr.atom.xml delete mode 100644 output/feeds/feed.atom.all.xml delete mode 100644 output/feeds/feed.atom.xml delete mode 100644 output/feeds/feed.hacking.xml delete mode 100644 output/feeds/feed.note.xml delete mode 100644 output/feeds/feed.oses.xml delete mode 100644 output/feeds/feed.ranting.xml delete mode 100644 output/feeds/feed.rss.all.xml delete mode 100644 output/feeds/feed.rss.hacking.xml delete mode 100644 output/feeds/feed.rss.note.xml delete mode 100644 output/feeds/feed.rss.oses.xml delete mode 100644 output/feeds/feed.rss.ranting.xml delete mode 100644 output/feeds/feed.rss.tutoriel.xml delete mode 100644 output/feeds/feed.rss.vidya-games.xml delete mode 100644 output/feeds/feed.rss.xml delete mode 100644 output/feeds/feed.tutoriel.xml delete mode 100644 output/feeds/feed.vidya-games.xml delete mode 100644 output/feeds/wxcafe.atom.xml delete mode 100644 output/feeds/wxcafe.rss.xml delete mode 100644 output/index.html delete mode 100644 output/index2.html delete mode 100644 output/pages/about/index.html delete mode 100644 output/posts/SSL-ou-la-securite-sur-internet/index.html delete mode 100644 output/posts/comment-saurik-a-roote-les-google-glass/index.html delete mode 100644 output/posts/docker-et-les-ebooks-sur-twitter/index.html delete mode 100644 output/posts/freebsd-online-mfsbsd/index.html delete mode 100644 output/posts/hori-vs-pdp/index.html delete mode 100644 output/posts/le-chiffrement-de-partition-avec-dm-crypt-et-device-mapper/index.html delete mode 100644 output/posts/mise-en-place-dun-serveur-dns/index.html delete mode 100644 output/posts/monter-son-propre-serveur-partie-1/index.html delete mode 100644 output/posts/mutt-ou-le-client-email-le-meilleur-moins-mauvais/index.html delete mode 100644 output/posts/nat/index.html delete mode 100644 output/posts/nuc-hdmi-cec/index.html delete mode 100644 output/posts/opensmtpd-debian/index.html delete mode 100644 output/posts/plan-9-from-whichever-space/index.html delete mode 100644 output/posts/pourquoi-je-vais-quitter-linux-pour-passer-a-freebsd/index.html delete mode 100644 output/posts/redesign-du-blog/index.html delete mode 100644 output/posts/sed-basics/index.html delete mode 100644 output/posts/ssl-starttls/index.html delete mode 100644 output/posts/update-et-pensees-a-propos-du-raspberry-pi/index.html delete mode 100644 output/posts/update/index.html delete mode 100644 output/tags.html delete mode 100644 output/theme/css/bootstrap-responsive.css delete mode 100644 output/theme/css/bootstrap.css delete mode 100644 output/theme/css/extra.css delete mode 100644 output/theme/css/font-awesome.css delete mode 100644 output/theme/css/pygments.css delete mode 100644 output/theme/css/pygments.css.bak delete mode 100644 output/theme/font/FontAwesome.otf delete mode 100644 output/theme/font/font-awesome-ie7.css delete mode 100644 output/theme/font/font-awesome-ie7.min.css delete mode 100644 output/theme/font/font-awesome.css delete mode 100644 output/theme/font/font-awesome.min.css delete mode 100755 output/theme/font/fontawesome-webfont.eot delete mode 100755 output/theme/font/fontawesome-webfont.svg delete mode 100644 output/theme/font/fontawesome-webfont.svgz delete mode 100755 output/theme/font/fontawesome-webfont.ttf delete mode 100755 output/theme/font/fontawesome-webfont.woff delete mode 100644 output/theme/img/favicon.ico delete mode 100644 output/theme/img/glyphicons-halflings-white.png delete mode 100644 output/theme/img/glyphicons-halflings.png delete mode 100644 output/theme/js/autosidebar.js delete mode 100644 output/theme/js/bootstrap.min.js delete mode 100644 output/theme/js/jquery-1.7.2.min.js diff --git a/__pycache__/pelicanconf.cpython-34.pyc b/__pycache__/pelicanconf.cpython-34.pyc deleted file mode 100644 index e37e4757b8bb705b5b44567f115407be5e004cd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmZuy+fM676x|`@LP#Kl+kw&++9EYliQ7t5r528k3x*Rl7ZjVeXI?BPGdLE$$zz|8 zRQ(|O8~uxUs??|R(hu-cXY2$FY7#H4y=Lv1J=-(Nztvi0Y54uk-vxkwAoD44{)RvF zPY#&>a$o~EIY2qc;Uz#zfb)RzfR_O+11h?}*wW;FWZeGsknmqqKC4Pn zB9oR&!dX>`0?#MXwGmj9E!_qmDm-tt*^!(YpUq$+$Of3Bgnn*fK)TY2EXsc3+By zZ6^a8nSo=PNR5mX&{W%bp)Jz4U+D8GRMFzGC3^g&ZMnpa9C~)iyG_12G$TT(ZX2$7 zrUelfTyJC>loC3R{i*2?H>5fZr#3lrJlDH3tR^c`#|Xk{TvEL#7?Gp+cpQd4{XvpU zD;!6|*2r__uS^=+o_RtOA6pj1uo5DHH?-V%S7h-d-=HCBJ-uR9NR+s89Sv=3ba-Wj z@%G%y7sxo{)pWrVYMCx8X%j2tXDQxaloO^xrXE(BYplqp<+a9p3v)VE)>}*^R!|(n zvg3V$p~ovuYkiX`xlG*m#OCLc<*$4*K3Yub^KLxZ7U$TYBbL7-Q1+nUmoy9z4_b~EU(vexb@sNYjq z^+LInZ#tUZk$YFHv52nat9DP;+Wj6YXm1ssyDAT~_IXFqMgICCP~~3~T~=9{C!|Bw zge~;yxvVKy{lU8=t^OD-##b&Cz(rw)`n8pE@3nZ1OtKz4SGQdcK&;e6!Irp3ki; P1OJ0576c}2xtRM8=`#3k 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
-
-
-
- -
-
-
-
- Proudly powered by Pelican, - which takes great advantage of Python.
- Powered by bootstrap2 theme, thanks! -
-
-
- - \ 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…

-
-
- -
- -
-
-
-
- Proudly powered by Pelican, - which takes great advantage of Python.
- Powered by bootstrap2 theme, thanks! -
-
-
- - \ 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!

-
-
- -
- -
-
-
-
- Proudly powered by Pelican, - which takes great advantage of Python.
- Powered by bootstrap2 theme, thanks! -
-
-
- - \ 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é - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
-
-
- Proudly powered by Pelican, - which takes great advantage of Python.
- Powered by bootstrap2 theme, thanks! -
-
-
- - \ 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
  • -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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
  • -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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
  • -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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
  • -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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
  • -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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
  • -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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…

    -
    -
    - -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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!

    -
    -
    - -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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!

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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…)

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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!

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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!

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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…

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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…

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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…*

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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.

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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!

    -
    -
    -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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é - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
      - -
    -
    - -
    -
    -
    -
    - Proudly powered by Pelican, - which takes great advantage of Python.
    - Powered by bootstrap2 theme, thanks! -
    -
    -
    - - \ 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 70125459f7d593b79cabc75bd60b91943aa65e93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61896 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 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 0662cb96bfb78cb2603df4bc9995314bd6806312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37405 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�-A&iY%khEsGVMaq&$BJA^QAs8x>7-g_ z%a|Cu`#=j-hMK0t0lC$!Nr;nh>V934W*5m7WvAqofBHSANk`JbJQ*t$U zwQgIEy~F9FW8C8!NIl{&c@{l{Priv(mk(uBQcp1xb~$O3f(xlI1ScJ_B&AIw$)w?M;Wtan~MCVv2uecOjC8#5{IUKyw2hLV2GGd5ET@5iCT%iO#hM4oG0Jo56Ro z|BN4>5npfnR`(o^UFwEDo@L$IK0;tXbm70bZ9*tq4&C^5xYF${9%s*7C;ATszyXJo zTwo%Guzw@Ib68RYOQpBH7i$CKldh9-3Wo5@OIyezUj8aJI`JLuKBW6=oSZNJZ1(I2 ziqYBfj9 zB6>Z#sdF3F{=5OVO3>iYeiL61>s!Y^SC#ta>1z-Mv-5dNKu5cKcZ~)qvX)tOb4%S{ ztbY?Zc=^V{J(sqqTi!7gKZ6iyBZQCSr+mRfiPO%dzlAC*=c! zmc9_mR9hUjMYiO&?$bqcS5L-*bMtrgFJh;sVlwyk#Dd@zfPR*?rMM2dTyNdX=khz| zmpzK_JdiM10*(7=Tj@iRH*SXzD5Zlfmj#au=Uck4Ky#$5rs2U zcztXZloO*$Rqd5C)pdVEESzivA+lI0VK&*wk?o0qp_A9+$Tob;6f>-vCTw`4?lg`| zRLbE%b5hUU%eEz)>w#0Bq2PHQJM*gjv@jZ`C@ zu7#yinEvDZA%dJKB~cfd`u+(VUnnhBU-50)AJx5vU;f7E+KW;6NIXW;3Bi3HfIgbw z)LBrsem)%qD0EPgDG0MWi{A;TD^B57RX~zEu2*zL95=+o4Kc$`wdL2W0#ix*F&C%?}&b;gRQJJp*3I8)| zo!ZgT6C;j{@;XXZfkrH~Q02tgtcd6^&#V`>Oz+UZimT8))AR_cw^ONMQiX|-kWFi;bq;**f=|y`a~A!9eHVZQ zlxDiPhvX7R$>OH61^-oA%H+cHnO6#Y|nQynRtfoA&#MdTuC8jh|@i1TAui-8ZXwRq1;AcR=UTK1lcBlwf6Y2m`uQRVF|c5Kq}%t zuoB7-?vh1>GpIFcESBSjh@tKV_)_I8$G5eq8{Y4TqKSz(rwr}=lR?&QCSRl}P%5o9 z???(=KI!Gc`{y}H2=8CT*yKd2#Y!37o(A0rvjNf@BcA8t7;>bpMzy>@hYO7AE zB^|%*N7<;$;fN1dF#^Eb<2AT!_Nh%Cxjpk=np19(;*7G??NB~H)3)dR_RfRdX2ccZ z63aF7W5|YX8+vtnVzk26HOO-H@$|rl#y}fS4}lJ;xD{M(EY{ZRpLH=_=bf}-DwJwt zxRvv1<2+FRn*Db8q++R7)0Jk%MHIVx%XHQGU@uSPv;#R`c0DqXJ4^XU-}Z0}N=~;9 zGWgo;VE?|aak$PrjpBg(6)pV&4p6iE*PhoD#t{M3K7$1bMfouQ;3*s${~G}y&Z<%Y z5aD(_yAS5~*6E1TgS$vu>Z4^u_;q@-q|6 z>}UGTQz!2l;WU&|tktoqcZFTJY}`Xn3+Gv#APh_Q0wCifTJ*-e9ZQR-iw)h_2VC|1 z9o>@^6hoL%VyB2wRc4XcxT|1$H$I&^$_FX~9d_EBS(EXt)OWG>ep2H5>f!erw-~+K z9s~4=v5YxU0{x(xI7VUwN;>J!fPYXH&4|Sd#rhamWn5h&AfI{UpEr*u91LV8E+_S^ z+hdfG1QetE*he)JCyH56Hl#%pf++Q&5CzugYtt_2pMGp@fkoAP2J8D}6 zW4SGDKU=7u1Y_HDgV3q?m_R(RR!Q=~ zEfMsdG-gM~G#U}3HKqKAT(Vl)g|%J&)JMv_SBzg%A}2!>GFQHJIA?lgqezx;UoN(3 ztg;Bk3AxR0;ti}E<E=GL&h1%;qU-ENjf%tc^OEza3{s;i2NKnM?hT;^C5b9o+9WKJFq3;4Du8A~&!GQi`D`FH$Uo5S*`m+KY?8au8|!hAoMOIdZ6R z2n@Uq{WlP>PQ%jMI3@B77^SOngMKYFkLpC3!OVrA@Qz~U<<=Mc3PE}BbXGJ9h~biJ zJH3`%K!H8#*_(y;W_Au^h>?oDr~}|)Or#hEW@@R+K_Z09uw}7klzq943d|8<@JK

    h!Ew-CkL#7+!+)@&03H!1k|bv@FI~pm8x%T+51^g^b@%x?Pg+ zraVO@|B9Kw8Sy&-^q$N1q7#Re7hNTV;#j$LtQpUE_#^kfcej9{E}Z7f$x+=!*l zo|8|XzT&&oY#j3M~+TURyuNvww$-ftP} zlpn3tmwapyupHG45}o2Y$-~GL9Iy0c`XceTiucC3ty*4Bh&R4J=pFUMniu)JGLF~9p3 z_bnU+?I2w8yt9$!$J;GZ$}4F-I{^y4lKdCYIK_`IwKlL`rhBUyw@@f}qY$Yy6)vQ1 zJyjI!jIt$bpC3<;m_ZNN?$WyrrU*eaEEhGD^k~7Rl|0sz&cehDl!sj zuy!=ud=~fn@WZ%(I*;nOh>Djg`{K=vWsJ5$%9n7tK$E!c#NKa&eHu}Ckvdf`94(>q zt1`rSluzF)*i(Ye>q+NW?v#L$BN7Ak^hnX4D%#DJ5`lTMq^P7!5#nyqZxEgK(JPAT zM81_Wp)*a5GAcXemr_i`e1>3hU`C=23`JoixYPTPROl$*`=vyXg_!?L{um_Q zl(DNNA@O#Ca_?!Cum5t=9|RE#R-6nLz8U4--a2MiGICt=A`0#nwEL63;w%S0GK_duOj%&R{;;;aa8cT53c6raq}o&nA(@$ffOQ0|?r? zi3TFHN=2C+XGIA|H?zTbB0H3S3T@_$g?l0Hr`pVx zv;7<;9qP~l6!E&c;%UO4(ud?MZnNTKeC;Qf*RMfWRAteO{Nwx&sR{m$dU{F9#8c(;ftR-=vh zHEUbR-MvM^(5qH7r{^YHjNxi#c)lU*%h4zUYqqFdO-W^1QB`aVrgBKB@$4fH3$(XV z6bG_JFDA0j1lPYjma5@}G8R27N-8JkNe0g}y^k^RPUlQT+I?neynh4O`2BNVqG2;u zKB~mR(I(v=CWkvs3ecu8N3RAY9*odm$F7o??+KV=0@$o}=xx)(UoZn<9VDGcdXUG5 z!8(eeMerskRP-$<3gM&-Il$Lk8^utly5VxB!W${%3VJn27Gt|}A~)1Sta$5RGUiHfqGq4W*Fb`gn#E4Il|x{YSp!T{~DyE1zP9t{i+&~$qH4Z zQL?lP>B9+Npi9(+a61HvNmMP@^l*Sz3hoGjG&R!{xyNym2;>ujoCtzAS{BPGi^O6P;+EQVRh$$jbEhIxrPr_TP}5OfNBfG!&Bk!@!i*ML>rJrCAAg^SJ@@V6#9dUuoI3Xp+Xj zjBZ{(=?xj2K^E>tApTE7i_Ke9H^UPrsI4gX@vNCSJ-4c+$#{C_Gka`<&-ZkA z1f$Z3-zFgD64G5*WssT|O|EaCat5gaY`tGAF!@ZibpS4;;0r-2y z>25XCM?a?TD3dt$1Pz=GW(WA6?%wk@FHcoD8CDKlBXBg3z9F5V;J8H(Ta#1nq}KS8r$CNDAe^2X|5MJ+WsL0gmtzcJibIfu-QgzOV^b$Daa zGI^CUw&7}^{VOMWF-+_4{l{`;-z-U=bKX|SmHov7_Pw(eGhPb=@ZLXwQ0^1jNX+Vd zE3Z~MRsCHa#zT8+k#s1Mq&kd^ea1EgzTzh6W}?7j zCmgKlhP;r$6257#yX5jt8TJqvE0y0&RpO74=>GO1y1Vbc$=G$#ru$?O%Nm_@uCBbF zG?_h?e?m|6!pCRA zM(<0DH1|flh0tK|m@zo9!c#Zj4&dMin=kaTAGn+Dpj4Ojc>CGbpIav7W2B~ z*xe)0a7B8(g@O_AZlzU*_Ylhg^(|^pwl+$(x-%vDAH#yL8NMvlreV{_Zx!mPi(K!} zZ%L+#@z24eq0q;kf#^Fb+FTo(4hn(#ZUThK{u~r^6O?}}gNBNdK=mlY-N}Al3N!D3 zay>sAFdGiI%ist6xO;srz=&Cut^w=Rg4~lE<0TJfEIvKo2fGxJchEu(aMSi_N*kc5 zW;MH+`NwISj?JEL>6SaLK=$Mf5L0d+C^}z5k0c|p_w;5hYMv6YqUZ$#xjT2EbS)8@ z=UNO29or~M2_^H}xl1JBa-^}n9)j#c2C;)${p7_jwF2iX)zBR(253~_ z^Ueh)uSh)rRhQVKdw196P!8E;$&%wM9v%cSiP8|!{r%xgfr{&}YMOwrD>7m=>U3?) z-iNRe4{f)`60&_HEAbs(Ir?=h@R&=t-_+xBfB1nz;-Xf1sFPhSXykW{2cA*OMSSCsQTy@^D5X@>{GT=i@*YrEI5@@i}y zpDdHia%Gzvr>V>keTzVR6y38N!>ZC_5Y#`JIbrJC%YQoHjkKisT^p>s!RE*(_ds_M z@3hv#4gU>ZavCh-2){(v-7c8&8UdiIDmu;Iu5vWNp9`(9_(Q;CfL)+>701a}qn7Qj z>x`8xXhwV&t$vz2q>(?Hp~xCF-vgQ=+F$2q3O}l=tC{8sv|~^hW%@h$x^C{`ze;CU z)O)`sh!5E~?roEo$yI&es^T1zRJhF+oFq=_amU`ELLI1Rg&wR^#E5>hkWYEa65;r5 z`(0B>zQW?`N-v3}Sl3E3@882^Ds1)O#TzpfazkIH&LKDRRVc(c1K!1S1O&bcifu&! z0rZ2EsVJUjWKVGx*7D|{*U6Mm(auj9zX^nAu^1(!s<+=rrtZHsXeST4ql$8gPPE={ zktU(p*^^Evu$NCA!XPj{Hd-IV=TK~3J;TDEb_%xvXh-Y5X?*qeKd3wx7-s}Hm%kwVK4=$1P%MRS8ld~BIH*eESCj40`zg1k`+kHg{^RR!1!xpf=7Kh*;UjG4tn}!JEnIMVN;|0V}4J6ugNkD;PGlH&R?xsF4K`RakmQc zh4Qz(SV3WKAM&sS7~~l{dY^J&E?A#}NV$BrhfFuJYh;S;a(3x)L6S334h6tvB}THc zS>|G{si9v(zif8Z)*zz+NMo1B^SH_Hmoca%-;FCtSZY|td%B1?q)EQ=5ny&X;yfnz z5VsvyT8P-M{j*aw|89Z3pTSQ=ow=%#U?r#7j*t?xjrPka!gJfMSd{J(xgA`%`j{16 zCHsfYnR9JMq4E|4&!xmd1EZRO7|H=r`s*Ec5Utcs+!1r(f^yFi8arJh4Xba$k`3o! z0ZftaVB1R@S%tIz8*Icxxm6!?=?77dVfS}L$PJ$bg(In z_c=g@26-yS9Y757;Z2IV$F$glt+oGa@CG1D2&~hc8~oB zQm`xoca|?c9Tmzc$!ZLIB^-N_wFcxQTMw$+C@!$v1t>0jTz51i75@u0K+39d);&}^mTxNr;g-dw3#w7u0 zi@-~!J!_KzaT|auh=tnNIKbQmKqO|vOCXI>5vkahhiHbc`&FS_u)Uf%ng5@G| zbiicnL?|pE4j56EQ5GTHg9e7#L4qTztW1o|XCgb>P<>JeVPi7G4rJ51Vc z@8miaQ1ODql8LnL_UOKXp}yoI2rMIJT_hayS3ZN`2xKI~rdR`tsd03Pwf<}rwq#^o zOePCnf1iA(fxr4{CIbNu`ydR)R&l0zC18$j-l03$f9|U)xq*R0CdN6L>%7bz&CQUkj%F%4PlE=r5pe-f@EuJct^nd^Xx$8WN zRPpZ9%!f+b4a2$6=;p(05PH1ZFNpASr77Y;6|{x?oPuMynFFsj$2{F0)OZx7N1N7| zYXTCaGW$+os|A%8?sl@rMgTSnba?pF{x|DI=ax=U3cm8N6ols3j_gIkAV&y9YTKAP zF=2&W#1#sUr~_v#$erBp!Yh5IVMrZf1H-7S^Ss?bQ%{Zn8te!qbSQmU)_{w7oiZ52 z*JJ@{oP;873!Ux=5Es?Ow-t<}z}230<{_a_J%m=eG$luqPkunt3=@?3KiOImE90b8 zlfo+6n_;K5xW-XHUPg^)!|HyWGF9U#~b?Y!#PAd zQKGRc`B~=S>#sa#lQeD+vQeHjl}^u9M7<(gQZ~}%zJduQ*p^mH02u~JAPX%TZZhYc ziOiH96KZihNO6qmID%#23svzBwDqn*HTf};^5%NE+(=<4dzX%gk~s$ByLc?UCx5cB z$>y7>+ie|C8}uH6d=)#vKHtLCqqFJ-B9HfW{?DCbAAPbyAh@kuP&*AjP{_W>}2 z*V%cPDZ~l4765ZM0T!F+CuIl*WHK^*H2qLN(vOvE`)G(}d9&^cA(s=G@5P%h5NAiP zgsKH2lc}gW!deCY81ZdA&Xj%%aZX+7<_RUg6?kA(ob0OC=wRr;m&Yx8xl0HT5{0FeO>V7sxJ*%S`7E1Pj?HvkWt)DyvV(G)?v|756SOQl z4FXJ$G^hd`W?;A`thXOa^H`^2@p36fi@3FrA7_Q6MGer2aMoHjBzTn(@vhdcZdCaN zrg_vrlMSA{ldIbZw>Y4zTm~1%kmH4XE+z+fy&T4R4h-MjinLlnB{}%9M1(*$-<-UG z=Y5=pt)<2mpMh!3?K0>2o>3k7PbSA+7d3W zY556%8q{sTZrco+?4Y&_%Yg~=*3R^chTnM=Mj-oWo&<`9cPXwxnzA{_2UwKBvDlLt zlruL~6u5V)A%D+x_Z1Q?Y2D7U)8>I~tcf6HBDhA27z*jVGz#GwBv}E#5(mXCO~R0o z24jw(QIykO9Fv(r@G)N78(D~^8i9+2>0sU-NA2C10T-zRcT8?G=s-ngzR)+QuVK2p zIBCRi$M@&}Op~5iJx5dN4TB0r23bBPQfynYXHa00oNG2c1%TD55hZD>e#k**ibRpC zK+nk9XrKcVpzz{P6T>KGH;%s5SiK?F-6#e5Q;7=6Dj2}JNFJ_d^~eSD2W2oBlcTO>M{5jXpy5{d%U zD(rMDq)`5F@Mw}CX-&L@w=E!XG=xq`7xmjsJf?B@aF;?R22NHH!Wx++e3bcG~S zT!ay{Fys==H%c6e}Te%PpJFY5!TomJQNc4`c zECoNs{ePBmI3&a1_spMRKJ9y?I88l>qfbc~x#1bRQ1#;;E=9|q3`z)7cwns$DJZ6dsvbg&Or*8?5OmBn_c{jhP!i4!JKXlRy zo~L~q(6q{GYC)&c2B|;;j2`85yt4l`mhc7mHust_OzvLTw-p5RJEToHT+AV?zJ_F=ID;V&HAyKmsvX}AZNp?545q`r+&1wux!2uEHCIrjzK<`jIhM?p9b8p=#%06= zy?*FuSck}X;x1|Ftf-C|wiVq|YARm7RxnHK1lP8#<3ixObIRq>tx(l1ow@}WKoI9- zyJ?2gJn&18N*#fbQZzDoloXN?RGoRRcCd2p1Vse53_JFzPggcV%{lCbz)vH3eTL!_ z`SE9>Gnc_1=!8aC6g3JPP@{k}0ySO*3okt3@}>u5fk5%SukC|+GhjFX+TO{U)YugB zn9p$uecCQ=PhWbLGsQW!4oKhdPTM1b(=%hOn+{QwC#qr9(i+qFS+obmeFDc#3?6w~B((OXgm_lNwriB|3 zbaX^P7i&0BfG$X*6Ma(b_A!!jnkX_aX+KYBB(+$>35{S>|FW-Tv92*mjCU5bP#zLN zwm_>1*r=`Ev^~q&Hz4^)L&Q&4Eggf@b-FJXX&M5q=m83N_@V@0)X#>Cn~h*(5YZGGQIbh`!yp++(e=0o9Q*YdJzTt|#K>nP{izR-*bZ3;O{O%qlBBm;2thGTfldzSwuG9tC^T`f0=ykrY=imgR~-BS zXX(B-B!&u#qoxV_%c#VwS&5Yj;Hsb{p^zmU+VEhwC$C;cHrW-&wQ+65?BYmiDsE{k z`C|uuV7)ZRm$2OgH0u+eX9*L}B)DOrDtO`z;E1n+J@qomFq4Z&0z%PIr9g)@NU5`r z6=-x-8%zR`;Yv0c5ea1}L*P6(11*nj5-}(xT zFkEkI2Z@uug(7=3OSJncpXZ0@gx(@Lavohjs#rN51rR_RBZnrDW3p*MLxXN~Co0XA z4S^Q-PzNRqv@i?on3)K4fNm$;>o%&WFKD1yI~+VD;$rhLsnI_@h2YkSl#jtHL|8bo z2UL*8{L#*&wrL>!(SMO$IJwubk-~zC?VB#wR)9G)wu*5EO{z?Tbfc;?h#FwZDGFhh z-D}9}K($E#c5WChk~HUl0gbW)Ut>Qfrktw!0hv%MgpyU*lLusS7~r3eMd6p=ayskT zXWxXb>m0wx$k{ngO@*6!ii~|3w5rdnnir#O7ft|xmDgA@2v8D=2eCyUJJFGFfU;4t z8bVL>0n-l2vw6rsREdu1RZkp8_nh)@KgfH5Ig!XGM)h(O+9!{T)j*^(3TDAW!UR5d zQt?!3K#JQxBg+!~DSOStfb)VTy?~*~L~|Mwa)`46e?BntD?Z6OohIO-4Kap6WG4ZC z=T2rYT%6hJLRyqifM7I7za^+cr5Hd4vpEf9A|Mh$qEa%eoup*uSA7=Ln0Q7wSxrsZ zLowrNLKfQ-gAcSO|NefL4e@Q5h7<>Y5$RU{lf{yy(Xv;VuV;P4E;Wa9#d~oTJYQ<9he@9PJVrRah<+?~0UJfkJm*em@57e@THEh^yh^MmqFu0^DZ1@f#TewYZm&8+@`s* z+WSw_35~^60;0OG*qlRjwUF?GiTHH}`0DCt?sfxya?Nh5QTxzjWXhF+0U zYwW+_iE7;j?TBV|d2&2Dvj``}x9wpfrUxln6bcO$Z?STiSNu zVW3eJ%7PUrMUnJpbydJSCbY6LJs{J-Be;RV5f%U#mGn$-L@as?c|^chcErfAX`?Hf z$$KPtL`{y6C^YPO&d|_oA+ur;mEjOV(y;ZKR)b2i7vK{g z%Zh6}@{L{uCst;lM_*79u`or+{4=fSd}2X3#PcOlg`U(?RAOy|RpDdnn;W;)+%y#W8NW=4Fdez9|Ok1L7k~{Z41`#D0$n$)Ddq=)(e&2X8 zKv_CXR0dSk*!m=5iiAP6efJa&tR(fa9CD&ewC97QPYsof&K~x}jjzKOJpCX}7*++K zwjqqJ5iiS|8)@I-Md70bk7bVCG!l;RmR;$Oq+DI1xH(Z0-7SiEOZyO!oKq+o;Ta<~ zfdXWgLP8Yn@(&p-CxSbNQ_!ej^CxaLW-EaopStH%p_6$Aq1N(a$OV3hxS zt%d+n?1qqF&op$?_9Wu?9Vd58r3n9KpYpNGFyMe!u#n?`*ZX$jBW;Uw8Sw>8bpUZP z7X=Nbh)gK+LyxuzNK;x!^LzsVdWcYPfI*7Vl=kib@zM6;)Pw^3$;UK3ZlqQ zMHz~EQ#6EVD<%9`zrERJP+LPU)zd;d^E4Z6jK%^XMC&05x8;^JC*$g z;Oa~tgay(r;!(0X3? z3&Qcta2y5C{T2}gh_&89?r+;f3os}w1Hp|Euw;Z#{o z8&sp8?C?B*ayUmiK9`jABc{<7=6iYAEEyR)AclZI^pD?#B6OsiqBB@t~%<*jl zG&dnaXQp0Ik)=XLln4%-+=~2kNc-V5cw;!G>ia|*XymB#MT%$eWdo*&GX!Yr6!O`6 zSMz4K#tRI>2uNU$lpXUhR~igFi(yq^Qqnoj>L zSv>p3GySc>DEs!HuF!N2b9@~oQnvEu74fEGE!2=~rpc<6$K^(#rEs1r0KZ@x0ss~> z6p(QogLA09-{Hk3&(-p1_PN0`03h-nDuSy9pT!`~Fw3#NLs}z?xD5?GtB{FdwC-pM zpg03-hjtcRSXhuzA~7r-gLn!E;-kSjfAqg_ZF-6!KESG$QjA0=rV{GqO->UBA`#np zi!BMR3^OD5?Mkc>vwLL_DvxeF-?W6m4|ygB#i>GEofvJC?JDFvY?j^CurdxPG=Pt|bM5e9J}Bd0!;3E9CN?Dy6=?3*WM8`;FIg zHw!px@14}boBg^~eP9$Y%epa|Lu>8+(l)tpm_Z^FY3o*{<(IIH_t5c(TiWTJ$T=t8 z*xj&r!th0tj+cA_LMQeb<&Z00Liq}Y5XYzsaO;@@QwKOTI!~$?G%r#-!hgt782puH zK7{g_zFS5Oq=*pr*iY#%Y+nA>y5~U^2U{Yb_{b^v?l1!VhsXC+tU$pVSPz#(0o*uZ zFDMFpy|B;~9al($qqYu0Lbcf`Gl(;y3dfQR1hIbeB&w>&dpZWXj56LCMlGUFk!ET@5Cu{QWL%Nc094CVGD zzaP_gunGv@5a!+NXb#88xO<@wij8_;u}6OZsDTE{dBE%se|Aq3ZG&Ejl8?n&&M{C{ z9_s3p$>s(cIs6d;zHD9dho9{m!_>W^eN5TDIw0=9TzJ1iZu>*}6%&>2f4{IkHLj9B z@*tmBw4W>uKyWJfc#SwiKDE8Ib~}Y$2nyay>(0kCrEq;EcuT0UnaolPsT8GZlQc(K z=#bo3u^o{M5R5R}0Hn)xJPIyCkUJRkj5H!Ix)FE;T=fRd7>LS6V|?QfeNF2t7|L_q zONu=Sa?obM_#<`3Zep@A+0Q(%1kMT074h8(@M{lL*YspLetXhDR*YJk((D2EXZ7HK7@|H9W2VYeMsD`nm4=2 z80iU?3Xnkm1htF+AXY}!eq=}UxG2AIc`z3&e4AX6Au5{fwi^&;)zHo23O7U$6NsKJ zrZ4&cLeLYCybp#cr-0m@7+V3SLe(eXEL4j7zT!N6pTh0jYAH?=CeXV&Z3b zP^OrGOViAfnPEf;4>kdb@n%<^9*PoW{w9;Pv6gR|<(#`H8__Ds>?5GVt)K~N%Ne<~XBFtbmIxgRWs{c&zf=JAbDjgIT0E4vdm3bA1 z2>_wRfrWZruntauhvhE#;X5a=U_Xfo;q-vAy;B&~U7SMVR(y1NaM(lAhhkWZ6*yG09Uc*R znM>w7`&61u1O$c&ETKa&Iqa|{4Guzt;JnPVxFTW6#=b8zSEUM@BJ0YBS>0ygH3#;6 z=1CWcEIqO|H%Uw%$)Al9BNM=TBp35cG*&sM3%a%MRvSEro9N$iZuT~yWW01=(?A=@ zpq2+a*Sc=u1KKbIlDQ$4z8y&(D?%m1NQs*3M!jZaS`5m_FH+QGUmWoQKE4Sj6F5o}<z*YEY`0IiCh#QB&FA88Tv0YN`$5eQ)wY& zkKddfAf(CnsQv7tCF<(XtA|$WoM@DJ?KQg+PyFBLY&a*xs~hhWDQE+VXCQIv?rC>KV@zmBLXRRVhbVR2(D|&oMbvD%F{}y2yY9A58YMea4)UU;H2? z?v~O6k?NmL)GRX*_C4$RB;Pm$1p|guoS^JPY_&SFufQjI(+b`RF7`-Wiu~KE#4|^q6{<;r>~*1 z9$e}|1rJY+r7eN8gpK0XVYj|vk%KEbHxc63aVX12=wOl6#&(|z&_`ED38z1f_jS)S z>y2COpvEeK%x@*+n)q2CDeiwjFvfhPp|d1_gB4r_i^eo?rMV5)8$uNTBkjM2I#|^Z zu+D_g>oeOZjR@}L z4wYg4+QJ!=%{+J&lkH%<(>j>uoEb4S1*)&EYNnxwQ%d0=%k~b_bKsT|`k40B(F)u2 z7&ORF)v^aIMKX}b_y3AzAHGM%c9Dne*t>Y~c=(n`?`+&~qL?~(Dy~7D0x;UC1$C@z zZx7XEC0OJ#-p!uaAi(&MtzkXQ?S&KPIU0N#YH81Q-%CMVZ==$ zxsN5ydy!qStU`(z5cv8bULS6!^p=|Rud5mBD%=DD0mDe|BdRbkk5z!|pD8z7q#NyO zPq2!tCM6?``Y?kAU0(hLdwfCHOo}2zm#XJ`6>!?cFoKNB`Ho-_Zu#4FLNTP60CJW* zT3C>k7oxyAivz(^6qQ0sgu#&_V975ysBmv*5*yT+Ie1hnv>4IW9`Od3PM*b!#G=;= zJp|MX$55!9C|wbzUq^EwOL&!T*o*LTyW>pu=$pFe*cO0}A zDWDMn?~<8>c%FNVP1bH2C|FQz7Jiwk`0PQ-s!aT$Zms-Zr_AUmEHG>9G(P*PbEFUp3>mKS@Y$43UNy8zX-6aq zi47MF!Iulh-U{aU`8<`uRaD-m<+VxI7v(S-M3`q^iap`O7+%y8^I^ZQnn(8ShhHF> z)}w@i3MeVeFFX6G^BHDiQ-_d^4RaEGrdJIdBq3k+U2j714Y!w%k?todsK6RgbytD_ zw??XC_&|v;lCKMhTa+k*=xH)|iMf2d`gh4O3JiA1xrYdI8EX&27w5K9tiXq(&Vx)Y z;%=)$+2vmz?VwXNzqUWguCI^UHwkecKP2q9(yeF1EE|*2T4*L);W;D{Ku7$Qiwm*O z9kItf8?$hhfZ0AKq1kqg28KQcq=Q~;6yxDQUMTen;dIG?*7jILYT$04na^VSW?@7lm}MU$^;|e&)Tlno_*ROdK~#B!g7MpzfWk1cxtMT!D9vb-E#R3LVSt zb9-1pvrX&hA`b=?M;u(od%p`}b+efv=ECi})j7GiNtkx68ISR;$0LQ=2O^+yFlkQN zQb#v5gjd*O*gWMsOp9-BQ6$wshhK$u2VE3A4+LK$xi|@YP5NdWmSx63P%F|MT49$v z;3X1&*gli5xfI#s8|OmUi2|r&C`Wr!<7Y#siuie2VNlBQ19rvCN)Z@?q_8W!2w`7V z&(};4xE7~9x&r^s;9ZX_UijV&$Iy}&K%@`TuHp(2MRqHzW^*~;OmKm!U>A4>K}g01 zyn#kw*KOWd&9q+93LGqS9l>h0=F8NaEeaIWr>+PJ5nA@7q7h?^2t?>N@eA=mK|kQm zWR`<){3|I_0?2O5^N&0rN<-=(1{K^-*IV^m=jo77z#zL; zq6cC~3V=i9P!~F2S4ru9>6k-U<5Q@i7F9PgN6xHR*0q+^Mc5A`k}`BiMH|&~VD)$L zE5Vl9M7KS4#TR}KVsu+yPRI_cD0T+Ri)<)D6XEKFy*wyGLcl^BvA`q1pe+r4gBr$N zEY*7Xvz0)Y+9{hM*2n%EuUvdj7hlX2PmPM}x9~Ig{o%_-O)as4kN3)<6#C;vxYLLW z4hKo$HhIo}b?XL>dvF9#omnR$?UKsm9uwRx?9BWBfut_5{Uc;^7Uv=B;Y>$w!*(Q& ze)x`EPzX)~vU|Sn0vt|nV94WdV*Q28`0uM`ERSRNx`XOCXNtTtnseWeO6a?F^jH=w zdQ1d0iy@pjw{-k*@J2QItUp*`>Coi2+Xb>ywJY-`1vABACe$3`vl0!*6-dBjH>&m$ zf^=Ub)NZRp6cx55L_xkP;7D;QSUm#q`^QgDrteQ``t;vYi~%@!iX=2v*mahCQ3N`m z?EIvqT`V9qGvyl15lMlNVfpyUFn?bLCM-JLoEt;|J(mX*oW@5BmJZRwvV}2K1zrv; zQPbe-KJ=oB3Es2|2~3f;HLXC)iQ+0RUda@0U@907M?!^0JwScts|!A|`7%jQK=8oEF|E%pn>NL9_$){>`y1 zw6F5eoiwe~xJy$!Wn0(dQMFI&cPC9MzcIHVlPRd?N_$=(AHNCZcxgz+2u39PgSku* zy-{PABHI;Hb|xj{yu1uc5Ib=XezlZBN7NX7hl2*m-A4}UJ`CH8R0F^PyCMp-Em!Yk zNCvL0i2GF|H|$!a8h_G;>_r zFGR@+3$a8mwWikfHA%{22Mkp;zu(zfkc;X?O&Uj^+7Srtn@+4q-hF8WWv`Q(p=Ps~kGgpxKs$8Dd~+3W@xC!;X+$ z?20kVM$ik1fvbB!I2ihg2X|>=x_FINk12}gD^WR~WM-zXf_soalwvF*J3^Xc7)1Ws zQIWSf{AGwvR3?#y%U;g{{W4H*P8l#ZE;jLhd2P3;jjK$|LNwxA6yy+MfrcNUC@Q;7 z9r;30u&7kbA}!&uhdc?23^g#3w8rs*AJ}2A4K>DaplA~ z42tw4*vvRU;{Zf3L9A2iq6tE z)doTw)ht-Z>!z0z2pTj4vlX>a%iUVWDD#C|Jv3Y37iS&1=QV zE=~lI6-?;H)4+swW6X)?&QN?zC|F4bLxPiJVN6ye8rEIurE(&5=uT{kd-(V-~m*)(mmAh{&~r*I{T>$_dfjLylUceqy(PJtpN zr&%};bUw64JR5n{A->D)2GmL{v;KLjZ3ona6s@A};a8NIl5aL(Qwa`Hz!1r62LW*< z3yuyMVKw+?oAhI_h!MU6MDpKO@k95VA4`w*ODZOTjVK2ZqvIQ7s%n}zDu7oEKkR!_ zRh2W3c){&QXk|Z1kxK@Yfv{A%SeWGJ#v?|Ko1|jM<|Di$g@X8zP{_%=P$Lswjf=tE z7m$s$T>yEUxZy%Nh@g;Qc=FrEA4@Qw0Hdi2_mr3L{F0yz>9nV7U3BXPza%u&!mM~> zr2jv}zu*)ISN}<~2_=iefw}3TKsZ~1ux`y^D6FS&mk?vuMpI-&^yM5gU(1MAb^|Xn zX&+u@Vsm(!!u@J9(*EPE_25~hxif6sGz!x#6tE7u2$q{gtIa)gTv-yx@6ZC?23o2K z1i=bxT^a{#@yj%ktLkm1>@slGzsf763x2I}^&tctQK~-cr3rL@yB>;n<-nkg{VZJ5 zoBnJ~b3hN1{U-`}$iksGnP}iiQ~Em9Fv{%KlHW(0*m_I9f}O)|c#D?HMj7*L!P|rg zG@0^l;TE?zk$*@@#0nssy}>pxe)_5r)gc>f|0Vbi8FUP(?7Crr56ZN>0Qv@0F0>R< zqIhMU=uR0x9=!752hwm2Vb40|y8+i}B^tIvp!Y2>d-E|lO!Z5XY^_U8$Oso6In-+O zga=80mp=w+(ZrR^Mq@t#XaU?=yupKP4QyVWsyg-n_7bZH{_$Govu%xW>Gw>oweFhG z$&e)KDi0@+e`XWtpc_~QuVp-dxAgkFO^k6tW{jg19Cy|i>Lu>P>zZLi2vurYBE&LR zuvplL-3mtrpCDKY1$1yb{3+BwIB0Pw^dXjBDZ6*@PCkIl#zru;7s+mh5>pgxOf-6cPyCzNlQ6G3@UgPl)H_|G(zt&BAaUnYpXKa!@@*Kc<-Bs3Z5`(N1}-dJ~d0yW}PcoX^>=#@*c_UC7WGYe<>6zj*xuCRH!*F-d{;w69iEdr4l} z#WKctn%r>s*wmEPfd@CaXMI9Q7W|d_h-+c7fmHrryYDC;{`0qdf_hDmbq8 zrNMB=B7%Uoa&8z{iBX9>b=!|-@tnp4I8Y;%Lv}{77tWDIB!D{MvF<3A7;Vf;H{s@OR*t*b#{bckk6syg%$zx6Q%LtEmVM{ zwL}U?Q!~AS5L*RkP$vod*ia{vko>BwP*PffcNK^WE&wdAPfR?JKbAQq9=@({$c~`J z{29ep*59Qfl*$U-T5wcpjQ(95R`=l3@(>*H?(%pNUO{{(NQ)e2{jwr6hr)9=P2`?| zV6r%G_9E)}5#+u{W}sdP(=smTG@-w< zG+JwRaRMEm09nrabofmHd-V9hE%7BZu#M=YwntH8QpJ9E{Wyc^%)j*tPk5laymQEA zP0qA;JX+j76@>35Mand5#AcB}&y8y zVE^rp>#^YDtN>QJ7`a2PJqd2Iu_3a0tSiGxwLv%?NR8J2JzmiU?ZN<%gLcn|nK>0{ zhr{*v|>ViNu_oiJR74lG5^HO?;0O-eQ zAK}$~<7Tje9p>(6Y0nMENZY(bft}EqTeVTah$+^r2N@ZP;$)E1(q#4w*F_B+{G8eC zBo56WngbbPG z277_DJ;#?cr$oXBJ3+dA=I@Yjnt?Y7FFQwDfdHut3PR{eq9X0)vog{t#D4!YE!A%b zT7rS=KQWz~48*SNRt`o6_p&QQ$0E+g*;EnbE36JAdNS)Sz~Y%4IWxV9vt&CP{K638 zA?qqtr8&%*FQvlfhv1_@xg!xF>_mIw!EMMQeqdO-aiAC$jNI2#uSE#QYaB3%F+H+X6l>G1^#tZiz|mBDEl~DiTH{I<&Pp$TDTKDQZp?#o!QiEM48xlAAuLuN1<(C ztIzh-t^i?vj-{uDTx+l6SzjPVhD=*8>7Z=1mHuT6v4dDd0Wn4gbd}vi%Q~i{c7uBU zl#t}RDeXL$oX(2)HKnA8Owoe2awZ%u3gtmqX#Q2=J`IK$#~-bnwwOy`_)n__G*2OL z5M(!4Ku$L^pGD13>=~7VIC7{?Bb{d)Z45<*WXds$)>h}L#*l7a2E>yrLZJXGg}bwL z7i_NaCYT|dnDLJYf=g@!Z3NS<(YHmW#Sec&is^g=ZR%=@udh(8Xx2Ya0``~8Ah-n( zreHGAl*o{RIeNXK%cw)0nlwRixU(X_AC==>f(G2hahL+V9434%{OvB%J)JB^0u#bwjPVfWT)Hs7ie&W* z&7657`VR9Gi2~cP50^DwU>1EZ4V=<=H1Re7QNap_>ijy37yt`|<6jeP51HyWHD8&R z<#OyXr|dpOe1HSUATTl< zt^JiE0C*^{9UX;$F4NzWK%nLcO6+33kAO37nXc9R=kcelL7)Is6C`K|q3~i_uB4a| zo+K9hz*q$@qcw| zzL-vQTP9j+caTx#Wq<5A1F~RqNigrCxnU5HR>pAygq^Q#_>q-(A+q)#nwi@<7s&?w z|GxJwq9eYRP38$8J4rTy7?rE0_$IrYWzROI=KCZ=qo)iEM=SgH&31Etjabn>N|AIbD zE*DFjIZyD~e2Lc>hOsV+F+*uKlmNCk!~03H#?F#u1Rn&_M-vVwn!8F&jv3MtTfFpXEI|XcuIxHqpguESf?-nO=M=Uzs-TJselD%DsYvChNgV^ z74)N8C`Mn5z$YtSPuXUhnvq3>wDq}ZR>T7k7@9(Jbp(|?vYE1gAB44eSt3*{u2iu< z5e$5K377==Y(_sd?VatlJ`7T9Pft5pA0288Nk1;IIHmbEZzhNFGgXJ7;oyInVUz*D z3IO8<4)3gA-OiQh(v(a;1dZWL8deL#vZ*bU$t9Y`l}4`{(6sHshSw&wp-=&y1<1qv zS%M~*!|V*M(_L5dP{jTdND1m6B9+x<|9wBH^8u5DVqojfC6(|)}ql? zkf*K>i8)t?rP&M1!o8*(&NG@7%8p&;l=tKwaTZJt?ZZD|ep60S!gO9Rgld;|MN+}? z@63aYf5f#y46IUQbDLoE{q-ljLFTvw63tcz3L}#(D&-3vRtq4gXlqoyRjo1!Dga9= z-5wkTY@owcqtiS9L21$1pO14SJcsZR=xq1FlNE=Jn7iO~*dCZS{=p`YN-OF!ji0hV zoPh@F?<{8dOa_OhlZh2H^wxwc>e?l9o!`I_HnZe;7AkGAhB;7r%UdWIEy43c!38^z zRBG8Syh#L64vTMJYi@}jRQeg}6wIPPGXrSllPh|~+ZWINk0YaC5gVvh(dx{`d z0kUKQz6(k|XU3xi8JUg zqj6 zN1egsed;6=H!!)Pl7@3>S;8`pKYD=#eMMPfAt`R9Ln7J*;B2p0q$@#<5e z(-*l8QkL=c6J>G55DHkWj0zXA{z@R!L}+mgKKd}j;<=o>pGw0X)+>K@`Y6<`k$V5hl>TCuFd^2LRNyRDe{|Rmm2XHcn z9N(Sm#NjJ(rU~4rqw=w`qw9g88hU~t1$0mmbv6envfao}1x)~Tkg$|@}&r%E&U_TpY zV~s|Nq&ZfKCVwPN`NRR=U_t_3a#exx5_v&=G$$9$`u6?ds*00t7T^lxiIwzw5>F5= zgmP70Oa^2jsCE;Oc#+_ve^J;Y|%96k!QLf8{fl?u(EIR_yOl`Oyb(_~btuvCTMhA3vt?%ZgP?CM!q=L>Vm zhBzZfkWs`&GsdlM&o|yYSR_jKwnuKHQ;1o?>Avx^EOOkr+f~$&lr#o>07u5)kau~w zx_5k5qbjkMRbaB0jYGN=4@qGixeF0|#rS-~dce{BHn634~7+-R9-Jd=4Mr zMda22NqO?~rW`rP7FW&ZMNg!TAxK&&B$PKu?Fi&DTg9GTT(Z--87U z{&r6t4yAM><=O5%$|Mt^#p;Hr@@6z-?GH~e4UomNq-M(MC?gT7WqE+0bYR2&TfDXb z9m+N(lfL=@_E%K{k_Da-chbeeT%n@LY&r0sy=XB=kE? z2M&R-|Fiy$PWJ;nF-~0$;nEoji4iq47OP23sXoE^tSAr67YmIr%=w@Q)mIMDtU0=& zaH_bj>*G0W!x|mHq;&z^7S3RYRJ9rWfRz+d!2k}Lt=th9$^$E=zgSxeh7K|kTb`o| ztT{hZ%5>$|qhfY!%fx~eHO3x4fc!2Tk#WPi&0Ox`d?ID1H59naSOBwK01Go+Ve}j3f@$I|S;T>e(qEUwWDf9~`cSPf@U9t3Wlx6oNQwCqIff;;M^R(^>P&hp?>9VX%S;jh}j7HMxRnRkE}-J$ssC2HbXuxG0uqAJGlnBu3X-X`W02cQg@r13-7 z&mF+p5XUFopdhE2^8cJ+nwyGgUade|3(Hs#U)$IZ?8}; zX5=i+U*2C!ZOI9G?J_kW*u3B<+bNUCR>PGTp&?W}#W9PP#bzjPv5Hp!?p_c34PEbubnAN)#Rpaa5%%5Yx3;@JE z7(9m0(p|muQZJY)q5O{6YVYR;U;4oV8O8)bPrN^zsG4Vej;#Qh3^K=)xaDOy8$Ef* z^frJ8s%z-Ns=Ww$5{Oc`;J8|5#6{$?sS*PrMcozfHuR9^a19&vr*1`n@vX96f08KS z>q2SOlD^axCu~b<4)$21xK{vpHe_2a%aW)wp-NG#-Lvdjw4H7UkRs#yP$mA?WEPkJ z*HHn!R{>0bo&| zeULX${oT0tQ~8I3SJmLc&;cEl9fSFE<-n zi_72zCuyuAUMTaOc2HOabDJxZ^c!T6g(!0?QRN613=T8eY@CJ_iok29lHgdeK zXf&-6x{0G{_Cg;YPf=(wB_)D#<}B!A;o6RLzEim0M!@LgvdZ!Ca>=*0U+!Jf~ z0@7}Zk;wgqpv*kTvX2Etqr)ug?X62LQ1B(Q?aly57!rwC<6Hx%^x~Aj&7YmikXy(R zf51I%FBlBHtSEe3*tn-648_CsP&3kjK;C>64Rn%Fpg%!hEhKT>o&c<~;qg@4dxWY( zm06IGwM2-hICL0Ty?Kb>Y-~_)n$iGtb_7`hEf}=^xyWRp*GrW{R~_ze^3MvQDHy~- zI@xEI>?xnSo6x5U9S=3EiQ<@@qGEW}Ogu5KIcJt}zheUb_m90DQ8-YV9uT3-sZdIT zkamw>-(202AaVs*;!WYUcm;=8$^$whkgd6rBKWz2Mu&tk&hg;@eT%F3*ITj? zQWi!PE(`^sN{$OW0%y+UWK;@Id*0mj0+YaDWQj#-giJx`Lz}c3bAk>n%drLMel-G- zVT$uCH^{~1gDc0daD$IIwcglZ2_z(>cG-#c#;El1OHu876fYCDs}Lr`gQALAwtl<^ zIh>Nakt&Dhv;on|2X-x}uwjL&TZ=kXOOc7bMRr*^wI*XwL@6$*7bda-b;2Z>#t9la zC*V2T0sJT5Fq(n$U~Flq=zbVTM%xeh2pjA>bwb+m?1a8(=ZeVK;FRcJkmA{F>F%!K zS~_Ta&KWzS!n*;5vgp@TME?Rh#4;`eB5)ZT;8cW`G-IAG>srl~?Jh(rZ&!BEfK-sm zTU5E}K`f$4PzGdN3VkmUBGh7SSW;Y9O@m$2zWxS`8YdNXf|4pjH=_%|2$gfYn)Ne=WEc^BMa9T_!k8Eq?W=~ z2w*j8MYYQ|VULL)ZzhtM=p-hE2Rlx|iAi*eA7K=}MT zjpYKD7;5Q(W+q*JeU7iOEP%>dqg;r7@M^x+wN70**e=g@?_pwCM6wOhsB9Z)^ns{H zs?P6^K)0wsQ*d>@C_D>bcsd09`@#VQH~#Hv^Z-Fd ztb@6+g)T_+XyCsaVtvRoWEdqqG7=R@WtkZA2!xPBHK5(XfHG^;#unSNWL=Yb zAkvCc$O*{qFp`_4g<{qrm@wNMszKKcy*^kF!=?0^DGoZs9Bh6ogXUy35*VUH2b<)U3|#Wvz=~#>m1n18Mz30+NiKOnJYQND-EFTzo~_mCMBqe#?0-x){TYMlJ6MYLC2RKpJBy zA{qeAi)k5R{C16DjW^@mToAq|!}qDkwo}oKrCp0Mb%Etph;Ydf(ax$NGOl|J#glO*bMM$pwxkap@arTG62T`NkY3t3WbCV zRTXY3q(dPH#BT_h6TT$eM(BqD8G=ECL6r~F&>U(>!2ej)#>;!ZcbuiXfCW6@i*o{HT-x?T5++xw)?uFq8-CHy(~J@8lM|H7Y+Zw=mFTxqx?c!6-) zaVzGZw?4@h&0g{S%>=7}j0iz3#Pi@IZgxAVO#p!!yhrLoOIlgWHf}Ov&2~>YU*%PX zUIduv!4n01Twsfa{t3X9lMJ#;w-%EasLywI=u5AO<>^N|Bez9H=!woqK;XI@5h1}# zw~ip%#)!JDmf4B3E+njLjHlc?mZKH7SdS_gus1NdCaI_doV$tFubBV_tY>!JOG+rE zxP^v*D!DkK0J2p}pv}cKl8XFKV@ykLPWFVPtCEJ!szjx57$NMNWEe1dkSHikj0Y{pxWzLKPne;l-K5b3@PmQ4T!cHBE;QeDyQ9s`c35YRH{lBI?|95qp%x5E# zh;tFM%v5j!rM|nU1W})au9V`vGmJ_or8gJJbG;ICXt_6AUl`~Ohy$jJ)7JrEXSMs9?B=$HTS7y+;~ zBe{^Qi@9|w!)GW}=)B?vGT%2j)I9wxP6Eh9;C|Cu*I08ldM(NwB_fIDg_}y`voGWu z;ELHI_rsDi0HS-oPM5 zBDsr$G}xQYieJlb54HqQ@3ILZVGqcfFD~}C86X*1BYz+Vo~$QjhF0SQ$#}%JK^I3J zn8|MpBbxfdeSq$1x3ctja>@0&`xAUJKe-ngjUhjS>{`yf!81L6KV{Uhc(Z8-3f z%kequZPQA##?BucVOnN3Z~7gK!4BBVeUPh97^guo-@l!=3FsoRdA!A=n@hR%8{R(- zB8JQ85hS|qAQh`(gJ=gW!gtK!1-2a(n+_1^cG4@dUMEx^@V_6$E@`$Nx6s+SU{r@V zTAVknjspdh{QpgrH3Si=iNTG8U*y|EjSI>O1h+ekhRhE;96of6d)MmY&MNI^>^D~~ zS{>t#nbil#%AB_A*-Dv}C~-^Tzgd>x0vzKG8QnO-DLScHm#LjlVx~=Z5lu9{-m3$o z`wN>pYD1WeTfpzqCU#osj?16h*%@hF50L>j^t^ttbVCO!-HaBv@@!6 zpQ)+h-b0g?qWR>l(_hLHoq381=&u18zGzO&E|`gCzG&k}*c#(5=TTP8l}lr?6Qsws zliG1G_MBr18GMZv6dK=4-UbDZXxFZek1XKWTwY}_6)^&wt$~?Qwtv4pl4einrA#?} za-h{|#WNR4!o?9ol2D^bT=QZzv~FU`+cO7_cyo6tF*-B9(0X$$K(_hC9wV;*Vy>2r z#_N>>39Gb=Rgu>P$O90ZFe=!Y#wj2I*u&Zi(xD7&B1y_^FvGOQaohd9L~`^Mo7E*O z(^m&#XXzn?aOegfMiW8<-JWTNzzHh-5jMHzA~?rY$rva<4B=zQueYsaHrei2BrxZg z4i8vtK$-^EW$BqqK7y>qfo;eLl9c1vu@p*H%CMA3<52BjMjT}oy(FZ1<=&)6qtEK! z3krmBvkinW9no9%jm(COJr3!&k?&%isIuQ|vqSdAbdf8YWC)n6f&i6!%z`N(ypVl( z=_HO2*Qc`$y(Y4`g)gsZ?lyU->NU7hr$vfJM$=rgGh=N%aRT};VOkj&QktT<^<^a; z3=7Qt7k59h$_A_AH+#*YYzJ|&W{icQry9t%!9h=NuZE&?s`Y?s5-`d;7^C5%`SShk71;Q?rYt_Sg)ud8qM#>V~8*!b63$@BW6PK^K zk$}5S08e70{XeP*tv6NB%l#o`YLLm7Qe^zln36!XQBDryvgDR9G@9!iVovu*;*y{Pv@9SC+oo~TuctqL!}W=lw1eo k3oQ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ 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 2a73cd7c10f25c9ca99aa864ba1fdccce215c990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21845 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 diff --git a/output/theme/font/fontawesome-webfont.ttf b/output/theme/font/fontawesome-webfont.ttf deleted file mode 100755 index d3659246915cacb0c9204271f1f9fc5f77049eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79076 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 diff --git a/output/theme/img/favicon.ico b/output/theme/img/favicon.ico deleted file mode 100644 index 2e2d468f1cd5597fd809f601639573c2b2e2f45e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69182 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 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 = $("