Installation d’un serveur Debian 9

Salut les amis.

Hier, j’ai réussi à avoir un serveur Kimsufi avec 2 To de HDD pour le prix d’un serveur avec 1 To. à 10€ par mois je ne vais pas regarder trop les performances pures et dures du serveur, sachant que ce serveur sera là pour remplacer mon vieillissant Kimsufi, qui n’a qu’un disque de 512 Go (que je pense reconvertir en serveur de Backup) … Ce nouveau serveur servira de serveur web, serveur de cloud privé, seedbox, serveur GIT, de test pour docker … enfin un peu tout.

Plutôt que de simplement migrer facilement mon serveur Debian 8 vers le nouveau, je vais réécrire ici les procédures d’installation from scratch, mais je pense que ceci aboutira à l’utilisation d’un script post-install … Oui car on est flemmard ou on ne l’est pas !

Partitionnement

La grande question du partitionnement

Alors pour expliquer rapidement.

Un / de 20 Go, suffisant.

/home qui fait pour l’instant 1 To, je vais stocker les fichiers de ma seedbox 😀

/var/log qui fait 5 Go (oui j’ai eu une fois une appli verbeuse, qui m’a généré tellement de log que j’en ai perdu mon serveur … Je préfère donc toujours mettre mon dossier de log dans une partition à part et qu’elle reste isolée du reste du système … Les logs ça grossi vite 🙂

Et le reste ?? Et bien le reste je vais voir. Est ce que j’agrandis mon /home ? est ce que je dédie une partition à autre chose ? Je ne sais pas … de toute façon c’est du LVM donc je verrai avec le temps ! 😉

Premier Démarrage

Création d’un compte utilisateur

Pour commencer, si vous n’avez pas de compte perso, ajoutez en un, si vous en avez un passez cette étape

Je vais donc me créer un compte sur le serveur et définir son mot de passe.

useradd -m -G sudo tom
passwd tom

Maintenant il va falloir personnaliser mon environnement de travail (logiciel, bashrc …)

Pour commencer, c’est personnel, je vais importer mon bashrc et mon env shell. Pour cela j’héberge sur GitHub les fichiers nécessaires

cd /tmp
# On installe git si pas encore installé
sudo apt install git
git clone https://www.github.com/SckyzO/bashrc
cd bashrc
# Copie dans le home directory de l'utilisateur
cp .bashrc .dircolors $HOME
# Copie dans le home directory de root
sudo cp .bashrc .dircolors /root
# On delete :)
rm /tmp/bashrc

Mise en place des dépôts

Nous allons ajouter les dépôts “contrib” et “non-free” ainsi que le rétro-portage Backports

 vi /etc/apt/sources.list
# Les dépôts officiels Debian Jessie :
deb http://httpredir.debian.org/debian/ stretch main contrib non-free
#deb-src http://httpredir.debian.org/debian/ stretch main contrib non-free

# Debian Jessie, mises-à-jour de sécurité :
deb http://security.debian.org/ stretch/updates main contrib non-free
#deb-src http://security.debian.org/ stretch/updates main contrib non-free

# Debian Jessie, mises-à-jour "volatiles" :
deb http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
#deb-src http://httpredir.debian.org/debian/ stretch-updates main contrib non-free

# Debian Jessie, dépôt de rétro-portages ("backports") :
deb http://httpredir.debian.org/debian stretch-backports main contrib non-free
#deb-src http://httpredir.debian.org/debian stretch-backports main contrib non-free

Mise à jour système

apt-get update && apt-get upgrade && apt-get dist-upgrade

Installation des programmes

Divers

apt-get install man manpages-fr manpages-fr-extra manpages-fr-dev bash-completion curl locales fortunes nano python-pip wget zip unzip bzip2 linux-kernel-headers screen ca-certificates fortune-mod lsof strace sudo tree coreutils htop ccze vim-runtime vim-common vim-nox vim vim-syntastic vim-addon-manager vim-runtime build-essential subversion autoconf screen g++ gcc ntp curl git unrar unzip mediainfo ffmpeg

Je ne vais pas rentrer dans les détails des programmes installés. C’est mon environnement

Ajout de mon MOTD Dynamique

Pour ceux qui ne savent pas, je vous renvoie vers le lien suivant :

Création d’un MOTD dynamique : dynmotd

 

Un peu de Sécurité

Sécuriser son serveur SSH, c’est quand même la base. Par défaut la configuration est bien pour une utilisation locale. Mais sur internet, mieux vaut prendre quelques précautions.

Perso, je change le port de connexion par défaut, cela évitera quelques petits soucis (mes amis les bots …), et je n’autorise pas la connexion SSH à l’utilisateur root (non sans déconner !!)

Il vous faudra éditer le fichier /etc/ssh/sshd_config

Changer le port par défaut (évitez de mettre un port compris en 1 et 1024 …)

[ . . . ]
Port 1234 # (mettez le port que vous souhaitez)
[ . . . ]
Protocol 2
[ . . . ]
PermitRootLogin no
[ . . . ]
# Cette variable permet uniquement aux utilisateurs listés après la variable AllowUsers de pouvoir se connecter en ssh (Fonctionne aussi avec AllowGroups)
AllowUsers username1 username2
AllowGroups groupe1 groupe2

Voila le principal est fait. J’écrirai un autre article à destination de la sécurité sur un serveur Linux (ssh, fail2ban, port-knocking …)

Et Ensuite ?

Et bien ensuite va s’en suivre plusieurs articles, pour l’installation et la configuration de plusieurs softs. Je pense à terme faire pas mal de docker. Je reviendrai dessus dans les jours prochains.
Pour l’instant on va s’installer “normalement” une petite seedbox sur le serveur. Je vous présenterai cela par la suite.

 

Et vous vous installez aussi votre Debian comme ceci ?

Mon bashrc

[UPDATE : 17-01-2017 : Mise à jour du code du bashrc ]

Suite à l’article sur mon motd dynamique, je vous propose en téléchargement mon fichier bashrc personnalisé.

Explication de la personnalisation de Bash (source : Mistra.fr)

Pour personnaliser l’invite de commande bash nous allons devoir modifier quelques fichiers de configuration relatifs à bash.

 

Voici les fichiers qui configurent un bash à son lancement :

  • /etc/profile : ce fichier est chargé quel que soit le shell utilisé (en particulier bash) et quel que soit l’utilisateur. Il ne doit pas contenir d’instruction spécifiques à bash, car sinon cela risque de perturber les autres shells.
  • /etc/bash.bashrc : ce fichier est chargé par tous utilisateurs au lancement d’un bash. Selon la distribution Linux ce fichier peut porter un nom légèrement différent, par exemple /etc/bash/bashrc.
  • ~/.bash_login : ce fichier est spécifique à un utilisateur (en tant que fichier situé dans son home directory) quand il se loggue. Ce fichier n’existe pas forcément, donc si vous en avez besoin n’hésitez pas à le créer.
  • ~/.bashrc : ce fichier est chargé au lancement d’un bash par cet utilisateur. C’est un contexte un peu plus général que se logguer (typiquement lorsqu’on lance la commande “bash”).

Concrètement nous allons travailler dans ~/.bashrc car nous ne souhaitons pas forcément modifier le prompt des autres utilisateurs. On aurait pu travailler dans /etc/bash.bashrc  pour modifier tous les prompts d’un coup.

Continuer la lecture de Mon bashrc

Vider la mémoire cache d’un serveur Linux

Salut à tous,

Vous le savez je bosse sur des serveurs de calculs, et depuis un certains temps certains calculs plantaient par manque de mémoire.

Ce n’est pas un phénomène nouveau, mais je ne vais pas m’étaler sur le pourquoi du comment, je vous conseille plutôt de lire cet article déjà tout bien écrit : https://www.randco.fr/blog/2012/gestion-de-la-ram-sous-linux/

Juste les commandes de bases à savoir :

Vérifier l’état de la mémoire sur votre système

Taper la commande Free avec les options qui vont bien, au pire un petit “man free” (et pas l’inverse) pour plus d’options

$ free -mt
             total       used       free     shared    buffers     cached
Mem:          3832        755       3076          0         25        485
-/+ buffers    244       3587
Swap:         2047          1       2046
Total:        5880        757       5123

Ou alors le bon vieux fichier /proc/meminfo (mais c’est plutôt imbitable pour les néophytes)

$ cat /proc/meminfo
MemTotal:        3924412 kB
MemFree:         3150572 kB
Buffers:           26228 kB
Cached:           497512 kB
SwapCached:          204 kB
Active:           437460 kB
Inactive:         199132 kB
Active(anon):      39828 kB
Inactive(anon):    73212 kB
Active(file):     397632 kB
Inactive(file):   125920 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2095868 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:        112832 kB
Mapped:            13084 kB
Shmem:               188 kB
Slab:              65576 kB
SReclaimable:      33132 kB
SUnreclaim:        32444 kB
KernelStack:        2864 kB
PageTables:         8856 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4059352 kB
Committed_AS:     257772 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      163900 kB
VmallocChunk:   34359561148 kB
HardwareCorrupted:     0 kB
AnonHugePages:     12288 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

Bref tout ça pour dire que parfois j’ai besoin de vider le cache ram.

Voici les différentes commandes disponibles

Libère la mémoire des données en cache

$ sync; echo 1 > /proc/sys/vm/drop_caches

Libère la mémoire des données en tampon

$ sync; echo 2 > /proc/sys/vm/drop_caches

Libère la mémoire des données cache et tampon (celle que j’utilise en règle générale).

$ sync; echo 3 > /proc/sys/vm/drop_caches

La commande sync permet de s’assurer que toutes les informations en mémoire en attente d’écriture soient bien répercutées sur le disque (oui mieux vaut prendre un minimum de précaution hein).

Ensuite, libre à vous de faire un petit script ou de mettre tout ça dans un crontab. Par exemple pour vider tous les jours à midi le cache :

# crontab -l

0 12 * *  * sync; echo 3 > /proc/sys/vm/drop_caches

Je profite aussi de cet article pour vous noter comment vider la swap d’un serveur linux

swapoff -a 
swapon -a

Tout simplement 🙂

Création d’un MOTD dynamique : dynmotd


Depuis que je m’occupe de la gestion d’un parc de serveurs Linux, environ 200, j’ai mis en place certaines petites customisations maison.

Ainsi, dès que je me connecte en SSH à un serveur, un motd dynamique s’exécute et il m’est donc simple de savoir quel est le serveur sur lequel je me connecte. Qu’est ce que le motd me demanderont certains ? Simplement l’abréviation de Message Of The Day.

Mettre en place un motd dynamique est très simple.

Suivez le tutoriel ci-dessous

<Mise à jour du 29 Avril 2016>

  • Mise à jour pour dû à un bug du TERM qui bloquait les transfert en SCP
  • Mise à jour du fichier dynmotd.sh avec : optimisation des variables
  • Mise en place du dynmotd uniquement pour le compte root et le groupe admin

</Mise à jour>

Continuer la lecture de Création d’un MOTD dynamique : dynmotd

5 Important scripts useful for a Linux system administrator

While all the scripts provided below may be accurate, there may be much more advanced features available. However, these scripts are just to give an overview of how things are meant to be done for a systems administrator. I did not make any of the below scripts and all scripts’ references are given inline along with their description.

Disk usage

This script will be useful to analyze the disk usage and if the reported disk space is more than 90 % an email will be sent to the administrator. The script is taken from here.

#!/bin/sh
# set -x
# Shell script to monitor or watch the disk space
# It will send an email to $ADMIN, if the (free available) percentage of space is &gt;= 90%.
# -------------------------------------------------------------------------
# Set admin email so that you can get email.
ADMIN="root"
# set alert level 90% is default
ALERT=90
# Exclude list of unwanted monitoring, if several partions then use "|" to separate the partitions.
# An example: EXCLUDE_LIST="/dev/hdd1|/dev/hdc5"
EXCLUDE_LIST="/auto/ripper"
#
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#
function main_prog() {
while read output;
do
#echo $output
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
  partition=$(echo $output | awk '{print $2}')
  if [ $usep -ge $ALERT ] ; then
     echo "Running out of space \"$partition ($usep%)\" on server $(hostname), $(date)" | \
     mail -s "Alert: Almost out of disk space $usep%" $ADMIN
  fi
done
}
if [ "$EXCLUDE_LIST" != "" ] ; then
  df -H | grep -vE "^Filesystem|tmpfs|cdrom|${EXCLUDE_LIST}" | awk '{print $5 " " $6}' | main_prog
else
  df -H | grep -vE "^Filesystem|tmpfs|cdrom" | awk '{print $5 " " $6}' | main_prog
fi

Incremental Backup Scripts

This script will do the incremental backup into an external mounted hard-drive. It is to take a backup of the /home directory. However, it can be modified to suit the requirements. The script is taken from here.

#!/bin/bash
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility
# ----------------------------------------------------------------------
# this needs to be a lot more general, but the basic idea is it makes
# rotating backup-snapshots of /home whenever called
# ----------------------------------------------------------------------

unset PATH  # suggestion from H. Milz: avoid accidental use of $PATH

# ------------- system commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;

MOUNT=/bin/mount;
RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;
TOUCH=/bin/touch;

RSYNC=/usr/bin/rsync;


# ------------- file locations -----------------------------------------

MOUNT_DEVICE=/dev/hdb1;
SNAPSHOT_RW=/root/snapshot;
EXCLUDES=/usr/local/etc/backup_exclude;


# ------------- the script itself --------------------------------------

# make sure we're running as root
if (( `$ID -u` != 0 )); then { $ECHO "Sorry, must be root.  Exiting..."; exit; } fi

# attempt to remount the RW mount point as RW; else abort
$MOUNT -o remount,rw $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readwrite";
    exit;
}
fi;


