Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/plugins/portfolio-slideshow/portfolio-slideshow.php:65) in /var/www/html/wp-includes/feed-rss2.php on line 8
Linux – Les mémos d'un admin système https://blog-sysadmin.archives.slashroot.fr Sat, 29 Jul 2017 07:31:37 +0000 fr-FR hourly 1 https://wordpress.org/?v=4.8.23 [CentOS] Prise en main d’un serveur dédié https://blog-sysadmin.archives.slashroot.fr/?p=1440 https://blog-sysadmin.archives.slashroot.fr/?p=1440#respond Fri, 28 Jul 2017 07:25:28 +0000 http://blog.slashroot.fr/?p=1440 Vous venez d’installer un super CentOS 7 (minimal bien sur) sur votre tout nouveau serveur dédié, et maintenant, que faire ?

1ère étape : La base

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

2ème étape : Sécurisation de SSH

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.

 

]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1440 0
[Git] Recevoir un email récapitulatif des modifications à chaque push https://blog-sysadmin.archives.slashroot.fr/?p=1422 https://blog-sysadmin.archives.slashroot.fr/?p=1422#respond Wed, 26 Jul 2017 12:31:15 +0000 http://blog.slashroot.fr/?p=1422 Si comme moi vous faites des choses bizarres avec git (dont des synchros automatiques la nuit), vous trouverez peut-être utile de recevoir un email à chaque git push avec toutes les modifications apportées.

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
]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1422 0
[Linux] tar over ssh https://blog-sysadmin.archives.slashroot.fr/?p=1463 https://blog-sysadmin.archives.slashroot.fr/?p=1463#respond Tue, 25 Jul 2017 08:45:06 +0000 http://blog.slashroot.fr/?p=1463 Dans certains cas spécifiques, notamment lors de migration de données entre différents réseaux, le transfert de dossiers distants/locaux par SSH m’a été fort utile. Cela permet notamment de palier à un manque de place de chaque côté (source ou destination).

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"

 

]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1463 0
[Bash] Script pour dumper des bases MySQL https://blog-sysadmin.archives.slashroot.fr/?p=1402 https://blog-sysadmin.archives.slashroot.fr/?p=1402#respond Mon, 24 Jul 2017 09:07:30 +0000 http://blog.slashroot.fr/?p=1402 #!/bin/bash # # MySQL_DB_Dump # # Auteur : Johan # Contact : johan@slashroot.fr # Date : 13/07/2011 # Version : 1.0 # Description : Dump une base donnee MySQL # Commentaire : Le fichier de dump peut etre envoye par email # Requis : Besoin de mutt si l'option -m est selectionnee # # # Usage # usage(){ echo "" echo "Utilisation : mysql_db_dump -s server_name -u mysql_user -p file/password -b database1,database2... -d save_folder [-m adresse@domain.com]" echo "" echo "OPTIONS :" echo " -h Affiche l'aide" echo " -u Utilisateur MySQL a utilise pour le dump" echo " -s Serveur contenant la base de données" echo " -p Type d'authentification a utiliser (prompt du password ou fichier ~/.my.cnf)" echo " -b Specifie la ou les bases a dumper" echo " -d Dossier a utiliser pour stocker les dumps" echo " -m Envoi le fichier de dump par email" echo "" echo "EXEMPLE :" echo " - Dump des bases db1 et db2 avec une authentification par fichier et l'envoi des fichiers par email" echo " mysql_db_dump -s localhost -u bob -p file -b db1,db2 -m dba@slashroot.fr" echo "" } # # getopts # while getopts "s:u:p:b:d:m:h" opt; do case $opt in s) serveur=$OPTARG ;; u) user=$OPTARG ;; p) auth=$OPTARG ;; b) bases=$OPTARG ;; m) dest=$OPTARG if [ ! -f /bin/mutt ] ; then echo "ERREUR - L'utilitaire mutt est introubable" exit 1 fi ;; d) folder=$OPTARG ;; h) usage exit 0 ;; \?) usage exit 1 ;; 🙂 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 ]]> https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1402 0 [CentOS] Actions de postinstall pour une workstation https://blog-sysadmin.archives.slashroot.fr/?p=1424 https://blog-sysadmin.archives.slashroot.fr/?p=1424#respond Sun, 23 Jul 2017 10:12:09 +0000 http://blog.slashroot.fr/?p=1424 Il m’arrive d’installer dans le cadre personnel des stations de travail en CentOS 7. Partant de la version minimale, il y a quelques actions à faire afin de pouvoir commencer à travailler. En voici les plus importantes :

# 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

]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1424 0
[Linux] Filtrer l’extraction d’un tar https://blog-sysadmin.archives.slashroot.fr/?p=1415 https://blog-sysadmin.archives.slashroot.fr/?p=1415#respond Fri, 21 Jul 2017 09:21:04 +0000 http://blog.slashroot.fr/?p=1415 Si vous avez un gros tar et que seulement quelques fichiers vous intéresse, l’option « –wildcards » permet de greper ce qu’on veut extraire.

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
]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1415 0
[Vim] Personnalisation de vim https://blog-sysadmin.archives.slashroot.fr/?p=1408 https://blog-sysadmin.archives.slashroot.fr/?p=1408#respond Thu, 20 Jul 2017 09:13:44 +0000 http://blog.slashroot.fr/?p=1408 Voici un extrait de mon vimrc afin d’améliorer un peu ce magnifique éditeur !

