Authentification SSH par clé publique

De Wiki de Romain RUDIGER
Aller à : navigation, rechercher

Manuellement

Ce manuel permet de mettre en place une authentification SSH par clé publique : PublickeyAuthentification.

Sur le serveur de supervision :

mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t dsa

Il faut maintenant copié la clé publique générée sur le serveur SSH destination (IP 10.1.1.17 dans cet exemple) :

scp -p ~/.ssh/id_dsa.pub nagios@10.1.1.17:

Sur le serveur SSH destination avec l'utilisateur nagios :

mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat id_dsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
mv id_dsa.pub ~/.ssh

Maintenant avec l'utilisateur root, il faut vérifier que ce type d'authentification est accepté par le serveur SSHd :

vi /etc/ssh/sshd_config
#Mettre : PubkeyAuthentication yes
/etc/init.d/sshd restart

Maintenant, il est possible de vérifier que cela fonctionne en faisant sur le serveur de supervision :

ssh nagios@10.1.1.17

Aucun mot de passe ne vous sera demandé ! Si cela ne fonctionne pas, vous pouvez lancer cette commande et observer les détails :

ssh nagios@10.1.1.17 -v -v -v

Script automatique

Il faut le lancer en tant que l'utilisateur et sur la machine qui sera authentifiée par clé.

#!/bin/bash
#
# This script can:
#  -add your public key on others servers
#
# 08/18/2009 - Romain RUDIGER
#

function usage {
   echo "usage : $0 server_list.txt"
   echo "   -server_list.txt file contain one server by line: IP or host name or DNS name."
   echo "   -If the public key already exist, this script will update it !"
   echo "   -This script use dsa key type."
   exit 1
}

if [[ $# -ne 1 ]]; then
   usage
fi
if [[ ! -r $1 ]]; then
   echo "The server list argument must be a file with read right !"
   usage
fi

###################################
# Get public key
###################################
if [[ ! -f ~/.ssh/id_dsa.pub ]]; then
   echo "Public key not exist, generating it..."
   ssh-keygen -N "" -t dsa -f ~/.ssh/id_dsa
fi
if [[ -f ~/.ssh/id_dsa.pub ]]; then
   PUB_KEY=`cat ~/.ssh/id_dsa.pub`
else
   echo "ERROR-Can't generate the public key !"
fi

###################################
# Global vars
###################################
ID=`echo $PUB_KEY | cut -d' ' -f 3`
SERVER_LIST=$1
declare -i NUMBER_OF_PROCESSED=0
declare -i NUMBER_OF_SUCCESS=0

###################################
# Main function
###################################
for SERVER in $( cat $SERVER_LIST | grep -Ev ^#.*$ ); do
   NUMBER_OF_PROCESSED=$NUMBER_OF_PROCESSED+1
   echo "INFO-$NUMBER_OF_PROCESSED-Processing $SERVER..."
   echo $SERVER | grep -qE "^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" > /dev/null
   if [[ $? -ne 0 ]]; then
      #try to resolv host name
      host $1 | grep -Eq "^.*has address ([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" > /dev/null
      SERVER_IP=`host $SERVER | grep -E "^.*has address ([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" | cut -d' ' -f 4`
      echo $SERVER_IP | grep -qE "^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" > /dev/null
      if [[ $? -ne 0 ]]; then
         echo "ERROR-$NUMBER_OF_PROCESSED-Can't resolv $SERVER."
         continue
      fi
   fi
   ssh $SERVER "mkdir -p ~/.ssh
         chmod go-w ~/.ssh
         touch ~/.ssh/authorized_keys
         chmod 600 ~/.ssh/authorized_keys
         echo \"INFO-$NUMBER_OF_PROCESSED-Check if a public key of $ID is in ~/.ssh/authorized_keys on $SERVER\"
         grep -qE \"$ID$\" ~/.ssh/authorized_keys
         if [[ \$? -eq 0 ]]; then
            echo \"INFO-$NUMBER_OF_PROCESSED-Public key for $ID already present, remove it.\"
            cat ~/.ssh/authorized_keys | grep -v $ID > ~/.ssh/authorized_keys
         else
            echo \"INFO-$NUMBER_OF_PROCESSED-No public key present for $ID.\"
         fi
         echo \"INFO-$NUMBER_OF_PROCESSED-Add public key of $ID in ~/.ssh/authorized_keys on $SERVER\"
         echo $PUB_KEY >> ~/.ssh/authorized_keys"
   echo "INFO-$NUMBER_OF_PROCESSED-$SERVER processed."
   NUMBER_OF_SUCCESS=$NUMBER_OF_SUCCESS+1
done
echo "INFO-Number of processed server(s): $NUMBER_OF_PROCESSED"
echo "INFO-Number of sucessful processed server(s): $NUMBER_OF_SUCCESS"