Le protocole TFTP est défini dans le document RFC1350 The TFTP Protocol (Revision 2). C'est une méthode simple utilisée pour transférer des fichiers. Il s'appuie sur le protocole UDP au niveau transport. Il se limite à l'écriture et à la lecture de fichiers entre deux hôtes réseau. Il ne possède pas de fonction d'authentification et il est impossible de lister les fichiers à distance.
L'absence de complexité de ce protocole fait qu'il peut être implanté dans un espace mémoire réduit. C'est la raison pour laquelle on le retrouve dans la majorité des équipements réseau comme moyen d'échange d'images firmware des systèmes d'exploitation (et|ou) de fichiers de configuration.
Dans le contexte de ce document, le poste avec le système
GNU/Linux doit échanger les fichiers avec l'équipement réseau. Il
s'agit donc de configurer un service tftpd
avec un minimum de précautions au niveau
sécurité.
Comme indiqué dans la Section 1.3, « Logiciels
utilisés », seuls les paquets de la distribution
Debian GNU/Linux sont présentés ici. À
l'heure actuelle, la distribution comprend trois paquets pour ce
service : tftpd
, atftpd
et tftpd-hpa
. Les principales différences entre
ces trois paquets se situent au niveau des tailles maximales des
fichiers transférés et de la gestion des droits sur l'arborescence
du service TFTP. Le paquet
tftpd-hpa offre le plus de
possibilités dans ces domaines. Son installation et sa
configuration sont présentées ici.
L'installation de tftpd-hpa et le contrôle de la version installée se résument aux instructions suivantes :
# apt-get install tftpd-hpa <snipped/> # dpkg -l *tftpd* | grep ^ii ii tftpd-hpa 5.0-7 HPA's tftp server
Le paquet propose plusieurs menus de configuration qui couvrent les opérations de mise en œuvre d'une arborescence de service, le contrôle d'accès et les options spécifiques à ce service telles que la création de fichiers depuis l'équipement réseau distant.
-
Définition de l'utilisateur système propre au service TFTP.
-
Définition de l'arborescence racine du service TFTP.
-
Définition de l'adresse IP sur laquelle le service TFTP est en écoute.
-
Définition des options spécifiques au service TFTP.
Dans le cas où l'on souhaite configurer manuellement ce service, voici les étapes équivalentes à celles présentées dans les copies d'écran ci-dessus.
- Compte utilisateur système et arborescence
-
Cette partie comprend plusieurs étapes dont le but est de mettre en place une arborescence dont l'accès est réservé à un utilisateur et un groupe système dédié. L'accès à cette arborescence est ensuite conditionné à l'appartenance au groupe système en question. On commence justement par la création du groupe système baptisé
tftp
.# addgroup --system tftp Ajout du groupe « tftp » (identifiant 130)... Terminé.
On passe ensuite à la création du compte utilisateur système proprement dit ; baptisé lui aussi
tftp
. Ce compte fait partie du groupe créé ci-dessus. Il dispose d'une arborescence dont la racine est placée au niveau du répertoire/var/lib/tftp/
et, comme ce compte est de type système, il ne doit être utilisable que par le service TFTP.# adduser --system --ingroup tftp \ --home /var/lib/tftp --disabled-password --disabled-login tftp Ajout de l'utilisateur système « tftp » (identifiant : 122)... Ajout du nouvel utilisateur « tftp » (identifiant : 122) avec le groupe « tftp »... Création du répertoire personnel « /var/lib/tftp »...
On complète le masque des permissions sur la racine de l'arborescence en donnant les droits d'écriture aux membres du groupe
tftp
.# chmod 2775 /var/lib/tftp
On peut contrôler le résultat des opérations précédentes en visualisant les droits sur l'arborescence.
# ls -lAh /var/lib/ |grep tftp drwxrwsr-x 2 tftp tftp 4,0K sep 27 11:31 tftp
Enfin, on contrôle le contenu du fichier
/etc/default/tftpd-hpa
pour vérifier qu'il est en conformité avec les opérations réalisées, soit manuellement, soit à l'aide des menus de configuration du paquettftpd-hpa
.# /etc/default/tftpd-hpa ## The configuration of this file is managed by debconf as long ## as a line beginning with the '#DEBCONF#' token is included. ## ## Do not edit this file manually, use: ## dpkg-reconfigure tftpd-hpa #DEBCONF# TFTP_USERNAME="tftp" TFTP_DIRECTORY="/var/lib/tftp" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure --create"
- Contrôle d'accès local au service
-
À la suite des opérations décrites ci-dessus, seuls les membres du groupe
tftp
, ont le droit d'écrire dans l'arborescence du service TFTP. Tous les utilisateurs du système ont le droit de lire le contenu de cette même arborescence. Pour autoriser un utilisateur à écrire dans le répertoire/var/lib/tftp/
, il suffit de l'ajouter au groupe système dédié. Voici un exemple :# adduser etu tftp Ajout de l'utilisateur « etu » au groupe « tftp »... Ajout de l'utilisateur etu au groupe tftp Terminé.
Les droits sur le système de fichiers du serveur TFTP attribués de cette façon permettent à un utilisateur normal (pas nécessairement le super-utilisateur) de déposer des images de systèmes d'exploitation (et|ou) des de fichiers de configuration. Attention, ce type de modification des droits d'un compte utilisateur n'est active qu'après une déconnexion/reconnexion.
- Contrôle d'accès réseau au service
-
Les options disponibles pour la configuration du démon sont extraites des pages de manuels du service :
.#
man in.tftpdL'option
--user
permet de désigner les identifiants (IDs) de l'utilisateur et du groupe propriétaires du processus du service. Comme nous avons créé un utilisateur systèmetftp
dédié au service, c'est cet utilisateur qui doit être affecté ici.L'option
--secure
désigne la racine du service dans l'arborescence du système de fichiers du serveur. Cette racine est la seule accessible depuis les hôtes distants.L'option
--create
autorise la création de fichier à partir de l'équipement réseau. Sans cette option, le comportement par défaut du service n'autorise pas l'upload. Cette option est très utile pour la sauvegarde directe des fichiers de configuration des équipements.Ensuite, on redémarre le service pour valider les paramètres de configuration mis en place et on visualise le résultat.
# /etc/init.d/tftpd-hpa restart Restarting HPA's tftpd: in.tftpd. # lsof -i | grep tftp in.tftpd 16621 root 4u IPv4 1211314 0t0 UDP *:tftp
Le résultat de la commande lsof montre bien que le démon
in.tftpd
est en écoute sur le port 69/udp sans restriction sur les adresses IP avec le caractère '*'.
Dans ce cas de figure, le transfert se fait du poste GNU/Linux
vers l'équipement. Il n'y a donc aucun problème lié aux accès sur
le système de fichiers côté GNU/Linux. Il suffit de placer une
copie du fichier à transférer dans le répertoire /var/lib/tftp/
.
Cet exemple est particulier puisque la taille du fichier image
du système d'exploitation est importante. Le service tftpd
est assuré à partir du paquet
tftp-hpa qui autorise le transfert
de blocs de données importants.
$ cd /var/lib/tftp $ ll c2800nm-advipservicesk9-mz.124-11.T1.bin -rw-r--r-- 1 etu tftp 38M 2007-03-20 21:10 c2800nm-advipservicesk9-mz.124-11.T1.bin
Côté routeur, il faut s'assurer que la mémoire flash dispose d'un espace libre suffisant pour accueillir la nouvelle image du système d'exploitation IOS. Au besoin, il faut effacer le fichier image en cours d'exécution.
router#sh flash: -#- --length-- -----date/time------ path 1 1826 Jul 5 2006 23:53:52 +02:00 sdmconfig-28xx.cfg 2 4734464 Jul 5 2006 23:54:12 +02:00 sdm.tar 3 833024 Jul 5 2006 23:54:26 +02:00 es.tar 4 1052160 Jul 5 2006 23:54:40 +02:00 common.tar 5 1038 Jul 5 2006 23:54:54 +02:00 home.shtml 6 102400 Jul 5 2006 23:55:06 +02:00 home.tar 7 491213 Jul 5 2006 23:55:18 +02:00 128MB.sdf 8 1684577 Jul 5 2006 23:55:38 +02:00 securedesktop-ios-3.1.1.27-k9.pkg 9 398305 Jul 5 2006 23:55:56 +02:00 sslclient-win-1.1.0.154.pkg 54702080 bytes available (9314304 bytes used)
On lance le transfert en indiquant le fichier image sur le serveur TFTP comme source et la mémoire flash comme destination.
router#copy tftp://192.168.2.1/c2800nm-advipservicesk9-mz.124-11.T1.bin flash: Destination filename [c2800nm-advipservicesk9-mz.124-11.T1.bin]? Accessing tftp://192.168.2.1/c2800nm-advipservicesk9-mz.124-11.T1.bin... Loading c2800nm-advipservicesk9-mz.124-11.T1.bin from 192.168.2.1 \ (via GigabitEthernet0/1): !!!!!!!!!!!!!!!!!! <snip/> [OK - 39798360 bytes] 39798360 bytes copied in 580.728 secs (68532 bytes/sec) router#sh flash: -#- --length-- -----date/time------ path 1 1826 Jul 5 2006 23:53:52 +02:00 sdmconfig-28xx.cfg 2 4734464 Jul 5 2006 23:54:12 +02:00 sdm.tar 3 833024 Jul 5 2006 23:54:26 +02:00 es.tar 4 1052160 Jul 5 2006 23:54:40 +02:00 common.tar 5 1038 Jul 5 2006 23:54:54 +02:00 home.shtml 6 102400 Jul 5 2006 23:55:06 +02:00 home.tar 7 491213 Jul 5 2006 23:55:18 +02:00 128MB.sdf 8 1684577 Jul 5 2006 23:55:38 +02:00 securedesktop-ios-3.1.1.27-k9.pkg 9 398305 Jul 5 2006 23:55:56 +02:00 sslclient-win-1.1.0.154.pkg 10 39798360 Mar 24 2007 17:04:52 +01:00 c2800nm-advipservicesk9-mz.124-11.T1.bin 14901248 bytes available (49115136 bytes used)
Comme dans l'exemple précédent, le transfert se fait du poste
GNU/Linux vers l'équipement et le fichier à transférer est dans le
répertoire /var/lib/tftp/
.
Côté équipement, il faut un minimum de configuration réseau IP pour communiquer avec le poste GNU/Linux.
sw1#sh run Building configuration... <snip/> ! interface Vlan1 no ip address no ip route-cache shutdown ! interface Vlan2 ip address 192.168.2.2 255.255.255.0 no ip route-cache !
On peut ensuite lancer le transfert à partir de l'interface de
commande de l'équipement. Voici un exemple de mise à jour via
tftpd
:
sw1#archive tar /x tftp://192.168.2.1/c2950-i6q4l2-tar.121-22.EA2.tar flash:
L'accès à l'interface de commande de l'équipement réseau peut être obtenu à l'aide de minicom ou de telnet.
Ici, le transfert se fait depuis l'équipement réseau vers le
poste GNU/Linux sur lequel le service tftpd
est exécuté.
Avec la configuration mise en place dans la partie Contrôle d'accès réseau au service, on a
autorisé la création de fichiers dans l'arborescence sur service
TFTP avec l'option -c
du démon in.tftpd
fourni avec le paquet tftpd-hpa.
En reprenant l'exemple du commutateur 2950, voici l'opération se résume au transfert de la configuration active.
sw1#copy run tftp://192.168.2.1 Address or name of remote host [192.168.2.1]? Destination filename [sw1-confg]? !! 2748 bytes copied in 1.116 secs (2462 bytes/sec)
Dans les faits, il est beaucoup plus fréquent que l'on édite la configuration sur le poste GNU/Linux avant de la transférer vers l'équipement. Cette méthode permet d'assurer un suivi des évolutions de configuration via un système de contrôle de version tel que CVS ou SVN. On dispose ainsi d'un dépôt centralisé des configurations.
On retrouve dans ce cas un transfert depuis le poste GNU/Linux vers l'équipement réseau. C'est le cas le plus simple du point de vue de la gestion des droits.
Une fois la nouvelle configuration éditée, on place le fichier
correspondant dans le répertoire /var/lib/tftp/
et on lance le transfert à partir
de l'interface en ligne de commande de l'équipement.
sw1#copy tftp://192.168.2.1/new-confg run Destination filename [running-config]? Accessing tftp://192.168.2.1/new-confg... Loading new-confg from 192.168.2.1 (via Vlan2): ! [OK - 2756 bytes] 2756 bytes copied in 19.984 secs (138 bytes/sec) sw1# 2d00h: %SYS-5-CONFIG_I: Configured from tftp://192.168.2.1/new-confg by console sw1# <snip/> sw1#copy run start Destination filename [startup-config]? Building configuration... [OK]
Il est préférable de copier la configuration en RAM dans un premier temps. Si la nouvelle configuration provoque un dysfonctionnement réseau, on a toujours la possibilité de réinitialiser complètement l'équipement. Il reprendra la configuration stockée en NVRAM (la version correcte précédente). Autrement, après avoir effectué les tests d'usage, on sauvegarde la nouvelle configuration en RAM dans la NVRAM.
Comme le service tftpd
n'est pas
un modèle en matière de sécurité, il est souhaitable de bien
encadrer son utilisation.
Généralement, on complète le contrôle d'accès (voir Contrôle
d'accès réseau au service) par une règle de filtrage réseau
pour chaque équipement.
Côté équipement on fixe l'adresse IP ou l'interface utilisée pour les transactions TFTP avec des instructions du type :
-
Pour un commutateur :
interface Vlan2 ip address 192.168.2.2 255.255.255.0 no ip proxy-arp no ip route-cache ! ip tftp source-interface Vlan2
-
Pour un routeur :
interface Loopback0 ip address 192.168.2.2 255.255.255.255 no ip redirects no ip unreachables no ip directed-broadcast no ip proxy-arp ! ip tftp source-interface Loopback0
Côté service tftpd
, on
n'autorise les accès TFTP (port
69/udp) qu'à partir des adresses IP fixées sur les équipements.
Voici un extrait du fichier /var/lib/iptables/active
utilisé par le script
d'initialisation du paquet iptables.
*filter :INPUT DROP [0:0] <snip/> -A INPUT -s 192.168.2.2 -p udp --dport 69 -m conntrack --ctstate NEW -j ACCEPT <snip/>
Pour un exemple complet, voir Annexe A, Configuration type du filtrage réseau.