13 February 2015

Raphaël Hertzog

Mes activités libres en janvier 2015

Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je l’écris pour mes donateurs (merci à eux !) mais aussi pour la communauté Debian au sens large parce que cela peut donner des idées aux nouveaux venus et que c’est également un des moyens les plus effectifs de trouver des volontaires pour travailler sur les projets qui me tiennent à cœur.

Debian LTS

Ce mois-ci ce sont 12 heures de travail sur Debian LTS qui ont été subventionnées. Voici le résumé des tâches qui m’ont occupé :

  • Tri de vulnérabilités CVE. J’ai poussé 24 commits vers le suiveur de sécurité. J’ai passé plus de temps que d’habitude à cette tâche ce mois-ci (cf. ci-dessous);
  • J’ai publié la DLA-143-1 concernant python-django (corrigeant 3 vulnérabilités CVE). Alors que j’espérais que la mise à jour soit rapide, mes tests ont révélé que, bien que les patchs fussent bien appliqués en majorité, ils ne fonctionnaient pas comme attendu. J’ai du coup passé 4 heures à rétroporter proprement les correctifs et à effectuer les tests correspondants (afin de m’assurer que les patchs fonctionnaient enfin correctement).

Je souhaite expliciter ici un peu plus avant deux cas auxquels j’ai été confronté dans mon tri des vulnérabilités CVE, et qui ont chacun nécessité pas mal de temps d’investigation. Si la description a posteriori que je vais en faire semble logique, simple et directe, il en a été tout autrement pour en venir à bout, ce qui a impliqué beaucoup d’itérations et de collectes de données que je ne mentionnerai pas ici.

Pour commencer, j’étais en train d’investiguer la vulnérabilité CVE-2012-6685 concernant libnokogiri-ruby, et la discussion du bogue upstream a révélé que libxml2 pouvait également être lié au problème. En utilisant les cas de tests soumis, j’ai confirmé que libxml2 était également affecté par un problème qui lui était propre… puis j’ai commencé à analyser l’historique CVE de libxml2 afin de trouver si un numéro CVE lui avait été affecté. Ce qui était le cas, la n°CVE-2014-0191 (bien que la description n’en souffle mot). Ceci étant, cette vulnérabilité était marquée comme corrigée dans toutes les versions. Comment donc ? Il s’est avéré que le correctif fourni par l’amont pour cette CVE était juste le complément d’un autre commit qui fut intégré beaucoup plus tôt (et qui fut utilisé comme base du commit, comme le montre les copier/coller des commentaires). Lorsque l’équipe de sécurité a intégré ce patch dans Wheezy/Squeeze, ils n’étaient probablement pas au courant que le correctif complet requérait également l’inclusion d’autre chose. En conséquence, j’ai réouvert la vulnérabilité CVE-2014-0191 sur notre suiveur (le commit correspondant).

Le second cas problématique fut pound. Thijs Kinkhorst a ajouté des données relatives à pound en relation avec de nombreux soucis SSL. Ce qui fit apparaître pound sur ma liste des nouveaux paquets vulnérables dans Squeeze, car la vulnérabilité CVE-2009-3555 était marquée comme corrigée dans la version 2.6-2, tandis que Squeeze ne dispose que de la version 2.5-1. Il n’y avait aucune référence à un bogue dans le suiveur de sécurité et l’historique des modifications Debian pour cette version ne mentionnait qu’un « patch anti_beast », qui est encore une autre vulnérabilité (CVE-2011-3389). Je devais creuser encore un peu plus profondément…et je découvris in fine que le patch précédent avait également à voir avec la CVE qui m’intéressait. Mais Brian May avait récemment remonté dans le bogue n°765649 que ce paquet était toujours vulnérable à cette faille ! J’ai essayé de comprendre où ce patch était déficient et j’ai remonté mes trouvailles dans le ticket. J’ai mis à jour les données du suiveur avec mes connaissances nouvellement acquises (commit 31751 et 31752).

Tryton

En ce qui me concerne, janvier est toujours le mois où j’essaye de clôturer les comptes de Freexian. Cette année ne fait pas exception à la règle, bien que ce soit la première fois où j’accomplis cette tâche avec Tryton. J’ai en premier lieu mis à niveau vers la version 3.4 afin de profiter de la dernière version de Tryton.

Malgré cela, j’ai découvert de multiples problèmes lors de la clôture…et comme je ne veux pas être confronté aux mêmes problèmes l’année prochaine, je les ai remontés et ai préparé des correctifs pour ceux concernant le plan comptable français :

  • n°4464: l’export CSV des vues hiérarchiques est inutilisable;
  • n°4466: ajout des propriétés de report manquantes des comptes;
  • n°4468: suppression de propriétés abusives de réconciliation sur certains comptes;
  • n°4469: conversion du compte 6354 en un vrai compte;
  • n°4479: la balance des comptes non reportables ne marche pas avec certains comptes parents.

Saltstack

J’ai mentionné cette idée le mois dernier : mettre en place et maintenir de nombreux chroots sbuild peut être fastidieux, et j’ai donc souhaité l’automatiser le plus possible. A cette fin, j’ai créé trois formules Salt et les ai fait ajouter au dépôt officiel Saltstack :

Chacune est construite par-dessus la précédente. debootstrap-formula crée des chroots avec debootstrap ou cdebootstrap. schroot-formula fait la même chose et enregistre ces chroots dans schroot. sbuild-formula fait la même chose que schroot-formula mais avec différents paramètres par défaut qui sont plus adaptés aux chroots sbuild (et bien entendu contrôle que sbuild est installé et que les chroots générés sont des chroots buildd).

Avec la formule sbuild je peux ajouter ceci aux données pilier :

sbuild:
  chroots:
    wheezy:
      architectures: [amd64, i386]
      extra_dists:
        - wheezy-backports
        - wheezy-security
      extra_aliases:
        - wheezy-backports
        - stable-security
        - wheezy-security
    jessie:
    [...]

Et ensuite un simple salt-call state.highstate (je fonctionne en mode standalone) permettra de contrôler que tous les chroots sont correctement paramétrés.

Empaquetage divers

J’ai empaqueté de nouvelles versions amont de Python dans experimental et ouvert une requête de pré-approbation afin d’avoir la dernière 1.7.x dans Jessie (n°775892). Il semble que cela soit un choix cornélien pour l’équipe en charge de la publication, ce qui est bien dommage : nous avons des développeurs Debian actifs, des développeurs amont actifs, et chacun est parfaitement au courant de la règle « pas de nouvelles fonctionnalités » afin d’éviter les régressions. Que risque-t-on ?

J’ai également créé une requête de déblocage pour Dolibarr (à la demande de l’équipe de sécurité qui souhaite voir le correctif CVE atteindre Jessie). J’ai contribué modestement à deux bogues qui étaient d’un intérêt particulier pour certains de mes donateurs (n°751339 et n°774811). Ils n’étaient pas sous ma responsabilité, mais j’ai essayé de les faire avancer en contactant les bonnes personnes.

J’ai préparé un patch de sécurité pour Django dans Wheezy (python-django_1.4.5-1+deb7u9) et l’ai envoyé à l’équipe chargée de la sécurité. En faisant cela j’ai découvert un petit problème dans leur patch rétroporté que j’ai remonté à l’amont dans le ticket Django n°24239.

Debian France

Avec la nouvelle année vient le temps d’organiser l’assemblée générale avec le renouvellement d’un tiers de son Bureau. Nous avons donc appelé les membres à candidater et j’ai été heureux de voir que nous avons 6 candidatures pour 3 sièges. C’est un signe positif, montrant que nous avons assez de personnes impliquées dans l’association. L’une d’entre elle évoque même une Debconf 17 en France… de grands projets !

De mon côté, j’ai annoncé que je ne concourrai pas pour le poste de président l’année prochaine. Ceci étant, je resterai au Bureau afin d’assurer une transition en douceur.

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities for January 2015; contribuée par Weierstrass01.

2 commentaires | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

13 February, 2015 08:29AM par Raphaël Hertzog

04 February 2015

Tuxicoman

Mettre à jour le microcode de son CPU sous Debian

Les CPU ont aussi un firmware appelé microcode. Normalement, c’est le BIOS de votre carte mère qui le met à jour. Mais si le fabricant de sa carte mère ne publie pas de nouveau BIOS avec de nouveaux microcodes pour son CPU, il est possible de le faire à la volée avant le chargement du noyau Linux.

Le microcode corrige des bugs connus du CPU. Si vous rencontrez des freeze ou des erreurs de calcul, il peut être intéressant de voir si une mise à jour du microcode ne corrige pas votre problème.

Tout d’abord on vérifie la version du microcode de son CPU :

$ grep microcode /proc/cpuinfo
microcode : 0x19

Puis on installe le paquet intel-microcode ou amd64-microcode selon son modèle de CPU. Vous avez besoin d’activer les dépôts contrib et non-free pour y avoir accès.

On redémarre. Et voilà !

$ dmesg | grep -i microcode
[    0.000000] CPU0 microcode updated early to revision 0x1c, date = 2014-07-03
[    0.071491] CPU1 microcode updated early to revision 0x1c, date = 2014-07-03
[    0.085625] CPU2 microcode updated early to revision 0x1c, date = 2014-07-03
[    0.099732] CPU3 microcode updated early to revision 0x1c, date = 2014-07-03
[    0.448963] microcode: CPU0 sig=0x306c3, pf=0x2, revision=0x1c
[    0.448968] microcode: CPU1 sig=0x306c3, pf=0x2, revision=0x1c
[    0.448972] microcode: CPU2 sig=0x306c3, pf=0x2, revision=0x1c
[    0.448976] microcode: CPU3 sig=0x306c3, pf=0x2, revision=0x1c
[    0.449007] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba

J'aime(1)Ferme-la !(1)

04 February, 2015 08:43AM par Tuxicoman

24 January 2015

Tuxicoman

Fail2ban pour Owncloud 7 sur Debian Jessie

Petit guide pour couper court au crackage de vos passwords par le formulaire de login d’Owncloud.

Ajouter dans le fichier /etc/fail2ban/jail.conf :

[owncloud]
enabled = true
port = http,https
filter = owncloud
logpath = /var/log/owncloud.log
maxretry = 3

Modifier le fichier /etc/owncloud/config.php

'loglevel' => '2',
'logtimezone' => 'Europe/Brussels',

Le loglevel ne doit pas être supérieur à 2 pour que les tentatives de login soient enregistrées dans le log !
le logtimezone doit être accordé avec l’heure de votre serveur. Sinon fail2ban pensera toujours que la connexion est ancienne et ne bannira rien.

Créer un fichier /etc/fail2ban/filter.d/owncloud.conf:

[Definition]
failregex = .*"message":"Login failed:.*IP: '<HOST>'.*
ignoreregex =

Relancer le service fail2ban:
# systemctl fail2ban restart

Faites trois mauvaises tentatives de login sur Owncloud pour vérifier !
Pour vérifier le status de fail2ban:

# fail2ban-client status owncloud

Pour débloquer une IP:

# fail2ban-client set owncloud unbanip 192.168.0.13

Cette configuration de Owncloud et Fail2ban devraient être par défaut dans Debian à mon sens.

On peut également se connecter à Owncloud par l’API REST. Je n’ai pas testé si les erreurs de connexion par cette API étaient aussi enregistrées dans le fichier de log, et donc prises en compte par Fail2ban.

J'aime(5)Ferme-la !(1)

