
|
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the host key has just been changed. Please contact your system administrator. |
Ce message signifie que la clef ssh (l'identification) de la machine distante a changé. En effet, à chaque fois que vous vous connectez à une machine par ssh, celle-ci présente à votre machine une sorte de carte d'identité, ainsi vous êtes sûr qu'il s'agit bien de la bonne machine et pas d'un pirate. Ou bien la machine a réellement changé de clef ssh (à l'ENS, cela arrive de temps à autres quand le SPI upgrade une machine), ou bien c'est une attaque de pirate. Il vaut mieux écrire au SPI pour savoir ce qu'il en est.
Il y a d'autres commandes associées à ssh qui vous permettent, de manière tout aussi sûre, de transférer des fichiers d'une machine à une autre. En l'espèce, scp (Secure Copy) a un fonctionnement aussi simple que celui de ssh.
Les explications qui suivent sous pour les sytèmes UNIX. Pour savoir comment faire sous Windows, reportez-vous au tutorial des WinTuteurs sur WinSCP.
Pour envoyer des fichiers de votre machine locale à la machine distante, faites :
machineloc ~ $ scp
Attention, n'oubliez pas les deux points à la fin. Vous devrez taper votre mot de passe (sauf si vous utilisez l'authentification par clef publique, voir ci-dessus), puis ssh se lancera dans le transfert en vous indiquant sa progression :
machineloc ~ $ scp tagada.txt machinedist:
toto@machinedist's password:
tagada.txt 100% |***************************************| 2263 00:00
Pour énumérer les fichiers à copier, mettez-les simplement à la suite, séparés par une espace, sans virgule.
Pour transférer un répertoire entier, il faut utiliser l'option -r (comme recursive), sinon ssh vous dira «
machineloc ~ $ scp -r
Dans ces premiers examples, le(s) fichier(s) sera ou seront copié(s), avec le même nom sur la machine distante, à la racine de votre compte. Nous allons compliquer progressivement les choses. Maintenant, vous voulez changer le nom du fichier en cours de route, renommer tagada.txt en coincoin.txt :
machineloc ~ $ scp tagada.txt machinedist:coincoin.txt
Maintenant, nous allons envoyer notre fichier tagada.txt à un endroit précis sur le compte distant, dans le répertoire $HOME/divers/blagues :
machineloc ~ $ scp tagada.txt machinedist:divers/blagues
Pour rapatrier des fichiers de la machine distante à votre machine locale, la même syntaxe est utilisée, mais inversée :
machineloc ~ $ scp machinedist:tagada.txt .
Le . (point) à la fin signifie que scp devra mettre le fichier ici, dans le répertoire dans lequel vous vous trouvez actuellement. Évidemment, vous pouvez lui indiquer un autre répertoire :
machineloc ~ $ scp machinedist:tagada.txt divers
Et ainsi de suite, vous pouvez appliquez les mêmes techniques que pour le transfert machine locale -> machine distante, décrites ci-dessus.
Si ssh s'exécute sur une machine distante à laquelle vous devez accéder, vous pouvez réduire énormément la quantité de saisie nécessaire grâce à Konqueror. Pour accéder à un hôte distant de cette manière, utilisez sftp:// dans la barre d'URL de Konqueror. Ajoutez ensuite votre nom d'utilisateur suivi du caractère « @ » et du nom de l'hôte. Voici un exemple :
sftp://willy@10.197.99.55/home/willy
....me permet d'accéder à un ordinateur en local sur mon réseau domestique, tandis que :
sftp://willy@www.linuxgazette.com/
....me permet d'accéder au site de la Gazette Linux.
Après avoir appuyé sur la touche Entrée, vous obtenez une boite de dialogue qui vous demande un nom d'utilisateur et un mot de passe. Comme votre nom d'utilisateur devrait être déjà renseigné, il vous suffit de saisir votre mot de passe pour voir apparaître le contenu de votre répertoire par défaut dans la fenêtre du navigateur.
sftp: n'a rien à voir avec le protocole ftp: : il utilise réellement ssh pour tout ce qui concerne la gestion des répertoires et des fichiers.
Suivant vos permissions sur l'hôte distant, vous pouvez lire, écrire, supprimer et copier des fichiers de cette manière. Cette méthode fonctionne aussi en conjonction avec d'autres fonctionnalités de Konqueror qui ont été abordées dans la Gazette Linux ; par exemple, vous devriez être en mesure de générer des miniatures et des pages web, comme l'explique Hal Stanton dans son article Créer une galerie d'images avec Konqueror, pour autant que vous utilisiez Konqueror comme gestionnaire de fichiers.
Notez que vous pouvez vous servir de la fonction du clic droit de Konqueror telle que Ouvrir avec, ou Enregistrer sous..., mais que si vous ouvrez un document avec un traitement de texte et l'éditez, vous ne pourrez pas l'enregistrer à nouveau dans l'hôte distant depuis le traitement de texte. Dans ce cas, enregistez une copie locale et copiez-la. Néanmoins, vous pouvez faire la copie dans une autre fenêtre ou onglet de Konqueror. En outre, si la connexion ssh expire, une invite pour saisir à nouveau votre mot de passe apparaît lorsque vous effectuez une opération sur les fichiers.
Si cela ne fonctionne pas, voici une liste pour vous dépanner :
1. Veillez à démarrer ssh sur l'hôte auquel vous souhaitez accéder.
2. Vérifiez que vous avez un nom d'utilisateur et un mot de passe valides sur ce système.
3. Vérifiez que le port 22 (le port ssh) est bien ouvert sur tous les pare-feu à traverser pour atteindre l'hôte distant.
4. Notez que sftp: n'étant pas un protocole habituellement enregistré, il est très probable qu'il n'opère pas sur d'autres navigateurs.
Une grande partie de la puissance du shell réside dans l’utilisation des tubes, permettant de relier la sortie d’une commande à l’entrée d’une autre. Le fait de passer par SSH ne rompt pas cette chaîne, et il est ainsi possible de brancher la sortie de commandes locales sur des commandes distantes, et vice-versa. Tout d’abord, il est possible d’utiliser SSH pour exécuter une simple commande sur la machine distante et récupérer sa sortie. Il suffit de passer la commande à exécuter après le nom d’hôte (de préférence entre guillemets pour la protéger) :
moi@machine1$ ssh lui@machine2 «ls»
Password:
Desktop bin monfichier.txt
moi@machine1$
Notez que la connexion est coupée dès que la commande distante est exécutée. Voyons maintenant comment nous pouvons tirer partie de cette forme d’appel à SSH. Un problème récurrent pour bon nombre d’entre nous consiste à faire des sauvegardes de ses données les plus importantes. Par sécurité, il est pertinent de stocker ces données sauvegardées sur une autre machine. En combinant bash et SSH, nous allons rendre cette opération possible en une seule ligne de commande qui pourra facilement être définie comme tâche périodique à l’aide de cron.
Lorsque l’on demande à SSH d’exécuter une simple commande distante, cette commande peut être branchée avec une commande locale. SSH redirige en effet son entrée standard vers l’entrée standard de la commande distante, et la sortie standard de la commande distante vers la sienne.
Voici la ligne permettant de faire une sauvegarde du répertoire Documents sur machine2 :
$ tar czf - Documents |ssh machine2 «cat >sauvegarde.tar.gz»
Le paramètre - donné à tar lui demande de sortir le flux compressé sur la sortie standard. Ce flux est récupéré par SSH qui le transfère sur machine2 et l’utilise comme entrée standard de cat. Tel qu’il est appelé, cat ne fait que copier son entrée standard vers le fichier sauvegarde.tar.gz. Ainsi, nous avons réalisé une sauvegarde distante et compressée en une seule ligne.
On peut également, si la bande passante n’est pas une ressource critique, réaliser la compression côté serveur :
$ tar cf - Documents |ssh machine2 «gzip -c >sauvegarde.tar.gz»
La restauration de cette sauvegarde pourra se faire de la manière suivante :
$ ssh machine2 «cat sauvegarde.tar.gz» |tar xzf
On peut donc faire passer les sorties standards de commandes à travers une connexion SSH. Ce serait dommage de s’arrêter là – on peut en effet y faire passer bien d’autres choses !
Pour ce scénario, nous allons compléter notre schéma réseau : machine1 et machine2 ne sont pas dans le même réseau local, mais appartiennent à deux réseaux différents connectés par internet. machine2 est derrière un pare-feu qui filtre tous les ports à l’exception du port 22 (le port utilisé par SSH). Derrière machine2 se trouve arthur, qui est un serveur POP3 (email). À partir de machine1, nous voudrions bien récupérer nos mails qui se trouvent sur arthur. Il y a plusieurs problèmes ici. Premièrement, arthur n’est pas directement accessible depuis machine1. Seul machine2 a une adresse internet publique, arthur n’étant pas visible de l’extérieur du réseau. Deuxièmement, le pare-feu filtre tous les ports à l’exception du port 22. Or, le serveur POP3 écoute sur le port 110... SSH va nous permettre de nous affranchir de ces contraintes.
L’option -L de SSH permet de créer un tunnel. Sous ce nom se cache le fait d’employer un port de la machine locale pour transporter des données à travers la connexion SSH et les rediriger où l’on veut à partir de la machine distante. Le tunnel est également utilisable en sens inverse. Cette option est très puissante. Dans notre cas, nous voulons nous servir de machine2 comme intermédiaire pour nous connecter à arthur, comme le montre la figure 2. Nous allons ouvrir notre tunnel avec la commande suivante:
$ ssh -L 2500:arthur:110 machine2
Nous demandons à SSH de nous connecter à machine2. Jusque-là tout est normal. Mais en plus, l’option -L demande à rediriger le port local 2500 vers le port 110 de l’hôte arthur. Celui-ci est spécifié du point de vue de machine2 – rappelons qu’arthur n’est même pas visible pour machine1. Le tunnel se fermera avec la session ssh. Du côté du client mail, il suffira de d’indiquer localhost comme serveur de mail, avec le port 2500. Et voilà ! Tant que la connexion SSH restera ouverte, le fait de nous connecter sur le port 2500 de machine1 équivaudra à se connecter sur le port 110 de arthur, et nous pourrons récupérer nos mails à partir de ce dernier, qui transiteront cryptés dans le tunnel SSH.
Par défaut, SSH écoute sur le port 22. Les attaquants ont coutume d'utiliser des scanners pour savoir quelles machines utilisent SSH. Si le port SSH est modifié en un numéro supèrieur à 1024, la plupart des scanners (dont nmap) seront leurés.
Ouvrez le fichier /etc/ssh/sshd_config et changez la ligne
Port 22
Avec le nombre de votre choix et redémarrez le service SSH
service sshd restart
IL existe deux versions de SSH. La version 2 seulement est plus sûre; la version 1 est sujette à des problémes de sécurité incluant les attaques man-in-the-middle et d'insertion. Editez le fichier /etc/ssh/sshd_config et à la ligne
Protocol 2,1
Changez la ligne pour n'avoir que le protocole 2.
|
Il s'agit du fichier sshd_config, et voici expliquées les différentes directives :
Port 22 Port d'écoute du serveur, il est préférable de changer ce port pour des raisons de sécurité et de relancer ensuite le serveur Protocol 2 C'est le protocole utilisé par SSH2, plus sécurisé que SSH1 hostkey /etc/ssh/ssh_host_rsa_key, permet de préciser les fichiers contenant les clés RSA de la machine UsePrivilegeSeparation yes ; Permet de sécuriser le focntionnement du serveur, Lorsqu'une connexion arrive, elle sera traitée par une copie du serveur en mémoire, qui ne posséde aucun privilége KeyRegenerationInterval 3600: Elle est spécifique à SSH1 ServerKeyBits 766 OPtion inutile pour SSH2, Détermine la taille de la clé de session SSH1 SyslogFacility AUTH Définit le type de message à mettre dans les journaux système LoginGraceTime 120 Détermine le nombre de secondes après lequel un utilisateur sera déconnecté s'il n'arrive pas à s'authentifier PermitRootLogin yes Autorise root à se connecter, à déconseiller, se connecter plutôt en utilisant en compte normal, puis utiliser sudo StrictNodes yes Renforce la sécurité en demandant la vérification des permissions sur les fichiers utilisés par OPENSSH RSAAuthentification yes Encore une option pour SSH1, Permet de spécifier que l'authentification par clé RSA est permise PubKeyAuthentification yes Même chose mais pour SSH2 IgnoreRhost yes Ignore les fichiers .rhosts et .shosts RhostsRSAAuthentification no Option pour SSH1, qui permet de faire une authentification basée sur les hôtes HostbaseAuthentification no Equivalente à la directive précédente pour SSH2 PermitEmptyPasswords no Interdit l'utilisation de mots de passe vides dans le cas d'une authentification par mot de passe X11Forwarding yes Le forwarding X11 permet de faire transiter les données d'une application graphique X au travers de SSH Ainsi, si vous utilisez l'option -X de la commande SSH, (ssh -X utilisateur@machine), la fenêtre apparaitra sur votre écran X11DisplayOffset 10 Spécifie le premier système d'affichage utilisable par Openssh PrintNotd no Permet de spécifier que le contenu du fichier motd ne doit pas être affiché PrintLastLog yes Permet d'afficher avec la connexion, la date, l'heure et et la source de la précédente connexion TCPkeepAlive yes Permet de conserver les connexions vivantes, en envoyant règulièrement des données pour tester l'état AcceptEnv LANG LC_* Permet de préciser quelles variables d'environnement peuvent être copiées du client vers le serveur UsePam yes Permet d'utiliser le système centralisé d'authentification Subsystem sftp /usr/lib/openssh/sftp-server Cette option permet de mettre en place un serveur sFTP |