lundi 20 janvier 2014

Un serveur web oui mais .... comment faire pour que ce ne soit pas une passoire - partie 1


Après une période creuse pour cause de taf un peu chargé et naturellement de repas gargantuesque, voici un tuto un peu fleuve en deux partie.

Récemment j'ai un amis qui a mis un site web en ligne sur un Raspberrypi (et le pire c'est moi qui lui ai conseillé), mais il l'a mis à l'arrache sans plus de sécurité et patatra le méchant est passé par là et zoup plus de serveur.
Voici donc un petit topo, pour créer un serveur web, SFTP et SSH histoire de pouvoir l'administrer à distance. Le paramétrage n'est clairement pas inviolable mais représente un bon début pour un serveur web derrière un pare feu.
Naturellement je pars du principe que notre serveur se trouve sur un Raspberry.
Pour des raisons de sécurité j'ai masqué des parties d'écran mais elle ne sont pas critiques au post.
les services concernés :

  • SSH / SFTP  traité par ce post (partie 1)
  • Web traité par le post suivant (partie 2)

Je pars du principe que vous avez une raspbian de base.

0) la modification de l'installation de base:

La raspbian étant une distribution généraliste, je propose de lui faire une coupe d'été.
Le raspberry pi a des ressources limités nous allons enlever des composants et travailler la mémoire.

0.1) Mémoire du GPU au minimum et overclocking :

Comme nous n'allons pas utiliser de composant graphique, nous allouons le minimum de mémoire au GPU : 16mo. Puis un petit overclocking au CPU.
Pour ce faire nous allons utiliser l'utilitaire de configuration de la raspbian :
sudo raspi-config



Entrez 16 puis validez.

0.2) Mise à jour de la distribution :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get autoclean  

0.3) Supprimer les paquets liés au serveur X : 

aucun besoin d'interface graphique sur notre serveur web :
sudo apt-get purge xserver-xorg xserver-xorg-core xserver-xorg-input-all xserver-xorg-input-evdev xserver-xorg-input-synaptics xserver-xorg-video-fbdev xserver-common xpdf xinit x11-common x11-utils x11-xkb-utils xarchiver screen pcmanfm penguinspuzzle lxde-common lxappearance lxde-icon-theme lxinput lxmenu-data lxpanel lxpolkit lxrandr lxsession lxsession-edit lxshortcut lxtask lxterminal leafpad dillo galculator gnome-icon-theme gnome-themes-standard gnome-themes-standard-data gpicview hicolor-icon-theme

0.4) Suppression des répertoires en trop dans /home/pi :


rm -r python_games
sudo rm -r Desktop/

Notre 1er acte de sécurité est de créer un autre utilisateur que pi pour gérer les services de l'extérieur. Sinon si une personne extérieur arrive à trouver votre OS, il essayera systématiquement de se connecter via ce user (je ne le supprime pas car les manipulations potentielles serait plus lourdes).

0.5) Création d'un utilisateur spécifique autre que pi :

adduser sebastien
sudo adduser sebastien sudo  

0.6) Sudo ou ROOT  :

J'adopte volontairement l'approche sudo qui est un service sécurisé, nous aurions pu enlever le sudo au profit de l'utilisateur ROOT. C'est un choix ...

1) SSH :

Le ssh est un service très pratique pour travailler sur votre server de l'extérieur. Il permet d'avoir accès à la console et au transfert de fichier. Nous allons sécuriser le SSH en modifiant sa configuration de base et mettre une authentification par à base de clès.

1.1) La base de SSH

modifier le fichier  /etc/ssh/sshd_config

  1. Changer la ligne port en mettant un autre port de votre choix pour le post j'ai choisi le port 1021.
    #seb:20131029:chg du port stdPort 1021(comme vous pouvez le voir je met un tag sur chaque modification de ligne pour les retrouver facilement avec des outils de type grep)
  2. Passer la ligne PermitRootLogin de yes à no. Cette ligne empêche le user root de se connecter au service
  3. Ajouter à la fin du fichier : AllowUsers sebastienCette ligne n'autorise que le user sebastien à ce connecter au service ( se nom correspond à l'utilisateur qui a été crée à l'étape 0).
  4. On redémarre le ssh :

