Les notes de Clément

Spécialiste de rien // Partageur de tout
Billets avec le mot-clé raspberry-pi

Sécuriser son accès SSH

Afin de pouvoir contrôler son Raspberry Pi sans avoir besoin d’y connecter un écran, une souris et un écran, il est très commode de s’y connecter via un accès SSH. Un serveur SSH étant installé par défaut sur Raspbian, il n’y a alors aucune configuration particulière à faire, et on peut brancher son Raspberry Pi, le connecter à son réseau avec un câble Ethernet, et depuis son ordinateur personnel (connecté au même réseau), faire :

ssh pi@raspberry

Ensuite, si l’on ajoute une règle NAT sur sa box pour rediriger le port 22 (celui du serveur SSH), on peut se connecter, en utilisant l’adresse IP externe à la place de raspberry, à son Raspberry Pi de n’importe où ! Et ce n’importe quand ! C’est super n’est-ce pas ? Sauf qu’il serait bon que n’importe qui ne puisse pas le faire… On va donc voir quelles règles simples appliquées pour réduire les chances qu’un petit malin se connecte sur votre réseau.

Pourquoi se protéger ?

Pour commencer, il faut dire qu’il y a pénurie d’adresse IP dans le monde, car leur nombre n’est pas infinie et il y a de plus en plus d’appareils reliés à internet ! C’est pourquoi il existe une nouvelle norme IPv6, mais elle n’est pas encore majoritairement utilisée. De plus, sur toute machine Linux, il y a pas défaut un compte root, qui est le super administrateur de la machine ! En bref, il peut tout faire, et c’est par lui que vous passer dès lors que vous modifier votre système (voir la commande sudo par exemple, qui veut dire « super user do »). Donc en faisant :

ssh root@adresse_aleatoire

J’ai plutôt de bonne chance d’essayer de me connecter à un ordinateur existant, ayant un serveur SSH utilisant le port 22, et ayant un utilisateur s’appelant root ! Ensuite, rien de m’empêche d’essayer automatiquement des milliers de mots de passe, et avec un peu de chance, je le trouverais ! Il suffit d’un programme qui teste méthodiquement toutes les chaînes de caractères, à raison d’un essai par seconde, on peut tester 86400 mots de passe par jour ! Même si le nombre de combinaisons possibles est largement plus grand que ça, avec le temps nécessaire, un pirate pourra alors se connecter en root à votre Raspberry Pi !

Mais il va faire quoi ? Ecouter ma musique ?!

Il y a peu de chance… Son intérêt sera plutôt d’installer un programme sur votre système, qu’il pourra utiliser à sa guise plus tard s’il désire lancer une attaque vers un site en particulier. Votre ordinateur est alors devenu ce que l’on appelle un zombie, faisant partie d’un BotNet !

Quelques règles simples

Pour éviter ce scénario, on peut appliquer les quelques règles suivantes.

Changer le port

Rien de plus simple, éditer la configuration de votre serveur ssh, qui est décrite dans le fichier /etc/ssh/sshd_config, pour y faire figurer la ligne :

Port 1337

Attention : vous risquez d’être déconnecté si vous faite l’opération en étant justement connecté en SSH… Donc vous pouvez dans un premier temps utiliser 2 ports, le 22 et le 1337 en dupliquant cette ligne. Puis supprimer la ligne Port 22 ultérieurement. Vous pouvez remplacer 1337 par n’importe quel numéro compris entre 1024 et 65537, en vérifiant qu’il n’est pas déjà utilisé par un autre programme.

Il faut alors penser à changer la règle NAT dans votre box, pour rediriger le port 1337 (et plus le 22). Pour vous connecter maintenant, utilisez l’option -p de la commande ssh :

ssh -p 1337 pi@raspberry

Désactiver la connexion root

Pour éviter à quiconque (vous y compris) de vous connecter directement en super utilisateur à votre Raspberry Pi . Il faut également éditer le fichier /etc/ssh/sshd_config, pour modifier la ligne:

PermitRootLogin no

Installation d’un logiciel qui bannit en cas d’échec

