Configuration de mes connexions SSH

J’administre tous mes serveurs (tous sous Linux) en ligne de commande. L’interface graphique consomme en effet beaucoup de ressources inutilement et n’est pas nécessaire pour seulement quelques accès par mois. De plus, la ligne de commande est plus puissante.

Pour me connecter simplement et en toute sécurité j’utilise le protocole SSH qui est parfaitement adapté à la situation. Voici les quelques configurations que j’applique systématiquement.

Je commence tout d’abord par me générer une paire de clés qui me serviront à me connecter par la suite. Cette étape peut n’être faite qu’une fois, puisqu’il suffira d’utiliser la même clé pour tous ses serveurs après. La commande est :

ssh-keygen -t rsa -b 2048

Ceci générera une paire de clés RSA de 2048 bits. Il suffit de suivre les instructions lors de la génération des clés pour mettre un mot de passe à ces clés. Je copie ensuite la clé publique générée dans <HOME>/.ssh/authorized_keys sur le serveur.

Je modifie ensuite le fichier /etc/ssh/sshd_config de la manière suivante pour appliquer mes réglages de sécurité (ATTENTION : sans accès physique à la machine, laisser le paramètre PasswordAuthentication à yes jusqu’à ce que la connexion soit réussie avec la clé, autrement il sera très contraignant d’arriver à se reconnecter) :

# Numéro du port en écoute sur lequel on se connecte
Port <NUMERO DE PORT>

# Vérifier que la version est bien la 2 car la version 1 avait une faille critique
Protocol 2

# Bannière affichée avant l’autorisation de connexion (Je le met rarement mais ça égaye un peu la console à la connexion)
#Banner /etc/issue.net

# Empêche la connexion directe en root
# N’empêche pas de se connecter en root depuis un autre utilisateur
PermitRootLogin no

# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key

# Temps en seconde pendant laquelle une connexion est ouverte sans être loggué
LoginGraceTime 10

# Nombre maximum d’essais d’authentification autorisés
MaxAuthTries 1

#Types d’authentifications autorisés
PubkeyAuthentication yes
RSAAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
UsePAM no
PasswordAuthentication no

# Fichier contenant les clés autorisées
AuthorizedKeysFile %h/.ssh/authorized_keys

#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Logging
SyslogFacility AUTH
LogLevel INFO

# check file modes and ownership of the user’s files and home directory before accepting login
StrictModes yes

# Don’t read the user’s ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don’t trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no
#MaxStartups 10:30:60

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

# Set this to ‘yes’ to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of « PermitRootLogin without-password ».
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to ‘no’.

# La plupart du temps je n’autorise que mon compte à se connecter
AllowUsers <NOM_DES_UTILISATEURS_AUTORISES>

# Si il faut mettre plusieurs comptes, mieux vaut utiliser ceci
#AllowGroups <NOM_DU_GROUPE_AUQUEL_APPARTIENNENT_TOUS_LES_COMPTES_AUTORISES>

# On peut aussi choisir de refuser juste certains utilisateurs/groupes
#DenyUsers <NOM_DES_UTILISATEURS_REFUSES>
# DenyGroups <NOM_DU_GROUPE_AUQUEL_APPARTIENNENT_TOUS_LES_COMPTES_REFUSES>

Une fois ce fichier modifié, je relance ssh à l’aide de :

/etc/init.d/ssh restart

et me voilà avec un serveur disposant d’une connexion SSH correctement sécurisée.

Configuration de grub

Installant toujours plusieurs systèmes d’exploitations sur mon ordinateur portable, j’ai besoin d’un bootloader me permettant de switcher facilement entre eux. Je détaillerais dans un prochain article les différents systèmes d’exploitation que j’utilise.

La version de grub que j’utilise est la version Grub 2 aussi connue sous le nom de grub-pc  (à l’opposé de la version 1, aussi nommée, grub-legacy).

Le fichier de configuration qui sera lu à chaque démarrage est le fichier /boot/grub/grub.cfg. Ce fichier est reconstruit à chaque fois qu’une nouvelle version du noyau est installée, ou, plus globalement à chaque fois que la commande grub-mkconfig est exécutée. Elle se sert des scripts situés dans /etc/grub.d/ pour générer le fichier de boot, ainsi que de /etc/default/grub.