24 January, 2015 12:57PM par Tuxicoman

23 January 2015

Debian France

Présentation du projet Debian aux Expériences Numériques

Expériences Numériques

Les EPN de la Maison pour Tous Salle des Rancy en collaboration avec l'Aadn, Aldil, Ubunteros de Lyon, Illyse organisent le 31 janvier 2015 : les Expériences Numeriques.

Ce rendez-vous est une journée de découverte, d’initiation et de rencontres autour des pratiques du numérique.

À cette occasion une conférence aura lieu à 16h pour présenter le projet Debian. Pendant cette journée une install party sera organisée où les personnes qui le désirent pourront installer notre distribution favorite.

Télécharger le programme.

Carte Openstreet Map. Voir aussi le plan d'accès officiel pour plus de détails.

logo Maison pour Tous Salle des Rancy

23 January, 2015 03:12PM

13 January 2015

Raphaël Hertzog

Mes activités libres en décembre 2014

Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je l’écris pour mes donateurs (merci à eux !) mais aussi pour la communauté Debian au sens large parce que cela peut donner des idées aux nouveaux venus et que c’est également un des moyens les plus effectifs de trouver des volontaires pour travailler sur les projets qui me tiennent à cœur.

Debian LTS

Ce mois-ci ce sont 20 heures de travail sur Debian LTS qui ont été subventionnées. Voici le résumé des tâches qui m’ont occupé :

  • Tri de vulnérabilités CVE : j’ai poussé 47 commits vers le suiveur de sécurité. Ce qui m’a amené à soumettre deux demandes d’évolution le concernant : n°772927 et n°772961;
  • J’ai publié la DLA-106-1 qui avait été préparée par Osamu Aoki;
  • J’ai publié la DLA-111-1, corrigeant une vulnéréabilité CVE affectant cpio;
  • J’ai publié les DLA DLA-113-1 et DLA-114-1 affectant bsd-mailx et heirloom-mailx, corrigeant respectivement une vulnérabilité pour le premier, et deux pour le second;
  • J’ai publié la DLA-120-1 affectant xorg-server. Cette mise à jour seule m’a demandé plus de 6 heures pour rétroporter tous les patchs, corrigeant un ensemble conséquent de 12 vulnérabilités CVE.

Hors heures subventionnées, mais toujours en relation avec Debian LTS : j’ai demandé à Linux Weekly News de couvrir Debian LTS dans leur section sécurité, ce qui est maintenant chose faite. Vous pouvez consulter les DLA sur la page de sécurité habituelle, tandis qu’une page dédiée suit ce flux en particulier : http://lwn.net/Alerts/Debian-LTS/.

J’ai modifié la page wiki de Debian LTS afin de disposer d’une sous-page dédiée au financement. Cela permet d’éviter l’affichage d’un lien direct vers l’offre de Freexian sur la page principale du projet (ce qui a surpris quelques personnes). Cela permet également d’expliquer plus avant le contexte et de lister d’autres sociétés/personnes physiques de la même manière, le cas échéant (dans la mesure où il n’y a aucune relation d’exclusivité entre Debian et Freexian ici !).

j’ai également répondu à plusieurs questions de Nguyen Cong (un nouveau contributeur, employé par Toshiba avec leur permission explicite de travailler sur Debian LTS pendant ses heures travaillées ! \o/), via IRC, sur ask.debian.net (encore) et sur la liste de diffusion ! Il est bon de voir le projet LTS trouver un écho au-delà de la communauté des membres actuels du projet Debian.

Distro Tracker

Je souhaite prioriser de nouveau Distro Tracker, a minima afin de compléter la transition de l’ancien suiveur de paquets vers ce nouveau service… le mois dernier fut à cet égard un petit peu mieux que novembre, mais pas de beaucoup.

J’ai passé en revue un patch du rapport de bogue n°771604 (concernant l’affichage des descriptions longues), puis j’ai fusionné un autre patch du rapport n°757443 (corrigeant un mauvais balisage rendant la page inutilisable avec Konqueror). J’ai enfin corrigé le bogue n°760382, affectant les paquets passant par l’état « NEW » et ne le perdant plus par la suite.

Contributions en lien avec Kali

Je ne décris pas ici tout mon travail sur Kali, mais seulement quelques réalisations qui ont été contribuées en amont (ou dans Debian).

En premier lieu, je me suis assuré que nous pouvions compiler l’ISO de Kali avec le live-build 4.x de Jessie. Le résultat en a été de multiples patchs fusionnés dans le projet Debian live (1, 2, 3 et 4).

J’ai également soumis un patch concernant une régression dans la manière de traiter les dépendances dans les listes de paquets. Elle a été corrigée différemment et mon patch a été rejeté. J’ai également créé le rapport de bogue n°772651 pour consigner un problème dans la façon qu’a live-build de décider de la variante du paquet live-config à installer.

