From a4c81a00c9787a8250bdc19c69cf4718c3d371a6 Mon Sep 17 00:00:00 2001 From: Thomas Constans Date: Mon, 28 Sep 2020 11:17:58 +0200 Subject: [PATCH] tp ssh : initial commit --- 0eval.yml | 39 ++++++++++++ README.txt | 1 + functions.sh | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++ test.sh | 3 + tp_ssh.md | 47 +++++++++++++++ 5 files changed, 253 insertions(+) create mode 100644 0eval.yml create mode 100644 README.txt create mode 100644 functions.sh create mode 100644 test.sh create mode 100644 tp_ssh.md diff --git a/0eval.yml b/0eval.yml new file mode 100644 index 0000000..d5585f8 --- /dev/null +++ b/0eval.yml @@ -0,0 +1,39 @@ +--- +- hosts: b1 + user: root + gather_facts: false + vars_prompt: + - name: script + prompt: "script? " + private: false + - name: result_file + prompt: "result file ? " + private: false + + pre_tasks: + - name: insert header + lineinfile: + path: "{{ result_file }}" + line: "machine\tuser\tquestions.." + state: present + create: true + delegate_to: localhost + + tasks: + - name: copy script + copy: + src: "{{ script }}" + dest: /root + mode: 0700 + + - name: exec script + command: "/root/{{ script }}" + register: result + + post_tasks: + - name: get result + lineinfile: + path: "{{ result_file }}" + line: "{{ result.stdout }}" + create: true + delegate_to: localhost diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..6e9f55c --- /dev/null +++ b/README.txt @@ -0,0 +1 @@ +better run eval playbook with -f 1 to avoid result overwriting \ No newline at end of file diff --git a/functions.sh b/functions.sh new file mode 100644 index 0000000..151735f --- /dev/null +++ b/functions.sh @@ -0,0 +1,163 @@ +#! /bin/bash + +#ok if given program returns given code +# arg1: program to run +# arg2: expected return code (default 0) +function exitCodeOk { + program=$1 + code=${2:=0} + $program &> /dev/null + if [ $? -eq $code ] ; then echo -ne "1\t" ; else echo -ne "0\t" ; fi +} + +#Ok if file size > X +# arg1: file +# arg2: min size +function fileBiggerThan { + if [ ! -f $1 ] ; then echo -ne "0\t" ; return 0 ; fi + filesize=$(stat --format "%s" $1) + if [ $filesize -lt $2 ] ; then echo -ne "0\t" ; else echo -ne "1\t" ; fi +} + +#Ok if file exists +# arg1: file to check +function fileMustExist { +if [ -f ${1} ] ; then echo -ne "1\t" + else echo -ne "0\t" +fi +} + +#Ok if file DOESNOT exists +# arg1: file to check +function fileMustNOTExist { +if [ -f ${1} ] ; then echo -ne "0\t" + else echo -ne "1\t" +fi +} + +#Ok if dir exists +# arg1: dir to check +function dirMustExist { +if [ -d ${1} ] ; then echo -ne "1\t" + else echo -ne "0\t" +fi +} +# Ok if given dir DOESNOT exists +# arg1: dir +function dirMustNOTExist { +if [ -d ${1} ] ; then echo -ne "0\t" + else echo -ne "1\t" +fi +} + +# Ok if file contains at least one occurence of pattern +# arg1: file +# arg2: pattern +function fileMustContain { + file=$1 + shift + string=$@ + if [ ! -f $file ] ; then echo -ne "0\t" ; return 0 ;fi + if ( grep -i -qE "${string}" $file ) ; + then echo -ne "1\t" + else + echo -ne "0\t" + fi +} + +# Return num of occurences of pattern +# arg1: file +# arg2: pattern +function fileCountPattern { + file=$1 + shift + string=$@ + if [ ! -f $file ] ; then echo -ne "0\t" ; return 0 ;fi + num=$(grep -ciE "${string}" $file ) + echo -ne "$num\t" +} + +# Ok if file contains N pattern +# arg1: file +# arg2: num of expected item +# arg3: pattern +function fileMustContainNItem { + file=$1 + n=$2 + shift + string=$@ + if [ ! -f $file ] ; then echo -ne "0\t" ; return 0 ;fi + num=$(grep -ciE "${string}" $file ) + if [ $num -eq $1 ] ; + then echo -ne "1\t" + else + echo -ne "0\t" + fi +} + +# Ok if file DOESNOT contain pattern +# Arg1: file +# ArgN: pattern +function fileMustNOTContain { + file=$1 + shift + string=$@ + if [ ! -f $file ] ; then echo -ne "0\t" ; return 0 ; fi + if ( grep -i -qE "${string}" $file ) ; + then echo -ne "0\t" + else + echo -ne "1\t" + fi +} + +# insert hostname at beginning of result line +function addHeader { + test -f /etc/motd && user="$(cat /etc/motd | sed 's/\n//')\t" + echo -ne "${user}$(hostname -s)\t" +} + +# Ok if given package is installed +# arg1: pkg to check +function pkgInstalled { + pkglist=/tmp/pkg.list + test -f $pkglist || rpm -qa > $pkglist + if ( grep -qi $1 $pkglist ) ; then echo -ne "1\t" ; else echo -ne "0\t" ; fi +} + +# ok if given process is running +# arg1: process to check +function processIsRunning { + if ( pgrep -f $1 &> /dev/null ) ; then echo -ne "1\t" ; else echo -ne "0\t" ; fi +} + +#Ok if given command returns 0 +# arg1: command to be run +function commandIsWorking { + command=$1 + if ( $command &> /dev/null ) ; then echo -ne "1\t" ; else echo -ne "0\t" ; fi +} + +# ok if given pattern is detected on command's stdout or stderr +# arg1: command +# arg2: pattern +function commandStdoutPattern { + command=$1 + shift + pattern=$@ + if ( $command 2>&1 | grep -qiE "${pattern}" ) ; then echo -ne "1\t" ; else echo -ne "0\t" ; fi +} + +# ok if given service is enabled +# arg1: service +function serviceIsEnabled { + service=$1 + if ( systemctl is-enabled $1 &> /dev/null ) ; then echo -ne "1\t" ; else echo -ne "0\t" ; fi +} + +# ok if given service is active +# arg1: service +function serviceIsActive { + service=$1 + if ( systemctl is-active $1 &> /dev/null ) ; then echo -ne "1\t" ; else echo -ne "0\t" ; fi +} + diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..2e75b2d --- /dev/null +++ b/test.sh @@ -0,0 +1,3 @@ +. functions.sh + +exitCodeOk "$1" 0 \ No newline at end of file diff --git a/tp_ssh.md b/tp_ssh.md new file mode 100644 index 0000000..e504bfe --- /dev/null +++ b/tp_ssh.md @@ -0,0 +1,47 @@ +# TP SSH + +## Objectif + +Renforcer la sécurité des accès + +## Prérequis: + +Le compte epsi doit avoir été créé (tp prise en main) et disposer d'un mot de passe + + +## Authentification par clé + +On va faire en sorte que la connexion ssh en tant qu'utilisateur epsi +se fasse par clé publique et non pas par mot de passe. + +_sur votre machine_: utiliser la commande ssh-keygen (ou le programme puttygen) si votre windows n'est pas équipé d'un client ssh natif pour générer une paire de clé publique / clé privée. + +_sur le container_: il faut rajouter la clé publique (le contenu du fichier id_rsa.pub se trouvant sur *votre* machine) dans le fichier *~epsi/.ssh/authorized_keys* + (vous pouvez utiliser la commande scp pour copier la clé) + +Il sera peut-être nécessaire de créer le répertoire ~epsi/.ssh + +Attention au permissions: ce répertoire doit appartenir à epsi et avoir les permissions 700 le fichier authorized_keys doit appartenir à epsi et avoir les permissions 600 + +### Validation: + +Garder votre connexion ssh active. + +Ouvrez une nouvelle connexion ssh: on doit vous demander la passphrase protégeant votre clé privée, si vous en avez définie une. + +Si on vous demande un mot de passe de connexion vous avez raté une étape. + + +## Renforcer la sécurité de ssh + +Une fois que l'authentification par clé fonctionne, modifiez la configuration du serveur ssh ( fichier /etc/ssh/sshd_config, page de man sshd_config) pour: + + * interdir les connexions en root + * n'autoriser que les membres du groupe wheel à se connecter + * interdir l'authentification par mot de passe + +### Validation: + +Vous devez toujours pouvoir vous connecter en tant qu'utilisateur epsi + +La connexion en root doit être refusée \ No newline at end of file