# rotating snapshots of /home (fixme: this should be more general)

# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/home/hourly.3 ] ; then         \
$RM -rf $SNAPSHOT_RW/home/hourly.3 ;                \
fi ;

# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/home/hourly.2 ] ; then         \
$MV $SNAPSHOT_RW/home/hourly.2 $SNAPSHOT_RW/home/hourly.3 ; \
fi;
if [ -d $SNAPSHOT_RW/home/hourly.1 ] ; then         \
$MV $SNAPSHOT_RW/home/hourly.1 $SNAPSHOT_RW/home/hourly.2 ; \
fi;

# step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
# if that exists
if [ -d $SNAPSHOT_RW/home/hourly.0 ] ; then         \
$CP -al $SNAPSHOT_RW/home/hourly.0 $SNAPSHOT_RW/home/hourly.1 ; \
fi;

# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first.  If it were not so, this would copy over the other
# snapshot(s) too!
$RSYNC                              \
    -va --delete --delete-excluded              \
    --exclude-from="$EXCLUDES"              \
    /home/ $SNAPSHOT_RW/home/hourly.0 ;

# step 5: update the mtime of hourly.0 to reflect the snapshot time
$TOUCH $SNAPSHOT_RW/home/hourly.0 ;

# and thats it for home.

# now remount the RW snapshot mountpoint as readonly