Kali a modifié le paquet sysvinit afin de pouvoir désactiver les services par défaut, et j’ai investigué comment porter cette fonctionnalité dans le monde systemd. Il s’est avéré que systemd présente nativement une telle fonctionnalité, nommée Preset files. Ce n’est malheureusement pas utilisable dans Debian car systemctl preset n’est pas appelé lors de l’installation du paquet. J’ai créé le rapport de bogue n°772555 pour demander la modification correspondante (dans Stretch, il est trop tard pour Jessie :-()

Saltstack

J’utilise salt afin d’automatiser certaines tâches d’administration dans Kali, au travail ou à la maison. J’ai découvert récemment que le projet essayait de rassembler des « Salt formulas », qui sont autant d’instructions prêtes à être utilisées, pour autant de services que possible.

J’ai commencé à les utiliser pour des services simples, et j’ai rapidement ressenti le besoin d’étendre « salt-formula », le jeu de formules utilisé pour configurer salt à partir de salt. J’ai soumis 5 demandes d’intégration (les n°73 et n°74 pour configurer salt en mode standalone, la n°75 pour activer les dépôts du paquet amont, la n°76 pour télécharger et activer automatiquement les formules salt désirées, et la n°77 corrigeant quelques bogues) qui ont toutes été intégrées en moins de 24h (ce qui est du genre à vous motiver pour contribuer de nouveau dans le futur !).

J’ai également soumis une correction de bogue pour samba-formula et un rapport de bogue pour salt lui-même (le n°19180).

Je dispose d’ailleurs d’états salt pour mettre en place schroot et sbuild. Je vais essayer de les empaqueter proprement en tant que formules dans le futur…

Travaux divers

Gouvernance de la liste de diffusion. Au sein de Debian, nous nous plaignons souvent des « méta-discussions » qui sont tenues sur les listes de diffusion (c’est-à-dire des discussions qui ont pour sujet la manière dont nous discutons ensemble). Néanmoins il est nécessaire que nous ayons ce type de discussions de temps à temps. J’ai ainsi suggéré d’héberger ces discussions sur une nouvelle liste de diffusion et, afin que cette liste soit effectivement mise en place, nos règles requièrent que d’autres personnes manifestent leurs intérêts pour celle-ci. Cette idée a reçu un certain soutien lorsque nous en avons discuté sur debian-private, je l’ai donc relancé sur debian-project tout en soumettant officiellement la demande via le rapport de bogue n°772645. Je n’ai malheureusement obtenu qu’un soutien jusqu’à maintenant. Aussi, si vous êtes intéressé par l’idée, je vous encourage à vous manifester…

Parrainage. J’ai parrainé un autre plugin de Galette ce mois-ci : galette-plugin-fullcard. Merci à François-Régis Vuillemin pour son travail.

Publican. A la suite d’un de mes rapports de bogue concernant Publican, et avec l’aide de l’auteur amont, nous avons identifié le problème et j’ai soumis un patch.

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities in December 2014 contribuée par Weierstrass01.

4 commentaires | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

13 January, 2015 08:00AM par Raphaël Hertzog

08 January 2015

Tanguy Ortolo

Objets connectés : attention aux services

Ces derniers temps, on parle beaucoup d'objets connectés, qui sont des accessoires divers — montre, cardiofréquencemètre, podomètre, vélo d'appartement, balance… — intégrant un ordinateur, connecté à votre réseau local ou à Internet afin de transmettre les informations qu'il collecte.

Attention donc à ne pas oublier une chose : si ces objets dépendent d'un service tiers, mis en place par le fabricant, ils ne dureront pas. Le jour où ce service prendra fin — car il prendra fin, ce n'est pas une hypothèse mais une certitude, à plus ou moins long terme — votre balance ou votre montre à plusieurs centaines d'euros ne fonctionnera plus, ou en tout cas pas comme ce qu'on vous a vendu.

08 January, 2015 12:02PM par Tanguy

02 January 2015

Philippe Latu

Raspbian & IPv6

Voilà maintenant plus d'un an que j'utilise un système Raspberry Pi comme routeur IPv6 entre le réseau local domestique et l'Internet via un tunnel SixXS. Je suis vraiment satisfait de cette solution qui permet d'agréger les services d'une «box» opérateur à moindre coût en plus de la fonction de routage. De mon point de vue, l'utilisation du système d'exploitation Raspbian s'imposait naturellement.

En configurant une nouvelle carte Raspberry Pi B+, j'ai redécouvert le fait que le protocole IPv6 n'est pas activé par défaut sur le système. C'est vraiment dommage dans un contexte où l'objet «Raspberry Pi B+» doit être nécessairement raccordé à l'Internet. En effet, il est particulièrement intéressant de pouvoir accéder via SSH à la carte sans avoir enregistré quoi que ce soit dans les services DHCP et DNS. L'autoconfiguration IPv6 prend tout son sens dans ce contexte.

Étape 1 : activer IPv6

Sur un système Raspbian fraichement installé, le support du protocole IPv6 n'est pas activé. Il apparaît que le protocole a été compilé sous forme de module dans le noyau de la distribution. La première manipulation à faire consiste donc à activer le chargement du module.

Les options de chargement des modules sont contrôlées via les fichiers placés dans le répertoire /etc/modprobe.d. Dans ce répertoire, on trouve un fichier ipv6.conf dont le contenu est le suivant :

# Don't load ipv6 by default
alias net-pf-10 off
#alias ipv6 off

Il suffit de commenter la ligne en rouge qui désactive la famille de protocole numéro 10 dans le noyau Linux et de redémarrer le système pour bénéficier du support IPv6. Le contenu du fichier devient :

# Don't load ipv6 by default
#alias net-pf-10 off
#alias ipv6 off

Une fois le redémarrage achevé, le module ipv6 est automatiquement chargé en mémoire.

$ lsmod | egrep -e '(Module|ipv6)'
Module                  Size  Used by
ipv6                  316254  22

Là, il faut bien reconnaître que c'est le module ipv6 qui occupe le plus de mémoire dans la liste complète des modules chargés en mémoire.

Il est maintenant possible d'accéder à la carte via SSH en utilisant les adresses de type lien local.

pi@raspberrypi ~ $ ip addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:27:eb:82:b2:64 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::ba27:ebff:fe82:b264/64 scope link
       valid_lft forever preferred_lft forever

Une adresse de type lien local appartient au préfixe fe80::/10 et est composée automatiquement à partir de l'adresse MAC au format EUI-64. Dans l'exemple ci-dessus, on reconnaît l'insertion des deux octets ff:fe au milieu de l'adresse MAC d'origine qui apparaît sur la ligne au-dessus.

L'accès SSH à l'aide de l'adresse de type lien local se fait comme suit :

phil@myhostname:~$ ssh pi@fe80::ba27:ebff:fe82:b264%eth0
pi@fe80::ba27:ebff:fe82:b264%eth0's password: 
Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan  3 15:49:24 2015 from fe80::226:18ff:fe27:7b9%eth0

La seule particularité de cet accès tient au fait qu'il est nécessaire de désigner l'interface du domaine de diffusion à utiliser. Ici, la notation %eth0 impose l'utilisation du réseau Ethernet sur lequel l'interface eth0 est raccordée.

Étape 2 : autoconfiguration IPv6

Si l'étape précédente ne nécessite aucun service d'infrastructure, l'affectation d'une adresse IPv6 visible sur l'Internet suppose qu'un routeur IPv6 déjà configuré se charge de l'attribution des paramètres de l'interface réseau. Sur le système Raspbian, il faut ajouter deux lignes au fichier /etc/network/interfaces.

auto lo

iface lo inet loopback
iface eth0 inet dhcp
iface eth0 inet6 auto

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
iface default inet6 auto

Après réinitialisation de l'interface active à l'aide des commandes sudo ifdown eth0 et sudo ifup eth0, l'autoconfiguration IPv6 peut s'effectuer. On visualise ci-dessous les adresses ainsi que la table de routage.

$ ip -6 addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8:fe00:814f:ba27:ebff:fe82:b264/64 scope global dynamic
       valid_lft 86368sec preferred_lft 14368sec
    inet6 fe80::ba27:ebff:fe82:b264/64 scope link
       valid_lft forever preferred_lft forever
$ ip -6 ro ls
2001:db8:fe00:814f::/64 dev eth0  proto kernel  metric 256  expires 86251sec
fe80::/64 dev eth0  proto kernel  metric 256 
default via fe80::ba27:ebff:feea:2972 dev eth0  proto ra  metric 1024  expires 1651sec

Pour compléter l'autoconfiguration, on ajoute le traitement des annonces RDNSS qui va servir à configurer le resolver DNS.

$ sudo aptitude install rdnssd
Les NOUVEAUX paquets suivants vont être installés : 
  rdnssd resolvconf{a}

On relève le résultat dans le fichier /etc/resolv.conf après réinitialisation de l'interface active.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 2001:db8:fe00:814f::1
search mydomain

Étape 3 : multicast DNS

Pour terminer, on ajoute le service multicast DNS au système. Manipuler des adresses IPv6 sous forme numérique peut s'avérer très fastidieux. Alors pourquoi ne pas bénéficier d'une résolution des noms d'hôtes sans passer par les enregistrements DNS «classiques» ?

On installe deux paquets supplémentaires ainsi que les dépendances associées.

$ sudo aptitude install avahi-daemon avahi-utils
Les NOUVEAUX paquets suivants vont être installés : 
  avahi-daemon avahi-utils bind9-host{a} libavahi-core7{a} libbind9-80{a} libdns88{a} libisc84{a} libisccc80{a} libisccfg82{a} liblwres80{a} libnss-mdns{a} 
0 paquets mis à jour, 11 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 1 420 ko d'archives. Après dépaquetage, 3 360 ko seront utilisés.

Une fois les paquets installés, il reste une ultime édition de fichier. La recherche de noms mdns ne doit pas être restreinte au seul protocole IPv4. On modifie donc le fichier /etc/nsswicth.conf comme ci-dessous.

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files mdns_minimal [NOTFOUND=return] dns mdns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Sur la ligne en vert ci-dessus, on a retiré les chiffres 4 pour les paramètres mdns.

Et voilà !

On accède maintenant à notre objet de l'Internet via son nom dans le Top Level Domain .local.

$ ssh pi@raspberrypi.local
The authenticity of host 'raspberrypi.local (2a01:240:fe00:814f:ba27:ebff:fe82:b264)' can't be established.
ECDSA key fingerprint is 4f:f9:17:ba:bf:57:16:a9:64:12:b7:e0:2b:51:7d:26.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'raspberrypi.local,2a01:240:fe00:814f:ba27:ebff:fe82:b264' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password: 
Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan  3 18:32:25 2015 from fe80::226:18ff:fe27:7b9%eth0

pour conclure, même si les configurations proposées dans ce billet ont une empreinte mémoire non nulle, je dirai qu'elles facilitent beaucoup l'utilisation de la connexion réseau sans qu'il soit nécessaire de déployer un jeu de services complet par ailleurs. Les «grands débutants» pourraient aborder plus facilement les outils disponibles sur ces nouveaux objets connectés à l'Internet.

02 January, 2015 05:18PM par Philippe Latu

25 December 2014

Florent Gallaire

La CNIL dans MISC, la fuite des données sur Internet

Un petit peu au dernier moment, je voudrais signaler un excellent article dans le n°76 de novembre-décembre de MISC, le magazine français de référence concernant la sécurité informatique.

« Analyse d’une inscription en ligne : comment vos données fuitent sur Internet » a été écrit par Stéphane Labarthe et Benjamin Vialle, le principal développeur de MarkUs, un logiciel libre d’annotation de code et de travaux.

Tous deux sont contrôleurs au sein de la  CNIL, la Commission nationale de l’informatique et des libertés, et les exemples qu’ils donnent s’inspirent donc de situations bien réelles auxquelles ils ont été confrontés au cours de leur travail.

L’article a l’avantage d’être très didactique, donnant les outils et les méthodes pour inspecter soi-même le parcours des données personnelles et des cookies que l’on est bien obligé de transmettre sur Internet, par exemple quand l’on veut commander des cadeaux (en passant Joyeux Noël à tous !).

Et si à cette occasion l’on détecte des fuites de données inappropriées, on peut saisir la CNIL qui s’est vu attribuer des prérogatives de contrôle en ligne par la loi Hamon du 17 mars 2014, dont l’article 105 a modifié l’article 44-III de la loi Informatique et libertés.

 

 

flattr this!

25 December, 2014 08:02PM par fgallaire

23 December 2014

Vincent Bernat

Eudyptula Challenge : démarrage rapide d'un noyau Linux

Le challenge Eudyptula est une série d’exercices de programmation pour le noyau Linux. Il commence avec le très basique module « Hello world » puis progresse en complexité jusqu’à faire pousser des modifications dans l’arbre du noyau Linux.

Une des premières tâches de ce challenge est de compiler puis démarrer son propre noyau. eudyptula-boot est un script autonome permettant de démarrer une image noyau jusqu’à obtenir un shell. Il est livré avec les fonctionnalités suivantes :

  • Il permet de booter quasiment n’importe quel noyau Linux, du noyau fourni par votre distribution favorite jusqu’au noyau personnalisé1 pour travailler sur une fonctionnalité quelconque.

  • Il utilise le système de fichiers de l’hôte comme racine pour le système invité. Aucune image disque n’est donc nécessaire. Ces dernières prennent beaucoup de place, doivent être maintenues à jour, se retrouvent encombrées au fil du temps et les outils dont vous avez besoin ne sont jamais installés. Pour éviter toute modification accidentelle, le système de fichiers est par défaut monté en lecture seule. S’ils sont disponibles, OverlayFS ou aufs sont utilisés pour ajouter une couche accessible en écriture. Il est de plus possible d’utiliser n’importe quel répertoire comme racine.

  • Le répertoire utilisateur est également accessible. Il est ainsi simple de partager des scripts et des programmes avec le système hôte.

  • Il démarre un système minimal avec le strict nécessaire2 pour démarrer un shell dans de bonnes conditions. Le système est opérationnel en moins de cinq secondes.

Dans la vidéo ci-dessous, eudyptula-boot est utilisé pour démarrer le noyau de l’hôte et exécuter quelques commandes :

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="270" src="http://www.youtube-nocookie.com/embed/aiE_Nd_vxQE?rel=0" width="480"></iframe>

Dans la vidéo suivante, nous démarrons un noyau personnalisé contenant un appel système supplémentaire. Il s’agit de la tâche n°15 du challenge Eudyptula. Un programme de test permet de vérifier le bon fonctionnement de l’appel système. Vers la fin, la vidéo contient également une rapide démonstration de gdb.

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="270" src="http://www.youtube-nocookie.com/embed/AEEAmnQ6Q6E?rel=0" width="480"></iframe>

Bien que ce hack permette également de lancer des conteneurs3 avec une isolation accrue, les performances de 9p sont malheureusement peu convaincantes pour un tel usage.


  1. Il est toutefois nécessaire d’activer le support de 9p virtio. Il suffit pour cela d’utiliser make kvmconfig

  2. Seul udev est démarré. 

  3. Un point de départ pour une telle utilisation est de combiner les options --root, --force et --exec. Ajoutez également --readwrite pour conserver les modifications. 

23 December, 2014 12:46PM par Vincent Bernat

22 December 2014

Carl Chenet

Le Journal Du Pirate, nouveau média propulsé par un Logiciel Libre qui trouve sa place

Suivez-moi aussi sur Identi.ca  ou Twitter  ou Diaspora*diaspora-banner

Un peu plus d’une semaine après le lancement en grande pompe du Journal du Pirate, site d’infos participatif francophone inspiré de son grand frère américain Hacker News, nous revenons sur le parcours de ce nouveau média propulsé par un Logiciel Libre.

jdp

Quelques statistiques intéressantes à nos yeux ont été publiées de nouveau dans un journal sur LinuxFr.org, afin de faire un retour quelques jours après ledit lancement.

Pourquoi un Logiciel Libre pour propulser ce site ?

La question peut paraître saugrenue aux aficionados du Logiciel libre qui vont lire ce billet, mais d’autres tentent régulièrement de lancer ce type de site en faisant un moteur à leur sauce, en général privateur. Ça n’est pas l’idée derrière le JdP. Nous voulions un moteur en accord avec notre vision du logiciel avec une interface suffisamment peu envahissante pour apparaître épurée d’un contenu superflu.

github-logo

Keep it simple, stupid

Le principe de ce site est simple, très simple. Une fois identifié ce qu’on veut faire exactement, cela peut paraître plus facile de tout re-coder. Mais c’est à mon sens une erreur dans la plupart des cas. De très bon prédécesseurs existent et ont subi tous les plâtres possibles et inimaginables. Rendons leur justice en utilisant ce qu’ils ont eu tant de mal à mettre au point et contribuons en retour. Pour le Journal du Pirate nous avons opté pour le moteur du site web Lobste.rs , sous licence BSD, qui a une approche mettant en avant la transparence des actions et des utilisateurs du site, attitude qui nous plaît beaucoup.

lobsters

Le site d’actualité Lobste.rs

Sur cette pierre je bâtirai…

Lorsque les fondations sont solides, on construit mieux et du durable. Au lieu de nous consacrer au moteur, l’équipe du Journal du Pirate se consacre au contenu et cherche à proposer la meilleure qualité d’articles possible ainsi qu’à coller à l’actualité. En espérant que cela vous plaise :)

Un média pour et par la communauté francophone

Il nous tient à cœur de présenter ce que produit la communauté francophone. Notre approche est complémentaire de LinuxFR ou des sites traditionnels proposant un vrai contenu éditorial original.

linuxfr_noel

LinuxFR.org, principal site du Logiciel Libre francophone

Nous optons pour présenter un maximum d’infos différentes à nos contributeurs qui effectuent un tri par leurs votes pour permettre aux meilleurs liens d’apparaître en première page. Ce modèle est éprouvé et marche plutôt bien.

