Petite marche à suivre à peu près généraliste pour configurer un serveur dédié Kimsufi.

Installation

Le schéma d’installation que j’ai utilisé diverge de celui par défaut pour Debian Jessie proposé par OVH.

Est configuré par défaut dans le template d’installation Debian 8.3 stable (Jessie) :

  • une large partition /home dans le schéma de partition par défaut :
    • une partition primaire / de 20Go ;
    • une partition primaire /home prenant l’espace restant, soit un peu moins de 980Go dans mon cas ;
    • une partition swap obligatoire de 512Mo ;
  • un noyau Linux « maison ».

Inconvénients pour un serveur web comme le mien :

  • j’utilise majoritairement les partitions /var (/var/www pour les sites en PHP, /var/lib pour le stockage de données des applications comme MariaDB, Prosody, etc.) et /srv (services divers balancés sur un port public)
  • avoir une partition /home séparée et prenant 98% de l’espace disque ne me sert à rien ;
  • le noyau maison n’est disponible dans aucun dépôt apt et doit être mis à jour à la main (wget), en allant le chercher depuis un serveur FTP, ce qui est rédhibitoire pour moi.

Donc, pour installer à ma façon :

  • template d’installation Debian 8.3 stable (Jessie) ;
  • cocher l’utilisation du noyau de la distribution à la place du noyau ;
  • éditer le schéma de partitionnement pour supprimer la place indue que prendrait /home et maximiser l’espace de la racine /.

Considérations d’installation

  • une partition /boot séparée de / ;
  • un partitionnement du disque (/var, /src) plus fin, en essayant de prévoir la place que prendraient ces partitions ;
  • utiliser le noyau avec les patchs de sécurité grsecurity, à l’instar du noyau OVH qui les intègre ;
  • ne pas activer de compte root mais directement un utilisateur appartenant au groupe sudo pour ne pas avoir à le désactiver par la suite.

Première connexion

Après l’installation de la distribution, OVH envoie un mail contenant le code du compte root permettant de se connecter au serveur. On va donc s’y connecter en forçant la demande de mot de passe (puisqu’il n’y a pas encore de clé SSH forgée est installée).

ssh root@ip.du.serveur -o PreferredAuthentications=password

Une fois connecté, je conseille de changer au plus vite le mot de passe du compte root :

passwd

Entrez le mot de passe actuel une première fois, puis entrez-en un nouveau par deux fois. Voilà, il ne devrait plus exister de copie de votre mot de passe root.

Pour désactiver complètement le login du compte root (après avoir créé un nouvel utilisateur appartenant au groupe sudo) :

sudo passwd -dl root

Pour continuer, mettre à jour des dépôts.

apt update

systemd

Utiliser les différents services de systemd renvoie l’erreur suivante :

Failed to create bus connection

Pour corriger, il suffit d’installer le paquet dbus manquant.

apt install dbus

NTP

Maintenant que systemd est réparé, on peut l’utiliser comme service de synchronisation du temps de la machine au lieu d’installer un second paquet pour NTP.

timedatectl set-ntp 1

Hostname

Le nom d’hôte (hostname) inscrit dans le fichier /etc/hostname est un nom de domaine hostname.ip-x-y-z.eu. Pour n’avoir que le nom court :

hostnamectl set-hostname $(hostname -a)

Puis éditer /etc/hosts pour remplacer hostname.ip-x-y-z.eu avec hostname.sondomaine.tld tel que défini dans sa zone DNS (sinon, le faire, j’utilise celle de Gandi).

Pour plus d’informations sur le renommage de la machine, voir le Debian Wiki HowTo/ChangeHostname.

Firewall et Fail2ban

Pas envie de m’emmerder à maintenir un pare-feu complexe, je teste UFW (Uncomplicated Firewall).

apt install ufw
ufw allow SSH # ouvre le port 22
ufw allow ’Nginx Full’ # ouvre les ports 80 et 443
ufw enable # active ufw

Si vous voulez utiliser fail2ban pour prévenir des attaques par force brute, il est possible de le faire utiliser directement ufw plutôt qu’iptables.

apt install fail2ban

Pour configurer la bête, créer un fichier /etc/fail2ban/jail.local : chargé après le fichier de configuration principal /etc/fail2ban/jail.conf, les valeurs qu’il contient écrasent celles contenues dans le premier, inutile donc de copier intégralement le contenu du fichier de configuration (comme j’ai pu le voir par-ci par-là). Y changer l’adresse à laquelle les notifications sont envoyées, et configurer le programme pour utiliser ufw :

[DEFAULT]
destemail = mail@domaine.truc
banaction = ufw

Yapyt

Yapyt est clone de yaourt (commande Arch Linux) développé par Thuban pour Debian. Très utile pour nettoyer son système et supprimer les résidus d’applications désinstallées.

