[Séc. Web] [Divers] Spécificités technologiques

Introduction
Dans cette quête, nous verrons comment s'authentifier auprès d'un serveur FTP via le langage PHP en utilisant des fonctions natifs de PHP notamment ftp_login();, ftp_connect(); etc.. Je vais te montrer comment configurer un serveur FTP sur Linux simplement et rapidement.
File Transfer Protocol, ouFTP, est un protocole de communication destiné au partage de fichiers sur un réseauTCP/IP. Il permet, depuis un ordinateur, de copier des fichiers vers un autre ordinateur du réseau, ou encore de supprimer ou de modifier des fichiers sur cet ordinateur.
🤓 Objectifs
✅ Comprendre à quoi sert le protocole FTP (File Transfer Protocol).
✅ Installer et configurer un serveur FTP sur une machine Linux.
✅ Comprendre comment fonctionne un code PHP, et s'authentifier auprès d'un serveur FTP en PHP.
👉 Installation et configuration d'un serveur FTP
- Nous installerons le paquet
vsftpdpour créer notre serveurFTP. Installonsvsftpdavec le gestionnaire de paquetapt-get. (Cela nécessite un accès root pour exécuter cette commande)
root@ubuntu:/root# apt-get install vsftpd -y
Une fois que le serveur vsftpd a été installé. Il suffit maintenant de créer un nouveau dossier où nous stockerons nos fichiers, personnellement, je vais créer un nouveau dossier /srv/ftp.
root@ubuntu:/root# mkdir /srv/ftp
Nous allons également créer un nouveau fichier avec une note dans ce dossier.
root@ubuntu:/root# echo "Bienvenue dans le serveur FTP" > /srv/ftp/notes
root@ubuntu:/root# cat /srv/ftp/notes
Dans mon système, j'ai uniquement deux utilisateurs ex75 et root. Je vais donner les permissions à l'utilisateur ex75 à écrire dans le dossier /srv/ftp.
root@ubuntu:/root# chown -R ex75 /srv/ftp
Nous allons maintenant démarrer notre service vsftpd.
root@ubuntu:/root# service vsftpd start
Maintenant, je vais essayer de m'authentifier en tant que mon utilisateur actuel de mon système (ex75), mais il s'avère que ici, nous devons plusieurs problèmes notamment que le serveur FTP n'est pas chroot au dossier /srv/ftp. Je peux également interdire au serveur FTP des utilisateurs présents dans le système (mais je vais pas le faire dans ce cas).
ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:ex75): ex75
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 4096 May 17 06:28 Desktop
drwxr-xr-x 2 1000 1000 4096 Apr 30 05:27 Documents
drwxr-xr-x 2 1000 1000 4096 May 13 07:40 Downloads
drwxr-xr-x 2 1000 1000 4096 Apr 30 05:27 Music
drwxr-xr-x 2 1000 1000 4096 May 25 03:51 Pictures
drwxr-xr-x 2 1000 1000 4096 Apr 30 05:27 Public
drwxr-xr-x 2 1000 1000 4096 Apr 30 05:27 Templates
drwxr-xr-x 2 1000 1000 4096 Apr 30 05:27 Videos
226 Directory send OK.
ftp> pwd
257 "/home/ex75" is the current directory
ftp>
Revenons à notre configuration, nous allons modifier notre fichier de configuration /etc/vsftpd.conf.
local_enable=YES
allow_writeable_chroot=YES
write_enable=YES
chroot_local_user=YES
Nous ajouterons ces configurations pour permettent aux utilisateurs de se connecter automatiquement dans le dossier /srv/ftp avec le répertoire chrooté. Cela va nous permettre que les utilisateurs ne remontent pas les dossiers dans le système de fichier Linux. Et, nous avons également autoriser l'écriture de données dans le dossier /srv/ftp.
- Il nous reste plus que à redémarrer le service
vsftpd, et réessayer une authentification. Tout fonctionne parfaitement, lorsque je liste les fichiers dans le dossier courant, il me liste uniquement le fichiernotes(le fichier que nous avons créer avant), et lorsque je regarde le chemin actuel du répertoire en utilisant la commandepwd, je suis bienchrootau répertoire/, cela veut dire que je peux plus remonter en haut, cela permet d'assurer la sécurité du système de fichier, il est important de le mettre.
root@ubuntu:/root# service vsftpd restart
root@ubuntu:/root# ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:ex75): ex75
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 30 May 26 02:38 notes
226 Directory send OK.
ftp> pwd
257 "/" is the current directory
ftp>
👉 Authentification dans un serveur FTP via le langage PHP
- Il ne sera pas nécessaire d'interpréter le code
PHPdirectement depuis le navigateur, il y a également la possibilité d'utiliser directement le binairephppour exécuter notre scriptPHP.
Donc, voici un script PHP qui permet de tester l'authentification auprès d'un serveur FTP via un script PHP.
<?php
$ftp_server = "127.0.0.1";
$ftp_user = "ex75";
$ftp_pass = "ex75";
$ftp_id = ftp_connect($ftp_server) or die("La connexion au serveur FTP est impossible.");
if (@ftp_login($ftp_id, $ftp_user, $ftp_pass)) {
echo "Tu es connecté en tant que $ftp_user@$ftp_server.\n";
} else {
echo "L'authentification est impossible !\n";
}
ftp_close($ftp_id);
?>
Et si maintenant, j'exécute le script PHP depuis le Terminal. Cela fonctionne parfaitement.
root@ubuntu:/root# php -f file.php
Connecté en tant que ex75@127.0.0.1
Ceci n'est que le début, nous avons également l'opportunité de télécharger des fichiers avec des fonctions intéressantes, il y a également des fonctions qui permettent de voir le dossier courant du serveur FTP et j'en passe. Ci-dessous, ça regroupe toutes les fonctions pour communiquer avec un serveur FTP.
| Fonction FTP | Description |
|---|---|
| ftp_alloc | Alloue de l'espace pour un téléchargement de fichier |
| ftp_append | Ajoute le contenu d'un fichier à un autre fichier sur le serveur FTP |
| ftp_cdup | Change de dossier et passe au dossier parent |
| ftp_chdir | Modifie le dossier FTP courant |
| ftp_chmod | Modifie les droits d'un fichier via FTP |
| ftp_close | Ferme une connexion FTP |
| ftp_connect | Ouvre une connexion FTP |
| ftp_delete | Efface un fichier sur un serveur FTP |
| ftp_exec | Exécute une commande sur un serveur FTP |
| ftp_fget | Télécharge un fichier via FTP dans un fichier local |
| ftp_fput | Téléverse un fichier sur un serveur FTP |
| ftp_get_option | Lit différentes options pour la connexion FTP courante |
| ftp_get | Télécharge un fichier depuis un serveur FTP |
| ftp_login | Identification sur un serveur FTP |
| ftp_mdtm | Retourne la date de dernière modification d'un fichier sur un serveur FTP |
| ftp_mkdir | Crée un dossier sur un serveur FTP |
| ftp_mlsd | Retourne la liste des fichiers d'un dossier donné |
| ftp_nb_continue | Reprend le téléchargement d'un fichier (non bloquant) |
| ftp_nb_fget | Lit un fichier sur un serveur FTP, et l'écrit dans un fichier (non bloquant) |
| ftp_nb_fput | Écrit un fichier sur un serveur FTP, et le lit depuis un fichier (non bloquant) |
| ftp_nb_get | Lit un fichier sur un serveur FTP, et l'écrit dans un fichier (non bloquant) |
| ftp_nb_put | Envoie un fichier sur un serveur FTP (non-bloquant) |
| ftp_nlist | Retourne la liste des fichiers d'un dossier |
| ftp_pasv | Active ou désactive le mode passif |
| ftp_put | Charge un fichier sur un serveur FTP |
| ftp_pwd | Retourne le nom du dossier courant |
| ftp_quit | Alias de ftp_close |
| ftp_raw | Envoie une commande FTP brute |
| ftp_rawlist | Fait une liste détaillée des fichiers d'un dossier |
| ftp_rename | Renomme un fichier sur un serveur FTP |
| ftp_rmdir | Efface un dossier FTP |
| ftp_set_option | Modifie les options de la connexion FTP |
| ftp_site | Exécute la commande SITE sur un serveur FTP |
| ftp_size | Retourne la taille d'un fichier |
| ftp_ssl_connect | Ouvre une connexion FTP sécurisée avec SSL |
| ftp_systype | Retourne un identifiant de type de serveur FTP |
Par exemple, je vais essayer de lister le dossier courant du serveur FTP en utilisant la fonction ftp_nlist();. Le deuxième argument de la fonction ftp_nlist(), signifie le répertoire, personnellement, j'ai mis le dossier courant (qui est .).
<?php
$ftp_server = "127.0.0.1";
$ftp_user = "ex75";
$ftp_pass = "ex75";
$ftp_id = ftp_connect($ftp_server) or die("La connexion au serveur FTP est impossible.");
$login_result = ftp_login($ftp_id, $ftp_user, $ftp_pass);
$contents = ftp_nlist($ftp_id, ".");
var_dump($contents);
?>
Et maintenant, l'exécution nous montre que le fichier notes est bien présent dans notre serveur FTP.
root@ubuntu:/root# php -f file.php
array(1) {
[0]=>
string(5) "notes"
}
Je t'invite à voir la documentation complète des fonctions PHP vis à vis du protocole FTP. Cela explique en détail le fonctionnement des fonctions, et de mieux maîtriser les fonctions si tu souhaites communiquer avec un serveur FTP.
☝️ Résumé
FTP(File Transfer Protocol) est un protocole utilisé sur un réseau pour envoyer ou télécharger des fichiers.- Il est tout à fait possible de communiquer avec un serveur
FTPvia un langage de programmation notamment par exemple avec le langagePHP.