Au-delà du Logiciel Libre, nous nous intéressons également aux publications scientifiques francophones et aux tissus des startups françaises, grandes utilisatrices du Logiciel Libre et proposant souvent des défis techniques intéressants.

Rejoignez-nous en réclament votre invitation pour aider à ce choix vous aussi, afin de mettre en avant vos logiciels libres, vos publications scientifiques ou vos startups !

Et vous ? Que pensez-vous de ce nouveau média francophone ? N’hésitez pas à réagir dans les commentaires ou à y demander votre invitation (en laissant votre e-mail dans le champ dédié).


22 December, 2014 11:00PM par Carl Chenet

Debian France

Dons Debian France

Dons Debian France

En cette fin d'année, nous tenons à rappeler que l'association Debian France est reconnue d'intérêt général. Ainsi, les donations à destination de l'association peuvent être déduites des impôts.

Une fois la donation réalisée, pour obtenir un reçu, il suffit d'envoyer un mail au trésorier - <tresorier@france.debian.net> en indiquant votre adresse.

Formulaire de donation

22 December, 2014 04:47PM

17 December 2014

Jean-Baptiste Hétier (djib)

"dmesg -w", vos messages système sous les yeux à tout moment

J'ai découvert au hasard dans la page de manuel de dmesg qu'il existait désormais une option -w (au moins à partir de Debian Jessie) qui permet d'afficher les messages du kernel dès qu'ils sont disponibles. C'est pratique pour suivre les logs système sans avoir à jouer avec tail.

17 December, 2014 06:06PM par djib

16 December 2014

Carl Chenet

Suivre les stats de son site web en Ruby On Rails avec Piwik

Suivez-moi aussi sur Identi.ca  ou Twitter  ou Diaspora*diaspora-banner

Après avoir lancé Le Journal du Pirate, le Hacker News francophone, j’avais évidemment besoin de suivre la fréquentation du site. J’avais utilisé AWStats sur un précédent projet et je voulais tenter d’utiliser un logiciel de comception un peu plus récente cette fois-ci.

awstats-logo

Piwik semblait convenir parfaitement. Multi-sites, Interface graphique moderne, des bons échos dans la communauté, je me suis donc naturellement dirigé vers cette solution. Piwik se présente comme une application web avec une base de données MySQL derrière.

piwik_app

Pour les gens intéressés, le site officiel propose une démo très sympa permettant de voir tout de suite les points forts de Piwik.

piwik

Le Journal du Pirate est quant à lui une application Ruby On Rails. Or Piwik requiert l’ajout d’un javascript sur les pages que l’on veut surveiller. Ce qui peut s’avérer délicat à réaliser lorsque que l’on maîtrise mal RoR.

La documentation officielle suivante explique très bien la marche à suivre. Ajouter une gem Ruby à son Gemfile, relancer bundle puis quelques éléments de configuration dans le fichier config/piwik.yml et le tout a marché directement.

rails

Je suis très content du résultat. Niveau interface graphique c’est très agréable et Piwik propose un très grand nombre de métriques associées aux différents sites web supervisés. J’en ai profité pour lui faire surveiller ce blog et le site web de MyTux, ma société d’infogérance de serveurs Debian.

Et vous ? Quel est votre ressenti après avoir utilisé quelques temps Piwik ? Des difficultés à le mettre en place avec RoR ? N’hésitez pas à réagir dans les commentaires de ce billet.


16 December, 2014 11:00PM par Carl Chenet

10 December 2014

Olivier Berger (perso)

Réparé les hauts-parleurs d'un portable HP dv6000 en échangeant deux nappes internes

