Étapes recommandées pour les nouveaux serveurs FreeBSD 10.1

De Get Docs
Aller à :navigation, rechercher

Introduction

Lors de la configuration d'un nouveau serveur FreeBSD, vous pouvez suivre un certain nombre d'étapes facultatives pour mettre votre serveur dans un état plus convivial pour la production. Dans ce guide, nous aborderons certains des exemples les plus courants.

Nous verrons comment configurer un pare-feu simple et facile à configurer qui refuse la plupart du trafic. Nous nous assurerons également que le fuseau horaire de votre serveur reflète précisément son emplacement. Nous allons configurer l'interrogation NTP afin de maintenir l'heure exacte du serveur et, enfin, nous montrerons comment ajouter de l'espace d'échange supplémentaire à votre serveur.

Avant de commencer avec ce guide, vous devez vous connecter et configurer votre environnement shell comme vous le souhaitez. Vous pouvez découvrir comment procéder en suivant ce guide.

Comment configurer un pare-feu IPFW simple

La première tâche que nous allons aborder consiste à mettre en place un pare-feu simple pour sécuriser notre serveur.

FreeBSD prend en charge et inclut en fait trois pare-feu distincts, chacun avec ses propres forces et faiblesses. Ceux-ci sont appelés pf, ipfw et ipfilter. Dans ce guide, nous utiliserons ipfw car nous pouvons facilement être opérationnels avec un pare-feu sécurisé et dynamique.

Configuration du pare-feu de base

La quasi-totalité de notre configuration aura lieu dans le fichier /etc/rc.conf. Ouvrez ce fichier avec les privilèges sudo dans votre éditeur :

sudo vi /etc/rc.conf

À l'intérieur, nous devrons ajouter un certain nombre de lignes différentes pour activer et contrôler le fonctionnement du pare-feu ipfw. Commençons par les règles essentielles. Ajoutez-les au bas du fichier :

. . .

firewall_enable="YES"
firewall_quiet="YES"

Comme vous pouvez vous y attendre, la première ligne active le pare-feu ipfw, le démarrant automatiquement au démarrage et lui permettant d'être démarré avec les commandes habituelles service.

La deuxième commande indique à ipfw de ne rien sortir sur la sortie standard lorsqu'il effectue certaines actions. Cela peut sembler être une question de préférence, mais cela affecte en fait la fonctionnalité du pare-feu.

Deux facteurs se combinent pour en faire une option importante. La première est que le script de configuration du pare-feu est exécuté dans l'environnement shell actuel, et non en tâche de fond. La seconde est que lorsque la commande ipfw lit un script de configuration sans l'indicateur "quiet", elle lit et sort chaque ligne, à tour de rôle, vers la sortie standard. Lorsqu'il sort une ligne, il immédiatement exécute l'action associée.

La plupart des fichiers de configuration de pare-feu vident les règles actuelles en haut du script afin de commencer avec une table rase. Si le pare-feu ipfw rencontre une ligne comme celle-ci sans l'indicateur silencieux, il videra immédiatement toutes les règles et reviendra à sa politique par défaut, qui consiste généralement à refuser toutes les connexions. Si vous configurez le pare-feu sur SSH, cela supprimera la connexion, fermera la session shell en cours et aucune des règles qui suivent ne sera traitée, ce qui vous empêchera d'accéder au serveur. Le drapeau silencieux permet essentiellement au pare-feu de traiter les règles comme un ensemble au lieu de les implémenter individuellement.

Après ces deux lignes, nous pouvons commencer à configurer le comportement du pare-feu :

. . .

firewall_type="workstation"
firewall_myservices="22 80"
firewall_allowservices="any"
firewall_logdeny="YES"

Tout d'abord, nous sélectionnons "poste de travail" comme type de pare-feu que nous allons configurer. Il s'agit d'un pare-feu avec état avec un bon comportement par défaut. Cela nous permet également de personnaliser facilement les services auxquels nous voulons que les clients puissent accéder en utilisant les options firewall_myservices et firewall_allowservices. Enfin, nous configurons ipfw pour consigner toutes les connexions refusées par les règles configurées.

L'option firewall_myservices doit être définie sur une liste de ports ou de services TCP, séparés par des espaces, qui doivent être accessibles sur votre serveur. Vous pouvez utiliser les ports, comme nous l'avons fait ici (nous avons configuré le port 22 pour notre connexion SSH et le port 80 pour un serveur Web HTTP conventionnel). Vous pouvez également utiliser les services par leur nom. Les services que FreeBSD connaît par leur nom sont listés dans le fichier /etc/services. Par exemple, nous pourrions changer ce qui précède en quelque chose comme ceci :

firewall_myservices="ssh http"

Cela aurait les mêmes résultats. Si vous utilisez SSL sur votre serveur Web, assurez-vous d'ajouter le port 443 ou le service https à cette liste.