Mes besoins de personnalisation de grub se limitent à l’édition de /etc/default/grub que je modifie comme ceci :

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=5
GRUB_GFXMODE=1920×1080
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT= »quiet splash »
GRUB_CMDLINE_LINUX= » »

Je boot ainsi sur le premier élément de ma liste par défaut après 5 secondes si aucune touche n’est pressée.

Pour avoir plus de détail sur les options de ce fichier, on peut lancer la commande :

info -f grub -n 'Simple configuration'

Je rajoute depuis peu une image de fond à grub. Contrairement à grub-legacy, ceci est d’une simplicité déconcertante puisqu’il suffit de copier une image dans /boot/grub pour qu’elle soit automatiquement détectée et ajoutée à grub.cfg lors de sa génération. La première image rencontrée par ordre alphabétique est utilisée. Les formats jpg, png et tga sont supportés. Si l’on souhaite le faire manuellement, il est possible de spécifier le chemin de l’image avec l’option « GRUB_BACKGROUND=« .

Enfin, je supprime toujours memtest86+ dans /boot/ pour ne pas avoir une entrée dans le menu alors que je ne fais des tests mémoires que quand je rencontre des problèmes matériels (autant dire presque jamais).

Je compte rajouter un mot de passe sous peu pour bloquer l’accès à l’édition des commandes de boot. Ceci permet en effet de pallier à une faille de sécurité importante, conservée pour permettre le changement du mot de passe root en cas d’oublie, et qui permet de lancer un shell en super utilisateur, sans demander de mot de passe.

Configuration du serveur FTP

Je voulais un serveur FTP pour pouvoir partager des données facilement et surtout pour avoir un espace de stockage accessible depuis n’importe où. Le premier besoin était de transmettre un gros fichier sans être limité par les quotas d’un mail.

Après avoir cherché un peu sur internet, j’ai décidé d’utiliser vsftpd mais d’autres font tout aussi bien l’affaire (proFTPd par exemple). Je l’ai donc installé avec :

apt-get install vsftpd

Je voulais que chaque utilisateur ait un espace qui lui est propre mais aussi un dossier qui serait commun à tous pour faciliter le partage. J’ai modifié le fichier de configuration ainsi :

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
ftpd_banner=Bienvenue sur mon FTP
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

Ceci me permet de garder chaque utilisateur dans son dossier avec des droits de lecture et d’écriture.

EDIT : ATTENTION : Ce qui suit est absolument nul, faisable avec des options sur les commandes de base sans avoir besoin de faire des scripts compliqués, sera supprimé dès que je me serais re-penché sur la question et a été supprimé de mon serveur tellement c’est lourd. Last but not least : le dossier de partage ne fonctionne pas. 

Pour le dossier de partage, j’ai utilisé ce que je qualifierais de patch parce que lourd à mettre en place et à maintenir. Je cherche un moyen plus efficace de faire la même chose.J’ai actuellement procédé ainsi :

mkdir /home/partage
groupadd ftpusers
chown root /home/partage
chgrp ftpusers /home/partage

Maintenant, à la création de chaque utilisateur, on le rendra membre du groupe ftpusers, on créera un dossier de partage et on montera /home/partage dedans. En plus, j’ai fait manuellement toutes ces opérations parce que je n’avais pas lu la manpage de useradd. Tout ceci peut donc évidemment être amélioré.

Voici les deux scripts que j’utilise actuellement pour créer et supprimer des utilisateurs :

Création :

#!/bin/sh
group="/etc/group";
fstab="/etc/fstab";

if [ -z $1 ]
 then
		echo "Usage : $0 username";
		echo "This script was designed to add a user and to give him an access to the shared zone";
 else
		useradd $1;
		mkdir -p /home/$1/partage;
		chown -R $1 /home/$1;
		chgrp -R $1 /home/$1;
		chmod 740 /home/$1
		mount --bind /home/partage /home/$1/partage;
		cp $group $group~
		sed -i "/ftpusers*/ s/.*/&amp;,$1/" $group;
		echo "/home/partage\t/home/$1/partage\tnone\tbind,defaults,auto\t0\t0" &gt;&gt; $fstab;
		echo "Initialisation du mot de passe\n";
		passwd $1;
		echo "User $1 created with success";
 fi