Les hauts-parleurs internes du portable HP de mes parents, un dv6000, ne marchaient plus : plus de son sans devoir mettre des enceintes ou un casque :-(

En fait, il semble que ce soit un problème classique, qui semble causé par des nappes de connexion internes deffectueuses.

La réparation n'est pas trop compliquée, si on achète une nappe de remplacement, mais on peut aussi trouver un contournement.

J'ai réussi à échanger les deux nappes qui connectent la carte mère à la partie qui contient les boutons et les hauts-parleurs, au dessus du clavier, et même si maintenant, les boutons de cette rangée supérieure ne marchent plus, ce n'est pas trop grave, car le son est revenu.

Pour voir une vidéo (en anglais) qui explique comment faire, voir : Hp Pavilion Dv6000 power button and speaker fix!

Content d'avoir récupéré le son :-)

10 December, 2014 10:10PM par obergix

29 November 2014

Philippe Latu

Comment effacer les fichiers de configuration inutiles ?

Sur les systèmes Debian GNU/Linux, les outils de gestion de paquets peuvent préserver les fichiers de configuration lors de la suppression d'un paquet. L'idée est que l'administrateur du système puisse retrouver une configuration personnalisée si le paquet supprimé était réinstallé par la suite.

Cependant, ces fichiers de configuration peuvent s'accumuler dans le temps et finir par générer des problèmes lors des migrations d'une version stable à l'autre. Ici, il faut insister sur le facteur temps. Retrouver des fichiers vieux de plus de dix ans n'est pas rare sur certains serveurs comme ceux utilisés pour l'hébergement des boîtes aux lettres de courrier électroniques. Les migrations matérielles d'une machine à l'autre se font depuis longtemps à l'aide de rsync et les systèmes de fichiers suivent. Il est donc utile de «faire le ménage» dans les fichiers de configuration de paquets trop anciens. Voici comment faire.

La version basée sur dpkg est connue de longue date :

# dpkg --purge $(dpkg -l | grep ^rc | cut -d ' ' -f 3 | tr '\n' ' ')

Il existe maintenant une version plus moderne basée sur aptitude :

# aptitude purge ~c

Contrairement à ce que j'avais indiqué dans une première version de ce billet, l'utilisation d'aptitude apporte une simplification considérable. Merci à JCD !.

Si vous avez une proposition de syntaxe encore plus optimisée pour le même traitement, je suis preneur !

29 November, 2014 03:41PM par Philippe Latu

16 November 2014

Vincent Bernat

Préparer des règles Netfilter dans un espace de nommage réseau

Souvent, les règles d’un pare-feu sont mises en place à l’aide d’un script faisant appel aux commandes iptables et ip6tables. Cela permet notamment d’utiliser des variables et des boucles. Il y a cependant trois inconvénients majeurs à cette méthode :

  1. Pendant toute la durée du script, le pare-feu est temporairement incomplet : les nouvelles connexions peuvent ne pas être autorisées à s’établir ou, inversement, le pare-feu peut autoriser des flux qui ne devraient pas l’être. Les règles de NAT nécessaires au bon fonctionnement du routeur peuvent également être absentes.

  2. Si une erreur survient, le pare-feu reste dans un état intermédiaire. Il est alors nécessaire de s’assurer que les règles autorisant l’accès à distance soient placées très tôt pour garder la main. Un système de retour automatique à la précédente version est également nécessaire pour corriger la situation rapidement.

  3. Construire de nombreuses règles peut être très lent. Chaque appel à ip{,6}tables va rapatrier l’ensemble des règles du noyau, ajouter la règle voulue et renvoyer le tout au noyau.

Avec iptables-restore

Une façon classique de résoudre ces trois aspects et de construire un fichier de règles qui sera lu par iptables-restore et ip6tables-restore1. Ces outils envoient en une seule passe les règles au noyau qui les applique de manière atomique. Habituellement, un tel fichier est construit par ip{,6}tables-save mais un script peut également faire l’affaire.

La syntaxe comprise par ip{,6}tables-restore est similaire à celle de ip{,6}tables. Cependant, chaque table dispose de son propre bloc et les chaînes doivent être déclarées différemment. Voyons un exemple :

$ iptables -P FORWARD DROP
$ iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
$ iptables -N SSH
$ iptables -A SSH -p tcp --dport ssh -j ACCEPT
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A OUTPUT -o lo -j ACCEPT
$ iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -A FORWARD -j SSH
$ iptables-save
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:SSH - [0:0]
-A INPUT -i lo -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j SSH
-A OUTPUT -o lo -j ACCEPT
-A SSH -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT

La table nat et la table filter disposent chacune de leur bloc. La chaîne SSH est déclarée en haut du bloc de la table filter avec les autres chaînes par défaut.

Voici un script qui détourne les commandes ip{,6}tables afin de construire un tel fichier (en s’appuyant massivement sur Zsh2) :

#!/bin/zsh
set -e

work=$(mktemp -d)
trap "rm -rf $work" EXIT

# ➊ Redefine ip{,6}tables
iptables() {
    # Intercept -t
    local table="filter"
    [[ -n ${@[(r)-t]} ]] && {
        # Which table?
        local index=${(k)@[(r)-t]}
        table=${@[(( index + 1 ))]}
        argv=( $argv[1,(( $index - 1 ))] $argv[(( $index + 2 )),$#] )
    }
    [[ -n ${@[(r)-N]} ]] && {
        # New user chain
        local index=${(k)@[(r)-N]}
        local chain=${@[(( index + 1 ))]}
        print ":${chain} -" >> ${work}/${0}-${table}-userchains
        return
    }
    [[ -n ${@[(r)-P]} ]] && {
        # Policy for a builtin chain
        local index=${(k)@[(r)-P]}
        local chain=${@[(( index + 1 ))]}
        local policy=${@[(( index + 2 ))]}
        print ":${chain} ${policy}" >> ${work}/${0}-${table}-policy
        return
    }
    # iptables-restore only handle double quotes
    echo ${${(q-)@}//\'/\"} >> ${work}/${0}-${table}-rules #'
}
functions[ip6tables]=${functions[iptables]}

# ➋ Build the final ruleset that can be parsed by ip{,6}tables-restore
save() {
    for table (${work}/${1}-*-rules(:t:s/-rules//)) {
        print "*${${table}#${1}-}"
        [ ! -f ${work}/${table}-policy ] || cat ${work}/${table}-policy
        [ ! -f ${work}/${table}-userchains || cat ${work}/${table}-userchains
        cat ${work}/${table}-rules
        print "COMMIT"
    }
}

# ➌ Execute rule files
for rule in $(run-parts --list --regex '^[.a-zA-Z0-9_-]+$' ${0%/*}/rules); do
    . $rule
done

# ➍ Execute rule files
ret=0
save iptables  | iptables-restore  || ret=$?
save ip6tables | ip6tables-restore || ret=$?
exit $ret

En ➊, une nouvelle fonction iptables() est définie et masque la commande du même nom. Elle tente de localiser le paramètre -t pour savoir quelle table est concernée par la règle. Si le paramètre est présent, la table est mémorisée dans la variable $iptables et le paramètre est retiré de la liste des arguments. La défintion d’une nouvelle chaîne avec -N ou la mise en place d’une politique par défaut avec -P sont également gérés.

En ➋, la fonction save() va émettre les règles qui seront lues par ip{,6}tables-restore. En ➌, les règles de l’utilisateur sont exécutées. Chaque commande ip{,6}tables appelle en réalité la fonction précédemment définie. Si aucune erreur n’est survenue, en ➍, les commandes ip{,6}tables-restore sont invoquées.

Cette méthode est parfaitement fonctionnelle3. Toutefois, la méthode suivante est bien plus élégante.

Avec un espace de nommage

Une approche hybride est de construire les règles avec ip{,6}tables dans un espace de nommage réseau (network namespace) puis de les sauver avec ip{,6}tables-save et enfin de les appliquer dans l’espace de nommage principal avec ip{,6}tables-restore.

#!/bin/zsh
set -e

alias main='/bin/true ||'
[ -n $iptables ] || {
    # ➊ Execute ourself in a dedicated network namespace
    iptables=1 unshare --net -- \
        $0 4> >(iptables-restore) 6> >(ip6tables-restore)
    # ➋ In main namespace, disable iptables/ip6tables commands
    alias iptables=/bin/true
    alias ip6tables=/bin/true
    alias main='/bin/false ||'
}

# ➌ In both namespaces, execute rule files
for rule in $(run-parts --list --regex '^[.a-zA-Z0-9_-]+$' ${0%/*}/rules); do
    . $rule
done

# ➍ In test namespace, save the rules
[ -z $iptables ] || {
    iptables-save >&4
    ip6tables-save >&6
}

En ➊, le script est réexécuté dans un nouvel espace de nommage réseau. Celui-ci dispose de ces propres règles de pare-feu qui peuvent être modifiées sans altérer celles de l’espace de nommage principal. La variable $ipatbles est utilisée pour déterminer quel est l’espace de nommage courant. Dans le nouvel espace de nommage, les fichiers de règles sont exécutés (➌). Ceux-ci contiennent l’appel aux commandes ip{,6}tables. Si une erreur survient, nous n’allons pas plus loin grâce à l’utilisation de set -e. Sinon, en ➍, les règles sont sauvegardées avec ip{,6}tables-save et envoyées dans l’espace de nommage principal en utilisant les descripteurs de fichier dédiés à cet effet.

L’exécution dans l’espace de nommage principal continue en ➊. Les résultats de ip{,6}tables-save sont envoyées à ip{,6}tables-restore. À ce point, le pare-feu est presque fonctionnel. Les fichiers de règles sont toutefois rejoués (➌) mais les commandes ip{,6}tables sont neutralisées (➋) de façon à ce que les éventuelles autres commandes, comme par exemple l’activation du routage IP, soient exécutées.

Le nouvel espace de nommage ne dispose pas du même environnement que l’espace de nommage principal. Notamment, il ne contient pas d’interfaces réseau. Il n’est donc pas possible de consulter ou de configurer des adresses IP. Lorsque des commandes ne peuvent être exécutées que dans l’espace de nommage principal, il est nécessaire de les préfixer par main :

main ip addr add 192.168.15.1/24 dev lan-guest

Jetez un coup d’œil à un exemple complet sur GitHub.


  1. iptables-apply est un autre outil pratique. Il applique un fichier de règles et revient automatiquement en arrière si l’utilisateur ne confirme pas le changement dans un laps de temps donné. 

  2. Zsh contient des primitives assez puissantes pour manipuler les tableaux. De plus, il ne nécessite pas d’utiliser les guillemets autour de chaque variable pour éviter leur découpage lorsqu’elles contiennent des espaces. Cela rend le script bien plus robuste. 

  3. S’il fallait pinailler, il y a trois petits problèmes. Primo, lorsqu’une erreur survient, il peut être difficile de savoir quelle partie du script l’a provoquée car on ne dispose que de la ligne dans le fichier de règles qui a été généré. Deuzio, une table peut être utilisée avant d’être définie ce qui peut faire passer inaperçu certaines erreurs dues à un copier/coller. Tertio, l’application de la partie IPv4 peut réussir alors que la partie IPv6 a échoué ou vice-versa. Ces problèmes n’existent pas avec la deuxième méthode. 

16 November, 2014 04:28PM par Vincent Bernat

19 October 2014

Jean-Baptiste Hétier (djib)

MoveFromExif : déplacer des images selon leurs infos EXIF

Déplacer des images en fonction des données Exif MoveFromExif est un petit script Ruby que j'ai développé pour déplacer des images selon les données EXIF. Plus précisément il place les photos dans des dossiers arborescents année/mois/jour, mais en l'adaptant légèrement vous pouvez triez vos photos par appareil photo, par objectif, ou par toute autre donnée Exif.

Je diffuse MoveFromExif sous licence libre (GPLv3) afin que vous puissiez justement l'adapter à vos besoins.
Suivez ce lien pour télécharger la dernière version de MoveFromExif.

Évidemment, puisque le script déplace des photos d'un dossier à un autre, je vous recommande très fortement de faire une sauvegarde de vos images et de faire vos premiers essais sur de petits échantillons.

Installation sous Debian GNU/Linux

Sous Debian (et probablement les autres distributions dérivées), lancez les commandes suivantes en tant que root

apt-get install ruby rubygems libimage-exiftool-perl
gem install mini_exiftool

Téléchargez ensuite la dernière version de MoveFromExif et déplacez ensuite automatiquement vos photos avec la commande

./movefromexif.rb /dossier/source /dossier/destination

Installation sous Windows

L'installation sous Windows est un peu plus longue :

  • Téléchargez MoveFromExif ;
  • Téléchargez et installez RubyInstaller ;
  • Téléchargez et dézippez ExifTool dans le répertoire de Exif2CSV (ou un répertoire de votre PATH) ;
  • Renommez exiftool(-k).exe en exiftool.exe ;
  • Lancez cmd.exe et exécutez gem install mini_exiftool. (Vous aurez peut-être besoin de spécifier le chemin complet vers gem.exe, par exemple C:\Ruby186\bin\gem.exe install mini_exiftool)

Vous pourrez ensuite déplacer automatiquement vos photos avec la commande :

./movefromexif.rb C:/dossier/source C:/dossier/destination

De nouveau, en fonction de votre PATH vous aurez peut-êre besoin de spécifier le chemin complet vers ruby.exe, par exemple : C:\Ruby186\bin\ruby.exe movefromexif.rb C:/dossier/source C:/dossier/destination.

Ensuite

N'hésitez pas à vous emparer du script ou à me faire remonter des idées. Personnellement ce script me sert moins depuis que je suis passé sur Shotwell pour la gestion de ma bibliothèque, mais j'en ai encore parfois l'utilité pour de gros tris.

19 October, 2014 09:42PM par djib

12 September 2014

Stéphane Blondon

Key Signing Assistant (concept)

Dans les allées de la DebConf14, j’ai discuté avec Franklin de l’intérêt pour un développeur d’utiliser son téléphone portable lors d’une key signing party.

Les schémas sont un brouillon d’une utilisation possible du téléphone. L’objectif n’est pas de remplacer la rencontre réelle ou la validation mais juste d’aider à l’échange et validation des clefs.

Actuellement, ce n’est qu’un concept ; rien n’est implémenté.

Le principe général est d’utiliser le téléphone comme un terminal pour l’échange et la validation. Les données partent et reviennent sur la station de travail du développeur par l’intermédiaire d’un serveur web.

  • Le téléphone portable considéré doit être un smartphone ;
  • La seule autorisation à donner pour le téléphone est l’accès à internet ;
  • On considère que les échanges réseau sont fait en https. Je ne pense pas que ce soit indispensable mais il n’y a aucune raison de s’en priver.

Avant la key signing party

Le développeur dispose d’un téléphone sur lequel l’application est installée.
Le processus pour installer ses propres informations est le suivant :

Avant la key signing party

Pendant la key signing party

Le processus est à reproduire pour chaque participant.

Pendant la key signing party

Après la key signing party

Une fois rentré chez lui, le développeur récupère l’ensemble de ses validations sur sa machine de travail :

Après la key signing party

Qu’en pensez-vous ?

Source des schémas

Schémas réalisés avec Inkscape, à partir d’icônes Tango et Gnome-Tango.
Les fichiers svg et png sont disponibles dans le répertoire http://stephane.yaal.fr/ksa/.


12 September, 2014 07:18AM par ascendances

10 September 2014

Olivier Berger (pro)

Le MOOC Bases de données relationnelles est lancé

Nous venons de lancer la première édition du MOOC sur les bases de données relationnelles de Télécom SudParis. Au programme, de la théorie (algèbre relationnelle), de la pratique (dans SQLite dans les navigateurs basés sur WebKit, et plus tard dans PostgreSQL dans une box Vagrant basée sur Debian (voir post précédent)), des contenus et logiciels libres (autant que possible) et pas mal de rush pour finaliser tout ça dans le Moodle.

On débute avec plus de 800 inscrits à la fin du premier jour (y compris les 180 étudiants ingénieurs de 2ème année de Télécom SudParis, qui suivront le cours présentiel en parallèle du MOOC, et collaboreront avec les apprenants externes pour les travaux personnels).

Il est toujours possible de s’inscrire : le gros du travail commence en semaine 2 (qui commence lundi 15/09 à 00h00 heure de Paris).

10 September, 2014 07:53PM par Olivier Berger

20 August 2014

Aurélien Jarno

MIPS Creator CI20

I have received two MIPS Creator CI20 boards, thanks to Imagination Technologies. It’s a small MIPS32 development board:

mips-ci20

As you can see it comes in a nice packaging with a world-compatible power adapter. It uses a Ingenic JZ4780 SoC with a dual core MIPS32 CPU running at 1.2GHz with a PowerVR SGX540 GPU. The board is fitted with 1GB of RAM, 8GB of NOR flash, HDMI output, USB 2.0 ports, Ethernet + Wi-Fi + BlueTooth, SD card slot, IR receiver, expansion headers and more. The schematics are available. The Linux kernel and the U-Boot bootloader sources are also available.

Powering this board with a USB keyboard, a USB mouse and a HDMI display, it boots off the internal flash on a Debian Wheezy up to the XFCE environment. Besides the kernel, the Wi-Fi + Bluetooth firmware, and very few configuration changes, it runs a vanilla Debian. Unfortunately I haven’t found time to play more with it yet, but it looks already quite promising.

The board has not been formally announced yet, so I do not know when it will become available, nor the price, but if you are interested I’ll bring it to DebConf14. Don’t hesitate to ask me if you want to look at it or play with it.

20 August, 2014 08:52PM par aurel32

Olivier Berger (pro)

Building a lab VM based on Debian for a MOOC, using Vagrant + VirtualBox

We’ve been busy setting up a Virtual Machine (VM) image to be used by participants of a MOOC that’s opening in early september on Relational Databases at Telecom SudParis.

We’ve chosen to use Vagrant and VirtualBox which are used to build, distribute and run the box, providing scriptability (reproducibility) and making it portable on most operating systems.

The VM itself contains a Debian (jessie) minimal system which runs (in the background) PostgreSQL, Apache + mod_php, phpPgAdmin, and a few applications of our own to play with example databases already populated in PostgreSQL.

As the MOOC’s language will be french, we expect the box to be used mostly on machines with azerty keyboards. This and other context elements led us to add some customizations (locale, APT mirror) in provisioning scripts run during the box creation.

At the moment, we generate 2 variants of the box, one for 32 bits kernel (i686) and one for 64 bits kernel (amd64) which (once compressed) represent betw. 300 and 350 Mb.

The resulting boxes are uploaded to a self-hosting site, and distributed through vagrantcloud. Once the VM are created in VirtualBox, the typical VMDK drives file is around 1.3Gb.

We use our own Debian base boxes containing a minimal Debian jessie/testing, instead of relying on someone else’s, and recreate them using (the development branch version of) bootsrap-vz. This ensure we can put more trust in the content as it’s a native Debian package installation without MITM intervention.

The VM are meant to be run headless for the moment, keeping their size to the minimum, even though we also provide a script to install and configure a desktop environment based on XFCE4.

The applications are either used through vagrant ssh, for instance for SQL command-line in psql, or in the Web browser, for our own Web based SQL exerciser, or phpPgAdmin (see a demo screencast (in french, w/ english subtitles)), which can then be used even off-line by the participants, which also means this requires no servers availability for our IT staff.
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="http://www.youtube.com/embed/sXZ3KGK5TCU?rel=0" width="420"></iframe>

The MOOC includes a section on PHP + SQL programming, whose exercises can be performed using a shared sub-folder of /vagrant/ which allows editing on the host with the favourite native editor/IDE, while running PHP inside the VM’s Apache + mod_php.

The sources of our environment are available as free software, if you’re interested to replicate a similar environment for another project.

As we’re still polishing the environment before the MOOC opening (on september 10th), I’m not mentioning the box URLs but they shouldn’t be too hard to find if you’re investigating (refering to the fusionforge project’s web site).

We don’t know yet how suitable this environment will be for learning SQL and database design and programming, and if Vagrant will bring more difficulties than benefits. Still we hope that the participants will find this practical, allowing them to work on the lab / exercises whenever and wherever they chose, removing the pain of installing and configuring a RDBMS on their machines, or the need to be connected to a cloud or to our overloaded servers. Of course, one limitation will be the requirements on the host machines, that will need to be reasonably modern, in order to run a virtualized Linux system. Another is access to high bandwidth for downloading the boxes, but this is kind of a requirement already for downloading/watching the videos of the MOOC classes ;-)

Big thanks go to our intern Stéphane Germain, who joined us this summer to work on this virtualized environment.

20 August, 2014 01:59PM par Olivier Berger

18 August 2014

Benoit Peccatte

Apache FTP like

Niveau :      
Résumé : alias / /%{username}

Aujourd'hui je voudrais faire un serveur web qui se comporterait comme un serveur FTP ou SFTP. Lorsqu'un utilisateur unix se connecte à un serveur FTP avec un login et un mot de passe, il lui est présenté un contenu qui lui est propre (son $HOME par exemple).

Comment faire l'équivalent avec apache ?

Dit autrement, je voudrais que les 2 commandes suivantes renvoient un contenu différent :

$ wget http://userA@www.monserveur.com/ # répertoire A
$ wget http://userB@www.monserveur.com/ # répertoire B

Pour cela il faut jouer avec les RewriteRules, mais c'est plus balaise que ça en a l'air.

Premièrement il faut une authentification. J'ai choisi ldap, mais prenez la méthode que vous préférez : http://httpd.apache.org/docs/2.2/mo... tout ce qui commence par mod_authn est valable. Voici comment on la met en place :

<Location />
        AuthType basic
        AuthName "My server"
        AuthBasicProvider ldap
        AuthLDAPURL ldap://serveur.ldap.com/dc=domaine,dc=com?uid?sub
        AuthLDAPBindDN cn=user,ou=technical,dc=domaine,dc=com
        AuthLDAPBindPassword password
        Require valid-user
</Location>

Ensuite on joue avec RewriteRule, les variables s'appellent sous la forme %{ENV:VARIABLE}

# utilisez %{ENV:USER_AUTH} pour ceux qui n'ont pas choisi l'authent LDAP
RewriteRule ^(.*) /%{ENV:AUTHENTICATE_uid}/$1

Mais ça ne marche pas. Tout d'abord on apprend qu'il faut mettre les règles dans le Location sinon les variables d'authentification ne sont pas disponibles. Ensuite on a oublié d'activer le rewrite engine. Et enfin dans un location (ou un directory) on ne matche plus la request uri mais le chemin créé à partir de cette uri. Cela qui une fois corrigé nous donne quelque chose comme ça :

<Location />
        RewriteEngine On
        # le résultat sera automatiquement préfixé par le DocumentRoot si on ne le fait pas nous même
        # notez l'absence du / initial dans le pattern ...
        RewriteRule ^var/www/html/(.*) /%{ENV:AUTHENTICATE_uid}/$1 
</Location>

Mais ça ne marche toujours pas. En effet, le rewrite engine d'apache est réentrant, quelle que soit la modification et quel que soit le flag utilisé, si une url est modifiée, apache fait une redirection interne et relance toute la machinerie (dont les redirections). Pour les petits malins, non [L] n'est pas fait pour ça, par contre la doc évoque un [END] qui aurait cette fonctionnalité mais je ne l'ai pas trouvé.

Il nous faut donc un moyen de détecter qu'une url a déjà été transformée par une RewriteRule. Malheureusement les variables (comme %{ENV:AUTHENTICATE_uid}) ne sont valables que dans la partie gauche de RewriteCond ou dans la partie droite de RewriteRule ce qui nous limite sévèrement. On ne peut pas matcher le chemin en pour détecter qu'il contient le répertoire de l'utilisateur. De plus on ne peut pas utiliser une autre racine, apache ajouterait automatiquement le DocumentRoot en cours.

J'ai essayé en utilisant des variables d'environnement temporaire (avec [E=VAR:VALUE]), mais le rewrite engine l'évalue trop tard et ne détecte pas la nouvelle valeur de la variable modifiée par lui-même.

Ma solution est donc de mettre en place un unique répertoire contenant les utilisateurs avec un nom improbable car il ne pourra pas être utilisé comme nom de répertoire dans les répertoires utilisateurs. Et d'utiliser ce nom de répertoire comme marqueur d'url déjà traitée. Ce qui nous donne :

        # mon répertoire s'appelle ____data____
        RewriteRule ^var/www/html/(?!____data____/)(.*) /____data____/%{ENV:AUTHENTICATE_uid}/$1

C'est bien joli, mais ça n'empercherait pas un utilisateur d'aller voir dans le répertorie de son voisin. En effet, ce ne sont que des rewrite rules, pas des droits d'accès. Puisqu'on ne peut pas utiliser les noms de répertoire utilisateur dans les require pour le matcher avec les nom d'utilisateur (on se mordrait la queue (et ça fait mal (au dos))). Il nous faut donc le garantir d'une autre façon, en forçant tout utilisateur a n'accéder qu'à son répertoire avec une autre règle.

        # ce qu'on veut c'est éviter l'utilisateur qui voudrait bypasser la première règle avec un http://www.monserveur.com/____data____/userX
        RewriteRule ^var/www/html/____data____/.*?/(.*) /var/www/html/____data____/%{ENV:AUTHENTICATE_uid}/$1
        # et on voudrait ausst éviter que l'utilisateur puisse scanner la racine
        RewriteRule ^var/www/html/____data____/?$ /var/www/html/____data____/%{ENV:AUTHENTICATE_uid}/

Notez l'ajout de /var/www/html dans les chaines de remplacement, c'est pour éviter qu'apache pense qu'on a modifié le chemin si on n'a rien changé.

Et c'est gagné, on a enfin trouvé !

Je vous laisse donc profiter du résultat :
Edit : la version finale minimise l'appel aux règles, prend en compte les chemins qui se terminent par / et les tentatives d'accès à des répertoires non autorisés.

<Location />
        AuthType basic
        AuthName "My server"
        AuthBasicProvider ldap
        AuthLDAPURL ldap://serveur.ldap.com/dc=domaine,dc=com?uid?sub
        AuthLDAPBindDN cn=user,ou=technical,dc=domaine,dc=com
        AuthLDAPBindPassword password
        Require valid-user

        # make http behave like ftp
        RewriteEngine On
        # create home dir var
        RewriteRule .* - [E=USER_ROOT:/var/www/html/____data____/%{ENV:AUTHENTICATE_homeDirectory}]
        RewriteCond %{ENV:USER_ROOT} !-d
        RewriteRule .* - [E=USER_ROOT:/var/www/html/forbidden]

        # redirection vers les repertpoires utilisateur
        RewriteCond %{REQUEST_FILENAME} !^/var/www/html/____data____
        RewriteRule ^var/www/html/(.*) %{ENV:USER_ROOT}/$1 [L,DPI]

        # impossibilite de lire la racine
        RewriteCond %{REQUEST_FILENAME} ^/var/www/html/____data____/?$
        RewriteRule .* %{ENV:USER_ROOT} [L,DPI]

        # impossibilite de lire le repertoire d'un autre
        RewriteCond %{ENV:AUTHENTICATE_homeDirectory}|%{REQUEST_FILENAME} !^(.*?)\|/var/www/html/____data____/\1
        RewriteRule ^var/www/html/____data____/?[^/]*/?(.*) %{ENV:USER_ROOT}/$1 [L,DPI]
</Location>

<Directory /var/www/html/forbidden>
        deny from all
</Directory>

Note : et pour ceux qui voudraient vraiment faire du FTP avec apache il y a mod_ftp.

Tags:, , ,

18 August, 2014 04:34PM par peck

15 August 2014

Aurélien Jarno

Intel about to disable TSX instructions?

Last time I changed my desktop computer I bought a CPU from the Intel Haswell family, the one available on the market at that time. I carefully selected the CPU to make sure it supports as many instructions extensions as possible in this family (Intel likes segmentation, even high-end CPUs like the Core i7-4770k do not support all possible instructions). I ended-up choosing the Core i7-4771 as it supports the “Transactional Synchronization Extensions” (Intel TSX) instructions, which provide transactional memory support. Support for it has been recently added in the GNU libc, and has been activated in Debian. By choosing this CPU, I wanted to be sure that I can debug this support in case of bug report, like for example in bug#751147.

Recently some computing websites started to mention that the TSX instructions have bugs on Xeon E3 v3 family (and likely on Core i7-4771 as they share the same silicon and stepping), quoting this Intel document. Indeed one can read on page 49:

HSW136. Software Using Intel TSX May Result in Unpredictable System Behavior

Problem: Under a complex set of internal timing conditions and system events, software using the Intel TSX (Transactional Synchronization Extensions) instructions may result in unpredictable system behavior.
Implication: This erratum may result in unpredictable system behavior.
Workaround: It is possible for the BIOS to contain a workaround for this erratum.

And later on page 51:

Due to Erratum HSw136, TSX instructions are disabled and are only supported for software development. See your Intel representative for details.

The same websites tell that Intel is going to disable the TSX instructions via a microcode update. I hope it won’t be the case and that they are going to be able to find a microcode fix. Otherwise it would mean I will have to upgrade my desktop computer earlier than expected. It’s a bit expensive to upgrade it every year and that’s a the reason why I skipped the Ivy Bridge generation which didn’t bring a lot from the instructions point of view. Alternatively I can also skip microcode and BIOS updates, in the hope I won’t need another fix from them at some point.

15 August, 2014 04:02PM par aurel32

13 August 2014

Benoit Peccatte

J’ai pété

... désolé

Niveau :      

Résumé : gdisk /dev/sda

Le format GPT

Guid partition table est un format de partitionnement de disque.

Il ne faut pas confondre un format de partitionnement avec le formatage d'une partition avec système de fichier. Il y a de nombreux formats de système de fichier : ext4, swap, xfs ... Mais il n'existe que peu de format de partitionnement, les plus connus étant :

  • MBR : format utilisé par les premiers PC sous DOS et encore en usage sur la beaucoup de vos machines
  • disklabel : utilisé sur solaris et BSD
  • GPT : apparu récemment (il y a environ 15 ans) pour les besoins de l'itanium

Ce format a pour but de palier les différents problèmes de son prédécesseur direct le MBR :

  • stockage de la table en double et checksum du contenu : la table étant une structure très importante, on peut enfin se dire qu'on ne la perdra plus
  • stockage des offset en LBA sur 64 bits : on arrête de parler de CHS obsolètes depuis longtemps et on espère pouvoir tenir assez longtemps la croissance des tailles de disques : 9 milliards de téra octets avec des secteurs de 512 octets
  • on dépasse donc la limite des 2To supportés par le format MBR, si vous avez un disque de plus de 2Tio il est a peu près certain qu'il a déjà du GPT
  • tous les identifiants sont des UUID : garantis uniques, on peut en créer autant qu'on veut (2^128) et il y en a partout
  • la table fait au minimum 16kio : on n'a plus de question de table primaire/logique/étendue et on peut stocker au moins 128 partitions sans se poser de question
  • accessoirement on peut stocker des noms de partition directement dans la table

Attention, on stocke des adresses de secteur (LBA comme en MBR depuis un certain temps) et non d'octets, et la taille d'un secteur peut varier d'un disque à l'autre, il faut faire attention à ne pas copier les tables GPT trop littéralement.

GPT est indiqué comme nécessaire pour le support du boot sur EFI, bien qu'il soit théoriquement possible de faire sans.

Partitionner en GPT

Pour partitionner en GPT vous avez le choix entre deux familles d'outil :

  • parted et gparted
  • gdisk, sgdisk et cgdisk (remplaçants de la famille fdisk)

Le moins dangereux est de ne partitionner que vos nouveaux disques en GPT, mais il y a moyen de refaire la table de partition d'anciens disques s'il y a suffisament de place pour stocker la table GPT (16kio en début et en fin de disque plus le MBR). Si l'espace est disponible, c'est simple, il vous suffit de reporter les adresses de début et de fin de chaque partition du MBR vers le GPT.

Choix des partitions

Tout d'abord je vous recommande d'aligner vos partition sur 1Mio, le minimum recommandé étant de 4kio. Le minimum de 4ko s'explique par le fait que de plus en plus de disques ont des secteurs de 4ko, et si vos écritures ne sont pas alignées sur 4kio vous allez voir vos performances dégringoler.

Il faut ajouter que de plus en plus de disques sont des SSD. Les SSD ont des pages sur lesquelles il est aussi intéressant de se caler et elles peuvent aller jusqu'à 1Mio.

Donc ne vous posez plus la question et prenez la valeur par défaut de l'outil qui aligne sur le Mio.

  1. Si vous avez un boot sur EFI, vous devez faire une partition EFI (type ESP), ne soyez pas radin, mettez-y au moins 100Mo
  2. Si vous avez un boot sur un BIOS d'origine, il est conseillé de faire une partition de type bios. Certaines personnes indiquent que celle-ci est indispensable car GPT ne laisse pas de place caché pour le bootloader. C'est faux puisqu'il suffit d'aligner les partitions pour faire apparaître de la place. Mais puisqu'on en en est à faire des trucs propres, profitez-en pour faire ce qui aurait du être fait depuis très longtemps et faites de la place pour stocker un bon grub2 avec tous ses modules (1Mo)
  3. Si vous voulez permettre l'hibernation de votre machine (ou si vous avez peu de ram) n'oubliez pas d'inclure une partition de swap.
  4. Pensez à séparer système et données sur deux partitions différentes. La partition de données est naturellement /home pour une particulier, mais sur un serveur c'est plus flou : /var /srv /home sont des répertoire de données.

Compatibilité MBR

Dans la notion de MBR (un unique secteur de 512 octets) il faut différencier le code et la table des partitions.

Si vous utilisez un BIOS classique, le code du MBR restera le même (grub/lilo/boot windows ...).

Si vous utilisez EFI, le code du MBR peut être vide (ce que fait en général gdisk), mais il peut être intéressant de mettre un code fonctionnel avec un avertissement.

La table des partitions du MBR doit elle être protégée pour éviter à un outil d'édition de cette table de tenter d'y faire des modifications et d'effacer vos précieuses données. C'est pour cela qu'on y inscrit un "protective MBR" qui indique que le disque est entièrement utilisé par une partition unique de type GPT.

Tags:, , ,

13 August, 2014 09:29PM par peck

15 July 2014

Stéphane Blondon

DebConf sur la planète

Cette année, la conférence Debian annuelle aura lieu à Portland, aux États-Unis. Comme l’année dernière, j’y participerai. :)

Participation à la conférence Debian

Cette conférence sera la quinzième du nom. Voici une carte des différentes DebConf (passées en rouge, la prochaine en blanc et celle de l’année prochaine en jaune).

debconf14_planet

Jusqu’ici les conférences ont eu lieu alternativement en Europe et en Amérique (du Nord, centrale ou du Sud). Ce sera aussi le cas en 2015 puisque la conférence aura lieu en Allemagne à Heidelberg.

Réalisation de la carte

La carte diffère légèrement de celle réalisée l’année dernière (pour DebConf13) grâce quelques changements de configuration d’xplanet.

Commande utilisée

xplanet -transpng debconf14_planet.png -geometry 1024x512 -projection peters -config debconf14_planet.conf -num_times 1

Deux paramètres ont été modifiés :

  • La carte utilise une projection de Peters plutôt qu’une projection de Mercator. Pour cela, il suffit de remplacer -projection mercator par -projection peters.
  • Avec cette projection, la taille de la Terre n’est pas la même et la zone vide est rempli par défaut par un ciel étoilé. Il est aussi possible de choisir une couleur unie ou sa propre image de fond. Remplacer le paramètre -output par -transpng pour définir le fichier de sortie permet d’avoir un fond transparent.

Fichier debconf14_planet.conf

[earth]
shade=100
marker_file=coords.txt
marker_fontsize=15
map=night.jpg

L’ajout de map permet de définir l’image à utiliser à la place de l’image par défaut. Ici, on obtient une image de la Terre de nuit (qui provient de /usr/share/xplanet/images/night.jpg).

Fichier coords.txt

+44.80 +0.58 "0&1" #Bordeaux, France
+43.65 -79.38 "2" #Toronto, Canada
+59.92 +10.75 "3" #Oslo, Norway
-29.99 -51.22 "4" #Porto Alegre, Brazil
+60.22 +24.66 "5" #Espoo, Finland
+18.91 -98.97 "6" #Oaxtepec, Mexico
+55.96 -3.19 "7" #Edinburgh, Scotland
-37.96 -57.59 "8" #Mar del Plata, Argentina
+39.60 -6.08 "9" #Extremadura, Spain
+40.74 -74.00 "10" #New York City, USA
+44.78 +17.21 "11" #Banja Luka, Republika Srpska, Bosnia and Herzegovina
+12.14 -86.25 "12" #Managua, Nicaragua
+46.87 +6.75 "13" #Le Camp, Vaumarcus, Switzerland
+45.53 -122.67 "14" color=white #Portland, Oregon, USA
+49.24 +8.42 "15" color=yellow #Heidelberg, Germany

Le fichier a simplement été mis à jour (ajout d’Heidelberg, décalage des couleurs).

À bientôt !


15 July, 2014 08:56PM par ascendances

16 June 2014

Christophe Nowicki

Déploiement “en masse” de noyau Linux personnalisé et durci à l’aide de Puppet

200px-Pax_tux

Comme tout barbu qui se respecte, j’aime avoir un noyau Linux, dont la configuration correspond parfaitement au matériel et à l’utilisation d’une machine.

Pour cela j’ai développé un module Puppet qui permet de déployer des noyaux Linux personnalisés et durcis.

Problématique

Compiler et personnaliser la configuration du noyau d’une seule machine est une tâche qui nécessite :

  • une bonne connaissance des options du noyau ;
  • connaissance du matériel et des drivers correspondants ;
  • du temps ;

Il y a de cela une dizaines d’année il était fréquent de compiler une version personnalisée du noyau Linux, mais aujourd’hui le noyau fourni par une distribution GNU/Linux, contient une grande quantité de pilotes et couvre la plupart des besoins.

Il n’y a pas de différence de performance entre un pilote de périphériques compiler en “dur” dans le noyau et charger en modules.

Les seules raisons de compiler un noyau personnalisé sont :

  • la vitesse de démarrage ;
  • et la sécurité.

C’est ce dernier point qui m’a poussé à mettre en place un système de compilation de noyau Linux automatisé.

Module Puppet

Le module Puppet dispose des fonctionnalités suivantes :

  • installation et décompression des sources du noyau dans /usr/src ;
  • application du patch grsecurity ;
  • écriture d’un fichier de configuration personnalisé ;
  • re-compilation du noyau et création d’un paquet pour la distribution Debian GNU/Linux ;
  • compilation en cas de changement de la configuration ;
  • TODO : installation du paquet et reboot sur le nouveau noyau à l’aide de kexec ;

Gestion de la configuration du noyau

D’après le LKDDb (Linux Kernel Driver DataBase), il y a plus de 19 000 options différentes dans un noyau Linux.

L’approche classique pour la gestion d’un tel nombre d’options est l’utilisation d’un tableur Excel ;-)

Mais la plupart des utilisateurs conservent les fichiers de configuration directement sur le système de fichier ou dans un logiciel de gestion de version.

Mais cette approche ne me satisfait pas, j’ai donc opté pour l’utilisation d’une base de données hiérarchique : Hiera

Structure hiérarchique

La structure adoptée est la suivante :

# /etc/puppet/hiera.yaml
---
:backends:
  - yaml
:yaml:
  :datadir: /etc/puppet/hiera/
:logger: puppet
:hierarchy:
  - "fqdn/%{::fqdn}"
  - "boardproductname/%{::boardproductname}"
  - "hardwaremodel/%{::hardwaremodel}"
  - common

common.yaml

Contient la configuration commune à toutes les machines et la “négation” des options, ce qui évite à make-kdpkg de choisir une option par défaut :

# /etc/puppet/hiera/common.yaml
---
linux-grsec::kernel::config:
    CONFIG_CGROUP_DEBUG: n
    CONFIG_CGROUP_FREEZER: n
    CONFIG_CGROUP_DEVICE: n
    CONFIG_CPUSETS: n
    CONFIG_PROC_PID_CPUSET: n
    CONFIG_CGROUP_CPUACCT: n
    CONFIG_RESOURCE_COUNTERS: n
    CONFIG_MEMCG: n
    CONFIG_CGROUP_HUGETLB: n
    CONFIG_CGROUP_PERF: n
    CONFIG_CGROUP_SCHED: n
    CONFIG_FAIR_GROUP_SCHED: n
    CONFIG_CFS_BANDWIDTH: n
    CONFIG_RT_GROUP_SCHED: n
    CONFIG_BLK_CGROUP: n
    CONFIG_CHECKPOINT_RESTORE: n    
    CONFIG_GRKERNSEC: y
    CONFIG_GRKERNSEC_CONFIG_AUTO: n
    CONFIG_GRKERNSEC_CONFIG_CUSTOM: y
    CONFIG_PAX: y
...

Répertoires hardwaremodel et boardproductname

Le répertoire hardwaremodel contiens la définition d’un architecture :

/etc/puppet/hiera/hardwaremodel/
├── i586.yaml
├── i686.yaml
└── x86_64.yaml

Comme par exemple l’architecture x86_64:

# /etc/puppet/hiera/hardwaremodel/x86_64.yaml
---
linux-grsec::kernel::config: 
    CONFIG_64BIT: y
    CONFIG_X86_64: y
    CONFIG_OUTPUT_FORMAT: '"elf64-x86-64"'
    CONFIG_ARCH_DEFCONFIG: '"arch/x86/configs/x86_64_defconfig"'

Le répertoire boardproductname contient la définition des pilote de périphériques pour une machine :

/etc/puppet/hiera/boardproductname/
├── beagleboneblack.yaml
├── C7Q67.yaml
├── D33217GKE.yaml
├── DN2800MT.yaml
├── net5501.yaml
├── net6501.yaml
├── raspberrypi.yaml
├── wandboard.yaml
├── X7SPA-HF.yaml
├── X9SCL.yaml
└── Z68MA-D2H-B3.yaml

Par exemple, pour un net5501 de Soekris Inc. :

# /etc/puppet/hiera/boardproductname/net5501.yaml
---
linux-grsec::kernel::config:
    CONFIG_SMP: n
    CONFIG_X86_64_SMP: n
    CONFIG_X86_32_SMP: n
    CONFIG_RCU_FANOUT: 32
    CONFIG_MGEODE_LX: y
    CONFIG_X86_GENERIC: n
    CONFIG_GENERIC_CPU: n
    CONFIG_NET_VENDOR_VIA: y
    CONFIG_VIA_RHINE: y
    CONFIG_VIA_RHINE_MMIO: y
    CONFIG_HW_RANDOM_GEODE: y
    CONFIG_FB_GEODE: y
    CONFIG_CRYPTO_DEV_GEODE: y
    CONFIG_CRC_T10DIF: y
    CONFIG_ATA_GENERIC: y
    CONFIG_PATA_CS5536: y
    CONFIG_CS5535_MFGPT: y
    CONFIG_SENSORS_PC87360: y
    CONFIG_I2C: y
    CONFIG_SCx200_ACB: y
    CONFIG_LEDS_NET5501: y

Répertoire fqdn

Le répertoire fqdn contient les options spécifique à une machine et à ses fonctionnalités (ici une gateway VPN avec StrongSwan et l’IPS Suricata ) :

# /etc/puppet/hiera/fqdn/foo.bar.yaml
---
linux-grsec::kernel::config:
# StrongSwan
    CONFIG_XFRM_USER: y
    CONFIG_NET_KEY: y
    CONFIG_NET_KEY_MIGRATE: n
    CONFIG_IP_ADVANCED_ROUTER: y
    CONFIG_IP_MULTIPLE_TABLES: y
    CONFIG_INET_AH: y
    CONFIG_INET_ESP: y
    CONFIG_INET_IPCOMP: y
    CONFIG_INET_XFRM_MODE_TRANSPORT: y
    CONFIG_INET_XFRM_MODE_TUNNEL: y
    CONFIG_INET_XFRM_MODE_BEET: y
    CONFIG_NET_IPVTI: n
    CONFIG_IPV6: y
    CONFIG_INET6_AH: y
    CONFIG_INET6_ESP: y
    CONFIG_INET6_IPCOMP: y
    CONFIG_INET6_XFRM_MODE_TRANSPORT: y
    CONFIG_INET6_XFRM_MODE_TUNNEL: y
    CONFIG_INET6_XFRM_MODE_BEET: y
    CONFIG_IPV6_MULTIPLE_TABLES: y
    CONFIG_IPV6_SUBTREES: n
    CONFIG_NETFILTER: y
    CONFIG_NETFILTER_XTABLES: y
    CONFIG_NETFILTER_XT_MATCH_POLICY: y
# Suricata
    CONFIG_NETFILTER_ADVANCED: y
    CONFIG_BRIDGE_NETFILTER: n
    CONFIG_NETFILTER_NETLINK_QUEUE: y
    CONFIG_NETFILTER_NETLINK_ACCT: y
    CONFIG_NETFILTER_XT_TARGET_NFQUEUE: y
...

Configuration finale

$ hiera -h  linux-grsec::kernel::config ::hardwaremodel i586 ::boardproductname net5501 ::fqdn foo.bar
{"CONFIG_NETFILTER_XT_MATCH_STATISTIC"=>"n",
 "CONFIG_BLK_DEV_RSXX"=>"n",
 "CONFIG_USB_CATC"=>"n",
 "CONFIG_MMU"=>"y",
 "CONFIG_GPIO_BCM_KONA"=>"n",
 "CONFIG_CHELSIO_T4VF"=>"n",
 "CONFIG_SERIAL_CORE"=>"y",
 "CONFIG_DM_MIRROR"=>"y",
 "CONFIG_IO_DELAY_TYPE_NONE"=>3,
 "CONFIG_MMC_TEST"=>"n",
...

Exemple d’utilisation

# puppet agent -t
...
info: Applying configuration version '1402952642'
notice: /Stage[main]/Linux-grsec::Kernel/File[/usr/src/foo.config]/ensure: created
info: /Stage[main]/Linux-grsec::Kernel/File[/usr/src/foo.config]: Scheduling refresh of Exec[make-kpkg]
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/linux-3.14.4.tar.xz]/ensure: defined content as '{md5}c7c565d14833550faa39ef8279272182'
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/grsecurity-3.0-3.14.4-201405141623.patch]/ensure: defined content as '{md5}e88a81b0c222d14e228dc29dd76a875a'
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/grsecurity-3.0-3.14.4-201405141623.patch.sig]/ensure: defined content as '{md5}737b22b6e8cae0d4398ba3f68acaf1e1'
notice: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4/grsecurity]/returns: executed successfully
info: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4/grsecurity]: Scheduling refresh of Exec[make-kpkg]
notice: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4]/returns: executed successfully
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/linux-3.14.4/.config]/ensure: created
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: exec make kpkg_version=12.036+nmu3 -f /usr/share/kernel-package/ruleset/minimal.mk debian APPEND_TO_VERSION=-foo  INITRD=YES 
...
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: cp -pf debian/control.dist          debian/control
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: make[2]: Leaving directory `/usr/src/linux-3.14.4'
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: make[1]: Leaving directory `/usr/src/linux-3.14.4'
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]: Triggered 'refresh' from 2 events
notice: Finished catalog run in 179.65 seconds
..
# dpkg -i linux-*.deb

