Le service FTP

L'auteur de cette page est : Jean-Baptiste Yunès

Le protocole

Le protocole de transfert de fichier est décrit par la RFC 959. Deux extensions sont proposées :

Le modèle client-serveur

Le modèle classique de communication entre un client FTP et un serveur FTP (d'autres modèles sont possibles) utilise deux concepts :

PI
l'interprète du protocole (Protocol Interpreter)
DTP
le processus de transfert (Data Transfer Process)

lesquels communiquent selon le schéma suivant :
diagramme de coopération
La liaison de commande véhicule les commandes définies par le protocole (plus celles propres aux extensions proposées par l'implémentation courante du serveur). Y circulent aussi les réponses à ces mêmes commandes.

La liaison de données transporte les données proprement dites, c'est-à-dire le contenu des objets à échanger.

Les commandes du protocole

Les commandes standard de la liaison de commande sont regroupées en différentes catégories :

Les commandes de contrôle d'accès :
USER
identification de l'utilisateur
PASS
mot de passe de l'utilisateur
ACCT
identification supplémentaire
CWD
permet à l'utilisateur de se positionner dans la hiérarchie du serveur
CDUP
commande générique permettant de remonter dans l'arborescence
SMNT
demande le montage d'une nouvelle structure de données
REIN
réinitialise la communication à l'état primitif de connection
QUIT
termine la session
Les commandes de paramétrage des transferts :
PORT
déclare le point de connection client de la liaison de données
PASV
permet de renverser le comportement du serveur sur la liaison de données (serveur passif)
TYPE
permet de contrôler le format de représentation utilisé pour les échanges
STRU
permet de contrôler la structure des fichiers échangés
MODE
permet de contrôler le mode d'échange des données
Les commandes de service :
RETR
active le tranfert du contenu d'un fichier à travers la liaison de données du serveur vers le client
STOR
active le transfert du contenu d'un fichier à travers la liaison de données du client vers le serveur
STOU
comme STOR mais l'écriture est réalisée dans un fichier de nom unique attribué par le serveur
APPE
comme STOR mais les écritures sont réalisées en fin du fichier s'il existe déjà
ALLO
permet de demander au serveur s'il est possible de réserver de la place avant d'envoyer des données
REST
permet de reprendre un transfert sur un point de reprise
RNFR
permet de renommer un fichier en précisant l'ancien nom (cette commande fonctionne avec RNTO)
RNTO
permet de renommer un fichier en précisant le nouveau nom (cette commande fonctionne avec RNFR)
ABOR
permet de demander l'arrêt immédiat d'un service en cours
DELE
permet la suppression d'un fichier sur le serveur
RMD
permet la suppression d'un répertoire sur le serveur
MKD
permet la création d'un répertoire sur le serveur
PWD
interroge le serveur pour connaître son répertoire courant
LIST
permet de consulter la liste des fichiers d'un répertoire du serveur. Le format des données renvoyées n'est pas normalisé, car cette commande est libre d'implémentation. Son usage est donc réservé aux humains
NLST
permet de consulter la liste des fichiers d'un répertoire du serveur. Le format des données est normalisé, ce qui permet à un programme client de réaliser des traitements automatiques de la réponse
SITE
cette commande permet de réaliser des opérations spécifiques au serveur et dont l'usage n'est pas considéré comme suffisament universel puor apparaître dans la spécification du protocole
SYST
permet d'obtenir des informations sur le système hôte
STAT
permet d'obtenir des informations sur un transfert en cours (s'il y en a un), sur l'état du serveur ou sur un fichier particulier
HELP
permet d'obtenir de l'aide sur les commandes implantées sur le serveur.
NOOP
cette commande ne fait que demander au serveur de répondre positivement

Un serveur minimal doît implémenter les commandes suivantes : TYPE, MODE, USER, QUIT, PORT, STRU, RETR, STOR et NOOP.

Les réponses

Chaque commande du protocole reçoit en retour une réponse. Celle-ci est constituée d'un code de trois chiffres (code de retour xyz), suivit d'un caractère d'espacement puis d'une ligne de texte à caractère informationnel. Il est possible que le texte soit constitué de plusieurs lignes; dans ce cas le caractère d'espacement doit être remplacé par un tiret, et la lecture est terminée par une ligne présentant le même code de retour suivi d'un caractère d'espacement puis de la dernière ligne. Par exemple :

100-Ceci est la première ligne.
Vous avez là la seconde.
  333 la troisième (attention le serveur y a ajouté des caractères pour éviter trop de confusion...)
100 et la quatrième et dernière.

Le code de retour a une sémantique particulière, le premier chiffre x peut prendre cinq valeurs différentes :

1yz : réponse positive et préliminaire
l'opération demandée est initiée, mais il faut attendre une réponse définitive pour procéder à une autre commande
2yz : réponse positive et définitive
l'opération en question s'est normallement terminée
3yz : réponse positive et intermédiaire
l'opération a été acceptée, mais ne peut-être réalisée par manque d'information. L'utilisateur doit alors y répondre en envoyant une autre commande. Ce type de réponse est utilisé avec les commandes groupées (ex : RNFR et RNTO
4yz : réponse négative et temporaire
l'opération a échouée mais les causes sont temporaires et l'utilisateur est encouragé à recommencer
5yz : réponse négative et définitive
l'opération a échouée et les causes de cet échec sont permanentes. L'utilisateur ne doit pas tenter de recommencer la séquence ayant conduit à cet échec à l'identique

Le second chiffre y a la signification suivante :

x0z : syntaxe
réponses relatives aux erreurs de syntaxe, ou à des commandes syntaxiquement correctes mais n'étant pas représentées dans les autres catégories fonctionnelles
x1z : information
réponses relatives à des requêtes informationnelles
x2z : connexion
réponses relatives à des commandes de contrôle des liaisons
x3z : contrôle d'accès
réponses relatives aux processus d'identification
x4z : non spécifié
x5z : système de fichier
réponses relatives aux opérations réalisées sur le système de fichier

Le troisième chiffre z est un simple raffinement sémantique du second.

Le service de transfert anonyme

Voici un exemple de session ftp anonyme :

$ ftp machine.domaine
Connected to machine.domaine
220-
220-        Bienvenue sur le serveur FTP de notre organisation
220-
220-
220 machine.domaine FTP server ready.
Name (votre machine:votre login): ftp
331 Guest login ok, send your complete e-mail address as password.
Password: tapez votre adresse électronique
Ce qui suit est la bannière
230-
230-        Bienvenue ftp ([unknown]) !
230-
230-        Vous êtes connecté sur machine.domaine depuis votremachine.domaine.
230-        Il y a actuellement 1 utilisateur(s) de ce service.
230-
230-        Note : Aucun abus ne sera toléré.
230-        
230-En cas de problème, contactez ftp-admin@machine.domaine
230-
Ce qui suit est probablement un message
230-
230-        Il n'y a pas encore grand-chose ici...
230-
230-
230 User ftp logged in.  Access restrictions apply.
On tente de lire le répertoire principal
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 16
-rw-r--r--   1 cheval        42 Sep 13  1999 .message
d--x--x--x   2 cheval       512 Sep 13  1999 bin
d--x--x--x   2 cheval       512 Sep 13  1999 dev
d--x--x--x   3 cheval       512 Sep 13  1999 etc
lrwxrwxrwx   1 cheval         7 Sep 13  1999 lib -> usr/lib
dr-xr-xr-x   3 ftp          512 Oct 19 09:47 pub
drwxr-x---   2 chile        512 Oct 12 18:23 pub2
d--x--x--x   4 cheval       512 Oct 12 15:23 usr
226 Transfer complete.
427 bytes received in 0,0073 seconds (57,34 Kbytes/s)
On tente de se déplacer dans le répertoire /etc
ftp> cd etc
250 CWD command successful.
On tente de récupérer le contenu du fichier des mots de passe
ftp> get passwd
200 PORT command successful.
550 /etc/passwd is marked unretrievable
On tente de se déplacer dans le répertoire /pub2
ftp> cd pub2
550 pub2: Permission denied.
On tente de se déplacer dans le répertoire /pub
ftp> cd /pub
Ce qui suit est un message
250-
250-        Pour l'instant, pas grand chose...
250-
250-
Le serveur nous informe de l'existence d'un fichier à lire
250-Please read the file README
250-  it was last modified on Thu Oct 19 09:47:46 2000 - 0 days ago
250 CWD command successful.
COnsultons la liste des fichiers et répertoires
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 8
-rw-r--r--   1 cheval        38 Sep 13  1999 .message
-rw-r--r--   1 ftp           33 Oct 19 09:47 README
-rw-r--r--   1 cheval        13 Oct 12 17:31 essai
drwxrwxrwx   2 ftp          512 Oct 19 12:45 up-load
226 Transfer complete.
223 bytes received in 0,007 seconds (30,91 Kbytes/s)
Essayons de lire le fichier en question en mode compressé
ftp> get README.gz
200 PORT command successful.
550 This is a BINARY file, using ASCII mode to transfer will corrupt it.
Le serveur nous encourage à utiliser le mode de transfert binaire
ftp> bi
200 Type set to I.
ftp> get README.gz
200 PORT command successful.
150 Opening BINARY mode data connection for /bin/gzip.
226 Transfer complete.
local: README.gz remote: README.gz
60 bytes received in 0,069 seconds (0,85 Kbytes/s)
Essayons de déposer un fichier
ftp> put README.gz
200 PORT command successful.
553 README.gz: Permission denied on server. (Upload)
Essayons de le faire dans le répertoire de dépot
ftp> cd up-load
250 CWD command successful.
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 10
-rw-r--r--   1 cheval         0 Oct 19 12:45 .notar
----------   1 ftp           52 Oct 19 11:15 bibop
----------   1 ftp           52 Oct 19 10:56 essai
----------   1 ftp           52 Oct 19 11:06 momo
----------   1 ftp           52 Oct 19 11:01 toto
----------   1 ftp           52 Oct 19 11:03 tutu
226 Transfer complete.
320 bytes received in 0,0049 seconds (63,28 Kbytes/s)
Essayons de le déposer avec un nom bizarre
ftp> put README.gz .bidule
200 PORT command successful.
550-Votre syntaxe est plutôt douteuse...
550 .bidule: Permission denied on server. (Filename (deny))
Essayons d'écraser un fichier existant
ftp> put README.gz essai
200 PORT command successful.
553 essai: Permission denied on server. (Overwrite)
Essayons de le déposer (attention il n'y a pas de décompression)
ftp> put README.gz readme
200 PORT command successful.
150 Opening BINARY mode data connection for readme.
226 Transfer complete.
local: README.gz remote: readme
60 bytes sent in 0,022 seconds (2,65 Kbytes/s)
Voyons voir
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 12
-rw-r--r--   1 cheval         0 Oct 19 12:45 .notar
----------   1 ftp           52 Oct 19 11:15 bibop
----------   1 ftp           52 Oct 19 10:56 essai
----------   1 ftp           52 Oct 19 11:06 momo
----------   1 ftp           60 Oct 19 13:26 readme
----------   1 ftp           52 Oct 19 11:01 toto
----------   1 ftp           52 Oct 19 11:03 tutu
226 Transfer complete.
373 bytes received in 0,0062 seconds (58,95 Kbytes/s)
Essayons maintenant d'acquerir des droits étendus
ftp> quote site group test
200 Request for access to group test accepted.
ftp> quote site gpass mot-de-passe
200 Group access enabled.
Voyons voir /pub2 encore une fois
ftp> cd /pub2
250 CWD command successful.
ftp> quit
221-You have transferred 120 bytes in 2 files.
221-Total traffic for this session was xxxx bytes in x transfers.
221-Thank you for using the FTP service on machine.domaine.
221 Goodbye.

Le démon ftpd standard

Les systèmes Unix sont généralement livrés avec un démon de service FTP par défaut. Celui-ci est habituellement nommé ftpd ou in.ftpd. Il est activé en ajoutant la ligne suivante dans le fichier inetd.conf contenant la configuration du super-démon inetd :

ftp    stream  tcp     nowait  root    /usr/sbin/in.ftpd       in.ftpd

Cette ligne est parfois présente mais commentée par la présence du caractère # en premiêre colonne, auquel cas il suffit de le retirer et forcer le super-démon inetd à lire sa nouvelle configuration en lui délivrant le signal SIGHUP.

Ce démon peut être utilisé pour fournir un accès anonyme au service : c'est-à-dire un accès ouvert à des utilisateurs distants ne disposant pas obligatoirement d'un compte régulier sur le système.

Pour cela il suffit d'effectuer quelques paramétrages :

Bien entendu à partir de là quelques possibilités sont offertes. Il est possible d'autoriser ou d'interdire de déposer (upload) des fichiers, de consulter librement certains répertoires, voire même de créer des utilisateurs fictifs.

Il est possible d'interdire la connexion ftp pour certains utilisateurs critiques, pour cela il suffit de créer le fichier /etc/ftpusers et d'y faire apparaître les logins interdits (ex : root).

Le fichier ftpusers

Le fichier /etc/ftpusers est utilisé afin d'interdire tout accès au service ftp aux utilisateurs sensibles. Il suffit donc d'y faire figurer entre autres les comptes d'administration système. Par exemple :

root
daemon
bin
sys
adm
lp
smtp
uucp
nuucp
listen
nobody
noaccess
nobody4
majordom
www
postgres
pop

Le démon ftpd de l'Université Washington de Saint-Louis

À l'origine développé à l'Université Washington de Saint-Louis ce produit n'y est plus supporté, c'est maintenant un groupe de développeurs indépendants qui s'en chargent. C'est un produit de remplaçement du démon standard dont les fonctionnalités ne permettent pas une véritable gestion de service anonyme grand public. La version courante (au moment de la rédaction de ce document est la 2.6.2.

Le démon wu-ftpd permet de réaliser des contrôles d'accès plus fins en classant les utilisateurs anonymes selon divers critères et en autorisant ou interdisant certaines fonctionnalités à partir de ces classes. D'autre part des traces de session plus évoluées sont possibles, ainsi que des compressions ou décompressions à la volée.

La configuration de base est strictement identique à celle du démon standard. Nous ne nous attacherons donc à ne décrire que les points divergents.

Le fichier ftpservers

Le fichier de configuration ftpservers permet de créer des serveurs virtuels très similaires à ce que l'on peut obtenir avec un serveur Web Apache.

Le fichier ftphosts

Outre le contrôle d'accès réalisé par l'intermédiaire du fichier /etc/ftpusers, il est possible d'autoriser ou interdire explicitement le service ftp en contrôlant l'accès à partir de la machine cliente : /etc/ftphosts.

Deux directives sont utilisables :

allow
la syntaxe à respecter est allow <utilisateur> <adresse> [<adresse>...]. Cela autorise explicitement l'utilisateur indiqué à se connecter depuis les adresses précisées.

Les adresses peuvent ètre précédées du caractère ! pour indiquer une négation. D'autre part le caractère * est utilisable en tant que joker. Par exemple :

allow toto !*.com

autorise l'utilisateur toto à se connecter depuis n'importe quelle machine ne se trouvant pas dans le domaine commercial

deny
la syntaxe à respecter est deny <utilisateur> <adresse> [<adresse>...]. Cela interdit explicitement à l'utilisateur indiqué de se connecter depuis les adresses précisées.

Par exemple :

deny bidule *
deny * *.com

interdit tout accès au service à bidule et ce d'où qu'il vienne ainsi qu'à n'importe quel utilisateur en provenance du domaine commercial.

Divers raffinement sont possibles : filtrer à l'aide du masque de sous-réseau ou d'adresses IP. L'ordre apparition des directives est significatif et naturel, on applique les règles dans l'ordre d'apparition. Donc :

allow toto *
deny toto ga.bu.zo.meu

autorise toto à se connecter depuis n'importe quelle machine sauf ga.bu.zo.meu. Alors que :

deny toto ga.bu.zo.meu
allow toto *

autorise toto à se connecter depuis n'importe quel endroit.

Le fichier ftpconversions

Cette fonctionnalité assez méconnue permet aux utilisateurs de réaliser des compressions ou décompressions à la volée des données à télécharger.

Plutôt que d'offrir les mêmes données compressées sous divers formats afin que les utilisateurs économisent du temps lors des transferts, il est possible d'économiser de la place sur le serveur en n'offrant qu'un exemplaire de base tout en permettant aux clients de choisir son format préféré de compression.

C'est le rôle du fichier /etc/ftpconversions, qui contient des lignes au format suivant :

pa:sa:pc:sc:cmd:type:options:description

où :

pa
désigne un préfixe à rechercher dans le nom du fichier du serveur
sa
désigne un suffixe à rechercher dans le nom du fichier du serveur
pc
désigne un préfixe à rechercher dans le nom du fichier indiqué par le client
sc
désigne un suffixe à rechercher dans le nom du fichier indiqué par le client
cmd
désigne l'action à réaliser par le serveur (lire plus bas)
type
désigne le type des objets sur lesquels l'action est réalisable, Les valeurs possibles sont une combinaison de T_REG, T_DIR et T_ASCII
options
désigne de façon générique l'action effectivement réalisée. Les valeurs possibles sont une combinaison de O_COMPRESS, O_TAR, O_UNCOMPRESS et O_UNTAR
description
message informationnel à des fins de tracage

Voici un exemple :

 :.gz: :  :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
 :   : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP
 :   : :.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
 :   : :.tar.gz:/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP

La première ligne indique que si l'utilisateur à demandé le transfert du fichier fic alors que n'existe sur l'archive que le fichier fic.gz, le serveur décompressera ce dernier à la volée.

On dévine aisément ce que permet la deuxième ligne : une compression automatique pour un fichier non compressé de l'archive.

La troisième ligne s'applique sur des fichiers ou des répertoires et permet donc de télécharger des données au format tar.

La quatrième ligne s'applique sur des fichiers ou des répertoires et permet donc de télécharger des données au format tar compressé.

Attention : pour que cela fonctionne il ne faut pas oublier de placer dans le répertoire /bin de l'arborescence anonyme les commandes utilisées, ainsi que les bibliothèques dynamiques éventuellement nécessaires à leur bon fonctionnement.

Le fichier ftpaccess

Le fichier ftpaccess permet de configurer le démon. Il contient de très nombreuses directives (que nous ne verrons pas toutes) classées dans les catégories suivantes : contrôles d'accês, informations, traces, ratios, divers et permissions.

Trois types d'utilisateurs y sont distinguables :

real
Ce sont des utilisateurs possédant un compte sur la machine serveur
guest
Ce sont des utilisateurs possédant un compte sur la machine mais dont on protègera la session à la manière d'un utilisateur anonyme.
anonymous
Ce sont les véritables utilisateurs anonymes du service

Les contrôles d'accès

class
dont la syntaxe est :
class classe liste-de-type adresse [adresse ...]

permet de définir une classe d'utilisateurs en combinant des types (real, guest ou anonymous) et des localisations. Par exemple :

class utilisateurs real *
class locaux guest,anonymous *.jussieu.fr
class exterieurs guest,anonymous *

définit la classe utilisateurs de tous ceux qui possèdent un compte sur la machine, la classe locaux de tous ceux qui sont invités ou anonymes mais qui se connectent depuis le domaine jussieu.fr et la classe exterieurs de tous ceux qui sont invités ou anonymes et qui se connectent depuis le reste du monde. En effet l'ordre d'apparition de ces directives stipule qu'une connexion est classée par la première directive rencontrée et qui correspond.

deny
dont la syntaxe est :
deny adresse fichier de message

permet d'interdire l'accès au service depuis certaines machines tout en permettant d'afficher le message contenu dans le fichier indiqué. Par exemple :

deny *.com /etc/msgs/deny.com

prévient toute tentative de connection depuis le domaine commercial en affichant le contenu du fichier /etc/msgs/deny.com lequel contient par exemple :

Désolé, ce service est réservé aux utilisateurs du cyber-monde libre !

Vous vous êtes connectés depuis %R.

Pour toute réclamation contactez %E.

dans ce cas les indicateurs %R et %E seront remplaçés dynamiquement par le nom de la machine cliente et l'adresse électronique de l'administrateur du service (voir la directive email).

guestgroup
dont la syntaxe est :
guestgroup groupe [groupe ...]

permet de créer un groupe d'utilisateurs invités (voir utilisateurs invités).

guestuser
dont la syntaxe est :
guestuser utilisateur [utilisateur ...]

permet de créer un utilisateur invité (voir utilisateurs invités).

limit
dont la syntaxe est :
limit classe nombre horaires fichier de messsage

permet de limiter les accès pour une classe d'utilisateurs. Par exemple :

limit utilisateurs 5  Any               /etc/msgs/msg.toomany
limit locaux       10 Any               /etc/msgs/msg.toomany
limit exterieurs   20 SaSu|Any1800-0600 /etc/msgs/msg.toomany
limit exterieurs   10 Any               /etc/msgs/msg.toomany

interdit plus de 5 sessions simultanées aux usagers de la classe utilisateurs, plus de 10 sessions simultanées aux usagers de la classe locaux, plus de 20 sessions simultanées aux usagers de la classe exterieurs les samedis, dimanche et autres jours de la semaine entre 18h00 et 6h00 et plus de 10 sessions simultanées le reste du temps. Tout accès supplémentaire sera voué à l'échec et le message contenu dans le fichier indiqué sera affiché. Par exemple :

Bonjour %U,

Il nous semble qu'en ce moment vous êtes de trop. En effet
les règles en vigueur n'autorisent pas plus de %M utilisateurs
simultanément à ce moment précis de la journée %T.

Veuillez réessayer plus tard.

Pour toute réclamation contactez %E.
loginfails
dont la syntaxe est :
loginfails nombre

permet de limiter le nombre de tentatives d'identification ratées pour une session donnée.

noretrieve
dont la syntaxe est :
noretrieve [absolute|relative] [class=classe] ...

permet de rendre impossible toute tentative d'accès à certains fichiers ou répertoires de l'archive. Par exemple :

noretrieve /etc /usr /dev /bin /lib core

interdit l'accès à tout fichier situé sous les répertoires /etc, /usr, /dev, /bin et /lib ainsi qu'aux fichiers de nom core où qu'ils se trouvent.

private
dont la syntaxe est :
private yes|no

permet d'autoriser ou d'interdire l'utilisation d'identifications étendues à travers les commandes étendues SITE GROUP et SITE GPASS.

Cette fonctionnalité permet d'obtenir des droits différents de ceux de l'utilisateur ftp après s'être identifié en tant qu'anonyme. C'est très utile dans le cas où il n'est pas possible de repérer de telles connexions par le type ou la provenance.

Pour cela il faut utiliser le fichier /etc/ftpgroups

Les autres directives

autogroup, realgroup, realuser, nice, defumask, tcpwindow, keepalive, timeout accept, timeout connect, timeout data, timeout idle, timeout maxidle, timeout RFC931, file-limit, data-limit, guestserver, allow-retrieve

La délivrance d'informations

banner
dont la syntaxe est :
banner fichier

permet d'afficher le contenu du fichier en question avant la procédure d'identification. Par exemple :

banner /etc/msgs/msg.banner

Le fichier /etc/msgs/msg.banner ayant par exemple pour contenu :

Bienvenue sur le serveur FTP de notre organisation
      

Attention certains clients FTP ne supportent pas la présence de messages de plus d'une ligne.

email
dont la syntaxe est :
email mél

permet de définir l'adresse électronique de l'administrateur du service (que chaque utilisateur est en droit de contacter en cas de problèmes) et qui apparaîtra en remplacement de la chaîne %E dans les différents messsages.

greeting
dont la syntaxe peut prendre l'une des deux formes suivantes :
greeting full|brief|terse
greeting text message

permet de contrôler le message envoyé lors de la connexion. L'option full employée par défaut mais non recommandée fait apparaître le nom de la machine ainsi que la version du serveur. L'option brief ne fait apparaître que le nom de la machine. Quant à la troisième forme elle ne fait apparaître qu'un message minimal. La quatrième forme permet de préciser le message lui-même.

message
dont la syntaxe est :
message chemin [LOGIN|CWD=répertoire [classe ...]]

permet de définir des messages à afficher lorsque certains évènements se produisent : identification réussie (LOGIN) ou changement de répertoire courant (CWD=). Pour rendre agréable l'interaction avec l'utilisateur ces messages ne seront affichées qu'une seule fois par session. Par exemple :

message /etc/msgs/msg.bienvenue login
message .message                cwd=*

affichera le contenu du fichier /etc/msgs/msg.bienvenue dès qu'un utilisateur se sera identifié, et le contenu du fichier .message s'il existe pour chaque répertoire dans lequel l'utilisateur se placera pour la première fois. Le fichier /etc/msgs/msg.bienvenue contiendra par exemple :

        Bienvenue %U (%u) !

        Vous êtes connecté sur %L depuis %R.
        Il y a actuellement %N utilisateur(s) de ce service.

        Note : Aucun abus ne sera toléré.

En cas de problème, contactez %E
      

pour connaître l'effet des différentes directives %x, reportez-vous plus loin dans ce document.

readme
dont la syntaxe est :
readme chemin [LOGIN|CWD=répertoire [classe ...]]

permet de prévenir l'utilisateur qu'un fichier particulier existe et a été modifié â telle ou telle date afin de l'inviter à le télécharger puis le consulter. Ceci lors d'évènements particuliers : identification réussie (LOGIN) ou changement de répertoire courant (CWD=). Pour rendre agréable l'interaction avec l'utilisateur ces messages ne seront affichées qu'une seule fois par session. Par exemple :

readme  README*    login
readme  README*    cwd=*

préviendra l'utilisateur de l'existence de fichiers README* dès qu'un utilisateur se sera identifié, et de fichiers README* pour chaque répertoire dans lequel l'utilisateur se placera pour la première fois.

Les autres directives
hostname

Les traces

log commands
dont la syntaxe est :
log commands liste de types

permet d'activer le traçage des commandes du protocole effectuées par les clients dont le type apparaît dans la liste.

log transfers
dont la syntaxe est :
log transfers liste de types directions

permet d'activer le traçage des transferts effectués par les clients dont le type apparaît dans la liste. Les directions possibles sont inbound pour les transferts du client vers le serveur ou outbound du serveur vers le client.

log security
dont la syntaxe est :
log security liste de types

permet de tracer les violations de sécurité effectuées par les clients dont le type apparaît dans la liste.

log syslog
redirige les traces de transfert vers syslogd, par défaut celles-ci ne sont écrites que dans le fichier xferlog.
log syslog+xferlog
redirige les traces de transfert à la fois vers syslogd et xferlog.

Les ratios de transfert

Il existe trois directives ul-dl-rate, dl-free et dl-free-dir.

Les commandes diverses et utilitaires

alias
dont la syntaxe est :
alias pseudo-répertoire répertoire

permet de définir des raccourcis dénommant des répertoires particuliers. Par exemple :

alias gnu /pub/software/mirror/gnu

autorise l'utilisateur à utiliser la commande cd gnu: afin de se placer dans le répertoire correspondant.

Il est préférable d'indiquer l'existence de tels raccourcis dans l'un des messages affichés en début de session

compress
dont la syntaxe est :
compress yes|no classe [classe ...]

permet d'autoriser ou interdire la fonctionnalité de compression ou décompression à certaines classes d'utiliseteurs.

shutdown
dont la syntaxe est :
shutdown fichier

permet de réaliser des extinctions propres du service. Lorsque le fichier désigné est présent, les clients sont prévenus d'une prochaine interruption du service et les nouveaux arrivant interdits d'accès. Par exemple :

shutdown /etc/msgs/shutmsg

Le fichier en question doit être structuré de façon particulière. Son contenu est une ligne du type :

année mois jour heure minutes interdiction déconnection texte

où l'on désigne la date et l'heure précise d'interruption du service (les mois, heures et minutes sont respectivement notées de 00 à 11, 23 et 59). L'heure d'interdiction de connexion est indiquée en utilisant le format HHMM, cette mesure est relative à l'heure de fin de service, idem pour les déconnections. Par exemple :

2001 00 20 10 00 0030 0015
Interruption de service à %s.

déclare une interruption de service pour le 20 janvier 2001 à 10 heures du matin. De plus les accès seront bloqués 30 minutes auparavant et les connexiions automatiquement coupées 15 minutes auparavant.

Ce fichier peut être automatiquement généré à l'aide de la commande ftpshut.

tar
dont la syntaxe est :
tar yes|no classe [classe ...]

permet d'autoriser ou interdire la fonctionnalité d'archivage ou désarchivage à certaines classes d'utiliseteurs.

Les autres directives
cdpath, daemonaddress, virtual, defaultserver, passive address, passive ports, passv-allow, port-allow, lslong, lsshort, lsplain, mailserver, incmail, mailfrom

Les permissions

chmod
dont la syntaxe est :
chmod yes|no liste de types

permet d'autoriser ou interdire aux clients dont le type apparaît dans la liste de modifier les droits d'accès des fichiers.

delete
dont la syntaxe est :
delete yes|no liste de types

permet d'autoriser ou interdire aux clients dont le type apparaît dans la liste de supprimer des fichiers.

deny-email
dont la syntaxe est :
deny-email mél

permet d'invalider certains mot de passe utilisés lors d'une connexion anonyme même s'ils sont conformes au contrôle réalisé (voir passwd-check). Par exemple :

deny-email mozilla@
deny-email ie30user@
deny-email ie40user@
deny-email ie50user@

refuse les mots de passe indiqués. Ceux-ci sont automatiquement générés par des navigateurs mal configurés.

overwrite
dont la syntaxe est :
overwrite yes|no liste de types

permet d'autoriser ou interdire aux clients dont le type apparaît dans la liste de modifier des fichiers.

passwd-check
dont la syntaxe est :
passwd-check none|trivial|rfc822 enforce|warn

définit le niveau de contrôle réalisé sur les mots de passe fournis par les clients anonymes. none permet d'utiliser n'importe quel chaîne de caractères. trivial ne contrôle que la présence du caractère @. rfc822 assure que le mot de passe est une adresse électronique conforme à la RFC 822.

Le test de conformité réalisée n'est que syntaxique.

Si le niveau de contrôle est warn et que le mot de passe n'est pas conforme à ce qui est précisé, l'identification est acceptée mais un message sera affiché. Si le niveau de contrôle est enforce alors un message d'erreur sera renvoyé et l'identification rejetée.

path-filter
dont la syntaxe est :
path-filter liste de types fichier autorisés [interdits ...]

permet de contrôler quels sont les noms de fichiers autorisés lors d'un dépot. La règle s'applique aux utilisateurs appartenant à l'un des types indiqués. En cas de non conformité le message est affiché. autorisés décrit les noms autorisés et interdits permet d'en retirer de la liste. Par exemple :

path-filter anonymous,guest /etc/msgs/pathmsg ^[-A-Za-z0-9_\.]*$ ^\. ^-

permet aux utilisateurs anonymous et guest de créer des fichiers dont le nom contient n'importe quel suite de caractères alphabétiques majuscules ou minuscules, chiffres, point, soulignement (_) et tiret, sauf s'il commence par un point ou un tiret.

Le fichier /etc/msgs/pathmsg contient un message indiquant l'erreur :

Le nom de fichier utilisé est plutôt douteux...
rename
dont la syntaxe est :
rename yes|no liste de types

permet d'autoriser ou interdire aux clients dont le type apparaît dans la liste de renommer des fichiers.

umask
dont la syntaxe est :
umask yes|no liste de types

permet d'autoriser ou interdire aux clients dont le type apparaît dans la liste de modifier son masque de droits d'accès.

upload
dont la syntaxe est :
upload [absolute|relative] [class=classe] racine répertoire \
      yes|no [propriétaire groupe mode [dirs|nodirs] [mode répertoire]]

Cette directive est assez compliquée, il est donc recommandé de lire la documentation accompagnant le serveur.

Elle permet de contrôler les dépots. Par exemple :

upload  /home/ftp *              no
upload  /home/ftp /pub/up-load   yes ftp ftp 0000 nodirs

La première ligne interdit aux utilisateurs dont la racine est /home/ftp de réaliser un quelconque dépôt.

La seconde autorise n'importe quel utilisateur dont le répertoire racine est /home/ftp à déposer des fichiers dans le répertoire /pub/up-load. Dans ce cas le fichier déposé est propriété de l'utilisateur ftp du groupe ftp et ses droits d'accès seront nuls. De plus la création de sous-répertoires y sera interdite.

L'autorisation de déposer doît être configurée avec beaucoup d'attention afin d'éviter que l'archive anonyme soit utilisée comme dépôt clandestin d'informations à caractère douteux ou illégal.

Les autres directives
throughput, anonymous-root, guest-root, deny-uid, deny-gid, allow-uid, allow-gid, restricted-uid, restricted-gid, unrestricted-uid, unrestricted-gid, site-exec-max-lines, dns refuse_mismatch, dns refuse_no_reverse, dns resolveroptions

Le fichier ftpgroups

Ce fichier contient une liste de pseudo-groupes associés à de véritables groupes identifiés dans le système et protégés par un mot de passe permettant au serveur ftp d'utiliser les droits d'accès de ce dernier pour accéder aux fichiers et répertoires. Chaque ligne de ce fichier est au format suivant :

pseudo-groupe:mot de passe:groupe

Où :

pseudo-groupe
est l'identification à utiliser avec la commande SITE GROUP pseudo-groupe
mot de passe
est le mot de passe crypté à utiliser avec la commande SITE GPASS mot de passe
groupe
est l'identité système du groupe utilisé par le démon pour obtenir des droits différents (par appel à setegid())

Par exemple :

test:mot de passe crypté:hendrix

La modification de ce fichier peut-être réalisée avec la commande privatepw.

Les cookies

Les fichiers contenant des messages sont paramétrables de façon à y faire apparaître certaines informations sur le ou les systèmes intervenant voire la configuration du serveur lui-même. Ces paramètres sont les suivants :

Les cookies standards
Cookie Sémantique
%T date et heure locale
%F espace libre (exprimé en octets) sur la partition courante
%C répertoire courant
%E mél de l'administrateur du service
%R adresse Internet de la machine cliente
%L adresse Internet du serveur
%u identification de l'utilisateur (identd, RFC 931)
%U identification fournie lors de la connexion
%M nombre maximal d'utilisateur dans la classe courante
%N nombre d'utilisateurs actuellement connectés dans la classe courante
%B limite absolue de blocs disque alloués
%b limite courante de blocs disque alloués
%Q nombre de blocs disque courant
%I limite absolue d'inoeuds alloués
%i limite courante d'inoeuds alloués
%q nombre d'inoeuds courant
%H délai maximal pour utilisation excessive du disque
%h délai maximal pour dépassement de quotas disque

Les cookies relatifs aux ratios
Cookie Sémantique
%xu nombre d'octets déposés
%xd nombre d'octets téléchargés
%xR ratio de téléchargement
%xc crédit d'octets
%xT délai limite
%xE temps écoulé depuis le début de session (en minutes)
%xL crédit temps
%xU limite de dépôt
%xD limite de téléchargement

Les utilisateurs invités (guest)

Pour créer un invité il suffit de créer un utilisateur sur la machine en respectant les règles données pour l'utilisateur ftp mais en utilisant un répertoire pouvant contenir par défaut contenant /./. Par exemple :

jimi:x:1031:200:Jimi Hendrix:/home/ftp/./pub2:/bin/false

Il faut par ailleurs activer guestuser dans le fichier ftpaccess. Par exemple :

guestuser jimi

Dans ce cas d'une connexion ftp avec le couple identifiant (jimi,mot-de-passe), le serveur ftp exécute un chroot() dans le répertoire /home/ftp puis positionne par défaut le répertoire de travail à /pub2.

Les utilitaires

Le serveur wu-ftpd est fournit avec quelques utilitaires : ftpwho, ftpcount, ftpshut et ftprestart.

Le démon ProFTPD

Il existe d'autre démon de service ftp: ProFTPD, Pure-FTPd, vsftpd.