Cette fiche opérationnelle décrit la mise en place d'un serveur minimal Raspbian (basé sur Debian Stretch) qui devra ensuite être étendu selon les besoins (web, TOR
, ...).
Le noyau Raspbian est toujours en 32 bits, il peut donc être installé sur toute carte Raspberry, de la Pi Zéro au format carte de crédit équipée d'un mono-processeur 32 bits et de 512MB de RAM, jusqu'à un Pi3 B+ format paquet de cigarettes munie d'un processeur 4 cœurs 64 bits (mais utilisés seulement en 32bits) et de 1Go en RAM.
Nous n'utiliserons que la ligne de commande (CLI), sans écran ni clavier à partir d'une connexion distante en SSH
.
S'agissant d'une utilisation serveur, SSH
sera durci ainsi que Raspbian.
(ici sur un PC Linux Ubuntu 18.04 LTS)
Les Raspberry(ies ?) démarrent normalement à partir d'une carte au format SD (hélas !) d'au moins 2Go pour la présente installation, bien qu'il soit possible d'utiliser un périphérique USB plus rapide.
Il faut y transférer une des images disques disponibles. Nous téléchargeons l'archive ZIP de la plus petite configuration officielle (Raspbian Release date: 2018-11-13)
wget https://downloads.raspberrypi.org/raspbian_lite_latest echo "47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d raspbian_lite_latest" > raspbian_lite_latest.sha256 sha256sum -c raspbian_lite_latest.sha256(la somme de contrôle est à recopier depuis le site)
(certaines commandes nécessiteront des droits privilégiés, donc sudo
à rajouter devant celles-ci, ou login en tant que root
)
Introduire la carte SD dans le PC et chercher son identifiant de périphérique, par exemple avec lsblk
, dmesg
ou encore journalctl -xe
. Attention à ne pas se tromper sous peine de perdre des données !
lsblkLa dernière ligne montre une SDCard qui a été montée, elle contient donc déjà un système de fichier et probablement des données ... méfiance avant de continuer.... └─sda3_crypt 253:0 0 118,3G 0 crypt └─ubuntu--vg-swap_1 253:2 0 3,9G 0 lvm └─cryptswap1 253:3 0 3,9G 0 crypt [SWAP] sdb 8:16 1 59,7G 0 disk /media/xxx/A6F6-44CD ...
xxx
sera à remplacer par votre login — il est également possible que le point de montage soit un chemin différent.
Sinon on obtient plutôt
sdb 8:16 1 59,7G 0 diskDans la suite nous supposerons que le périphérique recherché est
/dev/sdb
.
unzip raspbian_lite_latest dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/sdb bs=512optionnellement, vérifier la gravure au prix de 1.8 Go supplémentaires pour la relecture de l'image. On fournit à/dev/sdb bs=512 3645440+0 enregistrements lus 3645440+0 enregistrements écrits 1866465280 bytes (1,9 GB, 1,7 GiB) copied, 329,063 s, 5,7 MB/ssync
count=
le nombre d'enregistrements indiqués à l'écriture, ici 3645440
sudo dd if=/dev/sdb of=image-relue bs=512 count=3645440 cmp 2018-11-13-raspbian-stretch-lite.img image-relue rm 2018-11-13-raspbian-stretch-lite.img image-relue
Autre méthode, graphique, avec etcher à télécharger sur https://www.balena.io/etcher/ ou à installer comme paquet etcher-electron
.
Dans ce cas il convient de rajouter le suffixe .zip
afin que etcher propose cette archive comme image à choisir, sans besoin de la décompresser.
mv raspbian_lite_latest raspbian_lite_latest.zipEn outre etcher vérifiera la gravure bloc par bloc, sans fichier intermédiaire.
Retirer puis réinsérer la carte. Normalement Linux la détecte et monte automatiquement ses deux partitions boot
et rootfs
.
Au cas où le montage automatique n'aurait pas eu lieu, retrouver l'identifiant de périphérique associé à la carte, probablement le même que précédemment
fdisk -l /dev/sdbLa première partition, iciPériphérique Amorçage Début Fin Secteurs Taille Id Type /dev/sdb1 8192 98045 89854 43,9M c W95 FAT32 (LBA) /dev/sdb2 98304 3645439 3547136 1,7G 83 Linux
/dev/sdb1
formattée en FAT32
est celle qui contient le boot
, on la monte
mkdir /media/xxx/boot mount /dev/sdb1 /media/xxx/boot
ssh
dans boot
touch /media/xxx/boot/sshCela lancera le serveur
SSH
au démarrage de la Pi.
rootfs
à tout l'espace disponible sur la SDCard lorsqu'il démarrera.
Cela permet, par exemple, d'achever de configurer le serveur sur la Pi, puis, avant de l'utiliser réellement, de recopier la SDCard pour obtenir une image préconfigurée qu'il suffira de dupliquer. Cela sans devoir y enregistrer les Go ou les dizaines de Go d'espace alloué mais non utilisé rajoutés par l'extension.
sed -i -E 's: +init=/usr/lib/raspi-config/init_resize.sh::' /media/xxx/boot/cmdline.txtPlus tard, après avoir récupéré l'image, on pourra rajouter le redimensionnement automatique en remontant la carte comme précédemment
sed -i -E 's:$: init=/usr/lib/raspi-config/init_resize.sh:' /media/xxx/boot/cmdline.txtou plus simplement, sur la Pi, utiliser
raspi-config
.
Attention: le redimensionnement automatique sur la Pi ne fonctionnera pas si une autre partition a été créée.
Note : certaines des opérations ci-après réalisées sur la Pi en fonctionnement, pourraient être menées à cette étape, typiquement les modifications de fichiers ou le redimensionnement (voir la dernière section « Exemple de duplication ».
umount /dev/sdb[12] rmdir /media/xxx/boot
On insère la SDCard dans la Pi ... et on met le contact. Le démarrage ne nécessite aucun écran ni clavier.
Il faudra cependant trouver l'adresse IPv4 ou IPv6 associée.
pi
mot de passe raspberry
qu'il s'agit de changer ;
pi
peut passer sudo sans mot de passe. Nous allons donc lui enlever ce privilège et créer un autre utilisateur, seul autorisé à sudo
et par lequel il faudra passer pour toute opération « système » ;
sudo
par mot de passe ;
ssh
à des clefs exclusivement de type « courbes elliptiques » ;
(Utiliser l'adresse IPv4 ou IPv6 correcte)
pi
et passer super-utilisateur root
ssh pi@192.168.x.y passwd pi chmod 0750 ~ cd / sudo -s -H su - rootNote : Plus loin nous invaliderons même l'usage d'un mot de passe pour
pi
.
ssh
, purge de paquets inutiles à nos besoins, mise-à-jour, installation des paquets qui vont bien (liste à adapter aux besoins et habitudes)
systemctl enable ssh apt purge samba* exim4 apt-get update && apt-get dist-upgrade --fix-missing && apt-get autoremove && apt-get clean && df -mh apt-get install haveged atop vim ntp ifstat borgbackup timedatectl set-ntp noAvertissement : il est également souhaitable de purger les outils inutiles en production, notamment les compilateurs tels
gcc
, et, de façon générale, d'examiner la listes des paquets préinstallés dpkg -l | less
.
sed -i -E '/^\$Umask/{s/^/#/ a\$Umask 0027 }' /etc/rsyslog.conf sed -i -E '/^umask/{s/^/#/ a\umask 027 }' /etc/init/ssh.conf # Debian: /etc/init.d/ssh sed -i -E '/^UMASK/{s/^/#/ aUMASK 027 }' /etc/login.defs echo "session optional pam_umask.so umask=0027" >> /etc/pam.d/common-session echo "umask 027" >> /etc/profile
sudo
depuis un shell et un environnement restreints et suppression de ce rôle pour pi
madm
('machine administrator')
ADMIN=madm useradd $ADMIN -G sudo -s /bin/rbash passwd $ADMIN mkdir /home/$ADMIN chgrp $ADMIN /home/$ADMIN chmod 0710 /home/$ADMIN cd /home/$ADMIN echo "su - root" > .bash_history chmod 0400 .bash_history mkdir .ssh chown $ADMIN .ssh .bash_history chmod 0700 .sshlaisser ce terminal ouvert en
root
comme secours et en ouvrir un autre sur la machine distante.
mdadm
et à pi
— si l'on souhaite conserver ce login bien trop connu ... Transmettre aussi d'autres clefs mais attention à leur type car on va les restreindre aux seules « courbes elliptiques »)
# send/copy ecdsa/ed25519 ssh-keys from remote : ssh-copy-id -f -i ~/.ssh/id_ecdsa.pub madm@192.168.x.y ssh-copy-id -f -i ~/.ssh/id_ed25519.pub pi@192.168.x.y
pi
peut se connecter, puis madm
. En cas de problème ssh -v
et/ou journalctl -exu ssh
sur le terminal laissé ouvert en secours sur la Pi
ssh pi@192.168.x.y # CTRL-D disconnect if OK. ssh madm@192.168.x.y sudo -s -H # (give madm password) su - rooton continue depuis ce
root
obtenu par madm
pi
et faire le ménage
getent group | grep -F pi gpasswd -d pi sudo # "pi" as sudoer is far too well-known gpasswd -d pi adm rm /etc/sudoers.d/010_pi-nopasswd passwd -l pi # no more password access for "pi", ssh-key only
echo "changeme.scalaire.fr" > /etc/hostname vi /etc/ntp.conf # use other server/pool, listen interface, ...(dans la suite la machine sera en fait nommée
piresty.local
)
ssh
(adapté selon cette fiche opérationnelle)
F=/etc/ssh/ssh_config cat >> $F <<-EOD.......... VerifyHostKeyDNS yes Ciphers chacha20-poly1305@openssh.com MACs hmac-sha2-512-etm@openssh.com KexAlgorithms curve25519-sha256@libssh.org EOD..........
ed25519
que l'on régénère.
cd /etc/ssh rm ssh_host_dsa_key* ssh_host_ecdsa_key* ssh_host_rsa_key* echo y | ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -N '' -t ed25519 ssh-keygen -r piresty.localla commande précédente permet de récupérer les deux lignes SSHFP à mettre dans le DNS comme support de la directivepiresty.local IN SSHFP 4 1 daef071b50300cf29958d38cd44ae249c8ecc1c7 piresty.local IN SSHFP 4 2 211f41384983a40a0d10a35a2b5f5a68f6699b53119f4e016f1bc9a7d7541a6a
VerifyHostKeyDNS
des éventuelles configurations clients sur d'autres serveurs.
F="/etc/ssh/sshd_config" sed -i -e "/^\t*UsePAM/s/^/#/" "$F" cat >> "$F" <<EOD.......... StrictModes yes HostKey /etc/ssh/ssh_host_ed25519_key # ListenAddress 192.168.x.y # ListenAddress [2a01:e0b:182:e032:21c4:407d:2f15:40e3] UsePAM no PasswordAuthentication no PubkeyAcceptedKeyTypes ssh-ed25519,ecdsa-sha2-nistp521 Ciphers chacha20-poly1305@openssh.com MACs hmac-sha2-512-etm@openssh.com KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521 MaxAuthTries 60 # AllowUsers madm pi EOD..........(Décommenter et adapter les lignes en
#
à convenance)
systemctl restart ssh journalctl -xeu ssh ss -tapine |grep -F sshDepuis un autre terminal, la première connexion signalera un risque tout à fait normal vu la nouvelle clef du serveur avec un message du genre suivant
ssh pi@192.168.x.yExécuter la commande proposée@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ED25519 key sent by the remote host is SHA256:kWfyicIko2HHyOO9y0xFSytWSa/JZsQz9bCUEr0HW+g. Please contact your system administrator. Add correct host key in /home/xxx/.ssh/known_hosts to get rid of this message. Offending ED25519 key in /home/xxx/.ssh/known_hosts:13 remove with: ssh-keygen -f "/home/xxx/.ssh/known_hosts" -R "192.168.x.y" ED25519 host key for 192.168.x.y has changed and you have requested strict checking. Host key verification failed.
ssh-keygen -f "/home/xxx/.ssh/known_hosts" -R "192.168.x.y"ou enlever la ligne « offensante » par son numéro
sed -i -e 3d /home/xxx/.ssh/known_hosts
sed -i -E '/\s+\/boot\s+/s/defaults/defaults,noauto/' /etc/fstab umount /boot # From now, do not forget to mount /boot before updates ! see ~/SYSUP.sh echo "apt-get update && mount /boot && apt-get dist-upgrade --fix-missing && apt-get autoremove && df -h && apt-get clean && umount /boot && df -mh" > ~/SYSUP.sh chmod 0700 ~/SYSUP.sh ~/SYSUP.shOn peut également durcir le montage de certaines partitions disque si l'on en a créé (ce n'est pas le cas ici). Un extrait d'un autre
/etc/fstab
pour l'exemple :
/dev/mapper/vlhome /home ext4 defaults,nodev,nosuid 0 2 /dev/mapper/vltmp /tmp ext4 defaults,nodev,noexec 0 2 /dev/mapper/databases /var/lib/mysql ext4 defaults,nodev,noexec 0 2On interdit l'utilisation de fichiers spéciaux (accès aux périphériques), et de programmes pouvant s'exécuter avec les droits d'un autre login que celui de l'utilisateur voire interdiction pure et simple d'exécuter des programmes situés sous ce point de montage.
systemctl reboot # or 'poweroff' to stop safely and remove the SDCard
Si l'on avait choisi d'empêcher l'expansion du système de fichier à toute la carte, on peut maintenant en sauver l'image préconfigurée sur le PC. En supposant qu'elle y est toujours associée à /dev/sdb
On peut vérifier le nombre de secteurs consommés par fdisk -l /dev/sdb
comme dans la section « Montage manuel ». On prend le secteur de fin + 1 pour count=
puisque leur numérotation commence à 0.
sudo dd if=/dev/sdb of=raspbian-mini-preconf.img bs=512 count=3645440
On gagne de la place en compressant cette image. L'omnipréset format zip, très portable, permet de la transférer à d'autres sytèmes.
On peut alors créer de nouvelles partitions et/ou augmenter la taille de la partition Raspian rootfs
sur la carte SD (cf la section « Modifications »)
(Il s'applique également à la version originale de Raspbian.)
On part d'une grosse carte SD de 64 Go qu'on suppose encore vue comme /dev/sdb
sur laquelle on rajoutera une troisième partition (pour un futur /home
par exemple)
unzip raspbian_lite_preconf.zip ls -lh raspbian_lite_preconf.*-rw-r-1 xx xx 1,8G janv. 4 12:18 raspbian_lite_preconf.img -rw-rr1 xx xx 472M janv. 4 12:34 raspbian_lite_preconf.zip
Rafraîchissement mémoire —la nôtre !— à propos du partionnement de notre image
fdisk -l raspbian_lite_preconf.imgDisque raspbian_lite_preconf.img : 1,8 GiB, 1866465280 octets, 3645440 secteurs Unités : secteur de 1 × 512 = 512 octets Taille de secteur (logique / physique) : 512 octets / 512 octets taille d'E/S (minimale / optimale) : 512 octets / 512 octets Type d'étiquette de disque : dos Identifiant de disque : 0x7ee80803 Périphérique morçage Début Fin Secteurs Taille Id Type raspbian_lite_preconf.img1 8192 98045 89854 43,9M c W95 FAT32 (LBA) raspbian_lite_preconf.img2 98304 3645439 3547136 1,7G 83 Linux
Attention à ne pas se tromper de périphérique — risque de perte irrémédiable de données
dd if=raspbian_lite_preconf.img of=/dev/sdb bs=512On peut vérifier que3645440+0 enregistrements lus 3645440+0 enregistrements écrits 1866465280 bytes (1,9 GB, 1,7 GiB) copied, 312,137 s, 6,0 MB/ssync
1866465280 ÷ 512 = 3645440 = 3645439(bloc de fin) + 1
Retirer et remettre la carte dans le lecteur, son montage devant être automatique, la démonter et vérifier :
umount /dev/sdb{1,2} fdisk -l /dev/sdbDisque /dev/sdb : 59,7 GiB, 64054362112 octets, 125106176 secteurs Unités : secteur de 1 × 512 = 512 octets Taille de secteur (logique / physique) : 512 octets / 512 octets taille d'E/S (minimale / optimale) : 512 octets / 512 octets Type d'étiquette de disque : dos Identifiant de disque : 0x7ee80803 Périphérique Amorçage Début Fin Secteurs Taille Id Type /dev/sdb1 8192 98045 89854 43,9M c W95 FAT32 (LBA) /dev/sdb2 98304 3645439 3547136 1,7G 83 Linux
Extension de sdb2 / rootfs
à 15Go. Signification des commandes : Delete 2 New 2 Primary « secteur de début tel qu'indiqué juste au-dessus » taille Write. Pour éviter les problèmes, on peut choisir de taper à la main les commandes pour fdisk
...
fdisk /dev/sdb <<EOD... d 2 n p 2 98304 +15G w EOD...Bienvenue dans fdisk (util-linux 2.31.1). Les modifications resteront en mémoire jusqu'à écriture. Soyez prudent avant d'utiliser la commande d'écriture. Commande (m pour l'aide) : Numéro de partition (1,2, 2 par défaut) : La partition 2 a été supprimée. Commande (m pour l'aide) : Type de partition p primaire (1 primaire, 0 étendue, 3 libre) e étendue (conteneur pour partitions logiques) Sélectionnez (p par défaut) : Numéro de partition (2-4, 2 par défaut) : Premier secteur (2048-125106175, 2048 par défaut) : Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (98304-125106175, 125106175 par défaut) : Une nouvelle partition 2 de type « Linux » et de taille 15 GiB a été créée. La partition #2 contient une signature ext4. Commande (m pour l'aide) : La table de partitions a été altérée. Appel d'ioctl() pour relire la table de partitions. Synchronisation des disques.e2fsck -f /dev/sdb2Passe 1 : vérification des i-noeuds, des blocs et des tailles Passe 2 : vérification de la structure des répertoires Passe 3 : vérification de la connectivité des répertoires Passe 4 : vérification des compteurs de référence Passe 5 : vérification de l'information du sommaire de groupe rootfs : 41674/110880 fichiers (0.2% non contigus), 289406/443392 blocsresize2fs /dev/sdb2resize2fs 1.44.1 (24-Mar-2018) En train de redimensionner le système de fichiers sur /dev/sdb2 à 3932160 (4k) blocs. Le système de fichiers sur /dev/sdb2 a maintenant une taille de 3932160 blocs (4k).fdisk -l /dev/sdb... Périphérique Amorçage Début Fin Secteurs Taille Id Type /dev/sdb1 8192 98045 89854 43,9M c W95 FAT32 (LBA) /dev/sdb2 98304 31555583 31457280 15G 83 Linux
Création d'une 3ème partition, pour l'exemple. Elle débutera donc ici à 31555583 + 1
fdisk /dev/sdb <<EOD... n p 3 31555584indiquer la taille voulue p.ex. +8G ou laisser vide pour taille = le maximumw EOD... mkfs.ext4 /dev/sdb3 sync
Sortir et remettre la carte dans son lecteur pour vérifier
df -h/dev/sdb1 44M 23M 22M 51% /media/xxx/boot /dev/sdb2 15G 1,1G 13G 8% /media/xxx/rootfs /dev/sdb3 44G 53M 42G 1% /media/xxx/6ebaf79d-1176-4393-9cd3-24744acb0757