Outils pour utilisateurs

Outils du site


linux:ssh (lu 110156 fois)

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
linux:ssh [30-06-2014 11:49]
edmc73 [Créer un tunnel SSH]
linux:ssh [13-01-2023 08:50] (Version actuelle)
edmc73 [Clé DSA non supportée]
Ligne 4: Ligne 4:
 SSH est un protocol crypté et donc sécurisé.\\ SSH est un protocol crypté et donc sécurisé.\\
 Son utilisation est indispensable à l'administration d'un serveur linux. Son utilisation est indispensable à l'administration d'un serveur linux.
 +
 +===== Touches magiques =====
 +
 +Bloqué sur une connexion ssh avec un Ctrl+C ou Ctrl+D qui ne marche pas ?\\
 +Faite un ''~.'' (AltGr+é puis le point du pavé numérique), la connexion sera interrompu
 +
 +Besoin de rediriger un port après connexion ?\\
 +Faite un ''~C'' (AltGr+é puis maj+c), un shell ssh apparait, tapez **help** pour plus d'info
 +
 +  * ''~^Z'' Fait passer ssh en arrière-plan.
 +  * ''~#'' Liste les connexions transférées.
 +  * ''~&'' Fait passer ssh en arrière-plan lors de la déconnexion, si des transferts de connexions ou des sessions X11 sont toujours en cours.
 +  * ''~?'' Affiche la liste des caractères d'échappement.
 +  * ''~B'' Émet un BREAK au système distant (uniquement pour la version 2 du protocole SSH, et si la machine d'en face le supporte).
 +  * ''~C'' Ouvre une ligne de commande. Utile pour ajouter des transferts de port (port forwarding) à l'aide des options -L et -R (cf ci-après). Cela permet également la fermeture de transfert de port en cours, en utilisant -KR hostport Une aide rudimentaire est disponible avec l'option -h
 +  * ''~R'' Demande un nouvel échange de clef pour la connexion (uniquement pour la version 2 du protocole SSH, et si la machine d'en face le supporte).
 +
  
 ===== Configuration ====== ===== Configuration ======
Ligne 10: Ligne 27:
 > Le man en français http://www.delafond.org/traducmanfr/man/man5/sshd_config.5.html > Le man en français http://www.delafond.org/traducmanfr/man/man5/sshd_config.5.html
  
 +
 +Pour éviter de perdre sa session lors d'une interruption réseau, on peut rajouter
 +
 +  ClientAliveCountMax 10
 +  ClientAliveInterval 60
 +  TCPKeepAlive yes
 +
 +ce qui permet de tester si le client est en vie toutes les 60 secondes jusqu'a 10 essaie (soit 600 secondes) avant de le déconnecter
 ==== Si la demande de Password est longue à s'afficher ==== ==== Si la demande de Password est longue à s'afficher ====
 Ajouter cette option dans le fichier de config. Ajouter cette option dans le fichier de config.
Ligne 92: Ligne 117:
 ===== Créer un tunnel SSH ===== ===== Créer un tunnel SSH =====
  
-==== Scenario: Vous voulez vous connecter à un serveur mysql sur le serveur externe **toto-externe.com** à partir de votre machine **toto.local**.====+==== Scenario: Vous voulez vous connecter au serveur mysql du serveur public **toto-public.com** à partir de votre machine **monpc.local**.====
  
-1. Sur **toto.local**:+1. Sur **monpc.local**:
  
-  ssh -L 3307:localhost:3306 username@toto-externe.com+  ssh -L 3307:localhost:3306 username@toto-public.com
  
-Un tunnel sera ouvert avec un nouveau port en écoute sur **toto.local:3307** qui sera redirigé sur le port **localhost:3306** de la machine **toto-externe.com**+Un tunnel sera ouvert avec un nouveau port en écoute sur **monpc.local:3307** qui sera redirigé sur le port **localhost:3306** de la machine **toto-public.com**
  
-2. Maintenant, sur **toto.local**, connectez-vous à mysql:+2. Maintenant, sur **monpc.local**, connectez-vous à mysql:
  
   mysql -u username -p -h 127.0.0.1 -P 3307 databasename   mysql -u username -p -h 127.0.0.1 -P 3307 databasename
  
-Le serveur mysql de **toto-externe.com** pensera que cette connexion vient de localhost de **toto-externe.com**+Le serveur mysql de **toto-public.com** pensera que cette connexion vient de localhost de **toto-public.com**
  
  
-==== Scenario: Vous voulez vous connecter à un serveur mysql **mysql-externe.com** accessible uniquement par le serveur externe **toto-externe.com** à partir de votre machine **toto.local**.====+==== Scenario: Vous voulez vous connecter à un serveur mysql **mysql.toto.local** accessible uniquement par le serveur externe **toto-public.com** à partir de votre machine **monpc.local**.====
  
-1. Sur **toto.local**:+1. Sur **monpc.local**:
  
-  ssh -L 3307:mysql-externe.com:3306 username@toto-externe.com+  ssh -L 3307:mysql.toto.local:3306 username@toto-public.com
  
-Un tunnel sera ouvert avec un nouveau port en écoute sur **toto.local:3307** qui sera redirigé sur le port **mysql-externe.com:3306** depuis la machine **toto-externe.com**+Un tunnel sera ouvert avec un nouveau port en écoute sur **monpc.local:3307** qui sera redirigé sur le port **mysql.toto.local:3306** depuis la machine **toto-public.com**
  
-2. Maintenant, sur **toto.local**, connectez-vous à mysql:+2. Maintenant, sur **monpc.local**, connectez-vous à mysql:
  
   mysql -u username -p -h 127.0.0.1 -P 3307 databasename   mysql -u username -p -h 127.0.0.1 -P 3307 databasename
  
-Le serveur mysql de **mysql-externe.com** pensera que cette connexion vient de **toto-externe.com**+Le serveur mysql de **mysql.toto.local** pensera que cette connexion vient de **toto-public.com**
  
  
-==== Scenario: Votre serveur mysql est maintenant sur **toto.local** et **toto-externe.com** à besoin de s'y connecter car la sienne est tombé en panne.====+==== Scenario: Votre serveur mysql est maintenant sur **monpc.local** et **toto-public.com** à besoin de s'y connecter car la sienne est tombé en panne.====
  
-1. Sur **toto.local**: +1. Sur **monpc.local**: 
-  ssh -R 3306:localhost:3306 username@toto-externe.com+  ssh -R 3306:localhost:3306 username@toto-public.com 
 + 
 +Un nouveau port sera ouvert sur **toto-public.com:3306** qui pointera sur **monpc.local:3306**. Un moyen simple de mettre à disposition une base mysql sur un serveur sans l'installer. 
 + 
 +Vous pouvez remplacer localhost par une machine accessible par **monpc.local** 
 + 
 + 
 +==== Créer un proxy socks 5 ==== 
 + 
 +Encore plus puissant, vous êtes dans un réseau d'entreprise et vous ne pouvez pas vous connecter à internet, par contre vous pouvez vous connecter en ssh sur une machine externe
 + 
 +Créer un proxy sur **monpc.local** qui passera par **toto-public.com** 
 + 
 +  ssh -D 3128 username@toto-public.com 
 + 
 +Maintenant vous pouvez configurer votre navigateur pour qu'il utilise le proxy **localhost:3128**, tout le flux de votre navigateur passera par **toto-public.com**
  
-Un nouveau port sera ouvert sur **toto-externe.com:3306** qui pointera sur **toto.local:3306**. Un moyen simple de mettre à disposition une base mysql sur un serveur sans l'installer. 
  
-Vous pouvez remplacer localhost par une machine accessible par **toto.local** 
  
 Encore plus d'explication => http://fr.openclassrooms.com/informatique/cours/mise-en-place-d-un-tunnel-tcp-ip-via-ssh Encore plus d'explication => http://fr.openclassrooms.com/informatique/cours/mise-en-place-d-un-tunnel-tcp-ip-via-ssh
 +
 +===== Reverse ssh =====
 +
 +Mon serveur **toto-public.com** voudrait se connecter à **monpc.local** or celui-ci est derrière un pare-feu ou un réseau local inaccessible mais il a quand même accès au web et donc à **toto-public.com**.
 +
 +
 +Sur **monpc.local**, lancez la commande suivante
 +  ssh -NR 2200:localhost:22 user@toto-public.com
 +
 +L'option ''-N'' spécifie qu'on se loggue que pour du forward, pas possible de taper des commandes
 +
 +L'option ''-R'' pour Remote: port_local_du_serveur_distant:ip_local_du_serveur_distant:port_local_du_serveur_local (le port 2200 est un exemple)
 +
 +Une fois connecté, allons sur notre serveur **toto-public.com** et lancez la commande suivante pour vous connecter à **monpc.local**
 +
 +  ssh -p 2200 user@localhost
 +
 ===== Partager un répertoire distant via SSH ===== ===== Partager un répertoire distant via SSH =====
 Avec **sshfs** on peut monter un répertoire distant dans un répertoire local via ssh donc hyper sécurisé. Avec **sshfs** on peut monter un répertoire distant dans un répertoire local via ssh donc hyper sécurisé.
Ligne 150: Ligne 205:
 source => http://www.generation-linux.fr/index.php?post/2009/04/14/Monter-un-repertoire-distant-avec-SSH2 source => http://www.generation-linux.fr/index.php?post/2009/04/14/Monter-un-repertoire-distant-avec-SSH2
  
-===== Chrooter les utilisateurs en SFTP / SSH =====+==== Performance ==== 
 + 
 +Un très bon article sur les performances sshfs / nfs => http://www.admin-magazine.com/HPC/Articles/Sharing-Data-with-SSHFS 
 + 
 +  sshfs -o Ciphers=arcfour,compression=no,nonempty,auto_cache,reconnect,workaround=all user@development.net:/usr/local/gitdev/ ~/dev/code 
 + 
 +===== Chrooter les utilisateurs en SFTP =====
  
 Voir -> http://formation-debian-testing.via.ecp.fr/ftp.html#id289286 Voir -> http://formation-debian-testing.via.ecp.fr/ftp.html#id289286
Ligne 174: Ligne 235:
 </code> </code>
  
-Pour chrooter toto, son répertoire home doit appartenir à root+Pour chrooter toto, son répertoire home doit appartenir à root et être en 755
 <code>cd /home <code>cd /home
 ls -l ls -l
Ligne 180: Ligne 241:
  
 chown root toto chown root toto
 +chmod 755 toto
 ls -l ls -l
 drwxr-xr-x  2 root    toto                4096 16 janv. 08:44 toto</code> drwxr-xr-x  2 root    toto                4096 16 janv. 08:44 toto</code>
  
 Modifier la config du serveur ssh : Modifier la config du serveur ssh :
 +  vi /etc/ssh/sshd_config
  
-Pour limiter au sftp+Pour limiter un utilisateur au sftp
 <code>Match User toto <code>Match User toto
         X11Forwarding no         X11Forwarding no
Ligne 192: Ligne 255:
         ChrootDirectory %h         ChrootDirectory %h
 </code> </code>
 +
 +Pour limiter un groupe d'utilisateur
 +<code>Match Group users
 +        X11Forwarding no
 +        AllowTcpForwarding no
 +        ForceCommand internal-sftp
 +        ChrootDirectory %h
 +</code>
 +
 +exemple d'utilisation de sftp
 +<code>
 +Download a single file from a remote ftp server to your machine:
 +
 +sftp {user}@{host}:{remoteFileName} {localFileName}
 +
 +Upload a single file from your machine to a remote ftp server:
 +
 +sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
 +</code>
 +===== Chrooter les utilisateurs en SSH =====
 +--- source: https://debian-facile.org/viewtopic.php?id=9607  https://linuxfr.org/forums/linux-debian-ubuntu/posts/cloisonner-utilisateur-ssh-debian-8-resolu
 +
 +Installation du paquet bash-static
 +
 +  #apt-get install bash-static
 +
 +Pour faciliter l'administration nous allons créer un groupe sshchroot
 +
 +  #addgroup sshchroot
 +
 +Création de l'utilisateur test
 +
 +  #adduser test
 +  #usermod -d / test
 +  #usermod -s /bin/bash-static
 +  #adduser test sshchroot
 +
 +Mettre l'utilisateur root propriétaire du home de test sinon la connexion ssh sera refusée
 +
 +  #chown root: /home/test
 +
 +Petit script qui vous activera des commandes supplémentaire pour le user test
 +
 +  #cd /home/test
 +  #vim create.sh
 +
 +<file bash create.sh>
 +#!/bin/bash
 +
 +mkdir -p {bin,dev,lib,lib64}
 +mknod dev/null c 1 3
 +mknod dev/zero c 1 5
 +chmod 0666 dev/{null,zero}
 +
 +TMPFILE1=./temp1
 +TMPFILE2=./temp2
 +#Definition des commandes que vous souhaitez activer
 +APPS="/bin/bash /bin/cp /bin/ls /bin/mkdir /bin/mv /bin/rm /bin/rmdir /usr/bin/id /usr/bin/rsync /usr/bin/scp /usr/bin/wget /usr/bin/vim /usr/bin/vi /bin/cat /bin/less /usr/bin/tail /usr/bin/clear /bin/chmod"
 +
 +for app in $APPS;  do
 +  if [ -x $app ]; then
 +    app_path=`dirname $app`
 +    if ! [ -d .$app_path ]; then
 +        mkdir -p .$app_path
 +    fi
 +    cp -p $app .$app
 +    ldd $app >> ${TMPFILE1}
 +  fi
 +done
 +
 +for libs in `cat ${TMPFILE1}`; do
 +    frst_char="`echo $libs | cut -c1`"
 +    if [ "$frst_char" = "/" ]; then
 +        echo "$libs" >> ${TMPFILE2}
 +    fi
 +done
 +
 +for lib in `cat ${TMPFILE2}`; do
 +      mkdir -p .`dirname $lib` > /dev/null 2>&1
 +      cp $lib .$lib
 +done
 +
 +cp -r /lib/terminfo ./lib/
 +
 +rm -f $TMPFILE1
 +rm -f $TMPFILE2
 +</file>
 +
 +Lancez le script dans /home/test
 +
 +  #./create.sh
 +
 +Editez le fichier de conf ssh pour enfin chrooter la connexion
 +
 +  #vim /etc/sshd_config 
 +<code>
 +Match Group test
 +        #%u permet de se placer automatiquement dans le home du user 
 +        ChrootDirectory /home/%u
 +        AllowTCPForwarding no
 +        X11Forwarding no
 +</code>
 +
 +Petit restart du service ssh
 +
 +  # service ssh reload
 +(on ne sait jamais)
 +  #service ssh restart
 +
 +Test avec le user test
 +
 +<code>
 +I have no name!@x.x.x.x:/$
 +I have no name!@x.x.x.x:/$ ls -l
 +total 28
 +drwxrwxr-x 2    0 1003 4096 Mar 15 15:35 bin
 +-rwxr-xr-x 1    0 1003  886 Mar 15 15:21 create.sh
 +drwxr-xr-x 2    0 1003 4096 Mar 15 15:23 dev
 +drwxr-xr-x 2 1001 1003 4096 Mar 15 15:48 lala
 +drwxr-xr-x 4    0 1003 4096 Mar 15 15:23 lib
 +drwxr-xr-x 2    0 1003 4096 Mar 15 15:23 lib64
 +drwxr-xr-x 4    0 1003 4096 Mar 15 15:23 usr
 +</code>
 +
 +Je ne peux pas editez dans home de test\\
 +C'est normal seul root doit être propriétaire. Les droits plus permissifs sont les suivants:
 +chmod 755 si vous donnez des trop permissifs le ssh chrooter ne fonctionnera pas. Dans ce cas créer un répertoire dont l'utilisateur a full access.
 +exemple:
 +
 +  #mkdir /home/test/test 
 +  #chown test:test /home/test/test
 +
 +===== autossh : créer une connexion persistante =====
 +
 +**autossh** permet de lancer une commande ssh puis de la relancer en cas d'échec.
 +
 +Installer **autossh**
 +  apt-get install autossh
 +
 +
 +Comme le dit le **man autossh** il est préférable d'utiliser les options **ServerAliveInternal** et **ServerAliveCountMax** plutôt que d'utiliser le echo port pour le monitoring, je vais donc écrire les commandes dans ce contexte.
 +
 +Exemple: J'ai besoin d'un accès à une base de données distante en local
 +
 +La commande ssh serait
 +  ssh -L 3307:localhost:3306 username@toto-public.com
 +
 +La commande autossh serait
 +  autossh -M 0 -q -f -N -oServerAliveInterval=60 -oServerAliveCountMax=3 -L 3307:localhost:3306 username@toto-public.com
 +
 +Pour que cette connexion se lance au démarrage de la machine, placer cette commande dans le fichier **/etc/rc.local**
 +
 +===== Gérer plusieurs clés =====
 +
 +Les clés se trouvent en général dans
 +  cd ~/.ssh/
 +
 +Il y a la clé privé **id_dsa** et la clé publique **id_dsa.pub**. Admettons que vous voulez accéder à un serveur configuré pour se connecter avec une clé spécifique que l'on vous a fourni. Par exemple **id_dsa_serveur** et **id_dsa_serveur.pub**
 +
 +Placez ces 2 fichiers dans votre répertoire **.ssh**
 +
 +La commande pour se connecter en ssh avec cette clé est
 +  ssh -i ~/.ssh/id_dsa_serveur user@serveur.com
 +
 +On peut aussi créer un fichier de config pour automatiser tout ça soit dans son répertoire personnel, soit au niveau de la config du serveur ssh
 +  vi ~/.ssh/config
 +  vi /etc/ssh/ssh_config
 +
 +On peut ensuite écrire ceci
 +  Host serveur.com
 +    IdentityFile ~/.ssh/id_dsa_serveur
 +
 +Il existe une multitude de paramètre dans ce fichier de config disponible ici => http://www.gsp.com/cgi-bin/man.cgi?section=5&topic=ssh_config
 +===== Clé DSA non supportée =====
 +
 +This is a result of upgrading to OpenSSH 7.0. As the release notes for OpenSSH 7.0 say, "Support for ssh-dss host and user keys is disabled by default at run-time".
 +
 +The solution is to add the following line to ~/.ssh/config on every client machine (every machine where you run the SSH client):
 +
 +  PubkeyAcceptedKeyTypes=+ssh-dss
 +
 +If the server is using OpenSSH 7.0 or newer, you'll also need to add this line to /etc/ssh/sshd_config on each server machine.
 +
 +Alternatively, you can generate an entirely new SSH key and add it to your authorized_keys file on every server you ever want to log into. I recommend you use RSA, to avoid compatibility woes. I don't recommend ECDSA, as apparently gnome-keyring-daemon doesn't automatically pick up SSH keys of type ECDSA.
 +
 +
 +----------
 +
 +Si on essaie de se connecter sur un vieux serveur, on obtient le message d'erreur
 +  Unable to negotiate with 192.168.0.1 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
 +
 +La solution est de rajouter une option dans votre ligne de commande
 +  ssh 192.168.0.1 -oHostKeyAlgorithms=+ssh-rsa
  
linux/ssh.1404121788.txt.gz · Dernière modification: 30-06-2014 11:49 de edmc73