Suppression :

#!/bin/sh
fstab="/etc/fstab";

if [ -z $1 ]
then
        echo "Usage : $0 username";
        echo "This script was designed to add a user and to give him an access to the shared zone";
else
        umount /home/$1/partage;
        userdel $1;
        mv /home/$1 /home/archive;
        sed -i "/*$1*/ s/.*//" $fstab;
        sed -i '/^$/d' $fstab;
        echo "User $1 deleted with success";
fi

Je me rend compte en écrivant cet article que je ne supprime pas la ligne correspondante dans fstab.

A la suppression je déplace l’utilisateur dans le dossier archive au cas où il aurait fallut récupérer des données lui appartenant.

Je pense que ce que je veux faire est possible avec des utilisateurs virtuels. Ce sera mon prochain fil de recherche.

Configuration et mise en place de WordPress

Voici un petit article uniquement consacré à WordPress puisque j’ai décidé de l’héberger moi même désormais.

Après pas mal de temps à chercher quels étaient les droits à donner aux différents dossiers pour que WordPress cesse de m’afficher des erreurs de permissions dès qu’il essaye de faire quelque chose, je me suis rendu compte qu’il suffisait d’attribuer www-data comme utilisateur et groupe pour que tout fonctionne. En réalité, j’ai fait un wget pour récupérer la dernière version directement sur le serveur et je l’ai décompressée (tar -xzf latest.tar.gz). Il s’est chargé de conserver les droits.

En ce qui concerne la base de donnée MySql, je voulais créer un utilisateur de blog qui aurait la possibilité de gérer toute la base sans pouvoir toucher aux autres.
J’ai donc fait :

CREATE DATABASE <NOM_DE_LA_BASE>;
GRANT ALL PRIVILEGES ON `<NOM_DE_LA_BASE>`.* TO '<LOGIN>'@'localhost' IDENTIFIED BY '<MOT_DE_PASSE>';

J’obtiens ainsi un utilisateur qui a un accès total à la base de donnée de WordPress, qui ne peut se connecter qu’en local et qui ne peut pas toucher à mes autres BDD.

Pour ce qui est de la réécriture des liens afin d’avoir des permalinks facilement lisibles, j’ai dû activer le module rewrite d’apache en tapant la commande :

a2enmod rewrite

Il m’a fallut ensuite modifier dans /etc/apache2/site-available le fichier default en remplaçant dans la sous-catégorie correspondante à mon site (en l’occurrence <Directory /var/www>) « AllowOverride None » par «  »AllowOverride All ».

Il ne me reste alors plus qu’à configurer le CMS depuis l’interface d’installation disponible depuis l’adresse du site.

Lancement

Après avoir hésiter à réincorporer les posts de mon anciens blog, voici le nouveau en place. Comme je l’explique dans la section « About », je ne destine plus ce blog au développement. Il me servira plus à retrouver des informations que j’ai pu chercher par le passé, qu’à voir l’évolution de mes logiciels.

En ce qui concerne l’hébergement, j’ai profité d’une offre étudiante sur http://www.ikoula.com/. Je possède ainsi un serveur dédié pendant 1 an ayant comme configuration :

  • 1 CPU virtuel Intel Xéon
  • 512 Mo de RAM
  • 25 Go de disque dur
  • Debian 6 64bits
  • 100 Mbs (full duplex, interne/externe) de bande passante

ainsi que le nom de domaine laurentsanselme.com (avec autant de sous-domaine que je le désire) gratuitement.

J’ai par ailleurs pu tester la qualité de leur service consommateur et il est irréprochable. Chaque problème que je rencontrais a été résolu à l’aide de messages personnalisés et répondant à mon cas précis dans l’heure qui suivait ma demande.

Je vais donc profiter de mon année pour continuer de tester cet hébergeur mais il se peut que j’y reste par la suite. Je teste d’ailleurs sur plusieurs plans à la fois puisque j’ai aussi profité de leur offre hébergement web gratuit pendant un an avec un nom de domaine et 80 Go de stockage. Je donnerais donc des retours.