\documentclass{article}
\title{Serveur FTP}
\author{Julien Danjou\\jdanjou@linuxenrezo.org}
\date{}
\begin{document}
\maketitle

	\section{Installation du serveur}
        
	Vous devez installer un serveur, tel BeroFTPD ou wu-ftp. Wu-ftp connait certains probl\`emes de s\'ecurit\'e et il est donc pr\'eferable d'utiliser BeroFTPD.\\
        
	Vous pouvez vous les procurer sur leurs sites respectifs (cherchez sur \textbf{http://www.linuxapps.com}).\\ 
	
	Installez les comme expliqu\'e dans l'archive, ou \`a partir d'un package sp\'ecifique \`a votre distribution (rpm pour Redhat/Mandrake, deb pour Debian...).\\
        
	Pour ces explications, j'ai utilis\'e \textbf{BeroFTPD}.\\
        
	\section{Installation des r\'epertoires}
        
	Il se peut que les diff\'erents fichiers et r\'epertoires indiqu\'es ci dessous aient \'et\'e cr\'e\'es lors de l'installation du serveur. Si c'est le cas, v\'erifiez seulement qu'ils ont correctement \'et\'e cr\'e\'es, avec les bonnes permissions.\\ 
          
	Tout d'abord, ajoutez un nouvel utilisateur ftp dans /etc/passwd.\\
            
	Ajoutez aussi un groupe ftp dans /etc/group. Son r\'epertoire d'accueil doit \^etre /home/ftp.\\
            
	Voil\`a un exemple:/etc/passwd\\
            
	ftp:*:14:50:FTP User:/home/ftp:\\
        /etc/group\\
        ftp::50:\\
          
        Cr\'eez ensuite le r\'epertoire /home/ftp et attribuez lui le mode 555, le propri\'etaire devant en \^etre root.\\
          
	Cr\'eez le r\'epertoire /home/ftp/bin appartenant \`a root. avec les droits d'acc\`es 111. Copiez dans ce r\'epertoire le programme ls qui devra appartenir \`a root et avoir les droits d'acc\`es 111. Si vous copiez ult\'erieurement des programmes dans ce r\'epertoire, il devront aussi appartenir \`a root avec les droits d'acc\'es 111.\\
          
	Cr\'eez le r\'epertoire /home/ftp/etc appartenant \`a root, avec les droits 444. Vous devriez y placer un fichier passwd de ce type:\\
	
	root:*:0:0:::\\
	bin:*:1:1:::\\
	operator:*:11:0:::\\
	ftp:*:14:50:::\\
	nobody:*:99:99:::\\
            
	Et un fichier group:\\ 
        root::0:\\
	bin::1:\\
	daemon::2:\\
	sys::3:\\
	adm::4:\\
	ftp::50:\\
            
	Vous pouvez les modifier selon l'UID et le GID choisit dans le fichier /etc/passwd.\\
          
	Cr\'eez le r\'epertoire /home/ftp/pub. Il doit appartenir \`a root et au groupe ftp Tout ce qui sera dans ce r\'epertoire sera accessible publiquement.\\
            
	Tout ce qui s'y trouve devra poss\'eder les droits 555. Si vous d\'esirez que des utilisateurs anonyme puissent d\'eposer des fichiers, cr\'eez un r\'epertoire /home/ftp/incoming, puis fa\i\ ites un: \\
	
	chmod +t/home/ftp/incoming\\
	
	Cela emp\^echera quiconque d'\'ecraser un fichier existant !\\
            
	Il est bon, si possible, que cr\'eer votre r\'epertoire ftp dans une partition diff\'erente de votre partition principale: en effet, si une personne (plut\^ot mal intentionn\'ee...) se met \`a envoyez dans le r\'epertoire incoming des dizaines d'\'enormes fichiers, votre partition principale risque d'etre pleine, et votre machine compl\'etement paralys\'ee !!!\\
          
	Si vous montez des partitions dans votre r\'epertoire ftp, pensez \`a les monter en lecture seule !\\ 
        
        \section{Le fichier de configuration}

        Le fichier de configuration du serveur FTP est /etc/ftpaccess. Il est compos\'e de diff\'erents param\`etres, chacun utisant une ligne...\\
        
	Voici ces principaux param\\`etres:\\
        
        \textbf{deny addrglob message\_file}\
            
	Refuse l'acc\`es \`a toutes les machines ayant pour adresse addrglob et afficher le message message\_file. Vous pouvez mettre !nameserved comme valeur pour addrglob afin de refuser les connections venant des h\^otes sans enregistrement de nom inverse dans leur serveur de nom; ou le chemin d'un fichier commencant par, contenant les h\^ote a refus\'es sous la forme adress:netmask.\\
          
          \textbf{guestgroup groupname [groupname ...]}\\
          \textbf{guestuser username [username ...]}\\
          \textbf{realgroup groupname [groupnam ...]}\\
          \textbf{realuser username username ...]}\\
          
	Pour guestgroup, si n'importe quel utilisateur r\'eel appartient \`a un des groupes sp\'ecifi\'es, sa session sera comme celle d'un utilisateur anonyme.\\ 
	
	groupname doit \^etre un groupe valide de /etc/group. Le r\'epertoire d'accueil de l'utilisateur doit \^etre configur\'e dans le fichier /etc/passwd.\\ 
	
	Le premier champs sera le r\'epertoire racine, le deuxi\`eme le r\'epertoire d'accueil. Les 2 param\`etres devront \^etre s\'epar\'es par /./\\
	
	Exemple dans /etc/passwd:\\

        guest1:passwd:100:92:Guest Account:/ftp/./incoming:/etc/ftponly\\

        Quand guest1 sera logg\'e, son r\'epertoire racine sera /ftp et son r\'epertoire d'accueil sera /incoming. Il ne pourra acc\'eder qu'au r\'epertoire et fichiers se trouvant sous /ftp, qui pour lui s'apperentera \`a/.\\

        Le nom du groupe peut \^etre un ID num\'erique, mais vous devez alors placer un \% devant le nombre\\ 
	Mettre un * signifie tout les groupes.\\

        realuser et realgroup ont la m\^eme syntaxe, mais a l'effet inverse. Ils autorisent un utilisateur \`a avoir un acc\`es normal, alors qu'il devrait avoir un acc\`es de type guest.\\
            
	Par exemple:\\
            
	guestuser *\\
	realgroup admin\\
            
	a pour cause de traiter tous les utilisateurs non anonymes en tant qu'utilisateurs anonymes, sauf les utilisateurs appartenant au groupe admin, qui eux seront trait\'es normalement.\\ 
          
        \textbf{guestserver [hostname]}\\
        Sp\'ecifie les clients qui sont autoris\'es \`a se connecter en tant qu'utilisateur anonyme. Si aucune valeur n'est sp\'ecifi\'e, aucun acc\`es anonyme n'est autorisé.\\
        
	\textbf{noretrieve [absolute\textbar relative\textbar-] filename filename}\\
        Toujours refuser le t\'el\'echargement de ces fichiers. Si le fichier est un chemin absolu (ex: il commence avec un /), tous ces fichiers seront marqu\'es comme impossible \`a r\'ecup\'erer, autrement tous les fichiers correspondant \'a filename verront leur transfert refus\'e.\\
            
	Exemple:noretrieve /etc/passwd core\\
	sp\'ecifie que le transfert de /etc/passwd ou d'un fichier s'appelant core sera refus\'e. En revanche, un ficher s'appelant passwd, mais se trouvant ailleurs que dans /etc/ verra son transfert autoris\'e.\\
            
	Il est possible de sp\'ecifier un r\'epertoire. Dans ce cas, tout les fichiers qu'il contient ne seront pas t\'el\'echargeables.\\
            
	Le premier param\`etre est optionnel, et sert \`a s\'el\'ectionner si les noms de fichiers ou de r\'epertoires doivent \^etre interpret\'es comme absolus ou relatifs. La valeur par d\'efaut est d'interpr\'eter les noms commencant par un / comme absolus.\\
          
        allow-retrieve [absolute\textbar relative\textbar-] filename\\
        filename\\
        Autorise le transfert de fichiers qui autrement serait refus\'e par noretrieve.\\
        
        \textbf{loginfails number}\\
	Apr\`es number d'erreur de login, enregistrer un message de repeated login failure et terminer la connection FTP. La valeur par d\'efaut est 5.\\
          
        \textbf{greeting full\textbar brief\textbar terse}\\
        Contr\^ole combien d'informations sont donn\'ees avant l'invite de login. Full est par d\'efaut et montre le nom d'h\^ote et la version du daemon. Brief montre le nom d'h\^ote seulement, et terse dit seulement FTP server ready. M\^eme si full est par d\'efaut, brief est recommand\'e.\\
        
          \textbf{banner path}\\
          Ressemble \`a la commande message, mais apparait AVANT l'invite de login/password. Le chemin est relatif \`a la racine r\'eelle et non \`a celle du serveur FTP anonyme.\\
          
	\textbf{hostname some.host.name}\\
        D\'efinit le nom d'h\^ote du serveur FTP. Il est envoy\'e lors de la connection avec l'option greeting full.\\
        
	\textbf{email name}\\
       	D\'efinit l'adresse e-mail du responsable du serveur.\\ 
        
      	\textbf{message path \{when \{class\}\}}\\
        D\'efinit le fichier que ftpd affichera \`a l'utilisateur au moment du login ou de changement de r\'epertoire. Le param\`etre when peut \^etre LOGIN ou CWD=dir. Si when est CWD=dir, dir sp\'ecifie le nouveau r\'epertoire par d\'efaut qui fera afficher le message. On peut utiliser des magic cookies dans les fichiers. Le serveur FTP remplacera ces cookies par leur valeur, tel que:\\                  

		\%T       Heure local  (forme Thu Nov 15 17:12:42 1990)\\
                \%C      R\'epertoire courrant\\
                \%E       L'adresse e-mail de l'administrateur sp\'ecifi\'e dans /etc/ftpaccess\\
                \%R      Nom d'h\^ote du client\\
                \%L      Nom d'h\^ote du serveur\\
                \%U      Nom d'utilisateur donn\'e\\
                \%M      Nombre d'utilisateur maximum dans cette classe\\
                \%N      Nombre d'utilisateur en ce moment dans cette classe\\
                \%q      Nombres d'inodes allou\'es.\\

            Si vous utilisez la limitation de t\'el\'echargement, vous pouvez aussi utiliser:\\

                  \%xu     Bits envoy\'es\\
                  \%xd     Bits re\c\ cus\\
                  \%xR     Envoie/r\'eception ratio (1:n)\\
                  \%xc     Credit en bits\\
                  \%xT     Temps limite\\
                  \%xE     Temps \'ecoul\'es depuis le login\\
                  \%xL     Temps restant\\
                  \%xU     Temps d'envoi\\
                  \%xD     Temps de r\'eception\\
          
          
	\textbf{readme path \{when \{class\}\}}\\
        D\'efinit le fichier dont ftpd avertira l'utilisateur de l'existence et de la derni\`ere modification. Le param\`etre when peut \^etre LOGIN ou CWD=dir. Si when est CWD=dir, dir sp\'ecifie le nouveau r\'epertoire par d\'efaut qui fera afficher le message. \\
                
          \textbf{show-everytime \{message\textbar readme\} \{yes\textbar no\}}\\
          Sp\'ecifie si oui ou non le message/readme sera affich\'e \`a chaque fois que l'utilisateur change de r\'epertoire. La valeur par d\'efaut est non.\\ 
          
          \textbf{log commands typelist}\\
          Active l'enregistrement des commandes des utilisateurs. typelist doit \^etre s\'epar\'e par des virgules, et a pour valeur guest, anonymous ou real.\\
          
          \textbf{log transfers typelist direction}\\
          Active l'enregistrement des transferts de fichiers pour tous les utilisateurs r\'eels ou anonymes. typelist doit \^etre s\'epar\'e par des virgules, et a pour valeur guest, anonymous ou real. direction est la liste, s\'epar\'e par des virgules, des transferts qui doivent \^etre enregistr\'es: pour les transferts sortant la valeur sera outbound et pour les transferts entrants inbound.\\
          
          \textbf{log security typelist}\\
          Active l'enregistrement des violations des r\'egles de s\'ecurit\'es (noretrieve, .notar...) pour les utilisateurs r\'eels, guest ou anonyme. typelist doit \^etre s\'epar\'e par des virgules, et a pour valeur guest, anonymous ou real.\\
          
          \textbf{log syslog}\\
          Redirige les enregistrements des transferts vers syslog. Sans cette option, les messages sont \'ecrits dans le fichier xferlog.\\
                    
          \textbf{incmail adress}\\
          Envoie une note lorsqu'un fichiers est envoy\'e au serveur.\\
          
          \textbf{mailfrom adress}\\
          Utilise l'adresse adress comme adresse d'exp\'editeur des messages concernant l'envoi de fichiers au serveur.\\
          
            \textbf{mailserver IP}\\
            Utilise ce serveur SMTP pour envoyer les messages sur l'envoi de fichiers au serveur. L'utilisation de plusieurs lignes de ce type permettent de changer de serveur au cas où l'un d'eux serait en panne.\\
          
            \textbf{alias string dir}\\
            D\'efinit un alias, string, pour un répertoire.\\
            Par exemple:\\
            alias rfc: /pub/doc/rfc\\
            autorisera un utilisateur \`a acc\'eder \`a /pub/doc/rfc depuis n'importe quel r\'epertoire en utilisant la commande cd rfc:. Les alias ne fonctionnent que pour la commande cd.\\
          
       	    \textbf{cdpath dir}\\
            D\'efinit une entr\'ee dans le chemin des r\'epertoires. Il d\'efinit un r\'epertoire de recherche lorsque l'utilisateur change r\'epertoire.\\
            Par exemple:cdpath /pub/packages\\
	    cdpath /.aliases\\
            autorisera l'utilisateur \`a changer de r\'epertoire dans n'importe quel r\'epertoire sous /pub/packages ou sous /.aliases, et ce, depuis n'importe quel répertoire !\\
            Si l'utilisateur donne la commande cd foo, alors le r\'epertoire sera cherch\'e dans:\\
            ./foo\\
            /pub/aliases/packages/foo\\
            /.aliases\\
            Cela ne fonctionne qu'avec la commande cd.\\
          
          \textbf{include path}
          Inclure le fichier comme faisant partie de ftpaccess\\
          
          \textbf{chmod yes\textbar no typelist delete yes\textbar no}\\
          \textbf{typelist overwrite yes\textbar no typelist rename yes\textbar no}\\
          \textbf{typelist umask yes\textbar no typelist }\\
          Autorise ou interdit d'utiliser ces fonctions. Par d\'efaut, elles sont autoris\'es pour tout les utilisateurs. typelist doit \^etre s\'epar\'e par des virgules, et a pour valeur guest, anonymous ou real.\\
          
          \textbf{passwd-check none\textbar trivial\textbar rfc822 (enforce\textbar warn)}\\
          D\'efinit le niveau de v\'erification du type de mot de passe pour le utilisateurs anonymes.\\
	none	aucun mot de passe n'est v\'erifi\'e trivial le mot de passe doit contenir un @.\\
	rfc822	le mot de passe doit \^etre du type d\'efini dans le RFC822 (c'est \`a dire une adresse e-mail valide)\\
	warn	avertir l'utilisateur, mais l'autoriser \`a se connecter\\
	enforce	avertir l'utilisateur et le refuser\\
          
        \textbf{deny-email case-insenstive-email-adress}\\
        Consid\`ere l'adresse e-mail donn\'ee comme invalide. Si passwd-check a la valeur enforced, l'utilisateur est rejet\'e. Avec cette option, vous pouvez stoper les utilisateurs qui ont de stupides navigateurs WWW et qui utilisent des adresses comme IE?0User@ ou mozilla@. En utilisant cela, vous ne les mettrez pas dehors, mais vous les amenerez peut-\^etre \`a configurer correctement leur navigateur. Seulement une adresse e-mail par ligne est autoris\'e, mais vous pouvez utiliser plusieurs ligne deny-email.\\
          
          \textbf{upload [absolute\textbar relative\textbar -] root-dir dirglob}\\
          yes\textbar no owner group mode\\
          dirs \textbar nodirs d\_mode \\
          D\'efinit un repertoire avec dirglob qui permet ou refuse les envois. Si il permet les envois de fichiers, tous les fichiers seront la propriet\'e de owner et du group et auront la permission mode.\\
            
	Par exemple:\\
	
	upload  /var/ftp  *	         no\\
	upload  /var/ftp  /incoming        yes  ftp    daemon	0666\\
	upload  /var/ftp  /incoming/gifs  yes  jlc    guest      0600  nodirs\\
            
	Ceci autorise seulement les envois de fichiers dans /incoming et dans /incoming/gifs. Les fichiers qui seront envoy\'es dans /incoming auront ftp/daemon comme propri\'etaire et la permission 0666. Les fichiers envoy\'es dans /incoming/gifs auront jlc/guest comme propri\'etaire et la permission 0600.\\ 

	Notez que root-dir doit correspondre au r\'epertoire donn\'e \`a l'utilsateur FTP dans /etc/passwd.\\
            
	Vous pouvez sp\'ecifier les UID/GID num\'eriques \`a la place des noms, en les faisant pr\'ec\'eder du signe \%.\\
       
	Les options dirs et nodirs indiquent si la cr\'eation de r\'epertoire est autoris\'ee. Si la cr\'eation de r\'epertoire est autoris\'ee, l'option d\_mode d\'etermine la permission du r\'epertoire cr\'e\'e. Si il est omis, le mode sera de 0777.\\
            
	Le premier param\`etre optionnel d\'efinit si le r\'epertoire racine est a interpreter de fa\c\ con relative ou absolue. Par d\'efaut, il est interpr\'et\'e de fa\c\ con absolue.\\
          
        \textbf{anonymous-root root-dir}\\
        root-dir sp\'ecifie le r\'epertoire racine pour les utilisateurs anonymes. Si aucune valeur n'est donn\'ee, l'ancienne m\'ethode est utilis\'ee, c'est \`a dire que le r\'epetoire racine est celui donn\'ee dans /etc/passwd.\\ 
        
	\textbf{guest-root root-dir [uid-range]}\\
        root-dir indique le r\'epertoire racine pour les utilisateurs guest.\\ 
	Si aucune valeur n'est donn\'ee, alors le r\'epertoire de l'utilisateur est utilis\'e.\\ 
	Si aucun uid-range est indiqu\'e, c'est le r\'epertoire racine des utilisateurs guest qui ne correspondent pas \`a un autre crit\`ere qui sera utilis\'e. Plusieurs UID peuvent figur\'es sur une m\^eme ligne. Si un guest-root est choisi pour un utilisateur, son r\'epertoire d'accueil sera celui de root-dir/etc/passwd et non celui de /etc/passwd du system complet. uid-range sp\'ecifie des valeurs UID num\'eriques. L'ensemble des UID est d\'efinie par 2 nombres s\'epar\'es d'un\\
	
            -. Omettre le premier chiffre signifie jusqu'\`a, tandis qu'omettre le dernier signifie \`a partir de.
\\

            Par exemple:guest-root /home/users\\

	guest-root /home/staff \%100-999 sally\\
	guest-root /home/users/frank/ftp frank\\
            
	a pour cause de changer le r\'epertoire racine vers /home/users puis d'aller dans le r\'epertoire d'accueil sp\'ecifie dans /home/users/etc/passwd.\\
            
	Les utilisateurs ayant un UID compris entre 100 et 999, inclus, et l'utilisateur sally, auront /home/staff comme r\'epertoire racine et seront automatiquement plac\'es dans leur r\'epertoire d'accueil sp\'ecifi\'e dans /home/staff/etc/passwd. L'utilisateur frank aura comme r\'epertoire racine /home/users/owner/ftp et sera plac\'e dans le r\'epertoire d'accueil indiqu\'e dans /home/users/owner/ftp/etc/passwd.\\
          
          deny-uid uid-range [...]\\
            deny-gid gid-range [...]\\
            allow-uid uid-range [...]\\
            allow-gid gid-range [...]\\ 
            allow-uid et allow-gid autorisent des UID/GID qui seraient refus\'es avec.deny-uid\\
            deny-gid. Ceci peut \'eliminer l'utilisation de /etc/ftpusers\\
            
	Par exemple:\\
	
	deny-gid \%-99 \%65535\\
	deny-uid \%-99 \%65535\\
	allow-gid ftp\\
	allow-uid ftp\\

        refuse tout acc\`es aux utilisateurs privilégi\'es ou sp\'eciaux, sauf l'utilisateur/groupe 'ftp'. Vous pouvez utiliser des noms \`a la place des nombres, en enlevant le signe \%, evidemment...\\

\end{document}