Construction et sécurisation d'un système Linux embarqué Frédéric AIME faime@janua.fr 0 950 260 370
Différentes approches Création d'une distribution From Scratch Nécessite un investissement intellectuel Forte granularité Parfaite maîtrise du projet Conseillé si LINUX est stratégique Choix d'un produit commercial Outils graphiques Cross compilation Support technique Mais Granularité moindre Coût de support parfois élevé
Phases de construction d'un système Optimisation de la procédure de démarrage du système Réduction drastique de l'utilisation mémoire (utilisation de uclibc et Busybox) Optimisation du noyau en fonction des fonctionnalités nécessaires (pilotes de périphériques, réseau ou non, etc...). Réduction et simplification du nombre de fichiers et répertoires de configuration comme /etc contenant la majorité des fichiers de config. Suppression du système de swap: un système embarqué est destiné à un usage bien défini et sera donc suffisamment dimensionné en mémoire vive pour éviter l'utilisation d'une partition de swap.
Optimisation du démarrage boot du système par LILO (LInux LOader) ou un programme équivalent chargement du noyau lancement par le noyau du processus init (/sbin/init) lecture du fichier /etc/inittab par le processus init. Ce fichier contient en général le nom du script de démarrage: # System initialization (runs when system boots). si:s:sysinit:/etc/rc.d/rc.s le script en question poursuit l'initialisation du système
Construction d'un environnement Lightweight Utilisation de uclibc Nécessite: binutils gcc Remplacement des commandes systèmes par busybox Prend en charge la majorité des commandes usuelles Linux
Optimisation du noyau Sélection de l'architecture cible Inventaire des drivers utiles Supprimer tous les autres Optimisation en espace (option -Os de gcc) Suppression des fonctionnalités inutiles
Interfaces graphiques De plus en plus fréquent X Window System: parfois peu adapté car coûteux en ressources Reste cependant la référence dans le monde UNIX (plugins, etc...) XFree86 peut être optimisé en taille et ressources (Xkdrive, mode VESA...) Frame-buffer LINUX: accès aux modes graphiques sans X11 (en général mode VESA + quelques supports spécifiques) QTopia (ex Qt/Embedded ) Compatible source avec Qt: à la base de KDE et du navigateur OPERA Utilise le frame-buffer LINUX Déja éprouvé dans des solutions industrielles avec OPERA (Motorola, Sony mylo, sharp, volvo,...) Existe en version GPL ==> applications DOIVENT être GPL GTK+
Exemple d'environnement de développement pour l'embarqué ou * Station de développement Cross GCC Binutils architecture cible uclibc architecture cible Filesystem cible: Base-layout uclibc Busybox * en utilisant un sous-système permettant de faire fonctionner gcc, ex: cygwin
Sécurisation du système Principes de sécurisation identiques à l'informatique traditionnelle La sécurité parfaite N'EXISTE PAS Objectif : Rendre le plus complexe possible les «turnaround» Contraintes particulières D'espace de stockage D'espace mémoire
Sécurisation du système Isoler applicatif du système Environnement «chrooté» Un environnement «virtuel» et disjoint du système principal Exemple : serveur FTP, serveur WEB,... Cantonner l'impact d'une brèche de sécurité à cet environnement Difficile à mettre en place dans certains cas Front-end web de configuration du système Utilisateurs applicatifs non privilégiés (non root)
Sécurisation du système Noyau compilé dans l'esprit «SELinux» SELinux : un ensemble de règles de configuration Mais reste un noyau standard avec éventuellement quelque patches Un module est capable de tout faire Modules de noyau figés Phase de boot Chargement des modules connus echo off > /proc/modules en fin de phase de boot (<= linux-2.4.x)
Sécurisation du système Définir les éléments qui peuvent être mis à jour Noyau Modules «trustés» Applicatifs S'assurer que l'on parle au bon serveur de mise à jour Utilisation de certificats «clients» pour valider le serveur Utilisation de signature numérique des paquets à mettre à jour
Sécurisation du système Ce que fait Netfilter Effectuer des filtrages de paquets, principalement pour assurer des fonctions de Firewall (Filter) Effectuer des opérations de NAT (Network Address Translation) Effectuer des opérations de marquage des paquets (Mangle)