Labo 3 - Sécuriser vsftpd (un début)
Retour à la page du cours
Pour ce troisième laboratoire, je vous propose de commencer à sécuriser vsftpd, en créant des utilisateurs virtuels qui ne correspondent pas à un compte chacun sur votre serveur, en empêchant l'utilisation du compte root et de compte anonyme, et en utilisant PAM (Pluggable Authentication Modules) pour s'occuper de l'authentification.
Le but de ce laboratoire est beaucoup plus d'apprendre quelque chose que de se faire évaluer. Je vais tout de même passer vous voir pour vérifier que tout a bien été fait, mais l'idée est ici d'explorer et d'apprendre.
Ce que nous voulons obtenir:
- Un serveur ftp fonctionnel sur un port autre que 21 (normalement ça c'est déjà fait!)
- L'impossibilité d'utiliser le compte anonymous pour faire quoi que ce soit sur le serveur ftp
- L'impossibilité de se loguer avec des comptes protégés par le système (dont le root) et même l'impossibilité de tenter de se loguer avec ces comptes. On évitera ainsi que quelqu'un qui connait le mot de passe du root l'envoie circuler en clair sur le réseau pour se faire dire par le serveur ftp qu'il ne peut pas se connecter.
- La possibilité de créer des usagers virtuels qui n'auront qu'un accès ftp et rien d'autre sur notre serveur.
- La possibilité pour des usagers du serveur d'utiliser le ftp avec leur compte "normal", malgré la présence d'utilisateurs virtuels.
- La possibilité de donner un répertoire racine différent à chaque usager lorsqu'il se connecte sur le serveur ftp, afin qu'il ne puisse pas se balader un peu partout sur le serveur.
- La possibilité de configurer aisément de façon différente chaque usager, afin de permettre à certains de réaliser certaines opérations mais de l'interdire à d'autres (l'écriture par exemple).
- Utiliser PAM pour faire l'authentification des clients de façon sécuritaire.
Pour y arriver:
Le pare-feu
- Éteignez votre pare-feu (iptables) pour l'instant.
SElinux
SElinux (Security Enhanced Linux) est un gestionnaire de sécurité de Linux qui fonctionne par événement et qui contient tout un tas de variables booléennes que l'on peut mettre à 0 ou 1 (ou encore à on ou off, les deux fonctionnent et sont équivalents). Ces variables booléennes déterminent ce qui est permis ou non sur le système. Il y a également des contextes de sécurité que l'on peut associer à des répertoires ou à des actions.
Dans notre cas, vous devez changer les variables booléennes suivantes:
- setsebool -P ftp_home_dir 1
- setsebool -P allow_ftpd_full_access 1
La commande setsebool sert à changer une variable booléenne de SElinux. L'option -P rend le tout permanent (sinon ça serait valide jusqu'au redémarrage de SElinux).
ftp_home_dir: permet de lire ou d'écrire dans les répertoires maisons des usagers (il faut encore que le système de fichiers le permette pour l'usager.
allow_ftpd_full_access: permet d'écrire ou de lire dans tous les autres répertoires (toujours en supposant que le système de fichiers vous le permet)
Optionnellement, vous pouvez aussi faire passer SElinux en mode passif (il continue de loguer les alertes mais laisse tout passer quand même) en faisant:
Évidemment, ce n'est pas recommandé en dehors d'un environnement de tests et de débogage.
Le compte ftp
- Assurez-vous que votre système possède déjà un compte ftp. Comment allez-vous faire pour vérifier?
- En passant, quel est le shell par défaut du compte ftp? Que croyez-vous que ça signifie?
- Le compte ftp sera celui qui sera réellement utilisé lorsqu'un utilisateur virtuel, qui s'authentifiera avec un nom de compte quelconque, se branchera sur le serveur ftp.
Interdire l'accès aux comptes protégés
- Détruisez le fichier /etc/vsftpd/ftpusers - nous n'utiliserons pas ce fichier. Nous utiliserons plutôt le fichier /etc/vsftpd/user_list, qui contiendra la liste des usagers interdits d'accès. Lorsque vsftpd verra qu'un usager entre un de ces noms de compte, il fermera la connexion sans même demander le mot de passe (il donnera quand même un message d'erreur).
- Laissez le contenu de /etc/vsftpd/user_list tel quel - allez voir ce qui s'y trouve en passant, c'est instructif. Ces comptes sont des comptes système qui ne devraient jamais être utilisés par quelqu'un, à part bien sûr le root (qu'on veut tout de même interdire).
La configuration de vsftpd
- Faites une copie de votre fichier /etc/vsftpd/vsftpd.conf - nous allons le modifier alors autant se garder un backup...
- Effacez le contenu complet du fichier /etc/vsftpd/vsftpd.conf. Utilisez les paramètres suivants:
- listen=NO (vous le connaissez déjà celui-là...)
- pam_service_name=vsftpd (ceci donnera à PAM le nom du service et donc celui du fichier de configuration PAM à utiliser)
- anonymous_enable=NO (pas de login anonyme!)
- local_enable=YES (on permet le login des comptes locaux)
- guest_enable=YES (on permet le login des comptes virtuels)
- userlist_file=/etc/vsftpd/user_list (la liste des usagers proscrits)
- userlist_enable=YES (on l'utilise)
- userlist_deny=YES (pour interdire l'accès)
- write_enable=NO (par défaut, personne ne peut écrire sur notre serveur - on modifiera ce paramètre au cas par cas pour les usagers individuels)
- anon_upload_enable=NO (pas le droit d'uploader - ceci est supposé être valide uniquement pour les utilisateurs anonymes mais le paramètre s'applique également aux autres comptes!)
- anon_mkdir_write_enable=NO (pas le droit de créer des répertoires)
- anon_other_write_enable=NO (pas le droit de renommer, effacer, etc)
- chroot_local_user=YES (les usagers seront placés dans un sous-répertoire qui leur apparaîtra comme la racine - du coup ils n'auront accès à rien d'autre que ce répertoire et ce qui se trouve en-dessous)
- max_per_ip=2 (le nombre de connexions permises pour une même adresse IP)
- user_config_dir=/etc/vsftpd/vsftpd_user_conf (un répertoire contenant les configurations spécifiques à chaque usager - voir plus loin)
- Chaque usager (virtuel ou non) aura son propre fichier de configuration pour vsftpd, qui viendra modifier les valeurs par défaut créées ci-haut - d'où notre haut niveau de paranoïa dans le fichier principal.
- Pour plus de sûreté, changez les droits sur le fichier vsftpd.conf pour ne permettre qu'à root de le lire et d'y écrire.
Les usagers virtuels
- Les usagers virtuels utiliseront tous en fait le compte ftp. C'est donc à lui qu'il faut donner des droits d'accès aux répertoires des usagers. Peu importe les permissions que l'on donne à un usager virtuel, si ftp n'a pas les droits au niveau du système de fichiers, il ne pourra rien faire.
- Pour créer les usagers virtuels, on doit d'abord créer un fichier texte quelconque (disons /etc/vsftpd/login.txt) qui contiendra les usagers avec leur mot de passe. Le format est simple: un nom d'usager sur une ligne, son mot de passe sur la ligne d'en-dessous, l'usager suivant sur la ligne suivante, et ainsi de suite. N'oubliez pas de faire un retour de chariot après le dernier mot de passe du fichier! Pour des fins de test, nous utiliserons les deux usagers suivants:
- virtu_georges (mot de passe 1212)
- virtu_roger (mot de passe 1212)
- Une fois ce fichier créé, on devra le transformer en format binaire de base de données que PAM pourra reconnaître - du coup on améliore la sécurité. Pour ce faire, on peut utiliser le format de base de données Berkeley ou MySQL.
- Bien que la façon MySQL apporte des fonctionnalités intéressantes, elle demande qu'on installe un serveur MySQL et qu'on le configure, en plus de s'assurer qu'il roule en tout temps. Nous privilégierons donc le format Berkeley.
La configuration de PAM
- Le répertoire /etc/pam.d contient des fichiers de configuration utilisés par PAM pour les différents services demandant une authentification. Il devrait normalement déjà y avoir quelque chose pour vsftpd. Faites une copie de sécurité de ce fichier.
- Éditez le fichier, effacez son contenu et remplacez-le par les lignes suivantes:
#%PAM-1.0
auth sufficient pam_unix.so
account sufficient pam_unix.so
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login
- La première ligne est une entête qui doit rester là.
- Les deux lignes suivantes permettent à nos usagers locaux de se loguer:
- account s'occupe des restrictions/permissions selon l'heure, compte le nombre maximal d'usagers simultanés, etc. En bref, tout ce qui ne concerne pas l'authentification en tant que tel, mais qui peut tout de même empêcher l'accès à quelqu'un.
- auth s'occupe de l'authentification proprement dite.
- sufficient signifie que lorsque ce module termine avec succès, il n'est pas nécessaire d'aller essayer les autres modules en-dessous.
- pam_unix_so est le nom du module PAM qui s'occupe de l'authentification Unix, soit celle qui est utilisée lorsqu'on se logue au serveur physiquement.
- Les deux dernières lignes concernent nos usagers virtuels. Elles ne seront consultées que si les deux premières lignes échouent.
- required signifie que même s'il y a refus, les modules suivant seront tout de même appelés.
- pam_userdb.so est le module nécessaire pour utiliser une bd Berkeley
- db est le paramètre pointant vers le fichier .db lui-même (on n'a pas besoin de mettre l'extension)
Un premier test de connexion
- Placez-vous dans /root. Retenez le nom d'un des fichiers qui s'y trouvent.
- Faites une connexion ftp (vous pouvez la faire vers vous-mêmes avec localhost si vous voulez).
- Loguez-vous avec un utilisateur virtuel.
- Tentez de déposer un fichier en faisant "put nom_du_fichier" (utilisez celui que vous avez mémorisé au premier point!)
- Normalement, vous devriez pouvoir vous loguer mais pas pouvoir écrire.
- Loguez-vous maintenant avec un compte "réel" autre que root (faites quit pour quitter ftp). Tentez de déposer un fichier.
- Normalement, les résultats devraient être les mêmes.
- Tentez maintenant de vous loguer avec root.
- Normalement, vous ne devriez même pas avoir la chance d'entrer votre mot de passe.
Personnaliser les configurations des usagers virtuels
On peut maintenant créer des "répertoires racine" différents pour chaque usager, en plus de personnaliser leur configuration.
- Créez le répertoire /var/ftp/virtu_roger
- Créez le répetoire /var/ftp/virtu_georges
- Faites en sorte que le compte ftp et le groupe ftp soient propriétaires de ces deux répertoires (puisque c'est ce compte qui l'utilisera réellement).
- Créez le répertoire /etc/vsftpd/vsftpd_user_conf
- Dans /etc/vsftpd/vsftpd_user_conf, créez un fichier au nom de chaque usager virtuel. Dans ces fichiers, on redéfinira certains paramètres:
- local_root=nom_du_user (pour qu'il débute dans son répertoire et ne puisse pas en sortir)
- write_enable=YES
- anon_upload_enable=YES
- anon_mkdir_write_enable=YES
- anon_other_write_enable=YES
- (pour que l'usager puisse écrire et déposer des fichiers)
- Dans le même répertoire, créez un fichier au nom d'un usager "réel" autre que root et mettez-y le même contenu sauf la première ligne (local_root)
Tester de nouveau
- Refaites les tests que vous avez faits précédemment. Normalement vos usagers virtuels devraient pouvoir déposer des fichiers. Remarquez que les deux usagers ne voient pas les fichiers de l'autre.
- Allez-voir dans /var/ftp pour voir comment les fichiers se sont organisés.
- L'usager "réel" devrait lui aussi pouvoir déposer des fichiers. Toutefois, où commence-t-il sa session?
- Est-ce une bonne idée de le laisser là? Y a-t-il des cas où ça pourrait être bon?
Retour à la page du cours