wget http://git.yeuxdelibad.net/coolrepo/plain/yapyt/yapyt.py -O /usr/local/bin/yapyt
chmod +x /usr/local/bin/yapyt

Pour le nettoyage, yapyt nécessite deborphan et aptitude :

apt install aptitude deborphan

Certificats

Installer le client Let’s Encrypt disponible dans le dépôt jessie-backports activé par défaut dans le source.list déployé par OVH (qui utilise les miroirs d’OVH également), mais aussi les certificats racine de CACert qui sont à nouveau disponible dans un paquet séparé.

apt -t jessie-backports install letsencrypt ca-cacert

Dotdeb

Dotdeb is an extra repository providing up-to-date packages for your Debian servers : Nginx ; PHP 7.0, 5.6, 5.5, 5.4 (obsolete) and 5.3 (obsolete) ; useful PHP extensions : apcu, imagick, mongo, Pinba, xcache, Xdebug, XHprof… ; MySQL 5.5 and 5.6 ; Zabbix ; etc.

Installer la clé du dépôt :

wget https://www.dotdeb.org/dotdeb.gpg -O- | apt-key add -

Dans /etc/apt/source.list.d/dotdeb.list :

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Mettre à jour les dépôts :

apt update

Installer le serveur web :

apt install nginx-extras php5-fpm

MariaDB

MariaDB is one of the most popular database servers in the world. It’s made by the original developers of MySQL and guaranteed to stay open source. Notable users include Wikipedia, Facebook and Google.

Installer la clé du dépôt :

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

Dans /etc/apt/source.list.d/mariadb.list :

deb [arch=amd64,i386] http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main
deb-src http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.1/debian jessie main

Mettre à jour les dépôts :

apt update

Installer :

apt install mariadb-server

Prosody

Prosody is a modern XMPP communication server. It aims to be easy to set up and configure, and efficient with system resources. Additionally, for developers it aims to be easy to extend and give a flexible system on which to rapidly develop added functionality, or prototype new protocols.

Installer la clé du dépôt :

wget https://prosody.im/files/prosody-debian-packages.key -O- | apt-key add -

Dans /etc/apt/source.list.d/prosody.list :

deb http://packages.prosody.im/debian jessie main

Mettre à jour les dépôts :

apt update

Installer Prosody et ses dépendances optionnelles :

apt install prosody-trunk lua-event lua-zlib lua-dbi-sqlite3 lua-bitop

Je renvoie à mon article Prosody sur Debian Wheezy/Jessie pour plus d’informations quant à la configuration du service.

NodeJS LTS

Installer nodejs (v0.10.29) et npm (v1.4.21) depuis les dépôts Debian, dans /usr/bin.

apt install npm

Installer le gestionnaire de version n dans /usr/local/bin.

npm install -g n

Utiliser n pour installer la dernière version LTS de nodejs (v4.3.2) dans /usr/local/bin.

n lts

Installer la dernière version de npm (v2.14.12) dans /usr/local/bin.

npm install -g npm node-gyp

Supprimer les binaires de npm et nodejs qui trainent dans /usr/bin pour ne plus avoir que les derniers installés.

apt remove npm
apt-get autoremove

Superutilisateur

Plutôt que de continuer à utiliser le compte root, je me crée un utilisateur aux droits restreints, que j’ajoute néanmoins au groupe sudo pour l’utiliser à des fins de maintenance du système.

apt install sudo
adduser username
gpasswd -a username sudo

Pour désactiver complètement le login du compte root :

sudo passwd -dl root

SSH

Depuis un terminal sur mon ordinateur, je forge une clé SSH (inutilement grosse, pour tester) que j’autoriserai à servir d’authentification sur le compte utilisateur créé ci-dessus.

ssh-keygen -b 16384

Je la renomme $HOME/.ssh/id_rsa-nomduserver, lui met un gros gros mot de passe, puis je la copie dans les clés autorisées sur mon serveur.

ssh-copy-id -i $HOME/.ssh/id_rsa-nomduserver username@adresse.ip -o PreferredAuthentications=password

Je peux dorénavant me connecter à mon serveur par SSH avec une authentification par clé sur un utilisateur qui après entrée d’un (inutilement tarabiscoté) mot de passe, me confère des droits élevés.

ssh username@adress.ip -i $HOME/.ssh/id_rsa-nomduserver

Je renvoie au Debian Wiki pour la sécurisation de SSH : désactiver la connexion au compte root et l’authentification par mot de passe dans /etc/ssh/sshd_config.

PasswordAuthentication no
PermitRootLogin no

Shell ZSH et Byobu

