Christophe Nowicki

June 16, 2014

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

Filed under: Debian — Tags:, , , , , , , — cscm @ 22:33

October 23, 2009

Smart by “accident”

Despite The title, This weblog entry is in French. I’m deeply sorry for beening too lazy ;-)

Je viens de finir la lecture de l’étude suivante :
A Spotlight on Security and Privacy Risks with Future Household Robots: Attacks and Lessons.

Celui-ci parle des risques et de la sécurité liés aux robots ménagers (je crois que c’est pas le bon lien ;-) ).

Pour résumer rapidement l’article, celui-ci a évalué le niveau de sécurité des robots : Rovio, Spykee et RoboSapien V2.
Le résultat est une véritable catastrophe d’un point de vue de la sécurité :

  • des connexions sans fil, pas ou faiblement sécurisées ;
  • non chiffrement des informations d’authentification ;
  • apparition de nouvelles attaques.

Mais ce dont j’aimerais vous parler est l’idée que soulève les auteurs au début du document:

both thoses that we encountered and those that we foresee can be attributed partly to the fact that the home is becoming “accidentally” smart and that there is no dedicated, trained system administrator for the home environment.

Je vais dans ce billet illustré cette idée et me permettre de réfléchir à haute voix.

The incoming smart^Wobject

Ils sont minions, petits ou grands, utiles ou futiles.
ils s’appellent Roomba, Nabaztag ou Freebox.
Ils sont arrivés dans nos maisons progressivement.
Et les meilleurs pointent bientôt leur nez ;-)
Ils mettent en place progressivement le paradigme de l’Internet des objets et de l’Intelligence ambiante.

Early adopters

La cible 1ére de ses technologies sont les Geek, ce sont les seuls capables d’adopter ces technologies, d’accepter les problèmes liés à leur jeune âge et de les exploiter.

Les Geeks ont généralement les compétences nécessaires pour comprendre le fonctionnement de ces nouveaux objets.

Mainstream and Mrs. Michu

Ces objets arrivent progressivement chez Madame Michu et c’est la que cela devient intéressant.

Freebox

Commençons par la Freebox, voulez-vous. Car je trouve que c’est l un des meilleurs exemples d’intelligence accidentelle.

Des millions de foyers français ont reçus avec leur abonnement Internet une machin-box.
Celle-ci est équipée d’une liaison Wi-Fi qui n’est pas sécurisée, que cela soit en WEP ou WPA.
Du coup ces milliers de foyer se retrouvent propulsés dans le rôle d’un administrateur réseau.
Et s’ils n’ont pas les compétences nécessaires et que leur connexion est usurpée, ils se trouveront privé de leur droit d’accès Internet grâce à la loi HADOPI.

Roomba

Le robot aspirateur Roomba, dispose d’une forte puissance et il est capable de faire des dégâts important dans une maison si la pièce n’est pas préparée pour son passage.
Le mien dispose en plus d’une connexion Bluetooth dont je doute sérieusement du niveau de sécurité compte-tenu de la complexité du protocole.
Avec une bonne dose de Fuzzing, je pense qu’il est tout à fait envisageable de prendre le contrôle du robot à distance et de me ruiner le salon ;-)

Nabaztag

Continuons avec le Nabaztag.
J’aime beaucoup les lapins, mais je dois avouer que celui-ci me sort particulièrement par les oreilles compte-tenu des problèmes qu’il pose :

  • La connexion Wifi qui pose les mêmes problèmes que la Freebox ;
  • La centralisation, l’ensemble de l’intelligence du lapin se trouve sur les serveurs de Violet, ce qui signifie que si la société fait faillite, alors les lapins mourront ;
  • Ce dernier point soulève de nombreux problèmes liés à la vie privé ;

The rabbit is sad, he wants to hug you

Je suis un des early adopters des ces technologies ( la domotique, la robotique, etc… ).
Mais je trouve que les utilisateurs et les constructeurs ne font pas assez attention aux implications et aux risques liés à ces technologies.

Est-ce que je ne vais pas un peu fort dans les accusations ?

Je pense qu aujourd’hui les histoires de robots qui volent des clés ou qui saccagent une maison peuvent faire sourire.
Mais imaginez les mêmes scénarios dans 5 à 10 ans et nous rigolerons un peu moins.

Mais quel est le principal problème ?

L’internet des objets va être déployé dans un nouvel environnement : votre maison.
C’est à dire un lieu privé, ou la fuite d’information et/ou les risques encourus peuvent avoir des conséquences très importantes.

We need Free hugs, free as software

Je pense que la seule voix possible pour l’Internet des objets est le logiciel libre.

Les points évoqués dans les exemples précédents peuvent être résolu qu’à l’aide de deux méthodes :

  • la formation des utilisateurs ;
  • et l’utilisation de logiciels libres.

Le 1er point est évident, je vais donc développer le second.
Comme le logiciel libre à largement prouvé sa supériorité en matière de sécurité informatique.
Il est donc le seul à pouvoir prétendre une place dans votre vie privé.
C’est la seule solution pour faire adopter ces évolutions.

Il existe aussi une solution basée sur le logiciel propriétaire et des nombreuses lois semblables à HADOPI permettant de cacher ces lacunes en matière de sécurité, mais je n’ai vraiment pas envie d’essayer ;-)

Filed under: Home automation,Robotics — Tags:, , , , — cscm @ 18:54

Powered by WordPress