Le texte est organisé comme suit :
Comment installer un ftp anonyme sécurisé ?
Lisez toutes les notes et tous les avertissements !
ftp
dans /etc/passwd
.
Utilisez un groupe ordinaire. Le répertoire d'accueil de cet utilisateur
sera ~ftp
, ce sera la racine de l'arborescence que les utilisateurs
anonymes verront.
Utilisez un mot de passe et un shell invalides pour plus de sécurité.
Cette ligne du fichier passwd
ressemblera à ceci :
ftp:*:400:400:Anonymous FTP:/home/ftp:/bin/true
~ftp
, et donnez-en la propriété à
root
(pas à ftp
). Ainsi, les permissions du propriétaires
seront attribuées à root
, et les permissions de groupes concerneront les
utilisateurs anonymes. Mettez les droits d'accès de ~ftp
à 555
(lecture, pas d'écriture, exécution).
Certaines pages de manuel recommandent d'attribuer le répertoire~ftp
à l'utilisateurftp
. Ne le faîtes surtout pas si vous tenez à la sécurité de votre système.
~ftp/bin
appartenant à root
(groupe wheel
par exemple), avec les droits d'accès 111
(pas de lecture, pas d'écriture, exécution).ls
dans ~ftp/bin
. ls
appartiendra
à root
, avec les droits 111
(pas de lecture, pas d'écriture, exécution). Vous donnerez les mêmes droits à toutes les commandes que vous mettrez
ultérieurement dans ~ftp/bin
.~ftp/etc
, propriété de root
avec
les droits 111
.
passwd
et group
dans ~ftp/etc
, avec les droits 444
. Le fichier
passwd
ne devrait contenir que root
, daemon
, uucp
et
ftp
.
Le fichier group
contiendra le groupe choisi pour l'utilisateur
ftp
. Utilisez vos fichiers /etc/passwd
et /etc/group
comme modèles pour ~ftp/etc/passwd
et ~ftp/etc/group
.
Vous pouvez changer les noms d'utilisateurs dans ce fichier, ils ne sont
utilisés que par la commande ls
. Si par exemple les fichiers de votre
arborescence ~ftp/pub/linux
sont gérés par un utilisateur
balon
ayant l'uid
156
, vous pouvez mettre la ligne
linux:*:156:120:Kazik Balon::dans le fichier
~ftp/etc/passwd
(indépendemment de son vrai nom).
Ne faîtes figurer que les utilisateurs qui possèdent des fichiers
dans l'arborescence FTP, (c'est-à-dire root
, daemon
, ftp
...)
et supprimez résolument tous les mots de passe en les replaçant par
une étoile ``*
''. Les lignes du fichier ~ftp/etc/passwd
ressembleront donc à ceci :
root:*:0:0:Ftp maintainer:: ftp:*:400:400: Anonymous ftp::Pour plus de sécurité, vous pouvez tout simplement supprimer
~ftp/etc/passwd
et ~ftp/etc/group
(dans ce cas la commande
``ls -l
'' ne montrera pas les noms des groupes des répertoires). Le démon
FTP de Wuarchive (et d'autres) se base également sur le contenu
des fichiers group
et passwd
: lire la documentation
appropriée.
~ftp/pub
. Ce répertoire vous appartiendra
et aura le même groupe que ftp
avec les droits 555
. Sur la plupart
des systèmes (comme SunOs) vous pourrez donner les droits 2555
(positionnant le bit set-group-id
) pour que les fichiers
créés dans ce répertoire appartiennent au même groupe.
Les fichiers déposés dans ce répertoire seront accessibles publiquement.
Vous mettrez les mêmes droits d'accès 555
à tous les sous-répertoires
de ~ftp/pub
.
Ni le répertoire d'accueil ~ftp
, ni aucun de ses
sous-répertoires ne devra appartenir à l'utilisateur ftp
(ni aucun
fichier nulle part ailleurs). Les démons FTP modernes supportent
des tas de commandes très utiles, comme chmod
, qui permettent
de modifier de l'extérieur les droits d'accès que vous avez
laborieusement positionnés. Des options de configurations permettent
de désactiver ces commandes (ici WuFTP) :
# all the following default to "yes" for everybody delete no guest,anonymous # delete permission? overwrite no guest,anonymous # overwrite permission? rename no guest,anonymous # rename permission? chmod no anonymous # chmod permission? umask no anonymous # umask permission?
~ftp/pub/incoming
(propriétaire
root
, droits 733
). Faîtes un
``chmod +t ~ftp/pub/incoming
''. Normalement le démon FTP interdit
aux utilisateurs anonymes d'écraser un fichier existant, mais un
utilisateur normal pourrait détruire n'importe quoi. En mettant les droits
à 1733
ce ne sera plus possible. Avec wuftpd
vous pouvez
configurer le démon pour que les fichiers créés le soient avec les
droits 600
et appartiennent à root
(ou tout autre utilisateur).
Parfois répertoires ``incoming'' sont utilisés frauduleusement
pour échanger de fichiers piratés ou pornographiques. Les fraudeurs
y créent des sous-répertoires cachés précisément dans ce but. Ça aide
un peu de rendre le répertoire incoming
illisible
par les utilisateurs anonymes.
Avec les serveurs FTP usuels, on ne peut pas empécher la création de
répertoires dans incoming
. Le serveur ftp de WUarchive permet de
limiter les dépôts à certains répertoires, et de mettre des restrictions
sur les noms que l'on peut donner aux fichiers, comme par exemple:
# specify the upload directory information upload /var/spool/ftp * no upload /var/spool/ftp /incoming yes ftp staff 0600 nodirs # path filters # path-filter... path-filter anonymous /etc/msgs/pathmsg ^[-A-Za-z0-9_\.]*$ ^\. ^- path-filter guest /etc/msgs/pathmsg ^[-A-Za-z0-9_\.]*$ ^\. ^-
Suggestion : installez votre arborescence FTP (ou tout au moins la partieincoming
) dans un système de fichiers à part. Ceci empêchera une attaque paralysante consistant à saturer complètement votre partition principale (via le répertoireincoming
) avec des cochonneries.
Si vous avez wuftpd
vous pourrez installer quelques extensions comme
la compression-décompression au vol, ou la création de fichiers
tar
pour les arborescences. Récupérez les sources nécessaires
(gzip
, gnutar
, compress
), compilez-les avec une édition
des liens statique, et éditez le fichier qui contient la définition
des conversions autorisées. Le programme /usr/bin/tar
est déjà
lié statiquement. Vous préférerez probablement utiliser GNU-tar de toutes
façons.
Garry Mills a écrit le petit programme qui fait çà :
J'ai priscompress
surftp.uu.net
, à la racine je crois, et je l'ai compilé. Pourtar
etcompress
, j'ai écrit un petit programme appelé ``pipe
'', que j'ai lié statiquement. Mon fichier/etc/ftpconversions
ressemble à ceci :Note du traducteur: les 3 lignes qui ne commencent pas par deux-points ou dièse sont la continuation de celles qui les précèdent. J'ai dû les tronquer pour des raisons de formattage.
#strip prefix:strip postfix:addon prefix:addon postfix:external command: #types:options:description :.Z: : :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS :-z: : :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS : : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS : : :.tar:/bin/tar cf - %s:T_REG|T_DIR:O_TAR:TAR : : :.tar.Z:/bin/pipe /bin/tar cf - %s | /bin/compress -c:T_REG|T_DI R:O_COMPRESS|O_TAR:TAR+COMPRESS : : :.tar:/bin/gtar -c -f - %s:T_REG|T_DIR:O_TAR:TAR : : :.tar.Z:/bin/gtar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR +COMPRESS : : :.tar.gz:/bin/gtar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TA R+GZIP
Voilà le programme:
/* pipe.c: exec two commands in a pipe */ #define NULL (char *)0 #define MAXA 16 main(argc, argv) int argc; char *argv[]; { char *av1[MAXA], *av2[MAXA]; int i, n, p[2], cpid; i = 0; n = 0; while ( ++i < argc && n < MAXA ) { if ( *argv[i] == '|' && *(argv[i]+1) == '\0' ) break; av1[n++] = argv[i]; } if ( n == 0 ) uexit(); av1[n] = NULL; n = 0; while ( ++i < argc && n < MAXA ) av2[n++] = argv[i]; if ( n == 0 ) uexit(); av2[n] = NULL; if ( pipe(p) != 0 ) exit(1); if ( ( cpid = fork() ) == (-1) ) exit(1); else if ( cpid == 0 ) { (void)close(p[0]); (void)close(1); (void)dup(p[1]); (void)close(p[1]); (void)execv(av1[0], av1); _exit(127); } else { (void)close(p[1]); (void)close(0); (void)dup(p[0]); (void)close(p[0]); (void)execv(av2[0], av2); _exit(127); } /*NOTREACHED*/ } uexit() { (void)write(2, "Usage: pipe <command> | <command>\n", 34); exit(1); }
root
créez des fichiers .rhosts
et .forward
vides, appartenant à root
n en faisant par exemple
touch ~ftp/.rhosts ~ftp/.forward chmod 400 ~ftp/.rhosts ~ftp/.forward
ftp
, montez-les en lecture
seulement. La ligne correcte dans /etc/fstab
(sur la machine
où tourne ftpd
) ressemble à :
other:/u1/linux /home/ftp/pub/linux nfs ro,noquota,nosuid,intr,bg 1 0Ceci monte le disque de la machine
other
sur le répertoire
/home/ftp/pub/linux
sans quotas, sans aucun programme à
``suid'' (on ne sait jamais), interruptible (pour le cas où other
s'arrête), et en arrière-plan ``bg
'', pour que si vous redémarrez
votre machine alors que other
est arrêté, elle ne vous bloque
pas en réessayant continuellement de monter /home/ftp/pub/linux
.
Note du traducteur : Il s'agit là des serveurs ``chrooted FTP'', c'est-à-dire qui ne montrent à tous les utilisateurs (pas seulement les anonymes) qu'une sous-arborescence volontairement limitée, dont la racine apparente n'est pas la vraie racine de la hiérarchie de fichiers.Contribution de Marcus J. Ranum
<mjr@tis.com>
.
Etapes d'installation :
ftpd
qui soit liée statiquement, et
mettez dans ~ftp/bin
. Assurez-vous que root
en est le
propriétaire.
/bin/ls
, faîtes-en une version
statique également, que vous mettrez dans ~ftp/bin
.
Il y a un portage de la commande ls
de BSD net2 pour SunOs sur
ftp.tis.com
dans
pub/firewalls/toolkit/patches/ls.tar.Z
. Vérifiez que root
en est propriétaire.
~ftp/etc/passwd
~ftp/etc/group
comme
vous le feriez normalement, mais surtout ne mettez pas la racine
/
comme répertoire d'accueil pour l'utilisateur ftp
.
Assurez-vous que ces deux fichiers appartiennent à root
.
ftpd
et installez-le
dans /etc/inetd.conf
. En supposant que ~ftp
= /var/ftp
,
le lanceur ressemble à ceci :
main() { if(chdir("/var/ftp")) { perror("chdir /var/ftp"); exit(1); } if(chroot("/var/ftp")) { perror("chroot /var/ftp"); exit(1); } /* optional: seteuid(FTPUID); */ execl("/bin/ftpd","ftpd","-l",(char *)0); perror("exec /bin/ftpd"); exit(1); }
netacl
de la boite à outils standard, ou
des ``tcp-wrappers'' pour
obtenir le même résultat.netacl
pour pouvoir activer/désactiver
le confinement pour que quelques machines qui se
connectent au service FTP ne soient pas confinées dès le
début. Ceci rend le transfert de fichiers un peu moins pénible.ftpd
et enlever
tous les appels à seteuid()
. Ceux qui connaissent des trous de sécurité
qui permettent de passer root
n'y arriveront plus. Détendez-vous
et imaginez combien ils vont être frustrés.ftpd
, je vous recommande de
désactiver un tas d'options dans ftpcmd.y
en enlevant l'indicateur
``implemented
''. Ça ne sera commode que si votre serveur FTP est
destiné uniquement à la consultation.
/etc/passwd
de votre zone FTP
est maintenant complètement séparé de votre vrai /etc/passwd
.
Il y a des avantages et des inconvénients.syslog
,
parce qu'il n'y a pas de /dev/log
. Dans ce cas vous pouvez
construire une version de ftpd
avec une routine syslog()
basée
sur UDP, ou encore faire tourner un second syslogd
reposant sur le
code BSD Net2, qui avec l'option -p ~ftp/dev/log
gèrera
un socket unix-domain.
Rappellez-vous : si on peut passerroot
par une faille de votreftpd
, on peut vous causer des dégâts même sur un serveur à arborescence déplacée. Si vous n'avez pas peur de bricoler du code, s'arranger pour faire tournerftpd
sans permissions est une très bonne chose. Vous pouvez vérifier le bon fonctionnement de votre serveur bricolé en vous y connectant et (pendant qu'il en est à la chaîne d'invite utilisateur) en faisant unps-axu
pour voir s'il le tourne pas sousroot
.
... RTU6.0 (Masscomp, maintenant dénommée Concurrent Real Time UNIX), machines AT&T 3B1 et 3B2 :
Ces systèmes peuvent avoir besoin de dev/tcp
.
(dev/tcp)
Ces implémentations de ftpd
peuvent requérir un ~ftp/dev/tcp
en état de marche pour que le FTP anonyme fonctionne.
Il faut créer un fichier spécial en mode caractères avec les nombres
majeur et mineur convenables. Les nombres convenables pour
~ftp/dev/tcp
sont ceux de /dev/tcp
.
~ftp/dev
est un répertoire, et ~ftp/dev/tcp
est un
fichier spécial en mode caractères. Fixez-en le groupe et le propriétaire
à root
. Les droits d'accès de ~ftp/dev
sont
lecture-écriture-exécution pour root
, et lecture-exécution pour le
groupe et les autres. Pour ~ftp/dev/tcp
, root
aura le droit
de lire et écrire, les autres et le groupe le droit de lire seulement.
(Fichiers de trace) Si vous utilisez le ftpd
de HP, la ligne de
/etc/inetd.conf
devrait lancer ftpd -l
, qui fait des
traces supplémentaires.
(Bibliothèques) Pour que SunOs utilise ses bibliothèques dynamiques partagées, suivez ces étapes :
~ftp/usr
. Le propriétaire est
root
, avec les droits 555
.~ftp/usr/lib
. Le propriétaire est
root
, avec les droits 555
.ld.so
dans ~ftp/usr/lib
pour qu'il soit utilisable par ls
. ld.so
appartient à root
avec les droits 555
.
libc.so.*
) dans ~ftp/usr/lib
pour qu'elle soit utilisée par
ls
. La copie libc.so.*
appartiendra à root
avec les droits 555
.
Utilisateurs de 4.1.2 (ou au-delà) : il faut aussi copier
/usr/lib/libdl.so.*
dans ~ftp/lib
.
~ftp/dev
. Propriétaire root
et droits d'accès 111
.
~ftp/dev/zero
. Placez-vous dans
le répertoire ~ftp/dev
et créez-le par la commande :
mknod zero c 3 12transférez-en la propriété à
root
. Assurez-vous qu'il est lisible.
Avertissement aux novices : N'essayez pas de copier/dev/zero
dans~/ftp/dev/zero
!!! C'est un fichier sans fin de zeros et il va remplir complètement votre partition !
~ftp/usr/share/lib/zoneinfo
et copiez-y /usr/share/lib/zoneinfo/localtime
.
ls
de Sun qui est lié dynamiquement,
vous pouvez essayer de récupérer un ls
statique à la place.
Il y en a un sur le CD-ROM de distribution de SunOS. Dans ce cas vous pouvez
vous dispenser des étapes 6 à 8.
Si vous voulez un autre ls
statique, récupérez fileutils
de GNU sur un serveur d'archives proche et liez-le statiquement.
(Fichiers de trace) Le démon ftpd
standard de Sun enregistre
tous les mots de passe. Pour corriger ça, passez le patch :
101640-03 SunOS 4.1.3: in.ftpd logs password info when -d option is used.
Dans /etc/inetd.conf trouvez la ligne qui commence par ftp
.
La fin de la ligne qui devrait être ``in.ftpd
'', remplacez-la par
``in.ftpd -dl
>>. Dans /etc/syslog.conf
, ajoutez une ligne
daemon.* /var/adm/daemonlog
L'information peut-être ventilée sur plusieurs fichiers, en faisant :
daemon.info /var/adm/daemon.info daemon.debug /var/adm/daemon.debug daemon.err /var/adm/daemon.err
Attention, l'espace entre les deux colonnes doit contenir
au moins une tabulation, et pas seulement des espaces, sinon
ça ne va pas marcher. Vous pouvez mettre vos fichiers de traces
où vous voulez. Ensuite, créez les fichiers de traces (par exemple par
touch /var/adm/daemonlog
). Pour finir, relancez
inetd
et syslogd
, soit manuellement, soit en démarrant le
système. Ça devrait fonctionner.
Si vous n'installez pas le patch,
assurez-vous que le fichier de traces appartient bien à root
et qu'il a les droits 600
, parce que le démon ftpd
enregistrera absolument tout, y compris les mots de passe des utilisateurs.
Pour des raisons de sécurité les fichiers de traces ne doivent
être lisibles que par root
: si par erreur un utilisateur tape son
mot de passe au lieu de son nom, il pourrait être piraté par quiconque
peut lire les traces.
Wuarchive FTP 2.4 - Un démon FTP sécurisé qui améliore le
contrôle d'accès, les fichiers de traces, les bannières d'avant-login, et
offre de nombreuses options de configuration. Par ftp
sur
ftp.uu.net
dans le répertoire /networking/ftp/wuarchive-ftpd
.
Vérifiez bien le checksum pour être sûr d'avoir chargé une copie
valide. (Avertissement : les anciennes versions de Wu-FTP
sont très vulnérables et certaines ont des chevaux de Troie.)
BSD SVR4 File Checksum Checksum MD5 Digital Signature ----------------- -------- --------- -------------------------------- wu-ftpd-2.4.tar.Z 38213 181 20337 362 cdcb237b71082fa23706429134d8c32e patch_2.3-2.4.Z 09291 8 51092 16 5558a04d9da7cdb1113b158aff89be8f For DECWRL ftpd, sites can obtain version 5.93 via anonymous FTP from gatekeeper.dec.com in the "/pub/misc/vixie" directory. BSD SVR4 File Checksum Checksum MD5 Digital Signature ----------------- -------- --------- -------------------------------- ftpd.tar.gz 38443 60 1710 119 ae624eb607b4ee90e318b857e6573500 For BSDI systems, patch 005 should be applied to version 1.1 of the BSD/386 software. You can obtain the patch file via anonymous FTP from ftp.bsdi.com in the "/bsdi/patches-1.1" directory. BSD SVR4 File Checksum Checksum MD5 Digital Signature ----------------- -------- --------- -------------------------------- BU110-005 35337 272 54935 543 1f454d4d9d3e1397d1eff0432bd383cfSources dans le domaine public :
ftp.uu.net ~ftp/systems/unix/bsd-sources/libexec/ftpd gatekeeper.dec.com ~ftp/pub/DEC/gwtools/ftpd.tar.Z
Cette section offre à l'administrateur une petite liste de points à vérifier pour vérifier que son serveur n'est pas trop facile à fracturer.
SITE EXEC
en vous connectant par telnet
sur le port 21 et en tapant
``SITE EXEC
''. Si votre démon FTP accepte cette commande, vérifiez
qu'il est dans sa version la plus récente (c'est-à-dire Wu-FTP 2.4
).
Dans les versions plus anciennes, la commande permet à
n'importe qui d'exécuter un shell par le port 21.anonymous
et créer des fichiers .rhosts
,
et .forward
, l'accès est alors ouvert à tout intrus.ftp
. Sinon un intrus peut faire ``SITE CHMOD 777
'' sur le
répertoire principal et installer des fichiers qui lui donneront
immédiatement un accès. La commande SITE CHMOD
devrait être
supprimée parce que les utilisateurs anonymes n'ont besoin
d'aucun privilège particulier.
ftp
.
Si c'etait le cas, un intrus pourrait les remplacer par un cheval de Troie.
Recherche des programmes dans les sites FTP. Connectez-vous à ces
sites sous le nom archie
ou utilisez un client Archie pour un
accès plus rapide. Pour faire ajouter votre site dans la liste des
serveurs explorés par Archie, envoyez un courrier électronique à
archie-updates@bunyip.com
.
archie.ac.il 132.65.20.254 (Israel server) archie.ans.net 147.225.1.10 (ANS server, NY (USA)) archie.au 139.130.4.6 (Australian Server) archie.doc.ic.ac.uk 146.169.11.3 (United Kingdom Server) archie.edvz.uni-linz.ac.at 140.78.3.8 (Austrian Server) archie.funet.fi 128.214.6.102 (Finnish Server) archie.internic.net 198.49.45.10 (ATT server, NY (USA)) archie.kr 128.134.1.1 (Korean Server) archie.kuis.kyoto-u.ac.jp 130.54.20.1 (Japanese Server) archie.luth.se 130.240.18.4 (Swedish Server) archie.ncu.edu.tw 140.115.19.24 (Taiwanese server) archie.nz 130.195.9.4 (New Zealand server) archie.rediris.es 130.206.1.2 (Spanish Server) archie.rutgers.edu 128.6.18.15 (Rutgers University (USA)) archie.sogang.ac.kr 163.239.1.11 (Korean Server) archie.sura.net 128.167.254.195 (SURAnet server MD (USA)) archie.sura.net(1526) 128.167.254.195 (SURAnet alt. MD (USA)) archie.switch.ch 130.59.1.40 (Swiss Server) archie.th-darmstadt.de 130.83.22.60 (German Server) archie.unipi.it 131.114.21.10 (Italian Server) archie.univie.ac.at 131.130.1.23 (Austrian Server) archie.unl.edu 129.93.1.14 (U. of Nebraska, Lincoln (USA)) archie.uqam.ca 132.208.250.10 (Canadian Server) archie.wide.ad.jp 133.4.3.6 (Japanese Server)
Chapitre suivant, Chapitre Précédent
Table des matières de ce chapitre, Table des matières générale
Début du document, Début de ce chapitre