Sécuriser un serveur FTP

Je n'aime pas WU-FTPD

WU-FTPD a mauvaise réputation : de nombreuses failles de sécurité jonchent son histoire. Il n'est pas aussi configurable que ProFTPD. Par exemple, pour masquer le fait que le serveur FTP est WU-FTPD, je peux utiliser le paramètre greeting terse qui permet d'avoir un banner réduit au minimum 220 FTP server ready. mais il se trahit facilement.

telnet ftp.wu-ftpd.org ftp
220 ftp.wu-ftpd.org FTP server ready.
...
STAT
211-ftp.wu-ftpd.org FTP server status:
     Version wu-2.7.0(2) Mon Mar 12 12:30:14 EST 2001
...

La commande STAT révèle qu'il s'agit ici de wu-2.7.0(2). Je me suis définitivement faché avec WU-FTPD quand il a ignoré superbement la limitation en nombre de connexion que je venais de configurer.

ProFTPD

Ce serveur FTP est génial :

Pour cet article, j'ai essayé de réaliser des serveurs virtuels utilisant des fichiers de mot de passe séparés avec WU-FTPD mais sans succès. Avec ProFTPD, cela a été possible sans difficulté.

La section Global

On peux placer dans global des options qui se répercuterons sur l'ensemble des serveurs ftp sauf mention contraire ultérieure.


<Global>
	AllowOverwrite		no
	Umask			022
	IdentLookups         	off
	ServerIdent 		Off
	DeferWelcome 		On
# We want clients to be able to login with "anonymous" as well as "ftp"
	UserAlias		anonymous ftp
	RequireValidShell	yes
# Set the user and group that the server normally runs at.
	User			nobody
	Group			nobody
	ExtendedLog		/var/log/proftpd/access.log WRITE,READ write
	ExtendedLog		/var/log/proftpd/auth.log AUTH auth
	ExtendedLog 		/var/log/ftp.log AUTH
</Global>

L'option AllowOverwrite permet d'écraser un fichier sans avoir à l'effacer préalablement. On demande au serveur à ce qu'il n'annonce pas qu'il est un ProFTPDServerIdent Off, on obtient un bref 220 [hostname] FTP server ready. Pour éviter d'oublier (sur WU-FTPD, c'est implicite), on peut créer un alias anonymous vers le compte ftp dans la section globale.

Le système de log

Dans la section global, on a définit avec la commande ExtendedLog que les log liés à l'authentification AUTH serait enregistré selon le format standard dans le fichier /var/log/ftp.log et selon un format auth que l'on aura défini :


#
# Some logging formats
#
LogFormat		default "%h %l %u %t \"%r\" %s %b"
LogFormat              	auth    "%v [%P] %h %t \"%r\" %s"
LogFormat              	write   "%h %l %u %t \"%r\" %s %b"

SyslogFacility 		AUTH

Il est fortement conseillé de définir un nombre limite de connexions simultanées de façon à éviter les D.O.S., ceci ne fonctionne qu'en mode standalone, c'est à dire que les connexions ne sont pas transmises par l'intermédiaire d'inetd ou d'xinetd mais par ProFTPD directement, ProFTPD est en mode démon.

MaxInstances		30
ServerType		standalone
UseReverseDNS        	off

Configuration d'un serveur FTP

Définissions un serveur FTP classique


ServerAdmin		grenier@cgsecurity.org
# Port 21 is the standard FTP port.
Port				21
ServerName		"KMaster"
ServerAdmin		grenier@cgsecurity.org
MaxLoginAttempts	2
MaxClients		20
# Normally, we want files to be overwriteable.
AllowOverwrite		yes

Configuration d'un serveur FTP anonyme

Ajoutons un compte anonyme avec un répertoire d'upload.

Le compte ftp n'a pas de shell valide, on utilise RequireValidShell à no pour permettre la connexion. Ensuite, on utilise des LIMIT similaires à Apache pour interdire l'écriture sur la totalité avec une exception pour le répertoire uploads où les fichiers peuvent être ajouté mais pas lu et où aucun sous-répertoire ne peut créée. Ainsi, même si les permissions unix des fichiers sont laxistes, les LIMIT vont renforcer la sécurité.