" 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
]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1408 0
[Bash] Récupérer la taille des bases MySQL https://blog-sysadmin.archives.slashroot.fr/?p=1405 https://blog-sysadmin.archives.slashroot.fr/?p=1405#respond Wed, 19 Jul 2017 09:09:27 +0000 http://blog.slashroot.fr/?p=1405 #!/bin/bash # # MySQL_DB_Sizes # # Auteur : Johan # Contact : johan@slashroot.fr # Date : 13/07/2011 # Version : 1.0 # Description : Recupère la taille de chaque base de données et envoi les résultats par email # Commentaire : L'utilisateur doit avoir acces en lecture a toutes les bases dont on souhaite connaitre la taille # Reminder for a MySQL read only user # CREATE USER 'ro-user'@'localhost' IDENTIFIED BY 'MySQL_Ro_User_Password'; # GRANT SELECT ON database1.* TO 'ro-user'@'localhost'; # GRANT SELECT ON database2.* TO 'ro-user'@'localhost'; # ... # # Usage # usage(){ echo "" echo "Utilisation : mysql_db_sizes -s server_name -u mysql_user -p file/password [-b database1,database2...] [-m adresse@domain.com]" echo "" echo "OPTIONS :" echo " -h Affiche l'aide" echo " -u Utilisateur MySQL a utilise pour la requete SQL" echo " -s Serveur contenant la base de données" echo " -p Type d'authentification a utiliser (prompt du password ou fichier ~/.my.cnf)" echo " -b Specifie les bases a afficher (par defaut toutes celles accessibles" echo " -m Envoi le resultat par email au lieu de l'afficher dans le terminal" echo "" echo "EXEMPLES :" echo " 1 - Affichage de la taille de toutes les bases avec une authentification par mot de passe" echo " mysql_db_sizes -s localhost-u bob -p password" echo " 2 - Envoi de la taille des bases db1 et db2 par email avec une authentification par fichier" echo " mysql_db_sizes -s localhost -u bob -p file -b db1,db2 -m bob@admin.fr" echo "" } # # getopts # while getopts "s:u:p:b:m:h" opt; do case $opt in s) serveur=$OPTARG ;; u) user=$OPTARG ;; p) auth=$OPTARG ;; b) bases=$OPTARG ;; m) dest=$OPTARG ;; h) usage exit 0 ;; \?) usage exit 1 ;; 🙂 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

]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1405 0
[Bash] Replication d’une base Kerberos https://blog-sysadmin.archives.slashroot.fr/?p=1400 https://blog-sysadmin.archives.slashroot.fr/?p=1400#respond Mon, 17 Jul 2017 09:05:02 +0000 http://blog.slashroot.fr/?p=1400 Ce script permet de répliquer une base de royaume Kerberos d’un master vers un ou plusieurs slave en s’appuyant sur le service kpropd.

#!/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
]]>
https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1400 0
[Bash] Dump d’une base Kerberos https://blog-sysadmin.archives.slashroot.fr/?p=1398 https://blog-sysadmin.archives.slashroot.fr/?p=1398#respond Sun, 16 Jul 2017 09:02:11 +0000 http://blog.slashroot.fr/?p=1398 #!/bin/bash # # Kerberos_Dump # # Auteur : Johan # Contact : johan@slashroot.fr # Date : 24/05/16 # Version : 1.0 # Description : Le script realise un double dump (standard et ov) de la base kerberos passee en parametre # Commentaire : On part du principe que le script est execute en cron de maniere journaliere # # # Definition des variables # # Royaume a sauvegarder realm=$1 [[ -z "$realm" ]] || [[ "$realm" = "-"* ]] && echo "Usage: $0 REALM" && exit 1 # Repertoire contenant les dumps save_rep="/var/kerberos/backup" # Date et heure du dump heure="`date +%H%M`" date="`date +%Y%m%d`" # Nombre de dump a conserver nb_backup=30 # Nom du fichier de backup save_file="${realm}-${date}_${heure}" # # Verifications # # On verifie qu'on a bien la commande kdb5_util if [ ! -f /usr/sbin/kdb5_util ] ; then echo "ERREUR - Il manque la commande kdb5_util" exit 1 fi # On regarde si le repertoire de sauvegarde existe deja, sinon on le cree if [ ! -d $save_rep ] ; then mkdir -p $save_rep if [ ! -d $save_rep ] ; then echo "ERREUR - Impossible de créer le dossier qui va contenir les sauvegardes" exit 1 fi fi # # Au travail # # Sauvegarde de la base kerberosa cd $save_rep /usr/sbin/kdb5_util -r $realm dump $save_file /usr/sbin/kdb5_util -r $realm dump -ov $save_file.ov # On verifie que tout s'est bien passe if [ -f "$save_file.dump_ok" -a -f "$save_file.ov.dump_ok" ]; then rm -f $save_file.dump_ok $save_file.ov.dump_ok exit 0 else echo "ERREUR - Le dump de la base du royaume $realm s'est mal passe" exit 1 fi # On supprime les sauvegardes en trop s'il y en a find $save_rep -name "$realm-*_*" -mtime +30 -ls -delete ]]> https://blog-sysadmin.archives.slashroot.fr/?feed=rss2&p=1398 0