dimanche 15 décembre 2013

SELinux sur Raspberry Pi (recompilation du noyau)

La configuration par défaut du noyau du Raspberry Pi ne permet pas de faire fonctionner SELinux. Il est donc nécessaire de préalablement recompiler un noyau. Ma principale source d'information pour la compilation a été la page suivante. Ainsi que ce billet pour les options de compilation à ajouter.

On peut compiler directement sur Raspberry mais il faut compter une demi journée de compilation. J'ai donc choisi de compiler sous une VM Ubuntu. J'avais installé une Ubuntu x64 par habitude mais j'ai réalisé qu'il aurait été plus pratique de compiler sous un OS 32 bits comme le Raspberry Pi.

Pour pouvoir compiler un noyau 32 bits sur un OS x64 j'ai du installer libc6-i386 pour éviter l'erreur "bmc-2708 no such file or directory". sudo apt-get install libc6-i386 J'ai également du installer tout l'environnement de compilation 32 bits sans lequel la compilation échoue dès le début avec un "libz.so.1: cannot open shared object file" sudo apt-get install ia32-libs Vient ensuite l'installation de l'environnement de compilation ARM. sudo apt-get install gcc-arm-linux-gnueabi make ncurses-dev Puis le téléchargement et installation des outils de compilation correctement paramétrés pour l'architecture matérielle du Raspberry Pi. Télécharger et extraire l'archive suivante. Comme l'explique la page officielle, ces outils ne sont théoriquement pas nécessaires mais leur utilisation évite d'avoir à correctement configurer ceux présents sur votre installation Linux existante. Les commandes suivantes assurent que ce sont bien les outils Raspberry Pi qui vont être pris en compte lors de la compilation: ln -s /home/myaccount/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-gcc /usr/bin/arm-bcm2708-linux-gnueabi-gcc

export CCPREFIX=/home/myaccount/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-

export KERNEL_SRC=/home/myaccount/linux-rpi-3.6.y
Une fois notre VM ainsi préparée on peut passer au téléchargement des sources sur le github officiel de Raspbian que l'on extraira dans /home/myaccount/linux-rpi-3.6.y précédemment cité.

Avant de compiler le noyau il faut le configurer et le plus simple est de repartir de la configuration que vous avez sur votre installation existante de Raspbian: scp pi@rpiaddress:/proc/config.gz ./ (transfert de la config sur votre Ubuntu)
zcat config.gz > .config
mv .config $KERNEL_SRC
make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
Ensuite comme indiqué dans le le billet suivant, éditez à la main le fichier de configuration avec les paramètres ci-dessous: CONFIG_AUDIT=y
CONFIG_AUDIT_LOGINUID_IMMUTABLE=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
# CONFIG_SECURITY_SELINUX_DISABLE is not set
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_DEFAULT_SECURITY=""
CONFIG_LOCALVERSION="-MonNoyau"
Notez la personnalisation de CONFIG_LOCALVERSION qui va permettre d'installer les modules recompilés dans un répertoire spécifique "/libs/modules/3.6.11-MonNoyau" plutôt que d'écraser les modules déjà présents. On conserve ainsi les deux versions en cas de problème.

Puis on compile et on exporte les modules dans un répertoire séparé en vue de leur installation sur le Pi. make ARCH=arm CROSS_COMPILE=${CCPREFIX}
make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules
export MODULES_TEMP=~/modules
make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=${MODULES_TEMP} modules_install
Reste à déplacer le contenu de ~/modules sur le Raspberry ansi que le noyau lui même vers /boot/kernel.img. Le site officiel parle d'installer arch/arm/boot/Image mais on peut également installer la version compressée arch/arm/boot/zImage.

Si on a personnalisé CONFIG_LOCALVERSION on peut facilement vérifier la prise en compte de son nouveau noyau après un reboot par la commande: uname -a Linux XXX.dyndns.org 3.6.11-MonNoyau #538 PREEMPT Tue Dec 10 22:40:16 BST 2013 armv6l GNU/Linux

Aucun commentaire:

Enregistrer un commentaire