Conclusion

Ce système me permet de déployer des noyaux GRSec sur la petite dizaine de machines de mon réseau local.

Cette méthode ne convient pas au domaine de l’embarqué, (rasberrypi, beaglebone black, wandboard, etc… ) car l’espace disque et la puissance de calcul nécessaire ne sont pas disponible sur ce type de machine.

Références

16 June, 2014 09:33PM par cscm

16 April 2014

Tanguy Ortolo

Signing party au salon Solutions Linux le 20 mai 2014

En ces temps troublés, il est important de sécuriser nos échanges d'information — en chiffrant — ainsi que la distribution de logiciels — en signant les publications.

À cette fin, le salon Solutions Linux, Libres et Open Source sera l'occasion d'une signing party PGP, le 20 mai 2014 à 18h près du stand Debian France. Cette signing party est ouverte à tous les visiteurs et exposants du salon.

Pour faciliter les échanges d'empreintes de clefs en cas d'affluence, il est possible que nous utilisions une liste officielle de participants selon le protocole de Zimmermann-Sassaman. Pour préparer cela, il est demandé aux participants de me contacter en m'envoyant leur clef publique. Selon la méthode de signing party retenue, je publierai ultérieurement des instructions plus précises.

16 April, 2014 06:45PM par Tanguy