sudo service ssh restart

1.2) La gestion des clés 

Nous allons mettant configurer le service pour autoriser uniquement les connections par clès d’authentification
Le principe est le suivant : on crée une paire de clés:

  • une clés privé qui vous authentifie
  • une clés publique qui contrôle la véracité de votre clés privé. 
La clés privé vous est personnelle et ne doit jamais être donner (c'est un peu comme un mot de passe). La clés publique sera installée sur le serveur.
Chaque utilisateur du SSH devra avoir sa clés et donc la manipulation des points 12-1,2,3,4 sera à exécuter pour chaque utilisateur.

1.2.1) création du répertoire personnel SSH

On crée le répertoire personnel de SSH qui recevra la clés de l'utilisateur crée à l'étape 1 et autorisé par ssh. Le répertoire à créer est .ssh (le point désigne un répertoire caché), ici l'utilisateur est sebastien.
mkdir /home/sebastien/.ssh
(en fonction de votre login de connexion vous devrez mettre un sudo).

1.2.2) On crée la paire de clés sous linux :

Placer vous dans le répertoire précédemment créé puis créer les clés avec la commande
 ssh-keygen -t rsa
Je vous laisse décider si vous souhaitez mettre une passphrase à votre clès ( si oui vous devrez la tapez à chaque authentification, c'est une protection si une personne vient à voler votre clès)

Vous avez deux clés crées :

  • une clés privée ==> id_rsa
  • une clés privée ==> id_rsa.pub

La clés publique sera sur le serveur et la clés privée avec vous, c'est elle qui vous authentifiera vis à vis du serveur.
Pour que la clés publique soit reconnu par sshd nous allons la mettre dans le fichier qui sera lu lors de la connexion SSH.
cat id_rsa.pub > authorized_keys (cette manipulation est à faire dans le répertoire .ssh créé au 1.2.1)

Maintenant sauvegarder votre clés privé & public (id_ras.pub & id_rsa) hors du serveur, elle n'ont plus rien à y faire et mettez les dans un coffre fort :-)

Modifier les autorisations sur le répertoire .ssh et sur le fichier authorized_keys.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

En fonction de votre user connexion passer le propriétaire du fichier à l'utilisateur de connexion
sudo chown sebastien /home/sebastien/.ssh
sudo chgrp sebastien /home/sebastien/.ssh
sudo chown sebastien /home/sebastien/.ssh/authorized_keys
sudo chgrp sebastien /home/sebastien/.ssh/authorized_keys

1.2.3) Les test de connexion avec un client putty.

Pour ce faire il faut d'abord convertir la clés au format putty avec le programme suivant : putty key genrator

Faites un test de connexion avec ptty reprenez la procédure de l'annexe du post :
http://piexplo.blogspot.fr/2013/09/histoire-dune-post-installation-dune.html.
mais insérer votre clés avant de cliquez sur open: aller dans le menu Connection->SSH->Auth puis mettez votre clés
Faîtes un test de connexion, cela doit fonctionner.

1.2.4) Configuration définitive uniquement par clés :

sudo nano /etc/ssh/sshd_config

Et on redémarre le service :
sudo service ssh restart

1.2.5 ) transfert via SFTP :


J'utilise pour ce faire le client winscp (qui gère la connexion par clès) sous Windows
configuration de la connexion :

Puis aller dans Advanced, Advanced. Mettez votre clés :

Conclusion

Voilà pour cette 1ère partie nous avons un serveur avec un ssh et sftp en place. Dans le prochain post on s'attaque au server web, au firewall, au scan des ports ...

Aucun commentaire:

Enregistrer un commentaire