Pour éviter les attaques de type « brute force » qui consiste à essayer le plus possible de mots de passe, il est possible d’installer un logiciel qui va se charger de bannir une adresse IP si un utilisateur échoue à se connecter plus d’un certain nombre de fois. J’utilise personnellement le logiciel fail2ban (il y en a d’autres !), disponible dans les dépôts. Il y a pas grand chose à faire pour le configurer, on modifie le fichier /etc/fail2ban/jail.conf, les paramètres intéressants sont les suivants :

ignoreip = 127.0.0.1/8
bantime  = 600
maxretry = 3

destemail = votre_adresse@mail.com

action = %(action_mwl)s

ignoreip permet de ne pas se faire bannir depuis le Raspberry Pi lui même, bantime est le temps de bannissement en secondes (10 minutes par défaut donc), maxretry le nombre d’échecs pour être bannit. Ensuite, destmail est l’adresse email à laquelle seront envoyés les alertes, et surtout action sera l’action en cas de bannissement. J’aime bien action_mwl qui est celle qui envoie le plus d’informations. Cette action (les autres aussi) peut  elle-même être personnalisée en éditant le fichier  /etc/fail2ban/action.d/sendmail-whois-lines.conf

Remarque : pour que l’envoi des mail se passe correctement, il vous faudra avoir correctement installé et configuré un MTA sur votre système, et j’ai déjà expliqué comment faire dans ce billet : Installation d’un serveur web (Envoi de mail)

Ne pas utiliser de mot de passe

Finalement, il est possible de ne pas utiliser de mot de passe pour se connecter, mais de passer par la génération de clé de cryptage. Cette méthode est très bien pour des installations critiques, mais je trouve que l’on perd alors en flexibilité, et je ne l’utilise personnellement pas… Je ne détaillerai donc pas ici comme procéder, mais il existe de nombreux tutoriels en ligne, par exemple : lea-linux.org : Connection_SSH_sans_mot_de_passe

Sources

Raspberry Pi : gestion de sa carte SD

A force de jouer avec mon Raspberry Pi, j’ai eu le désagrément de le voir refuser de démarrer… La partition /root de ma carte SD était corrompue. J’ai donc du me résoudre à réinstaller Raspbian, et à repartir de zéro, l’occasion cependant d’apprendre à faire des sauvegardes et des restaurations !

Bien sûr, je travaille sous Linux (Xubuntu puisque vous voulez tout savoir), et si vous êtes sous Windows, je sais qu’il est possible de faire la même chose, mais je ne le couvrirai pas dans ce billet.

Ce qu’il faut comprendre, c’est que comme ma carte SD est de taille relativement faible (8Go), il est facile de faire une sauvegarde complète de son contenu (surtout en compressant le résultat).

La commande qu’il faut utiliser est la commande dd, la même que j’ai utilisé pour ma première installation de Raspbian. Ses deux arguments principaux sont :

  • if :  fichier d’entrée (ou périphérique)
  • of : fichier de sortie (ou périphérique)

Il faut déjà savoir à quel périphérique correspond votre lecteur de carte SD, utilisez la commande fdisk :

sudo fdisk -l

Et cherchez un disque d’environ 8Go. Si Raspbian est installé sur la carte, vous avez normalement deux partitions, voilà ce que j’obtiens par exemple :

Disk /dev/sda: 7969 MB, 7969177600 bytes
4 heads, 16 sectors/track, 243200 cylinders, total 15564800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00017b69

		Device Boot      Start         End      Blocks   Id  System
/dev/sda1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sda2          122880    15564799     7720960   83  Linux

Sauvegarde

Je sais donc que c’est /dev/sda qui correspond à ma carte SD que je souhaite sauvegarder. Pour faire une sauvegarde, il me suffit alors d’utiliser :

sudo dd if=/dev/sda of=/chemin/vers/ma/sauvegarde.img bs=1M

Le fichier /chemin/vers/ma/sauvegarde.img fait alors exactement 8Go. J’ai personnellement fait plusieurs sauvegardes pendant que je re-configurais mon Raspberry Pi. Par exemple, après avoir fait une mise à jour complète du système, installer vos disques externes, sécuriser votre accès SSH (article à venir), installer votre serveur web et configurer votre DNS dynamique, une petite sauvegarde du système ne fait pas de mal !

