====== SSH ====== ===== Définition ===== SSH est un protocol crypté et donc sécurisé.\\ 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 ====== /etc/ssh/sshd_config > 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 ==== Ajouter cette option dans le fichier de config. UseDNS no ===== Partage de clé public ===== Pour se connecter via ssh ou scp sans avoir à taper le mot de passe. Sur la machine client, tapez la commande ssh-keygen -t dsa Afin de générer un fichier **~/.ssh/id_dsa.pub** qui sera votre clé public. ==== 1ère méthode ==== Copier ce fichier sur le serveur ssh scp ~/.ssh/id_dsa.pub user1@serveur:/tmp/. Ensuite sur votre serveur, connectez vous en **user1** et ajoutez la clé public à votre fichier d'authorisation user1:$ cat /tmp/id_dsa.pub >> /home/user1/.ssh/authorized_keys Il y a parfois un 2 à authorized_keys ==== 2eme méthode ==== Utiliser la commande **ssh-copy-id** ssh-copy-id -i chemin/to/id_dsa.pub user@serveurDistant.com si le port ssh est différent (n'oubliez pas les guillemets) ssh-copy-id -i chemin/to/id_dsa.pub "user@serveurDistant.com -p 45632" Le mot de passe sera demandé puis un message disant que tout va bien user@serveurDistant.com's password: Now try logging into the machine, with "ssh 'user@serveurDistant.com -p 45632'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. Et voila !! ==== Vérification si ca ne marche pas ==== Vérifiez sur le serveur que votre fichier de config **/etc/ssh/sshd_config** comporte la ligne PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys Le cas échéant, redémarrez le serveur ssh /etc/init.d/ssh restart Et voila ;) Pour copier un fichier sans demande de mot de passe, utilisez l'option **-B** : scp -B fichier_a_copier user@serveur:/dossier/. ==== Dans le cas ou on a plusieurs serveurs avec une meme adresse ip mais des ports différents ==== Il arrive que derrière un routeur, on a plusieurs serveurs ssh accessible depuis des ports différents. Du coup le client ssh s'affole avec des warnings disant ATTENTION ce serveur à la même ip que l'autre mais son empreinte est différente !! Dans ce cas, créé un fichier dans le répertoire de l'utilisateur du client **/home/user/.ssh/config** et mettez une exception Host serveurSSH.com CheckHostIP no StrictHostKeyChecking no UserKnownHostsFile=/dev/null ==== Si vous un message d'erreur : SSH Authentication refused: bad ownership or modes for directory ==== Cela signifie que votre répertoire **.ssh** et votre fichier **authorized_keys** n'ont pas les bons droits. Vous devez les configurez comme ci-dessous chmod 700 /home/your_user/.ssh chmod 600 /home/your_user/.ssh/authorized_keys Sinon vous pouvez désactiver le mode strict de votre serveur ssh dans le fichier de config. StrictModes off ===== Créer un tunnel SSH ===== ==== Scenario: Vous voulez vous connecter au serveur mysql du serveur public **toto-public.com** à partir de votre machine **monpc.local**.==== 1. Sur **monpc.local**: ssh -L 3307:localhost:3306 username@toto-public.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 **monpc.local**, connectez-vous à mysql: mysql -u username -p -h 127.0.0.1 -P 3307 databasename 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.toto.local** accessible uniquement par le serveur externe **toto-public.com** à partir de votre machine **monpc.local**.==== 1. Sur **monpc.local**: ssh -L 3307:mysql.toto.local:3306 username@toto-public.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 **monpc.local**, connectez-vous à mysql: mysql -u username -p -h 127.0.0.1 -P 3307 databasename Le serveur mysql de **mysql.toto.local** pensera que cette connexion vient de **toto-public.com** ==== 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 **monpc.local**: 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** 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 ===== Avec **sshfs** on peut monter un répertoire distant dans un répertoire local via ssh donc hyper sécurisé. Pour ce faire, installé le paquet **sshfs** et assurez vous d'ajouter votre compte utilisateur dans le groupe **fuse** adduser toto fuse Ensuite, créer votre répertoire de montage, par exemple **/home/toto/monPCdistant** Lancez la commande suivante sshfs UserDistant@PCdistant:/repertoireAmonter /home/toto/monPCdistant/ et voila ;) source => http://www.generation-linux.fr/index.php?post/2009/04/14/Monter-un-repertoire-distant-avec-SSH2 ==== 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 Créer un utilisateur # adduser toto Ajout de l'utilisateur « toto » ... Ajout du nouveau groupe « toto » (1001) ... Ajout du nouvel utilisateur « toto » (1001) avec le groupe « toto » ... Création du répertoire personnel « /home/toto »... Copie des fichiers depuis « /etc/skel »... Entrez le nouveau mot de passe UNIX : Retapez le nouveau mot de passe UNIX : passwd : le mot de passe a été mis à jour avec succès Modification des informations relatives à l'utilisateur toto Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée Nom complet []: N° de bureau []: Téléphone professionnel []: Téléphone personnel []: Autre []: Cette information est-elle correcte ? [O/n] Pour chrooter toto, son répertoire home doit appartenir à root et être en 755 cd /home ls -l drwxr-xr-x 2 toto toto 4096 16 janv. 08:44 toto chown root toto chmod 755 toto ls -l drwxr-xr-x 2 root toto 4096 16 janv. 08:44 toto Modifier la config du serveur ssh : vi /etc/ssh/sshd_config Pour limiter un utilisateur au sftp Match User toto X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ChrootDirectory %h Pour limiter un groupe d'utilisateur Match Group users X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ChrootDirectory %h exemple d'utilisation de sftp 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}' ===== 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 #!/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 Lancez le script dans /home/test #./create.sh Editez le fichier de conf ssh pour enfin chrooter la connexion #vim /etc/sshd_config Match Group test #%u permet de se placer automatiquement dans le home du user ChrootDirectory /home/%u AllowTCPForwarding no X11Forwarding no Petit restart du service ssh # service ssh reload (on ne sait jamais) #service ssh restart Test avec le user test 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 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