30
Nov 2013

Category: Programming | Tags: kimsufi security dedie howto unix ssh mysql php apache ftp monitoring

MAJ : 18/12/2013, 04/04/2015.

Cet article est un résumé inspiré de ce site et de mon retour d'expérience. Je me base sur un serveur dédié Kimsufi 2G sur lequel j'ai effectué mes tests.

Partitionner le serveur

Les serveurs dédiés sont fournis pré-installés par votre fournisseur, cependant je vous recommande fortement de le réinstaller complètement. Préférez un Debian 6 en version 64bit pour une utilisation professionnelle, et notamment pour un hébergement sans prise de tête d’outils web standards.

Pour des raisons étranges, le partitionnement proposé par défaut par OVH pour ses serveurs dédiés ne correspond pas à la meilleure solution pour un serveur web. Cela ressemble plutôt à un partitionnement adapté pour une station de travail personnelle. Voici comment y remédier.

Avertissement préalable : le repartitionnement de votre serveur va effacer toutes vos données et re-formater entièrement votre disque dur ! Pensez à faire une sauvegarde !

Notre serveur possède une capacité totale d'un teraoctet, nous allons donc partager cet espace selon les besoins d'un serveur web.Par défaut, un serveur web Debian va utiliser le répertoire /var/www pour stocker les contenus des sites web (statiques et scripts), le répertoire /var/mysql pour les données de vos bases de données, le répertoire /var/log pour stocker les journaux d’activités, et /var/svn pour vos sources subversion. C'est donc au répertoire /var que l'on vas alloué le plus d'espace disque.

Tout d'abord, connectez vous à votre manager OVH, et réinstallez votre serveur en choissant Debian 7 64bit, une des distribution de base proposée. Choissisez le partitionnement personnalisé.

Nous allons simplement définir cinq partitions sur le disque dur qui se partageront l’espace total disponible. Initialement, l’écran de configuration vous propose trois partitions, supprimez-les puis suivez les instructions suivantes :

  • 100000 Mo pour la partition racine, primaire (ext4). Point de montage : /
  • 10000 Mo pour les utilisateurs système, partition primaire (ext4). Point de montage : /home
  • 696000 Mo pour le serveur web, partition primaire (ext4). Point de montage : /var
  • 100000 Mo pour les sauvegardes FTP, partition logique (ext4). Point de montage : /save
  • 4000 Mo pour la partition swap, de type logique (swap).

installer-dedie

Voici le résultat que vous devez obtenir suite au partitionnement de votre disque

Cliquez sur "Lancer la réinstallation", il n’y a plus qu’à suivre en direct la réinstallation automatique de notre serveur ! Comptez environ 15/20 minutes pour cette étape, puis vous recevrez par mail le mot de passe pour accéder à votre nouveau serveur.

Configuration de la connexion SHH

Tout d'abord, connectez vous en ssh sur votre serveur à l'aide des identifiants qui vous on été fournis par mail suite à la réinstallation de votre serveur. Pour cela éxécutez la commande suivante :

ssh root@‹ipdemonserveur›

Travailler en root n’est pas recommandé pour des raisons de sécurité, encore moins quand ce compte root utilise un mot de passe qui a circulé par e-mail. On commence donc par créer un compte d’utilisateur non privilégié (auquel on donnera les privilèges nécessaires pour faire de l’administration à distance tout de même !), et par changer le mot de passe root. Exécutez les commandes suivantes :

passwd
adduser ‹votre login›
adduser ‹votre login› root
adduser ‹votre login› adm
exit

Testez la connexion avec votre nouvel utilisateur en vous connectant sur votre serveur.

Configuration de la clé SSH pour automatiser la connexion

Sous la plupart des autres distributions GNU/Linux / Unix supportant le mécanisme de connexion sécurisée par clés publiques/privées openssh, votre “trousseau” de clés SSH se trouve stocké dans de simple fichiers textes dissimulés dans un répertoire “caché” nommé .ssh et situé à la racine de votre répertoire user. Dans ce dossier, on trouve en général cinq types de fichiers distingués par leur nom qui est toujours du même type quelque soit le système.

  • known_hosts : contient la liste des adresses et des clés publiques des serveurs considérés comme “connus”, c’est-à-dire vers lesquels vous autorisez des connexions en ssh avec échange de clés ou de mot de passe crypté.
  • authorized_keys : contient les trousseaux de clés autorisés (et donc ne nécessitant pas d’entrer un mot de passe pour établir la connexion)
  • authorized_keys2 : (obsolète) contient les trousseaux de clés autorisés pour les sessions en ssh2 (les versions récentes d’openssh ne distinguent plus les deux types de fichier et donc tout peut être stocké dans le seul fichier authorized_keys).
  • id_rsa ou id_rsa.key ou autre fichier .key ou private : votre clé privée (utilisant le cryptage RSA).
  • id_rsa.pub ou autre fichier .pub ou public : votre clé privée (utilisant le cryptage RSA).