Les éléments de la liste firewall_allowservices sont les clients qui doivent être autorisés à accéder aux services fournis. Le mot-clé « any » signifie que n'importe quel client peut accéder à ces services. Si nous voulions limiter les clients pouvant se connecter à nos services, nous pourrions le faire ici.

L'option firewall_logdeny indique à ipfw de consigner toutes les tentatives de connexion refusées dans un fichier situé dans /var/log/security.

Au total, cette partie du fichier /etc/rc.conf devrait ressembler à ceci :

. . .

firewall_enable="YES"
firewall_quiet="YES"
firewall_type="workstation"
firewall_myservices="22 80"
firewall_allowservices="any"
firewall_logdeny="YES"

N'oubliez pas d'ajuster l'option firewall_myservices pour référencer les services que vous souhaitez exposer aux clients. Lorsque vous avez terminé, enregistrez et fermez le fichier.

Autoriser les connexions UDP

Les ports et services répertoriés dans l'option firewall_myservices du fichier /etc/rc.conf permettent l'accès aux connexions TCP. Si vous souhaitez exposer des services qui utilisent UDP, vous devez modifier le fichier /etc/rc.firewall :

sudo vi /etc/rc.firewall

Nous avons configuré notre pare-feu pour utiliser le type de pare-feu "poste de travail", alors recherchez une section qui ressemble à ceci :

. . .

[Ww][Oo][Rr][Kk][Ss][Tt][Aa][Tt][Ii][Oo][Nn])

. . .

Il y a une section dans ce bloc qui est dédiée au traitement des valeurs firewall_allowservices et firewall_myservices que nous définissons. Il ressemblera à ceci:

for i in ${firewall_allowservices} ; do
  for j in ${firewall_myservices} ; do
    ${fwcmd} add pass tcp from $i to me $j
  done
done

Après cette section, vous pouvez ajouter tous les services ou ports qui doivent accepter les paquets UDP en ajoutant des lignes comme celle-ci :

${fwcmd} add pass udp from any to me port_num

Dans l'exemple ci-dessus, vous pouvez laisser le mot-clé "any" si la connexion doit être autorisée pour tous les clients ou le remplacer par une adresse IP ou une plage de réseau spécifique. Le port_num ci-dessus doit être remplacé par le numéro de port ou le nom du service auquel vous souhaitez autoriser l'accès UDP. Par exemple, si vous utilisez un serveur DNS, vous souhaiterez peut-être avoir une ligne qui ressemble à ceci :

for i in ${firewall_allowservices} ; do
  for j in ${firewall_myservices} ; do
    ${fwcmd} add pass tcp from $i to me $j
  done
done

${fwcmd} add pass udp from 192.168.2.0/24 to me 53

Cela permettra à n'importe quel client de la portée du réseau 192.168.2.0/24 d'accéder à un serveur DNS fonctionnant sur le port standard 53. Notez que dans cet exemple, vous voudriez également ouvrir ce port pour les connexions TCP car il est utilisé par les serveurs DNS pour les réponses plus longues.

Enregistrez et fermez le fichier lorsque vous avez terminé.

Démarrage du pare-feu

Lorsque vous avez terminé votre configuration, vous pouvez démarrer le pare-feu en tapant :

sudo service ipfw start

Le pare-feu devrait s'afficher correctement, bloquant le trafic indésirable tout en respectant vos services et ports autorisés. Ce pare-feu démarrera automatiquement à chaque démarrage.

Nous voulons également configurer une limite sur le nombre de refus par adresse IP que nous enregistrerons. Cela empêchera nos journaux de se remplir à partir d'un seul utilisateur persistant. Vous pouvez le faire dans le fichier /etc/sysctl.conf :

sudo vi /etc/sysctl.conf

En bas du fichier, nous pouvons limiter notre journalisation à « 5 » en ajoutant :

net.inet.ip.fw.verbose_limit=5 

Enregistrez et fermez le fichier lorsque vous avez terminé. Cela configurera ce paramètre au prochain démarrage.

Pour implémenter ce même comportement pour votre session actuellement active, nous pouvons utiliser la commande sysctl elle-même, comme ceci :

sudo sysctl net.inet.ip.fw.verbose_limit=5

Cela devrait immédiatement implémenter la limite pour ce démarrage.

Comment définir le fuseau horaire de votre serveur

C'est une bonne idée de régler correctement le fuseau horaire de votre serveur. Il s'agit d'une étape importante lorsque nous configurons la synchronisation de l'heure NTP dans la section suivante.

FreeBSD est livré avec un outil basé sur un menu appelé tzsetup pour configurer les fuseaux horaires. Pour définir le fuseau horaire de votre serveur, appelez cette commande avec les privilèges sudo :

sudo tzsetup

Vous verrez le premier écran de menu, qui vous demande si votre horloge matérielle est réglée sur UTC ou sur l'heure locale :

