On se connecte sur le serveur avec le mot de passe fournit par mail :
ssh root@IP
On commence par changer le mot de passe root :
passwd
Création d’un utilisateur standard :
adduser bob && passwd bob
On se reconnecte en user standard :
ssh bob@IP
On installe le minimum vitale :
yum install bash-completion bash-completion-extras epel-release nc nmap
On présume qu’on a déjà un couple de clés publique/privée avec une passphrase.
Création du dossier .ssh de l’utilisateur :
cd ~ mkdir .ssh chmod 700 .ssh
On rentre la clé publique :
vi .ssh/authorized_keys chmod 600 .ssh/authorized_keys
On modifie un peu le fichier de conf SSH :
vi /etc/ssh/sshd_config * Port XXXX # On change le port SSH par défaut * PermitRootLogin no # On interdit les connexions en tant que root + AllowUsers bob # On spécifie les utilisateurs autorisés à se connecter * PasswordAuthentication no # On refuse les connexion par simple mot de passe
On ajoute notre port au firewall :
firewall-cmd --permanent --zone=public --add-port=XXXX/tcp && firewall-cmd --reload
On prend en compte les modifications :
systemctl reload sshd
On test la configuration sur une nouvelle session pour pas se couper la main :
ssh johan@IP + clé privé -p XXXX
-> OK
On vérifie que l’authentification simple n’est pas possible :
ssh johan@IP -p XXXX Permission denied (publickey).
-> NOK
A partir de la, les vilains devront vous voler votre clé privée et trouver la passphrase pour se connecter à votre serveur. S’ils y arrivent, ils devront ensuite réussir à passer root pour faire des dégâts. Autrement dit, bon courage !
ps : on me dit souvent que changer le port du service SSH ne change rien d’un point de vue sécurité. Peut-être qu’ils ont raison mais lorsque j’ai un SSH ouvert en 22 sur l’Internet, mon fail2ban me spam plutôt pas mal alors que sur un autre port, personne n’essaye de se connecter.
]]>
Pour ce faire, il suffit de configurer un hook de post-receive et de récupérer un script qui fait la synthèse (sous CentOS ils sont mis en place avec les paquets).
johan@slashroot:~$ cd git/depot23/hooks johan@slashroot:~/git/depot23/hooks$ ln -s /usr/share/git-core/contrib/hooks/post-receive-email post-receive johan@slashroot:~/git/depot23/hooks$ vim ../config [hooks] mailinglist = "johan@slashroot.fr" emailprefix = "[Slashroot][Git-Depot23] " envelopesender = "git@slashroot.fr"
A chaque git push, vous recevrez un email avec les modifications prises en compte :
Sujet : [Slashroot][Git-Depot23] depot23 branch master updated. 62eb916848c11a945dba230c3137a3d23856b6c8 Date : Thu, 1 Jun 2017 23:16:03 +0200 De : git Pour : Johan This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "depot23". The branch, master has been updated via 62eb916848c11a945dba230c3137a3d23856b6c8 (commit) from 73e282d51c43007bb4a51358a09eb14b97ef1bd1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 62eb916848c11a945dba230c3137a3d23856b6c8 Author: Johan Date: Thu Jun 1 11:15:42 2017 +0200 puppet-groups.conf : nouveau serveur de messagerie "mail3" ----------------------------------------------------------------------- Summary of changes: etc/puppet/puppet-groups.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- depot23]]>
Exemple pour archiver en local un dossier se trouvant sur un serveur distant :
bob@server1:~$ ssh bob@server2 tar czf - /srv/data/ > /srv/data_server2.tar.gz
Exemple pour archiver un dossier local sur un serveur distant :
bob@server1:~$ tar zcvf - /srv/data | ssh bob@server2 "cat > /srv/data_server1.tar.gz"
]]>
usage
exit 1
;;
esac
done
#
# Variables et verifications
#
# Verification des parametres choisis
if [[ $# -eq 0 || -z $serveur || -z $user || -z $auth || -z $bases || -z $folder ]] ; then
usage
exit 1
fi
# Verification du dossier de sauvegarde
if [ ! -d $folder ] ; then
echo "ERREUR - Le dossier cense accueillir les dumps est introuvable"
exit 1
fi
# Verification de l'authentification choisi
if [ $auth == "file" ] ; then
if [ ! -f ~/.my.cnf ] ; then
echo " ERREUR - Le fichier .my.cnf est introuvable"
# exit 1
else
if [ $(stat -c %a ~/.my.cnf) != 600 ] ; then
echo "Warning - Votre fichier ~/.my.cnf n'a pas les droits recommandes"
fi
fi
elif [ ! $auth == "password" ] ; then
usage
exit 1
fi
# Date du jour
date=`date +%m-%d-%Y`
host=`hostname`
res="\n"
#
# Au boulot
#
# Pour chaque base
for base in $(echo $bases | sed "s/,/ /g") ; do
dump="$folder/dump-$base-$date.sql"
if [[ $auth == "file" ]] ; then
mysqldump -u $user $base > $dump
else
mysqldump -u $user -p $base > $dump
fi
gzip $dump
if [ -n $dest ] ; then
echo "" | mutt -s "[Save-SQL] Dump base $base du $date" -a ""$dump".gz" -- $dest
fi
done
]]># Mise en place d’EPEL
yum -y install epel-release && yum clean all
# Installation des paquets de base
yum install -y vim net-tools bash-completion
# Installation du graphique
yum groupinstall -y « X Window System »
yum groupinstall -y « MATE Desktop »
# Graphique par defaut au boot
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
# De quoi travailler
yum install terminator guake -y
# Un prompt correct
echo « PS1=’\[\033[1;32m\]\u\033[0;36m@\033[1;33m\H:\[\033[0;37m\]\w\$\[\033[00m\] ‘ » >> ~/.bashrc
# Nom de la machine
hostnamectl set-hostname w-laptop
# Guake au demarrage
ln -s /usr/share/applications/guake.desktop /etc/xdg/autostart/
# Depot Nux pour VLC et autres
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
yum clean all && yum install -y vlc
# Base pour le NTP, envoyer des mails et lire les PDF
yum install -y chronyc mailx okular
# Desactivation de IPV6 et SELinux
echo « net.ipv6.conf.all.disable_ipv6 = 1 » >> /etc/sysctl.conf
echo « net.ipv6.conf.default.disable_ipv6 = 1 » >> /etc/sysctl.conf
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
sed -i ‘s/inet_protocols = all/inet_protocols = ipv4/g’ /etc/postfix/main.cf
# Generation d’une paire de cle SSH et envoi de la publique
ssh-keygen
cat ~/.ssh/id_rsa.pub | mail -s « Nouvelle Cle SSH » johan@slashroot.fr
# Conf git
git config –global user.email johan@slashroot.fr
git config –global user.name Johan
git config –global push.default simple
Exemple pour ne récuperer que le dossier /etc/openldap/slapd.d :
[johan@slashroot ~]$ tar xvf mon_archive.tar.gz --wildcards "etc/openldap/slapd.d*"
etc/openldap/slapd.d/
etc/openldap/slapd.d/cn=config.ldif
etc/openldap/slapd.d/cn=config/
etc/openldap/slapd.d/cn=config/cn=schema.ldif
etc/openldap/slapd.d/cn=config/cn=schema/
etc/openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif
etc/openldap/slapd.d/cn=config/cn=schema/cn={1}cosine.ldif
etc/openldap/slapd.d/cn=config/cn=schema/cn={2}inetorgperson.ldif
etc/openldap/slapd.d/cn=config/cn=schema/cn={3}nis.ldif
etc/openldap/slapd.d/cn=config/cn=schema/cn={4}ssh.ldif
etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif
etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
etc/openldap/slapd.d/cn=config/cn=module{0}.ldif
]]>" Prise en compte de la syntax du script syntax enable " Indentation automatique filetype indent plugin on set tabstop=4 " Numero de lignes " set number " Dark background set bg=dark " Retrouver les acolades perdues set showmatch " Desactive la casse lors des recherches set ignorecase " Permet les retour a la ligne avec backspace set backspace=eol,start,indent " Un peu de magie pour les expression regulieres set magic]]>
usage
exit 1
;;
esac
done
#
# Variables et verifications
#
# Verification des parametres choisis
if [[ $# -eq 0 || -z $serveur || -z $user || -z $auth ]] ; then
usage
exit 1
fi
# Verification de l'authentification choisi
if [ $auth == "file" ] ; then
if [ ! -f ~/.my.cnf ] ; then
echo " ERREUR - Le fichier .my.cnf est introuvable"
exit 1
else
if [ $(stat -c %a ~/.my.cnf) != 600 ] ; then
echo "Warning - Votre fichier ~/.my.cnf n'a pas les droits recommandes"
fi
fi
elif [ ! $auth == "password" ] ; then
usage
exit 1
fi
host=`hostname`
res="\n"
# Fichier de sortie temporaire
tmp="/tmp/mysql_db_sized.tmp"
#
# Au boulot
#
# On extrait dans un fichier toutes les bases du serveurs
if [ $auth == "file" ] ; then
mysql -h $serveur -u $user -B --exec="SELECT table_schema, round(sum(data_length+index_length)/1024/1024,4) AS 'Size (MB)' FROM information_schema.tables GROUP BY table_schema;" > $tmp
else
mysql -h $serveur -u $user -p -B --exec="SELECT table_schema, round(sum(data_length+index_length)/1024/1024,4) AS 'Size (MB)' FROM information_schema.tables GROUP BY table_schema;" > $tmp
fi
# On supprime la premières ligne du fichier comprenant les titres ainsi que la base schema
sed -i '1d' $tmp
sed -i '/information_schema/d' $tmp
# Pour chaque base
while read line ; do
# On recupere son nom et sa taille
nom=`echo $line | cut -f1 -d ' '`
taille=`echo $line | cut -f2 -d ' '`
# On l'ajoute au resultat si on veut toutes les bases ou si elle fait partie des bases choisies
if [ -z $bases ] && ( echo $bases | grep -wq $nom ) ; then
res+="$nom : $taille Mo\n"
elif [ -n $bases ] && ( echo $bases | grep -wq $nom ) ; then
res+="$nom : $taille Mo\n"
fi
done < $tmp
# On redige et on envoi l'email si demande
if [ ! -z $dest ] ; then
corps="Bonjour,\n\nVoici les informations concernant la taille de ma/mes base(s) de données :\n\n$res\n\nnCordialement,\n\n$host"
echo -e $corps | mail -s "Infos : Taille base MySQL" $dest
# Sinon on affiche le resultat dans le terminal
else
echo -e $res
fi
# On supprime le fichier de sortie temporaire
rm -f $tmp
]]>#!/bin/bash
#
# Kerberos_Replication
#
# Auteur : Johan
# Contact : johan@slashroot.fr
# Date : 04/07/16
# Version : 1.0
# Description : Ce script permet de repliquer une base de royaume kerberos vers un ou plusieurs serveurs slaves
# Commentaire : A mettre en crontab
print_usage ()
{
echo ""
echo "Utilisation : kerberos_replication ROYAUME SLAVE1 SLAVE2 ..."
echo ""
}
err=0
# Le script prend au moins deux parametres
if [[ $# -lt 2 ]] ; then
echo ""
echo "ERREUR - Il faut au moins renseigner deux parametres"
print_usage
exit 1
fi
# On recupere le royaume
REALM=${1^^}
realm=${1,,}
# On verifie qu'on dispose de la base
if [[ ! -d "/var/kerberos/krb5kdc/$realm" ]] ; then
echo ""
echo "ERREUR - Il semble que la base ne soit pas presente"
echo ""
exit 1
fi
# On dump la base pour la propager
/usr/sbin/kdb5_util -r "$REALM" dump "/var/kerberos/krb5kdc/$realm/slave_datatrans"
# Les parametres apres le premier doivent etre des serveurs fonctionnels
shift
for slave in $@ ; do
if ( sleep 1 | nc -w 1 -v $slave 754 &> /dev/null ) ; then
/usr/sbin/kprop -r $REALM -f "/var/kerberos/krb5kdc/$realm/slave_datatrans" $slave &> /dev/null
else
err=$((err+1))
fi
done
if [[ $err -eq 0 ]] ; then
exit 0
fi
# Affichage du resultat
if [[ $err -eq $# ]] ; then
echo ""
echo "ERREUR - La replication de n'est pas bien passee"
echo ""
exit 1
else
echo ""
echo "WARNING - Il y a $err replication(s) en erreur"
echo ""
exit 1
fi
]]>