Avant de pouvoir vous connecter à des systèmes distants par clé SSH et donc sans avoir à taper de mot de passe, vous devez vous créer un trousseau personnel de clé publique / clé privée associé à votre login sur la machine locale. Pour cela, taper la commande suivante en ligne de commande dans un terminal local :

ssh-keygen

Votre clé va être générée, sauvegardez la dans l'emplacement conseillée par le Terminal (.ssh). Vous pouvez augmenter la sécurité de votre clé SHH privée par un mot de passe, mais ce n'est pas obligatoire. Deux nouveaux fichiers ont été créés dans votre répertoire .ssh, contenant respectivement votre clé privée (qui ne doit pas quitter votre machine), et votre clé publique (que vous allez pouvoir utiliser pour vous identifier sur des machines distantes).

Une fois la clé générée et stockée dans un fichier texte localement, se reconnecter en ssh avec l’utilisateur non privilégié créé ci-dessus :

#sur le serveur
ssh ‹login›@‹ipdemonserveur›
mkdir .ssh
cd .ssh
vi authorized_keys

#sur la machine locale
cat ~/.ssh/id_rsa.pub
#copiez la clé ssh affichée

#sur le serveur
#collez la clé SSH dans le fichier authorized_keys
exit

C’est tout, votre clé publique a été enregistrée pour accéder à votre compte sur le serveur distant en ssh. Vous pouvez maintenant tester la connexion automatique avec la clé ! Pour cela entrez la ligne de commande suivante :

ssh ‹login›@‹ipdemonserveur›

Si tout a bien fonctionné, vous vous retrouvez connecté instantanément sans avoir à préciser de mot de passe ! La connexion s’établit via un échange crypté entre les deux machines, qui utilisent votre clé publique pour vérifier la validité de votre clé privée (sans la transmettre) et ainsi identifier votre session.

Si c’est votre première connexion ssh à cette machine, vous devrez préalablement confirmer que vous acceptez cet hôte comme “connu” (ceci l’ajoutera automatiquement dans le fichier known_hosts déjà évoqué ci-dessus).

Petite astuce : Vous pouvez ajouter un alias sur vôtre propre machine pour vous connecter plus rapidement en SSH. Pour faire cela, exécutez les commandes suivantes

cd
sudo nano .bashrc

#ajouter la ligne suivante à la fin du fichier
alias kimsufi='ssh ‹login›@‹ipdemonserveur›'

#enregistrez et mettez à jour votre terminal avec la commande : 
source .bashrc

Vous pouvez maintenant vous connecter en appelant directement la commande kimsufi

Sécurisation minimum du serveur

Afin d'aller seulement à l'essentiel, exécutez les commandes suivantes :

#connexion en root et suppression des fichiers sensibles
su root
rm /root/.ssh/authorized_keys2
rm /root/.email

#on renomme la machine pour appliquer notre domaine
vi /etc/hostname # -> changer nom de machine (genre ksXXXXXX.‹votre-domaine›.com)
invoke-rc.d hostname.sh stop
invoke-rc.d hostname.sh start
vi /etc/hosts # -> ajouter nom de machine

#mises à jour des sources et des paquets
aptitude update
aptitude safe-upgrade
aptitude full-upgrade
aptitude install debian-goodies

#utilitaire qui vérifie automatiquement la qualité des mots de passe,
#avec un dictionnaire de mots français
aptitude install libpam-cracklib wfrench

vi /etc/pam.d/su
# -> On dé-commente la ligne : auth required pam_wheel.so
pam-auth-update

aptitude install sudo
visudo
# -> Ajout de la ligne : %root ALL=(ALL) PASSWD: ALL

#installation et configuration de fail2ban
apt-get install fail2ban
vi /etc/fail2ban/jail.conf

