# Travail pratique 5 ## Objectif Le but de ce tp est de sécuriser notre système embarqué en ajoutant utilisateurs politique de confidentialité etc... On va aussi utiliser mdev pour gèrer les peripheriques Faire des modifs noyeau. ## 1. Sécurisation du système et authentification dans /etc/ `touch passwd` et `touch group` Voici l'exemple du cours du contenu du fichier passwd : `username : password : UID : GID : d e s c r i p t i o n : home_dir : shell` Dans notre cas on va mettre : `root::0:0:root user,,,:/root:/bin/sh` On a un utilisateur root sans mot de passe avec une description "root user" qui a comme dossier par défaut le repertoire root et le shell localisé dans /bin/sh Avec ca on va créer un repertoire /root et /home `mkdir root` et `mkdir home` Maintenant voici une ligne exemple pour le fichier group : `groupname:x:GID:username1,username2 ,...` Dans notre cas `root:x:0:` Maintenant que on a mis les valeurs basiques à la main on peut utiliser des commandes de busybox pour modifier et peupler ces fichiers automatiquement. On peut utiliser la commande passwd pour changer le mot de passe root. Il faut trouver un mot de passe assez long sinon on se fait engeuler. J'ai choisi "Super2024" Et si on verifier dans le fichier passwd on peut voir que ca a bien été changé. `root:dDs2HI7zOXCjg:0:0:root user,,,:/root:/bin/sh` Pour ajouter un utilisateur on peut utiliser adduser `adduser -h /home/moi -s /bin/sh moi` Dans ce cas on créée un utilisateur "moi" avec un home directory au même nom et le même shell que tout le monde. J'ai donné un mot de passe classique également et maintenant le fichier passwd ressemble à ca : ``` root:dDs2HI7zOXCjg:0:0:root user,,,:/root:/bin/sh moi:h/F/aO4UQZcSc:1000:1000:Linux User,,,:/home/moi:/bin/sh ``` on ajoute le group "addgroup nogroup" `adduser -D -H -G nogroup -s /bin/false www` Permet de crééer un user www avec la config par défaut mais -H empêche la création du home directory -s /bin/false empêche le user de se logger Si on cat le repertoire group ``` moi:x:1000: nogroup:x:1001:www ``` On peut aller modifier ensuite le fichier user pour set manuellement le repertoire www comme default home pour le user www On a maintenant ce fichier passwd : ``` ~ # cat /etc/passwd root:dDs2HI7zOXCjg:0:0:root user,,,:/root:/bin/sh moi:h/F/aO4UQZcSc:1000:1000:Linux User,,,:/home/moi:/bin/sh www:x:1001:1001:Linux User,,,:/var/www:/bin/false ``` Maintenant on veut activer l'authentification au démarrage alors on ajoute cette ligne au init (trouvée dans le cours) `::respawn:/sbin/getty 115200 ttyS0` à la place de `::respawn:-/bin/sh` On peut désormais essayer de reboot notre linux pour voir si ces changements sont effectifs. On a ce prompt : ``` 192.168.144.100 login: root Password: login[46]: root login on 'ttyS0' ``` et ensuite on est bien connecté en root On peut faire la même chose en essayant de se connecter en www ``` 192.168.144.100 login: www Password: Login incorrect login[45]: invalid password for 'www' on 'ttyS0' ``` On ne peut bien pas se connecter en tant que www Maintenant on peut faire en sorte que httpd soit executé par uniquement ce user. On peut aller dans /etc/init.d et edit notre Script StartHttp en remplacant la ligne `httpd -h /var/www` par la ligne `httpd -h /var/www -u www` Pour que le service se lance au nom de www et que au cas ou le service soit compromis il ne puisse rien faire d'autre Avant de mettre la ligne dans le script on peut tester en faisant un `killall httpd` voir que le site n'est plus up et ensuite on peut lancer la commande et voir si le site fonctionne à nouveau. `chown www:nogroup /var/www` Avec cette commande, le repertoire /www appartient à l'utilisateur www ensuite c'est une histoire de faire les bons chmods a la racine pour assigner les bonnes autorisations je vais pas tout citer ici. ## 2. Hotplug et mdev Led bleue : `/sys/class/leds/d2/device/leds/d2/` Led rouge : `/sys/class/leds/d2/device/leds/d3/` Dans chacuns de ces repertoires on peut trouver un fichier brightness dans lequel on peut mettre 0 ou 1 pour changer l'étât des leds. Ensuite avec le fichier depuis le git compressé `xz --decompress disk.img.xz` Ensuite on peut utiliser dd pour copier le contenu dans la clé usb `dd if=./disk.img of=/dev/sdb` la destination est /dev/sdb qui représente la clé usb que on vient d'insèrer. `mkdir media` à la racine de notre système embarqué Quand on plugg la clé USB sur notre système embarqué le nom est SDA donc dans media : `mkdir sda` `mount /dev/sda /media/sda` On peut voir que désormais dans le repertoire media/sda on a bien toutes les images : ``` /media/sda # ls alien.jpg grimsel_pass.jpg rhone_winter.jpg antelope.jpg ice.jpg sardinia.jpg appenzell.jpg island.jpg shark.jpg autumn.jpg jet_d'eau.jpg snail.jpg azores.jpg jonction.jpg sphere.jpg bamboo.jpg kauai.jpg stranger.jpg beach.jpg lagoa_do_fogo.jpg sunrise.jpg bee.jpg leaves.jpg sunset.jpg blossoms.jpg lizard.jpg sup.jpg boat.jpg lone_horse.jpg surfer.jpg chateau_d'oex.jpg lost+found swan1.jpg cyclists.jpg magnolia.jpg swan2.jpg daisy.jpg misty.jpg tentacles.jpg dendelion.jpg moutain_haze.jpg the_view.jpg dropplets.jpg paradise.jpg tortoises.jpg elephant.jpg peak.jpg tulips.jpg fern.jpg peaks.jpg turtle.jpg flower.jpg petals.jpg vertigo.jpg flower_dropplets.jpg rain_forest.jpg vines.jpg glacier.jpg rhone.jpg ``` Ensuite pour faire ces actions de manière automatique on va crééer le fichier /etc/mdev.conf sur le système embarqué. ``` sd[a-z] 0:0 777 @/bin/usb_automount.sh $MDEV ``` Cette commande permet de dire que pour tout perpherique dans /dev qui commence par sd qui appartiendra a root et au groupe 0 et avec les permissions 777 et ca va lancer le script automount.sh avec comme argument le nom du peripherique. Pour le script on doit allumer la led rouge Créer le repertoire /media/[nom du peripherique] monter le peripherique dans /media/[nom du peripherique] Installer le contenu de ce repertoire dans le repertoire correspondant dans le site web sous www Démonter le peripherique Eteindre la led rouge ```sh #echo "$1 Mounted !" >> /dev/console echo 1 > /sys/class/leds/d2/device/leds/d3/brightness echo "mounting fs" >> /dev/console mkdir /media/$1 mount /dev/$1 /media/$1 echo "transferring files" >> /dev/console install /media/$1/* /media/installed/ echo "unmounting" >> /dev/console umount /media/$1 rm -r /media/$1 echo "done" >> /dev/console echo 0 > /sys/class/leds/d2/device/leds/d3/brightness ``` Quand on lance ce script on a bien la led rouge qui s'allume pour indiquer que le transfers est en cours et elle s'eteint quand c'est fini. Et quand on va regarder dans le repertoire installed après coup : ``` /media # ls ./installed/ alien.jpg grimsel_pass.jpg sardinia.jpg antelope.jpg ice.jpg shark.jpg appenzell.jpg island.jpg snail.jpg autumn.jpg jet_d'eau.jpg sphere.jpg azores.jpg jonction.jpg stranger.jpg bamboo.jpg kauai.jpg sunrise.jpg beach.jpg lagoa_do_fogo.jpg sunset.jpg bee.jpg leaves.jpg sup.jpg blossoms.jpg lizard.jpg surfer.jpg boat.jpg lone_horse.jpg swan1.jpg chateau_d'oex.jpg magnolia.jpg swan2.jpg cyclists.jpg misty.jpg tentacles.jpg daisy.jpg moutain_haze.jpg test dendelion.jpg paradise.jpg the_view.jpg dropplets.jpg peak.jpg tortoises.jpg elephant.jpg peaks.jpg tulips.jpg fern.jpg petals.jpg turtle.jpg flower.jpg rain_forest.jpg vertigo.jpg flower_dropplets.jpg rhone.jpg vines.jpg glacier.jpg rhone_winter.jpg ``` Maintenant il faut que on fasse un script qui créée une page web et qui affiche toutes les images du repertoire pour qu'on puisse les voir depuis le site web. ```sh #!/bin/sh echo "Content-type: text/html" echo "" echo "" echo "