$MOUNT -o remount,ro $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readonly";
    exit;
} fi;

High CPU Usage Script

At times, we need to monitor the high CPU usage in the system. We can use the below script to monitor the high CPU usage. The script is taken from here.

#!/bin/bash
while [ true ] ;do
used=`free -m |awk 'NR==3 {print $4}'`

if [ $used -lt 1000 ] && [ $used -gt 800 ]; then
echo "Free memory is below 1000MB. Possible memory leak!!!" | /bin/mail -s "HIGH MEMORY ALERT!!!" user@mydomain.com


fi
sleep 5
done

Adding new users to a Linux system

This script allows the root user or admin to add new users to the system in an easier way by just typing the user name and password (The password is entered in an encrypted manner). The below script is taken from here.

#!/bin/bash
# Script to add a user to Linux system
if [ $(id -u) -eq 0 ]; then
    read -p "Enter username : " username
    read -s -p "Enter password : " password
    egrep "^$username" /etc/passwd >/dev/null
    if [ $? -eq 0 ]; then
        echo "$username exists!"
        exit 1
    else
        pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
        useradd -m -p $pass $username
        [ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
    fi
else
    echo "Only root may add a user to the system"
    exit 2
fi

Database Backup

This script is a pretty basic script useful in backing up the database. The script is taken from here.

#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder="/var/www/vhosts/example.com/httpdocs/backups"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --user=mydbuser--password=mypass --default-character-set=utf8 mydatabase | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
chown myuser "$fullpathbackupfile"
chown myuser "$logfile"
echo "file permission changed" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

Source : http://unix.stackexchange.com/questions/125726/important-scripts-useful-for-a-linux-system-administrator