Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c21c1589de | |||
| 76e333eab8 | |||
| 4beaf6d108 | |||
| 559c1d7ea8 | |||
| 8815709fea | |||
| 4c64360318 | |||
| a74c3d2d29 |
39
0eval.yml
39
0eval.yml
@@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
- 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
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
## Sur votre windows dans un terminal
|
|
||||||
ssh-keygen
|
|
||||||
scp -P #machine .ssh\.id_rsa.pub epsi@cours.opendoor.fr:
|
|
||||||
|
|
||||||
## Sur le container connecté en tant qu'utilisateur epsi
|
|
||||||
|
|
||||||
mkdir -pm 0700 ~/.ssh
|
|
||||||
cat id_rsa.pub >> .ssh/authorized_keys
|
|
||||||
chmod 600 .ssh/authorized_keys
|
|
||||||
|
|
||||||
sudo vim /etc/ssh/sshd_config
|
|
||||||
|
|
||||||
...
|
|
||||||
PermitRootLogin without-password
|
|
||||||
...
|
|
||||||
AllowGroups wheel root
|
|
||||||
AllowUsers root@100.0.0.1
|
|
||||||
PasswordAuthentication no
|
|
||||||
|
|
||||||
sudo systemctl restart sshd
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
better run eval playbook with -f 1 to avoid result overwriting
|
|
||||||
@@ -4,23 +4,27 @@
|
|||||||
|
|
||||||
Renforcer la sécurité des accès
|
Renforcer la sécurité des accès
|
||||||
|
|
||||||
## Prérequis:
|
## Compte utilisateur dédié aux opération d'administration
|
||||||
|
|
||||||
Le compte epsi doit avoir été créé (tp prise en main) et disposer d'un mot de passe
|
Créer un compte utilisateur standard
|
||||||
|
- login: sub3
|
||||||
|
- répertoire personnel (doit exister) /home/sub3
|
||||||
|
- mot de passe: de votre choix ( -1 point à chaque demande de réinitialisation)
|
||||||
|
- membre du groupe _sudo_
|
||||||
|
|
||||||
|
|
||||||
## Authentification par clé
|
## Authentification par clé
|
||||||
|
|
||||||
On va faire en sorte que la connexion ssh en tant qu'utilisateur epsi
|
On va faire en sorte que la connexion ssh en tant qu'utilisateur sub3
|
||||||
se fasse par clé publique et non pas par mot de passe.
|
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 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*
|
_sur le container_: il faut rajouter la clé publique (le contenu du fichier id_rsa.pub se trouvant sur *votre* machine) dans le fichier *~sub3/.ssh/authorized_keys*
|
||||||
|
|
||||||
Il sera peut-être nécessaire de créer le répertoire ~epsi/.ssh
|
Il sera peut-être nécessaire de créer le répertoire ~sub3/.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
|
Attention au permissions: ce répertoire doit appartenir à sub3 et avoir les permissions 700 le fichier authorized_keys doit appartenir à sub3 et avoir les permissions 600
|
||||||
|
|
||||||
### Validation:
|
### Validation:
|
||||||
|
|
||||||
@@ -36,11 +40,22 @@ Si on vous demande un mot de passe de connexion vous avez raté une étape.
|
|||||||
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:
|
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:
|
||||||
|
|
||||||
* Directive PermitRootLogin: n'autoriser que les connexions en root sans mot de passe.
|
* Directive PermitRootLogin: n'autoriser que les connexions en root sans mot de passe.
|
||||||
* Directives AllowGroups et AllowUser: n'autoriser que les membres des groupes et root wheel à se connecter ET l'utilisateur root depuis l'adresse 100.0.0.1
|
* Directives AllowGroups : n'autoriser que les membres des groupes root et sudo à se connecter
|
||||||
* Directives PasswordAuthentication: interdir l'authentification par mot de passe
|
* Directives PasswordAuthentication: interdir l'authentification par mot de passe
|
||||||
|
|
||||||
### Validation:
|
### Validation:
|
||||||
|
|
||||||
Vous devez toujours pouvoir vous connecter en tant qu'utilisateur epsi
|
Vous devez toujours pouvoir vous connecter en tant qu'utilisateur sub3
|
||||||
|
|
||||||
La connexion en root doit être refusée
|
La connexion en root doit être refusée
|
||||||
|
|
||||||
|
## Finalisation
|
||||||
|
|
||||||
|
Mettez au point au format md dans ~/sub3/ssh.md la procédure décrivant :
|
||||||
|
* la création d'une paire de clés
|
||||||
|
* les conséquences d'avoir une clé privée non protégée par une passphrase
|
||||||
|
* les étapes à réaliser pour que l'utilisateur puisse se connecter avec cette paire de clés sur une machine distante.
|
||||||
|
|
||||||
|
La procédure distinguera clairement sur quelle machine (client ou distante) chaque opération doit être faite.
|
||||||
|
|
||||||
|
Elle précisera les points de vigilance à avoir pour éviter toute erreur (et les pistes pour diagnostiquer et corriger ces erreurs)
|
||||||
12
eval.sh
12
eval.sh
@@ -1,12 +0,0 @@
|
|||||||
#! /bin/bash
|
|
||||||
# this script is meant to be run by ansible
|
|
||||||
|
|
||||||
source functions.sh
|
|
||||||
# check that alias has been tried
|
|
||||||
addHeader
|
|
||||||
fileMustContain ~epsi/.ssh/authorized_keys 'ssh-rsa'
|
|
||||||
fileMustContain ~epsi/.ssh/authorized_keys 'tom@workine'
|
|
||||||
fileMustContain /etc/ssh/sshd_config ' Allow(Groups|Users)'
|
|
||||||
fileMustContain /etc/ssh/sshd_config "^PermitRootLogin no"
|
|
||||||
fileMustContain /etc/ssh/sshd_config "^PasswordAuthentication no"
|
|
||||||
|
|
||||||
36
eval.yml
36
eval.yml
@@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
- hosts:
|
|
||||||
- b2
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
result_file: "tp_ssh.csv"
|
|
||||||
|
|
||||||
pre_tasks:
|
|
||||||
- name: insert header
|
|
||||||
lineinfile:
|
|
||||||
path: "{{ result_file }}"
|
|
||||||
line: "machine\tuser\tauth keys etu\tauth key tom\tallow groups/user\tpermit root login\tpassword auth"
|
|
||||||
state: present
|
|
||||||
create: true
|
|
||||||
delegate_to: localhost
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: copy script
|
|
||||||
copy:
|
|
||||||
src: "{{ item }}"
|
|
||||||
dest: /root
|
|
||||||
mode: 0700
|
|
||||||
loop:
|
|
||||||
- functions.sh
|
|
||||||
- eval.sh
|
|
||||||
|
|
||||||
- name: exec script
|
|
||||||
command: /root/eval.sh
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- name: get result
|
|
||||||
lineinfile:
|
|
||||||
path: "{{ result_file }}"
|
|
||||||
line: "{{ result.stdout }}"
|
|
||||||
create: true
|
|
||||||
delegate_to: localhost
|
|
||||||
163
functions.sh
163
functions.sh
@@ -1,163 +0,0 @@
|
|||||||
#! /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
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user