Mini-HOWTO Term-Firewall Barak Pearlmutter, barak.pearlmutter@alumni.cs.cmu.edu 22 Mai 1996 (Version francaise realisee par Eric Dumas, dumas@freenix.fr, dumas@Linux.EU.Org, 1er Juillet 1997). Ce document decrit comme utiliser Term pour traverser un Firewall Internet, ce que vous n'etes pas suppose pouvoir faire. 11.. AAvveerrttiisssseemmeennttss ((IImmppoorrttaanntt !!)) Je decline sur le present document toute responsabilite d'une quelconque application de ce qui va suivre. Si cela echoue de n'importe quelle maniere, c'est votre probleme. Ce n'est pas ma faute. Si vous ne comprenez pas les risques qui decoulent de cette methode, ne l'utilisez pas. Si vous employez cette methode et que cela permet a des pirates vicieux de penetrer dans votre systeme informatique et que cela vous coute votre travail et a votre entreprise des millions de dollars, ce n'est que de votre faute. Ne venez pas pleurer. 22.. CCooppyyrriigghhtt Sauf contre-indication, les documents HOWTO Linux sont copyrightes par leurs auteurs respectifs. Les documents Linux HOWTO peuvent etre reproduits et diffuses totalement ou en partie, sous n'importe quel support physique ou electronique du moment ou la notice legale se trouve sur toute copie. Les diffusions commerciales sont autorisees et encouragees. Toutefois, l'auteur souhaiterait etre tenu au courant de telles diffusions. Toute traduction, travail derive contenant n'importe quel document HOWTO Linux doit etre convert par cette note legale. Ainsi, vous ne pouvez pas creer un document derive d'un HOWTO et ajouter des restrictions sur sa diffusion. Des exceptions a ces regles peuvent etre eventuellement acceptees dans certaines conditions. Contactez le coordinateur des HOWTO a l'adresse qui suit. En resumant, nous souhaitons favoriser la dissemination de ces informations _v_i_a le maximum de moyens de communications. Toutefois, nous souhaitons garder un copyright sur ces documents et souhaiterions etre tenu au courant de toute initiative de diffusion de ces documents. Si vous avez des questions, contactez Greg Hankins, le coordinateur des HOWTO Linux a gregh@sunsite.unc.edu par courrier electronique ou par telephone au 1 404 853 9989. 33.. IInnttrroodduuccttiioonn Le programme term est normalement utilise sur une ligne serie ou modem, pour permettre a plusieurs services machine-a-machine de communiquer grace a cette simple connexion serie. Toutefois, il est assez utile quelquefois d'etablir une connexion entre deux machines communiquant par telnet avec term. L'utilisation la plus interessante reside dans la connexion de deux machines separees par des _f_i_r_e_w_a_l_l_s ou par des serveurs _s_o_c_k_s. Les _f_i_r_e_w_a_l_l_s permettent l'etablissement de connexions a travers eux- memes, typiquement en utilisant le protocole _s_o_c_k_s. Ce dernier permet aux machines du reseau interne de se connecter a l'exterieur, et oblige les utilisateurs exterieurs a se connecter en premier sur la machine passerelle qui leur demande un mot de passe. Ces _f_i_r_e_w_a_l_l_s rendent impossible, par exemple, la communication entre un client X sur une machine interieure et un serveur exterieur. Mais, en configurant une connexion term, ces restrictions peuvent etre contournees assez facilement, au niveau de l'utilisateur. 44.. MMiissee eenn ooeeuuvvrree ggeenneerraallee Configurer une connexion term par-dessus une session telnet se fait en deux phases. Dans un premier temps, votre client habituel telnet est utilise pour configurer une connexion telnet et pour se connecter. Ensuite, le client telnet est mis en sommeil, et fait en sorte que la connexion telnet soit transmise a term. 55.. PPrroocceedduurree ddeettaaiilllleeee En detail, la marche a suivre est la suivante : 1. A partir d'une machine a l'interieur du _f_i_r_e_w_a_l_l, se connecter par telnet a l'exterieur de celui-ci et s'y loger. 2. Sauf si vous etes sous LLiinnuuxx et que vous utilisez le systeme de fichiers _/_p_r_o_c (voir ci-dessous), verifiez que votre shell est du genre sh. C.a.d. que votre shell par defaut soit une variante de csh. Appelez telnet par (setenv SHELL /bin/sh; telnet machine.la- bas.dehors). 3. Apres s'etre loge, lancer la commande sur la machine de l'exterieur : term -r -n off telnet. Maintenant revenez a l'invite telnet sur la machine locale, en utilisant le caractere d'echappement ^] (ou celui que vous voulez), puis utilisez la commande de telnet pour executer une commande shell ! pour lancer term : telnet> ! term -n on telnet <&3 >&3 _E_t _v_o_i_l_a _!_!_! (Ndt : En francais dans le texte). (Si vous possedez une autre version de telnet, vous risquez d'avoir a utiliser d'autres descripteurs de fichiers que 3. C'est facile a determiner en utilisant trace. Mais 3 semble fonctionner sur tous les telnet de type bsd que j'ai testes. J'ai egalement essaye sous Sun OS 4.x et les distributions LLiinnuuxx standard.) Certains clients telnet ne possedent pas de caractere d'echapement !. Par exemple, client telnet diffuse avec la Slackware 3.0 en fait partie. Les sources de ce client sont senses provenir de ftp://ftp.cdrom.com:/pub/linux/slackware-3.0/source/n/tcpip/NetKit- B-0.05.tar.gz, paquetage qui contient le caractere d'echapement. Une solution assez simple est de recuperer ces sources et de les recompiler. Je n'y suis malheureusement pas arriver. De plus, si vous etes a l'interieur d'un firewall socks, vous devrez avoir un client telnet a la SOCKS. J'ai reussi a compiler un tel cient en utilisant ftp://ftp.nec.com/pub/security/socks.cstc/socks.cstc.4.2.tar.gz ou si vous etes a l'exterieur des USA, ftp://ftp.nec.com/pub/security/socks.cstc/export.socks.cstc.4.2.tar.gz Autrement, sous LLiinnuuxx version 1.2.13 ou precedentes, vous pouvez mettre telnet en sommeil avec ^]^z , recuperer son pid et lancer : term -n on -v /proc/ < telnetpid > /fd/3 telnet Cela ne fonctionne plus avec les noyaux 1.3 et superieur, qui ont verouille certaines failles de securite pour eviter les acces a des descripteurs de fichiers n'appartenant pas au proprietaire du processus ou a ses fils. 66.. SSoocckkeettss ppoouurr tteerrmm multiples C'est une bonne idee de donner un nom explicite a la socket de term. C'est l'argument donne a telnet dans la ligne de commande ci-dessus. A moins que vous n'ayez la variable d'environnement TERMSERVER positionnee a telnet, vous pouvez appeler les clients avec le parametre -t, c'est-a-dire : trsh -t telnet. 77.. LLee ffiicchhiieerr dd''iinniittiiaalliissaattiioonn ..tteerrmm//tteerrmmrrcc..tteellnneett J'ai attendu que la ligne soit claire en utilisant un verficateur de ligne sur ce media. J'esperais qu'il soit totalement transparent, mais cela semble impossible. Toutefois, le seul caractere perturbant semble etre le 255. Le fichier /.term/termrc.telnet que j'emploie (le fichier .telnet est le nom de la connexion term, cf. supra) contient : baudrate off escape 255 ignore 255 timeout 600 Il peut etre ameliore en trichant, j'ai un debit de seulement 30.000 cps (caracteres par secondes) pour une connexion longue distance a- travers un _f_i_r_e_w_a_l_l lent. FTP peut aller jusqu'a 100.000 cps en suivant le meme chemin. Une vitesse en bps (bits par seconde) realiste peut eviter quelques temps morts. 88.. AAddmmiinniissttrraattiioonn Manifestement, si vous attaquez de l'exterieur du _f_i_r_e_w_a_l_l, et que vous employez une carte avec un identificateur securise ou quelque chose de ce genre, vous voudrez surement inverser les roles des serveurs de connexion et local (si vous ne comprennez pas ce que cela signifie, vous n'etes peut-etre pas assez familier avec term pour utiliser l'astuce decrite dans ce document d'une maniere responsable). 99.. SSeeccuurriittee Ce n'est rien moins qu'une faille que la possibilite d'avoir une connexion telnet detournee sur une machine non securisee de l'exterieur. Le premier risque supplementaire provient des personnes capables d'utiliser la socket term que vous avez configuree sans que vous soyez au courant. Donc, soyez prudents (personnellement, je fais cela sur une machine externe que je sais etre securisee. Pour etre plus precis, un portable sous LLiinnuuxx que j'administre moi-meme et qui n'accepte aucune connexion de l'exterieur). Une autre possibilite est d'ajouter socket off dans ~/.term/termrc.telnet ou ajouter -u off. Cela evide que la socket soit accessible du site distant, avec une perte de fonctionnalite assez mineure. 1100.. MMooddee tteellnneett Verifiez que le demon telnetd distant n'est pas dans un mauvais mode sept bits. Si c'est le cas, vous devez l'indiquer a term lorsque vous le lancez en ajoutant un -a sur la ligne de commande (j'emploie de temps en temps un ^] telnet> set outbin ou un set bin ou bien, je lance telnet avec l'option _-_8 pour forcer la connexion en mode 8 bits). 1111.. BBuuggss eett mmeess ssoouuhhaaiittss ccoonncceerraanntt tteerrmm Le programme de verification de ligne a de temps en temps quelques problemes pour controler la connexion telnet. Cela provient parfois du fait qu'il ne verifie pas le code de retour de l'appel read(). Pour des connexions reseau, cet appel peut retourner le code d'erreur -1 avec _E_I_N_T_R (interrompu) ou _E_A_G_A_I_N (reessayer). Manifestement, cela serait une bonne chose que cela soit verifie. Un certain nombre de caracteristiques pourraient faciliter l'utilisation de term sur telnet. Cela provient essentiellement d'une hypothese qui a influence le developpement de term, qui est que la connexion dispose d'une largeur de bande faible, d'une latence reduite et qu'elle est quelque peu bruitee. Une connexion telnet possede en general une bande passante assez importante, une grande latence et qui contient peu d'erreurs. Cela signifie que la connexion pourrait etre mieux utilisee si : 1. la taille maximale de la fenetre etait augmentee, bien au-dela de la limite imposee par la formule _N___P_A_C_K_E_T_S_/_2 _= _1_6 de term 2. une option pour desactiver l'envoi et la verification du _c_h_e_c_k_s_u_m des paquets etait implementee 3. de plus grands paquets etaient permis lorsque cela est approprie. Egalement, pour ameliorer la securite, il serait sympathique d'avoir une option dans term pour afficher la liste des connexions realisees par la socket dans un fichier ou sur stderr, ou bien dans les deux. Cela permettrait de verifier si une connexion term a ete corrompue par des pirates situes du cote non securise de la machine. 1122.. TTrruuccss qquuii sseemmbblleenntt nnee ppaass ffoonnccttiioonnnneerr Quelques clients et serveurs telnet acceptent d'encoder leurs communications pour tromper la surveillance sur reseau. Malheureusement, la methode employee ci-dessus (en utilisant la connexion reseau que le client telnet a configure pendant que l'autre client est en attente) ne fonctionne pas dans ce cas. Au lieu de cela, il doit reellement traverser le client telnet, donc ne peut realiser l'encodage. Il semble qu'il faille modifier que le client, pour y a jouter une commande qui lance un processus avec leurs stdin et stdout connectes au telnet en cours. Cela serait egalement utile pour des processus de connexion automatiques, peut-etre quelqu'un l'a- t-il deja fait. 1133.. SSoouurrcceess J'ai legerement consulte la bibliotheque Term. Les details ainsi que les patches a SOCKS sont disponibles en les demandant a Steven Danz (danz@wv.mentorg.com). 1144.. RReemmeerrcciieemmeenntt Mes remerciements a +o Gary Flake (flake@scr.siemens.com) +o Bill Riemers (bcr@physics.purdue.edu) +o Greg Louis (glouis@dynamicro.on.ca) 1155.. CCooppiiee ssuupppplleemmeennttaaiirree ddeess aavveerrttiisssseemmeennttss --LLiisseezz--llee !! Je decline sur le present document toute responsabilite d'une quelconque application de ce qui a ete expose. Si cela echoue de n'importe quelle maniere, c'est votre probleme. Ce n'est pas ma faute. Si vous ne comprenez pas les risques qui decoulent de cette methode, ne l'utilisez pas. Si l'emploi de cette methode permet a des pirates vicieux de penetrer dans votre systeme informatique et que cela vous cote votre travail et a votre entreprise des millions de dollars, ce n'est que de votre faute. Ne venez pas pleurer. .