Plutôt qu’une session SSH toute moche avec seulement BASH, j’utilise le gestionnaire de multiplexeurs de terminal Byobu (backend tmux) et ai remplacé BASH par ZSH.

ZSH, Prezto et Byobu

apt install zsh byobu git
byobu-enable

La commande byobu-enable active byobu si et seulement si le shell par défaut est bash. Donc plutôt que modifier le shell de l’utilisateur (chsh -s /bin/zsh) qui empêcherait l’activation automatique de byobu, il suffit d’ajouter les lignes suivantes à $HOME/.byobu/.tmux.conf pour changer l’interpréteur de commandes du programme :

set -g default-shell /usr/bin/zsh
set -g default-command /usr/bin/zsh

Installation de Prezto, un framework de configuration de ZSH. Lancer zsh et ne pas créer de fichier de configuration (touche q)

zsh

Copier le répertoire de prezto :

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

Activer prezto pour mon profil utilisateur :

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

Etherpad Lite

Installation des dépendances :

apt install gzip git curl python libssl-dev pkg-config build-essential

Déploiement d’Etherpad Lite comme service, dans son propre dossier avec son propre user/group.

adduser --system --home=/srv/etherpad-lite --group etherpad-lite

Il faut utiliser le compte adéquat pou r la suite : pour ce faire, faire précéder les commandes suivantes de :

sudo su etherpad-lite -s /bin/bash -c "ici la commande entre guillemets"

Clônage du répertoire à la racine du dossier nouvellement créé.

cd /srv/etherpad-lite;
git clone git://github.com/ether/etherpad-lite.git .

Copier le fichier de configuration.

cp /srv/etherpad-lite/settings.json.template /srv/etherpad-lite/settings.json

Configuration du backend (j’aime bien utiliser redis qui me nécessite aussi peu de configuration qu’un fichier SQLite pour des performances plus hautes) :

apt install redis-server

Dans /srv/etherpad-lite/settings.json :

//the type of the database
"dbType" : "redis",
//the database specific settings
"dbSettings" : {
                 "host"    : "localhost",
                 "port"    : 6379,
                 "database": 1
               },

Dépendances optionnelles pour l’import/export :

apt install tidy libreoffice-writer

Dans /srv/etherpad-lite/settings.json :

/* This is the absolute path to the soffice executable. Setting it to null, disables LibreOffice exporting.
 LibreOffice can be used in lieu of Abiword to export pads */
"soffice" : "/usr/bin/soffice",

/* This is the path to the Tidy executable. Setting it to null, disables Tidy.
 Tidy is used to improve the quality of exported pads*/
"tidyHtml" : "/usr/bin/tidy",

Documentation :

Ghost

Ghost is a platform dedicated to one thing: Publishing. It’s beautifully designed, completely customisable and completely Open Source. Ghost allows you to write and publish your own blog, giving you the tools to make it easy and even fun to do.

Pareillement qu’Etherpad Lite ci-dessus, je déploie Ghost comme un service, ayant son propre utilisateur et groupe.

adduser --system --home=/srv/ghost --group ghost

Comme pour etherpad, il faut utiliser le compte adéquat : pour ce faire, faire précédér les commandes suivantes de :

sudo su ghost -s /bin/bash -c "ici la commande entre guillemets"

Dans le dossier de l’utilisateur ghost, je décompresse l’archive de la dernière version disponible :

cd /srv/ghost;
wget http://ghost.org/zip/ghost-latest.zip;
unzip -uo ghost-latest.zip -d /srv/ghost;
rm ghost-latest.zip

Ne reste plus qu‘à installer le tout.

npm install --production

Pour la configuration de Ghost, je renvoie à la documentation :

Pour aller plus loin :

ownCloud

ownCloud gives you universal access to your files through a web interface or WebDAV. It also provides a platform to easily view & sync your contacts, calendars and bookmarks across all your devices and enables basic editing right on the web. Installation has minimal server requirements, doesn’t need special permissions and is quick. ownCloud Server is extendable via a simple but powerful API for applications and plugins.

Pour plus de facilité quant à l’installation d’ownCloud, j’utilise le dépôt. Installer la clé :

wget https://download.owncloud.org/download/repositories/stable/Debian_8.0/Release.key -O- | apt-key add -

Créer /etc/apt/source.list.d/owncloud.list avec le dépôt :

sh -c "echo ’deb http://download.owncloud.org/download/repositories/stable/Debian_8.0/ /’ >> /etc/apt/sources.list.d/owncloud.list"

Mettre à jour les dépôts et installer owncloud :

apt-get update
apt-get install owncloud

Documentation :

Pour une première salve, ça suffira je crois. N’hésitez pas à commenter si je dois préciser un élément de configuration, je verrai si j’ai le temps pour compléter.