Table des matières

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

Configuration

/etc/ssh/sshd_config

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
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