Restauration

Il est possible de restaurer cette image en inversant les argument if et of :

sudo dd if=/chemin/vers/ma/sauvegarde.img of=/dev/sda bs=1M

Attention :  en utilisant of=/dev/sda vous écrasez complètement le disque sda, donc vérifiez bien avec la commande fdisk.

Compression

Si vous faites régulièrement l’opération, pensez qu’il est possible de compresser les images pour qu’elles occupent moins de 8Go sur votre disque en utilisant la commande gzip par exemple :

gzip /chemin/vers/ma/sauvegarde.img

qui créera un fichier /chemin/vers/ma/sauvegarde.img.gz, bien plus petit que 8Go. Il est également possible de faire la sauvegarde et la compression en une seule opération, et pour cela, je vous recommande la lecture des pages 12 et 13 du dernier numéro du magazine MagPi (dans les sources).

Effacer la table de partition

Lorsque j’ai eu mon problème de partition /root corrompue, même en re-copiant une image toute fraîche de Raspbian sur ma carte SD, mon Raspberry Pi refuser toujours de démarrer. Il a fallu que j’efface complètement la table de partition de la carte avec la commande :

sudo dd if=/dev/zero of=/dev/sda bs=1M count=2

Attention : vérifiez bien que /dev/sda est la carte SD, et pas un autre disque dur !

Sources

Raspberry Pi : installation et partage d’un disque dur externe

Comme je souhaite utiliser mon Raspberry comme « serveur de stockage » entre autres, j’ai acheté un disque dur USB alimenté, car les 8Go de la carte SD étaient un peu juste. Dans ce billet, j’explique comment j’ai configuré ledit disque dur, pour un partage simple.

Le montage

Dans le monde Unix, le verbe « monter » désigne l’opération barbare qui consiste à faire en sorte de pouvoir accéder à votre disque dur (ou autre périphérique). En effet, quand on le branche simplement, on ne peut pas y accéder tant qu’il n’a pas été monté. Donc on va faire en sorte que ce disque dur là tout neuf soit automatiquement monté dans un répertoire de notre choix, avec les permissions qui vont bien, afin d’être sûr de toujours le retrouver.

Pour savoir à quel « device » il correspond, utilisez la commande :

sudo fdisk -l

Dans le résultat obtenu, il faut chercher le bloc qui correspond au disque dur, pour moi c’est :

Disk /dev/sdb: 2000.4 GB, 2000398933504 bytes
255 heads, 63 sectors/track, 243201 cylinders, total 3907029167 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x524a5d81

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048  3907024895  1953511424    7  HPFS/NTFS/exFAT

Puisque je sais qu’il fait 2To (enfin 2000398933504 octets). Il correspond donc à /dev/sdb1 (une seule partition) et il est formaté en NTFS, tout va bien. Maintenant, il va nous falloir une seconde info le concernant : son UUID. C’est un identifiant unique, pour le trouver, utilisez la commande :

ls -l /dev/disk/by-uuid/

Et cherchez l’UUID recherché est la suite de numéro et de lettres qui précède le -> ../../sdb1 dans mon cas. Dernière étape : choisir et créer le répertoire dans lequel on veut monter ce disque. J’ai choisit de créer un dossier /storage/ dans lequel je monterai mes disques durs, et donc pour celui là en l’occurrence, on va créer le répertoire /storage/mon_disque :

sudo mkdir /storage
sudo mkdir /storage/mon_disque

On peut maintenant configurer le fichier /etc/fstab pour y ajouter la ligne qui correspondra au montage de notre disque dur :

sudo vim /etc/fstab

Et ajoutez la ligne suivante à la fin :

UUID=votre_UUID    /storage/mon_disque    ntfs-3g    defaults    0    2

Voilà, vous pouvez maintenant monter manuellement votre disque en faisant la commande [AJOUT : il faut avoir installer le paquet ntfs-3g avant !] :

sudo mount /dev/sdb1