15 April 2014

Florent Gallaire

Lucas 2.0

Lucas Nussbaum vient d’être réélu Debian Project Leader.

Comme on peut le constater sur ce graphe, il a obtenu 47 voix de plus que Neil McGovern :

Une analyse plus précise des votes permet d’en calculer une représentation plus “classique” du point de vue des habitudes électorales, et donc plus compréhensible pour la majorité des gens :

Lucas Nussbaum : 56,5%
Neil McGovern : 43,5%

C’est bien une large victoire de Lucas, mais aussi une défaite très honorable pour Neil, qui se positionne donc comme un prétendant sérieux à la victoire l’année prochaine.

flattr this!

15 April, 2014 04:36PM par fgallaire

11 April 2014

Roland Mas

Une page de publicité

Allez, c'est vendredi, c'est permis, je vais m'autoriser deux petites annonces.

Premièrement : rappelez-vous Minami Taiko, ce groupe de tambours japonais du sud de la France. Bon, nous on est des amateurs, mais il se trouve qu'on fait venir, pour le festival Escale à Sète, un vrai groupe de taikos du Japon et tout. Ils s'appellent SEN, et ils vont faire quelques animations musicales dans Sète du 18 au 21 avril. Et avant de repartir dans leur lointain Cipango, ils feront un vrai concert à Montpellier, le mardi 22 avril au soir, sur le campus de l'INRA/Supagro. Et devinez qui fait la première partie ? Minami Taiko, voilà qui ! Donc si vous voulez découvrir le taiko ou voir quelques amateurs suivis d'un vrai groupe, faites donc un tour sur le site de Minami Taiko. À noter qu'il y a aussi un atelier d'initiation le même jour si ça vous intéresse.