<Anonymous ~ftp>
	RequireValidShell	no
# Maximum clients with message
	MaxClients			5 "Sorry, max %m users -- try again later"
	User				ftp
	Group				ftp
	# Allow logins if they are disabled above.
	<Limit LOGIN>
		AllowAll
	</Limit>
	# Limit WRITE everywhere in the anonymous chroot
	<Limit WRITE>
		DenyAll
	</Limit>
	<Directory uploads/*>
		<Limit READ>
		DenyAll
		</Limit>

		<Limit STOR>
		AllowAll
		</Limit>
	</Directory>
</Anonymous>

Serveur FTP virtuel

Il y a quelques temps, j'ai eu à étudier comment héberger les pages web d'un groupe d'utilisateurs sur un serveur dont je m'occupe et leur permettre de mettre à jour leurs pages par ftp sans poser de problème de sécurité. Les contraintes suivantes se sont posées :

Pour isoler les utilisateurs, il suffit des les chrooter dans leurs home directory respectifs. WU-FTPD oblige à à placer un binaire /bin/ls dans chaque compte chrooté. Or, en plus d'être lourd à mettre en place (Ok, cela peut être fait avec un script), la possibilité de récupérer des binaires permet de découvrir l'architecture sous laquelle fonctionne le serveur et donc d'utiliser des exploits adaptées à la plate-forme. L'option noretrive de WU-FTPD est là pour éviter ce problème. On se retrouve avec le message suivant get ls: server said: /bin/ls is marked unretrievable.

ProFTPD intègre la commande ls et on peut restreindre facilement la racine au répertoire personnel de chaque utilisateur avec un DefaultRoot ~.

Installer un client NIS sur ce serveur ne me semblait pas une bonne idée, ses utilisateurs ne doivent pas recevoir de mail, pas faire de ssh et en fait, n'avoir aucune existence en dehors du ftp. Il est possible de spécifier le fichier de mot de passe de son choix AuthUserFile /etc/proftpd.passwd. WU-FTPD dispose d'un paramètre passwd et shadow mais je n'ai pas réussi à le faire fonctionner. Il n'y a pas besoin de faire tourner un client NIS, le programme ypx permettant de récupérer le fichier de mots de passe, dans lequel l'administrateur n'a plus qu'à enlever les comptes des personnes ne pouvant accéder au serveur ftp.

Contrairement aux serveurs web, le seul moyen de distinguer différents serveurs est de leur attribuer différentes adresses IP. Dans l'exemple ci-dessous, le serveur FTP virtuel VirtualHost utilise l'adresse IP interne 10.0.1.227.


<VirtualHost 10.0.1.227>
	ServerName			"perso"
	ServerAdmin			grenier@cgsecurity.org
	AuthUserFile		/etc/proftpd.passwd
	MaxLoginAttempts	2
	RequireValidShell	no
	MaxClients		20
	DefaultRoot		~
	AllowOverwrite		yes
	<Directory ~>
		<Limit WRITE STOR RNFR DELE>
			Order Allow,Deny
			Deny ALL
		</Limit>	
	</Directory>

	<Directory ~/public_html>
		<Limit WRITE STOR RNFR DELE>
			AllowAll
		</Limit>	
	</Directory>
</VirtualHost>

Conclusion

ProFTPD s'adapte facilement aux besoins de sécurités de chacun que ce soit par la facilité de chrooter les comptes ou au niveau de la personalisation de ses fichiers de log. Le protocole FTP n'offre pas la confidentialitée des données echangés et lors de l'identification, login et password circulent en clair. Pour ceux que cela préoccupe, utiliser plutôt des solutions comme scp/sftp venant avec OpenSSH.

Liens

ProFTPD
Christophe GRENIER - grenier@cgsecurity.org