Mais tout l’intérêt est que maintenant, à chaque fois que vous brancherez ce disque sur ce raspberry, il sera toujours monté de la même façon, dans le dossier /storage/mon_disque/ !

Un point qui ne me plaisait pas spécialement avec cette configuration très simple, est que le disque dur est en accès 777, c’est à dire que tout le monde peut écrire dessus ! Je ne sais pas si cela est fondamentalement grave mais j’ai préféré changer les permissions. Le seul point délicat, c’est que certains logiciels ont besoin de pouvoir accéder à ce disque : samba, client bittorrent, serveur web, etc… On va voir dans la suite comment j’ai choisi de gérer cela.

Les permissions

Ce qui m’a semblé le plus simple, c’est de créer un groupe storage qui aura tous les droits sur mes disques durs externes, et j’y ajouterai à la main les utilisateurs. Voilà la démarche que j’ai suivie :

  1. Création du groupe :
    sudo groupadd storage
    
  2. Récupération de l’id de ce groupe. La commande :
    cat /etc/group |grep storage
    

    devrait vous renvoyer une seule ligne ressemblant à :storage:x:1005: L’id du groupe est donc 1005, et on va en avoir besoin plus tard.

  3. Ajout de l’utilisateur pi (ou toto si vous vous appelez toto) :
    sudo usermod -a -G storage pi
    
  4. Modification du fichier /etc/fstab pour que le dossier de montage appartienne au groupe storage (on remplace les options defaults) :
    UUID=votre_UUID    /storage/mon_disque    ntfs-3g    suid,dev,auto,async,gid=1005,umask=007    0    2
    

    Le 1005 correspond à l’id du groupe storage et le umask est un paramètre assez compliqué (voir mes sources à la fin du billet), mais la valeur 007 implique que les utilisateurs n’appartenant pas au groupe storage pourront lire et parcourir le disque, mais pas écrire dessus.

  5. Eventuellement, ajout des autres utilisateurs correspondant aux logiciels qui doivent pouvoir écrire sur le disque. Par exemple, si vous souhaitez partager certains dossiers via votre serveur web (voir mon billet Installation d’un serveur web), l’utilisateur correspondant au serveur Apache2 est www-data. Il faut donc faire :
    sudo usermod -a -G storage www-data
    

Partage sur le serveur Web

J’ai expliqué dans le billet Installation d’un serveur web comment installer un simple serveur Apache. Vous pouvez par exemple partager un dossier de votre disque dur directement via le web en créant un lien symbolique. Par exemple, si vous souhaitez partager tout le contenu du dossier /storage/mon_disque/dossier_public/, vous pouvez utiliser la commande :

sudo ln -s /storage/mon_disque/dossier_public/ /var/www/dossier_public

Si l’adresse pour accéder à voter serveur web est mon-rpi.dnsdynamic.com (vous avez utiliser mon tutoriel Utilisation d’un DNS dynamique ?), vous (ou n’importe qui attention !) pouvez consulter le contenu de ce dossier à l’adresse : mon-rpi.dnsdynamic.com/dossier_public/

Il est possible de protéger ce que vous partager sur votre serveur web, par mot de passe par exemple, mais j’en parlerai plus tard. J’ajoute tout de même un lien la dessus dans les sources de ce billet.

Partage avec Samba

Je pense que j’écrirai un billet là-dessus, mais juste au cas où vous auriez déjà configuré un serveur Samba (partage de certains répertoires, y compris avec Windows), sachez que si vous avez suivi ce tutoriel, il vous faudra modifier légèrement votre configuration. Dans le fichier /etc/samba/smb.conf, pour chacun de vos partage, ajoutez la ligne force group = storage, ce qui donnera par exemple :

[mon_disque]
	path = /storage/mon_disque
	browseable = yes
	read only = no
	guest ok = yes
	force group = storage

Accès par client Bittorrent

On verra dans un prochain billet comment installer un client Bittorrent (Transmission) sur votre Raspberry Pi, et le configure pour que les fichiers téléchargés arrivent sur votre disque externe. Il ne faudra donc pas oublier d’ajouter l’utilisateur debian-transmission au groupe storage :

sudo usermod -a -G storage debian-transmission

Sources