#Vérifiez la config :
[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6
# durée du banissement
bantime  = 900

# on redémarre fail2ban
/etc/init.d/fail2ban restart

#on change le port de SSH (optionnel mais conseillé)
vi /etc/ssh/sshd_config
#-> Port 22000 (pour déplacer l’écoute du daemon ssh sur un port “non standard”)
/etc/init.d/ssh restart

#on redémarre le serveur
reboot

Désinstallation de trucs inutiles / installation de trucs utiles

Cette fois on se reconnecte en ssh sur le port 22000 (pour ceux qui ont changé), toujours avec la clé ssh. Vous pouvez d’ailleurs sauvegarder ces paramètres de connexion qui seront définitifs.

ssh -l ‹votre login› -p 22000 ‹hôte›
su

#suppression de quelques paquets inutiles
aptitude purge bind9 bind9-doc \
 manpages-cs manpages-de \
 manpages-es manpages-it manpages-pl \
 manpages-pt reiserfsprogs

#installation de ntp
apt-get install ntp ntpdate
sudo vi /etc/ntp.conf # -> Ajouter server fr.pool.ntp.org
/etc/init.d/ntp stop
ntpdate fr.pool.ntp.org
/etc/init.d/ntp start
date

#Installation de Java
aptitude search openjdk
aptitude install openjdk-7-jre

#Installation de Zip/UnZip
aptitude install zip unzip

#Installation de composer
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Installation d’Apache2

Je vais ici vous présenter comment configurer et optimiser votre serveur web Apache2, Il existe plusieurs manières de faire, je vais vous en présenter une.

#installation
apt-get install apache2 php5 php5-gd
vi /etc/apache2/conf.d/security # -> ServerTokens Prod ; ServerSignature Off
a2enmod rewrite
a2enmod expires
a2enmod headers
/etc/init.d/apache2 restart

#configuration (exemple de configuration)
vi /etc/apache2/apache2.conf

Timeout 300
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 2
‹ifmodule mpm_prefork_module›
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          100
    MaxRequestsPerChild   0
‹/ifmodule›
HostnameLookups Off
LogLevel warn

Installation de Mysql

On va maintenant installer Mysql pour gérer nos bases de données.

apt-get install mysql-server-5.5 php5-mysql

#configuration de mysql
vi /etc/mysql/my.cnf
# -> log_slow_queries = /var/log/mysql/mysql-slow.log

/etc/init.d/mysql restart

Installation de Munin et phpsysinfo

Munin et phpsysinfo sont des outils d'analyse de votre serveur, il est conseillé de les installer si vous souhaitez surveiller l'état de celui-ci.

#munin
apt-get install munin
vi /etc/apache2/conf.d/munin #-> Allow from all (ou pas ?)
/etc/init.d/apache 2 restart
#vous pouvez y accéder via : http://ksXXX.ovh.net/munin/

#phpsysinfo
apt-get install phpsysinfo
vi /etc/apache2/conf.d/phpsysinfo

#Alias /phpsysinfo /usr/share/phpsysinfo
#‹Directory /usr/share/phpsysinfo›
#        Order allow,deny
#        Allow from All
#        Options None

#   ‹IfModule mod_expires.c›
#        ExpiresActive On
#        ExpiresDefault M310
#   ‹/IfModule›
#‹/Directory›

/etc/init.d/apache2 restart

http://ksXXX.ovh.net/phpsysinfo

Installation de PHP et mise à jour vers PHP5.5

Installation de PHP et de eAccelerator pour votre serveur web et optimiser les requêtes.

apt-get install php5-dev php5-curl \
php-pear php5-imagick php5-mcrypt php5-memcache make
apt-get install re2c
/etc/init.d/apache2 restart

#Mettre à jour php
echo "deb http://packages.dotdeb.org/ wheezy-php55 all" > /etc/apt/sources.list.d/php55.list
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xA2098A6E
apt-get update && apt-get upgrade
apt-get dist-upgrade

#Redémarrer le serveur Apache2
/etc/init.d/apache2 restart

vi /var/www/info.php
#-> créer le fichier contenant un phpinfo();
http://ksXXX.ovh.net/info.php

Installation de PhpMyadmin

PhpMyAdmin est un outil de gestion des bases de données MySql en ligne, il est très utiliser et surtout très pratique

apt-get install phpmyadmin
vi /etc/phpmyadmin/apache.conf
#-> changer l’Alias par ‘/mon_admin_de_mysql_en_php’ par exemple
# (beaucoup d’attaques sur ce répertoire sinon)
cp /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin.conf
/etc/init.d/apache2 restart

#http://ksXXX.ovh.net/mon_admin_de_mysql_en_php

FTP

Installez un serveur FTP utilisant les users de votre serveur

aptitude -y install vsftpd

# Editer le fichier de configuration avec la config suivante
vi /etc/vsftpd.conf

# line 23: change( disable anonymous )
anonymous_enable=NO
# line 26: uncomment
local_enable=YES
# line 29: uncomment
write_enable=YES
# line 97,98: uncomment ( allow ascii mode transfer )
ascii_upload_enable=YES
ascii_download_enable=YES
# line 120: uncomment ( enable chroot )
chroot_local_user=YES
# line 121: uncomment ( enable chroot list )
chroot_list_enable=YES
# line 123: uncomment ( enable chroot list )
chroot_list_file=/etc/vsftpd.chroot_list
# line 129: uncomment
ls_recurse_enable=YES

# add at the last line 
# specify root directory ( if don't specify, users' home directory become FTP home directory)
local_root=public_html

#Redemarrez le serveur FTP et testez la connexion
/etc/init.d/vsftpd restart 

Un peu de config sécurité

PhpMyAdmin est un outil de gestion des bases de données MySql en ligne, il est très utiliser et surtout très pratique

vi /etc/ssh/sshd_config
PermitRootLogin no   # Ne pas permettre de login en root
AllowUsers qso git   # N'autoriser que certains utilisateur précis (user courant + git)

#Redémarrez le service SSH après ces modifications
/etc/init.d/ssh restart

#Suppression de quelques logiciels inutiles
/etc/init.d/portmap stop
/etc/init.d/nfs-common stop
update-rc.d -f portmap remove
update-rc.d -f nfs-common remove
update-rc.d -f inetd remove
apt-get remove portmap
apt-get remove ppp

Voila vous avez maintenant toutes les cléfs en mains pour installer votre propre serveur dédié !