Deuxièmement : je suis fier de vous présenter un petit site web que c'est moi qui l'ai fait avec mes petits doigts délicats. Ça s'appelle Chacun sa part, et ça sert à faire des comptes entre amis, genre quand on part en vacances ensemble, ou qu'on fait régulièrement des dépenses partagées dans un groupe de gens. Pour éviter des comptes d'apothicaire à chaque restau, chaque tournée au bar, chaque passage en caisse, on saisit la dépense sur le site, on dit qui a payé et qui a participé, et le site calcule automatiquement les soldes de chacun et propose des suggestions de remboursements pour rééquilibrer les comptes. Y'a un système d'invitations pour que chacun puisse consulter l'état du groupe et saisir des dépenses, des QR-codes pour faciliter la vie aux utilisateurs de smartphone, et même si ça n'a pas encore été testé à grande échelle ça a été validé par une poignée de testeurs dans différentes configurations. Allez-y, c'est cadeau. Chacun sa part. Point com.

11 April, 2014 08:06AM

11 March 2014

Rodolphe Quiédeville

Debian, PG9.3, Osmosis et Nominatim

Même en se basant sur des références en terme de stabilité il peut arriver que certains combos soient fatals à votre production. C'est ce qui m'est arrivé récemment pour un serveur Nominatim installé pourtant sur une Debian Wheezy, osmosis est utilisé pour la mise à jour continue de la base Nominatim et m'a fait des misères que je m'en vais vous conter.

En parallèle de la version de PostgreSQL 9.1 standard Debian j'ai installé sur la machine une 9.3 en provenance du dépôt Debian de la communauté PG (le support dfe JSON dans PG 9.3 c'est awesome), jusque là tout va bien. Seulement à l'upgrade suivant le paquet libpostgis-java est passé en version 2.1.1-5.pgdg70+1 (celle-ci étant disponible sur le dépôt PG) ; malheureusement cette version est incompatible avec osmosis packagé chez Debian qui nécessite la version 1.5.3 de cette librairie, et là c'est le drâme !

Donc si au lancement d'osmosis vous rencontrez l'erreur :

java.io.FileNotFoundException: /usr/share/java/postgis.jar

Alors que le sus-dit fichier est bien présent, et que vous commencez à dire du mal des backtraces java, il existe un solution simple et efficace, downgrader la version de libpostgis-java en quelques commandes :

dpkg --remove osmosis
apt-get install libpostgis-java=1.5.3-2 osmosis

Sans oublier un pinning pour éviter la future mise à jour du paquet.

11 March, 2014 08:07AM par Rodolphe Quiédeville