Sélectionnez "Non" ici. Ensuite, il vous sera demandé de sélectionner la région du monde dans laquelle se trouve votre serveur :

Vous devrez ensuite choisir une sous-région ou un pays :

Enfin, sélectionnez le fuseau horaire spécifique qui convient à votre serveur :

Confirmez la sélection de fuseau horaire qui est présentée en fonction de vos choix.

À ce stade, le fuseau horaire de votre serveur doit correspondre aux sélections que vous avez effectuées.

Comment configurer NTP pour conserver une heure précise

Maintenant que le fuseau horaire est configuré sur notre serveur, nous pouvons configurer NTP, ou Network Time Protocol, sur notre serveur. Cela aidera à synchroniser l'heure de votre serveur avec celle des autres dans le monde. Ceci est important pour les interactions client-serveur sensibles au facteur temps ainsi que pour une journalisation précise.

Encore une fois, nous pouvons activer le service NTP sur notre serveur en ajustant le fichier /etc/rc.conf. Ouvrez ceci avec les privilèges sudo :

sudo vi /etc/rc.conf

Dans ce fichier, ajoutez la ligne suivante :

ntpd_enable="YES"

Nous devons également ajouter une deuxième ligne qui synchronisera l'heure de notre machine avec les serveurs NTP distants au démarrage. Ceci est nécessaire car cela permet à notre serveur de dépasser la limite de dérive normale lors de l'initialisation. Notre serveur sera probablement en dehors de la limite de dérive au démarrage car notre fuseau horaire sera appliqué avant le démarrage du démon NTP, ce qui décalera notre heure système :

ntpd_enable="YES"
ntpd_sync_on_start="YES"

Si nous n'avions pas cette ligne, notre démon NTP échouerait au démarrage en raison des paramètres de fuseau horaire qui faussent l'heure de notre système avant le processus de démarrage.

Enregistrez et fermez le fichier lorsque vous avez terminé.

Vous pouvez démarrer votre service ntpd en tapant :

sudo service ntpd start

Cela maintiendra l'heure de votre serveur en se synchronisant avec les serveurs NTP répertoriés dans /etc/ntp.conf.

Comment configurer un espace d'échange supplémentaire

Sur les serveurs FreeBSD configurés sur DigitalOcean, 1 gigaoctet d'espace de swap est automatiquement configuré quelle que soit la taille de votre serveur. Vous pouvez le voir en tapant :

sudo swapinfo -g

Il devrait afficher quelque chose comme ceci :

Device          1G-blocks     Used    Avail Capacity
/dev/gpt/swapfs         1        0        1     0%

Certains utilisateurs et applications peuvent avoir besoin de plus d'espace d'échange que cela. Ceci est facilement accompli en ajoutant un fichier d'échange.

La première chose que nous devons faire est d'allouer une partie du système de fichiers au fichier que nous voulons utiliser pour le swap. Nous utiliserons la commande truncate, qui peut rapidement allouer de l'espace à la volée.

Dans ce guide, nous placerons le fichier d'échange dans /swapfile, mais vous pouvez utiliser n'importe quel emplacement raisonnable dans le système de fichiers. Ce fichier fournira 1 gigaoctet supplémentaire d'espace d'échange. Vous pouvez ajuster ce nombre en modifiant la valeur donnée à l'option -s.

sudo truncate -s 1G /swapfile

Après avoir alloué l'espace, nous devons verrouiller l'accès au fichier. Les utilisateurs normaux ne devraient pas avoir accès au fichier :

sudo chmod 0600 /swapfile

Ensuite, associez un pseudo-périphérique à notre fichier et configurez-le pour qu'il se monte au démarrage en tapant :

sudo sh -c 'echo "md99 none swap sw,file=/swapfile,late 0 0" >> /etc/fstab'

La commande ci-dessus ajoute une ligne qui ressemble à ceci au fichier /etc/fstab :

md99 none swap sw,file=/swapfile,late 0 0

Une fois la ligne ajoutée à notre fichier /etc/fstab, nous pouvons activer le fichier d'échange pour la session en tapant :

sudo swapon -aqL

Nous pouvons vérifier que le fichier d'échange fonctionne maintenant en utilisant à nouveau la commande swapinfo :

sudo swapinfo -g

Vous devriez voir le périphérique supplémentaire (/dev/md99) associé à votre fichier d'échange :

Device          1G-blocks     Used    Avail Capacity
/dev/gpt/swapfs         1        0        1     0%
/dev/md99               1        0        1     0%
Total                   2        0        2     0%

Ce fichier d'échange sera monté automatiquement à chaque démarrage.

Conclusion

Les étapes décrites dans ce guide peuvent être utilisées pour amener votre serveur FreeBSD dans un état plus prêt pour la production. En configurant les éléments essentiels de base comme un pare-feu, la synchronisation NTP et un espace d'échange approprié, votre serveur peut être utilisé comme une bonne base pour les installations et services futurs.