Files
LinuxEmbarque/tp5.md
2024-12-05 17:11:34 +01:00

15 KiB

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

#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.

#!/bin/sh 
echo "Content-type: text/html"
echo "<html>"
echo "<body>"
echo "<h1>Image gallery</h1>"
# Loop through all image files in the current directory

for img in /image_gallery/*.jpg; do
  if [ -f "$img" ]; then
    echo "<div>"
    echo "<img src=\"$img\" style=\"max-width: 300px; height: auto; margin: 10px;\" alt=\"$img\">"
    echo "<p>$img</p>"
    echo "</div>"
  fi
done

echo "<p><a href=\"/\"><img src=\"/gohome.png\" border=\"0\"></a></p>"
echo "</body></html>"

On peut ensuite modifier le script original par

#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 :

#!/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'
~ #