Image gallery

" # Loop through all image files in the current directory for img in /image_gallery/*.jpg; do if [ -f "$img" ]; then echo "
" echo "\"$img\"" echo "

$img

" echo "
" fi done echo "

" echo "" ``` On peut ensuite modifier le script original par ```sh #echo "$1 Mounted !" >> /dev/console echo 1 > /sys/class/leds/d2/device/leds/d3/brightness echo "mounting fs" >> /dev/console mkdir /media/$1 mount /dev/$1 /media/$1 echo "transferring files" >> /dev/console install /media/$1/* /var/www/cgi-bin/image_gallery/ echo "unmounting" >> /dev/console umount /media/$1 rm -r /media/$1 echo "done" >> /dev/console echo 0 > /sys/class/leds/d2/device/leds/d3/brightness ``` Maintenant les images sont directements installées au bon endroit mais va savoir pourquoi ca ne veut pas marcher. Les liens sont generés correctements par le script mais les images ne s'affichent pas c'est l'enfer je ne comprends pas pourquoi. Ok après avoir passé LITTERALLEMENT 1h30 sur ce problème j'ai compris pourquoi. Dans la config de HTTP le repertoire cgi-config est utilisé comme un repertoire de fichiers executables. Le problème est que du coup les images ne peuvent pas être executées et cela sort un 404. En déplaceant les images dans le repertoire /var/www/image_gallery/ Plus de problèmes les images peuvent être lues correctement et le site les affiches correctement ! On peut delete toutes les images et dès que on rebranche la clé usb pouf elles sont toutes installées et ca marche nikel ! (Envie de me defenestrer) ## 3. Support USB avec des modules noyau dans le repertoire de notre kernel non compilé : `make menuconfig` Sous device drivers on a une rubrique USB-SUPPORT dans laquelle on peut voir plusieurs features incluses dans le noyeau que on va inclure avec des modules USB MASS STORAGE SUPPORT -> passé en module EHCI HCD (USB 2.0) SUPPORT -> passé en module USB announce new devices -> passé en module Support for host side usb -> passé en module ensuite make `make -j` on peut même compiler simplement les modules avec `make modules install` ou `make INSTALL_MOD_PATH=/home/moi/tp/kernel/MYMODULES modules install` Ca permet de s'assurer de ou les modules sont installés. Après juste le make sans options on peut voir avec la commande `find ./ -name "*.ko"` Que on a pleins de fichiers modules dans /lib, /fs, /crypto, /net et /drivers. On voit que certains modules parlent d'usb genre `./drivers/usb/storage/usb-storage.ko` mais je n'ai pas compris si on devait prendre juste les fichiers .ko et les mettre dans /lib/modules/version ou si il fallait conserver la même arborescence. J'ai pas tout capté honnêtement. On va deja essayer de deployer le kernel sans les modules USB pour bien voir que ca ne marche plus. Et ensuite le but sera de les importer uns à uns jusqu'à ce que ca marche. Sur la board dans u-boot je fais un `run update_kernel` qui est mon script qui nettoie la NAND et qui tftp le nouveau kernel dedans. Maintenant quand on boot sur ce nouveau kernel et que on insère une clé USB il ne se passe plsu rien ! super... `make modules_install INSTALL_MOD_PATH=/home/moi/shared_tftp/lesmodules` Qui nous permet d'output les modules directement dans un fichier que je pourrai TFTP sur ma machine hôte qui contient le nfsroot. Pour transfèrer le tout par tftp comme d'hab on ne peut pas transfer le repertoire directement donc on doit commencer par zipper et envoyer le fichier La compilation des modules fait une arborescence qui commence par /lib/modules J'ai pris le repertoire modules et je l'ai mis dans /lib/modules sur le système embarqué ce qui nous donne une arborescence `/lib/modules/6.6.56` ou on peut voir différents modules. Sous `/lib/modules/6.6.56/kernel/drivers/usb` On a plusieurs categories `class core host serial storage` Sous `/lib/modules/6.6.56/kernel/drivers/usb/storage` On peut voir un fichier usb-storage.ko qui je pense sera utile. Sous `/lib/modules/6.6.56/kernel/drivers/usb/core` on peut voir un fichier usbcore.ko que j'imagine important également. On va monter ces deux modules et voir si l'USB remarche. `modprobe usb-storage` `modprobe usbcore` Mais ca ne suffit pas Quand on va regarder dans /lib/modules/6.6.56/kernel/drivers/usb/host On peut voir pleins de fichiers OHCI (USB1) et EHCI (USB2) On a donc deux fichiers intéressants `ehci-atmel.ko` et `ehci-hcd.ko` `modprobe ehci-atmel` Et la ca marche !! magnifique. Maitenant si on reboot, ca ne marche plus car les modules ne sont pas montés. Donc on va mettre en tant que service dans `/etc/init.d` un script `SmodUsb.sh` avec ce contenu : ```sh #!/bin/sh modprobe usb-storage modprobe usbcore modprobe ehci-atmel ``` Et à présent quand on redémarre le système embarqué, les modules USB sont montés correctements et le fonctionnement du script que l'on a créé au préalable est de retour ! Bonus quand on lance le système ca ressemble à ca : ``` ####################### ######################### ############################ ############################# ################################ ############################### ############################## ############################## ############################# ############################ ########################### ########################### ######################### ######################### ####################### ####################### ###################### ###################### ######################################## #################################### ############################## ########################## #################### ################ ############ ############# ################ ####### ####### ##### #### ## ## Welcome back 192.168.144.100 login: root Password: login[53]: root login on 'ttyS0' ~ # ```