Appliquer des correctifs de sécurité est une part importante de la maintenance de logiciels informatiques tout particulièrement dans le cas du système d'exploitation. Pendant très longtemps sous FreeBSD, ce processus n'était pas aisé. Les correctifs devaient être appliqués au code source, le code ensuite recompilé sous forme de binaires, et enfin les binaires devaient être ré-installés.
Ce processus n'est plus de mise comme FreeBSD dispose
désormais d'un utilitaire appelé simplement
freebsd-update
. Cet utilitaire fournit deux
fonctions distinctes. Tout d'abord, il permet l'application de
mises à jour de correction et de sécurité
sur le système de base de FreeBSD sans nécessiter une
compilation et une ré-installation. En second lieu,
l'utilitaire supporte les mises à jour mineures et
majeures des versions publiées.
Les mise à jour binaires sont disponibles pour
toutes les architectures actuellement supportées par
l'équipe de sécurité. Avant de mettre
à jour vers une nouvelle version, les annonces
concernant la version devront être passées en
revue sachant qu'elles peuvent contenir des informations
importantes au sujet de cette version. Ces annonces peuvent
être consultées à l'adresse suivante:
http://www.FreeBSD.org/releases/
.
S'il existe une table crontab
utilisant
freebsd-update
, elle doit être
désactivée avant de démarrer les
opérations qui vont suivre.
Certains utilisateurs peuvent souhaiter adapter le fichier
de configuration par défaut
/etc/freebsd-update.conf
, permettant un
meilleur contrôle du processus. Les options sont
très bien documentées, mais les suivantes
demandent un peu plus d'explication:
# Composants du système de base qui doivent être maintenus à jour. Components src world kernel
Ce paramètre contrôle quelles sont les
parties de FreeBSD qui seront mises à jour. Par
défaut on met à jour le code source,
l'intégralité du système de base et le
noyau. Les composants sont les mêmes que ceux
disponibles durant l'installation, par exemple, ajouter
world/games
ici permettrait d'appliquer les
correctifs relatifs aux jeux. Utiliser
src/bin
permettrait la mise à jour
du code source du répertoire src/bin
.
La meilleure option est de laisser telle quelle la configuration par défaut car la modifier pour ajouter des éléments particuliers demandera à l'utilisateur de lister chaque élément qu'il désire mettre à jour. Cela pourrait avoir des conséquences désastreuses puisque le code source et les binaires peuvent à terme ne plus être en phase.
# Les chemins d'accès commençant par quelque chose correspondant à une # entrée de type IgnorePaths seront ignorés. IgnorePaths
Ajoute les chemins d'accès comme /bin
ou /sbin
pour préserver
intacts ces répertoires durant le processus de mise
à jour. Cette option peut être utilisée
pour empêcher freebsd-update
d'écraser des modifications locales.
# Les chemins d'accès qui commencent par quelque chose correspondant à # une entrée de type UpdateIfUnmodified seront mis à jour que si le # contenu du fichier n'a pas été modifié par l'utilisateur (à moins # que les modifications ne soient fusionnées; voir plus bas). UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
Met à jour les fichiers de configuration dans les
répertoires désignés seulement s'ils
n'ont pas été modifiés. Tout changement
effectué par l'utilisateur invalidera automatiquement
la mise à jour de ces fichiers. Il existe une autre
option KeepModifiedMetadata
qui indiquera
à freebsd-update
de sauvegarder les
changements durant la fusion.
# Quand on met à jour vers une nouvelle version de FreeBSD, les fichiers # correspondant à une entrée de type MergeChanges verront leurs # différences locales fusionnées avec le fichier de la nouvelle # version de FreeBSD. MergeChanges /etc/ /var/named/etc/
Liste des répertoires avec des fichiers de
configuration que freebsd-update
devrait
tenter de fusionner. Le processus de fusion des fichiers est
l'application d'une série de correctifs diff(1)
similaires à ceux de mergemaster(8) avec cependant
moins d'options, les fusions sont soit acceptées,
ouvrant un éditeur, soit abandonnées par
freebsd-update
. En cas de doute,
sauvegardez /etc
et
acceptez les fusions. Consultez la section sur Section 25.7.11.1, « mergemaster
» pour plus d'information sur la commande
mergemaster
.
# Répertoire dans lequel stocker les mise à jour téléchargées et les # fichiers temporaires utilisés par la mise à jour de FreeBSD. # WorkDir /var/db/freebsd-update
Ce répertoire est l'endroit où tous les correctifs et les fichiers temporaires seront placés. Dans les cas où l'utilisateur effectue une mise à jour de version, cet emplacement doit disposer d'au moins un gigaoctet d'espace disponible.
# Lors de mises à jour entre versions de FreeBSD, doit-on lire la liste # de composants de manière stricte (StrictComponents yes) # ou tout simplement comme une liste de composants qui *pourraient* # être installés et pour lesquels la mise à jour de FreeBSD devrait # déterminer lesquels sont effectivement installés et les mettre à # jour (StrictComponents no)? # StrictComponents no
Cette option fixée à yes
,
freebsd-update
supposera que la liste de
composants est complète et n'essaiera pas d'effectuer
des modifications en dehors de cette liste.
Concrètement, freebsd-update
tentera
de mettre à jour chaque fichier appartenant à la
liste de composants.
Les correctifs de sécurité sont stockés sur une machine distante et peuvent être téléchargés et installés en utilisant la commande suivante:
#
freebsd-update fetch
#
freebsd-update install
Si des correctifs ont été appliqués
au noyau le système devra être
redémarré. Si tout s'est bien passé le
système est corrigé et
freebsd-update
pourra être
exécuté chaque nuit via un processus
cron(8). Une entrée dans le fichier
/etc/crontab
devrait être
suffisante pour accomplir cette tâche:
@daily root freebsd-update cron
Cette entrée indique qu'une fois par jour,
l'utilitaire freebsd-update
sera
exécuté. De cette manière, en employant
l'option cron
,
freebsd-update
vérifiera seulement
l'existence de mises à jour. Si des correctifs
existent, il seront automatiquement
téléchargés sur le disque local mais
non-appliqués. L'utilisateur root
sera contacté par courrier électronique, il
pourra ainsi les installer manuellement.
Si quelque s'est mal passé,
freebsd-update
a la capacité
d'annuler le dernier ensemble de changements avec la commande
suivante:
#
freebsd-update rollback
Une fois la commande achevée, le système devra être redémarré si le noyau ou un de ses modules ont été modifiés. Cela permettra à FreeBSD de charger en mémoire les nouveaux binaires.
L'utilitaire freebsd-update
peut mettre
à jour uniquement et automatiquement le noyau
GENERIC
. Si un noyau personnalisé
est utilisé, il devra être recompilé et
réinstallé après que la commande
freebsd-update
ait achevé
l'installation du reste des mises à jour. Cependant
freebsd-update
détectera et mettra
à jour le noyau GENERIC
dans
/boot/GENERIC
(s'il
existe), et cela même si ce n'est pas le noyau actuel
(qui tourne) du système.
C'est toujours une bonne idée de conserver une
copie du noyau GENERIC
dans /boot/GENERIC
. Cela sera utile
pour diagnostiquer une variété de
problèmes, et lors des mises à jour utilisant
freebsd-update
comme décrit dans
la Section 25.2.3, « Mises à jour mineures et majeures ».
A moins que la configuration par défaut
présente dans
/etc/freebsd-update.conf
n'ait
été modifiée,
freebsd-update
installera les sources du
noyau mises à jour avec le reste des mises à
jour. La recompilation et la réinstallation d'un noyau
personnalisé peuvent effectuées de la
manière classique.
Les mises à jour distribuées via
freebsd-update
, n'impliquent pas toujours
le noyau. Il ne sera pas nécessaire de recompiler
votre noyau personnalisé si les sources du noyau
n'ont pas été modifiées par
l'exécution de freebsd-update
install
. Cependant
freebsd-update
met toujours à jour
le fichier
/usr/src/sys/conf/newvers.sh
. Le
niveau ou la version de correctifs (comme indiqué par
le nombre -p
rapporté par
uname -r
) est obtenu à partir de
ce fichier. Recompiler votre noyau personnalisé,
même si rien d'autre n'a changé, permettra
à la commande uname(1) de rapporter
précisément le niveau de correctifs du
système. C'est particulièrement utile quand
on gère de multiples systèmes, car cela permet
une évaluation rapide des mises à jour
présentes sur chacun d'eux.
Ce processus supprimera les anciens fichiers objets et bibliothèques qui rendent inutilisables la plupart des applications tierce-partie. Il est recommandé que tous les logiciels portés soient supprimés et réinstallés ou mis à jour ultérieurement en utilisant l'outil ports-mgmt/portupgrade. La plupart des utilisateurs voudront lancer une compilation test à l'aide de la commande suivante:
#
portupgrade -af
Cela garantira que tout sera réinstallé
correctement. Notez que fixer la variable d'environnement
BATCH
à yes
répondra yes
à toute question
lors de ce processus, supprimant ainsi la
nécessité d'une intervention humaine durant le
processus de compilation.
Si un noyau personnalisé est utilisé, le
processus de mise à jour est un peu plus complexe. Une
copie du noyau GENERIC
est
nécessaire et devrait être placée dans le
répertoire /boot/GENERIC
. Si le noyau
GENERIC
n'est pas présent sur le
système, il peut être obtenu en utilisant une des
méthodes suivantes:
Si un noyau personnalisé a déjà
été compilé, le noyau présent
dans /boot/kernel.old
est en fait
le noyau GENERIC
. Renommer ce
répertoire en /boot/GENERIC
.
En supposant qu'un accès physique à la
machine est possible, une copie du noyau
GENERIC
peut être installé
à partir d'un CD-ROM. Insérer votre disque
d'installation et utiliser les commandes suivantes:
#
mount /cdrom
#
cd /cdrom/X.Y-RELEASE/kernels
#
./install.sh GENERIC
Remplacer X.Y-RELEASE
avec la version que vous utilisez. Le noyau
GENERIC
sera installé par
défaut dans /boot/GENERIC
.
En dehors de ce qui précède le noyau
GENERIC
peut être
recompilé et installé à partir des
sources:
#
cd /usr/src
#
env DESTDIR=/boot/GENERIC make kernel
#
mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
#
rm -rf /boot/GENERIC/boot
Pour que ce noyau soit pris en compte comme
GENERIC
par
freebsd-update
, le fichier de
configuration GENERIC
devra ne pas
avoir été modifié. Il est
également suggéré qu'il soit
compilé sans aucune option particulière (de
préférence avec un fichier
/etc/make.conf
vide).
Redémarrer avec le noyau GENERIC
n'est pas nécessaire à ce stade.
Les mises à jour de versions majeures et mineures
peuvent être effectuées en passant à la
commande freebsd-update
la version vers
laquelle on désire mettre à jour, par exemple,
la commande suivante effectuera la mise à jour vers
FreeBSD 8.1:
#
freebsd-update -r 8.1-RELEASE upgrade
La commande freebsd-update
analysera le
fichier de configuration et le système afin de
récupérer les informations nécessaires
à la mise à jour du système. A
l'écran s'affichera quels sont les composants
détectés et quels sont ceux qui n'ont pas
été détectés. Par exemple:
Looking up update.FreeBSD.org mirrors... 1 mirrors found. Fetching metadata signature for 8.0-RELEASE from update1.FreeBSD.org... done. Fetching metadata index... done. Inspecting system... done. The following components of FreeBSD seem to be installed: kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin world/base world/info world/lib32 world/manpages The following components of FreeBSD do not seem to be installed: kernel/generic world/catpages world/dict world/doc world/games world/proflibs Does this look reasonable (y/n)? y
A ce niveau freebsd-update
tentera de
télécharger tous les fichiers nécessaires
à la mise à jour. Dans certains cas
l'utilisateur sera interrogé sur ce qu'il faut
installer ou sur comment procéder à certaines
actions.
Si un noyau personnalisé est utilisé, l'étape précédente produira un avertissement semblable au suivant:
WARNING: This system is running a "MYKERNEL
" kernel, which is not a
kernel configuration distributed as part of FreeBSD 8.0-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running "/usr/sbin/freebsd-update install"
Cet avertissement peut sans risque être
ignoré à ce niveau. Le noyau
GENERIC
mis à jour sera
utilisé comme une étape intermédiaire
dans le processus de mise à jour.
Une fois l'ensemble des correctifs
téléchargé sur le système local,
ils seront appliqués. Ce processus peut prendre plus
ou moins de temps en fonction de la vitesse et de la charge de
la machine. Les fichiers de configuration seront
fusionnés — cette partie du processus
demande l'intervention de l'utilisateur car un fichier peut
être automatiquement fusionné ou en cas de besoin
un éditeur peut apparaître sur l'écran
pour une fusion manuelle. Les résultats des fusions
réussies seront affichés au fur et à
mesure que se déroule l'opération. Un
échec ou une fusion ignorée provoqueront
l'arrêt du processus. Certains utilisateurs peuvent
vouloir conserver une sauvegarde du répertoire
/etc
et fusionner plus
tard à la main les fichiers importants comme
master.passwd
ou
group
.
Le système n'a pas encore été réellement modifié, les fusions et l'application des correctifs ont lieu dans un autre répertoire. Quand tous les correctifs ont été appliqués avec succès, que tous les fichiers de configuration ont été fusionnés et que le processus s'est déroulé sans problème, les modifications devront être appliquées définitivement au système par l'utilisateur.
Une fois les opérations précédentes achevées, la mise à jour peut être appliquée en utilisant la commande suivante:
#
freebsd-update install
Le noyau et les modules seront corrigés les
premiers. A ce moment la machine doit être
obligatoirement redémarrée. Si le
système utilisait un noyau personnalisé,
utiliser la commande nextboot(8) pour indiquer le noyau
/boot/GENERIC
(qui a
été mis à jour) pour le prochain
démarrage:
#
nextboot -k GENERIC
Avant de redémarrer sur le noyau
GENERIC
, assurez-vous qu'il contient tous
les pilotes nécessaires pour que votre système
démarre correctement (et se connecte au
réseau, si la mise à jour de la machine se
fait à distance). En particulier, si le noyau
précédemment utilisé contient des
fonctions généralement fournies par des
modules, faites en sorte de charger temporairement ces
modules avec le noyau GENERIC
à
l'aide de /boot/loader.conf
. Vous
pouvez également avoir intérêt à
désactiver les services non-indispensables, les
montages réseaux ou disques, etc. avant que le
processus de mise à jour ne soit
achevé.
La machine doit maintenant être redémarrée avec le noyau mis à jour:
#
shutdown -r now
Une fois la machine de nouveau active,
freebsd-update
devra être
lancée à nouveau. L'état du processus de
mise à jour a été sauvegardé, et
donc freebsd-update
ne recommencera pas au
début, mais supprimera les anciens fichiers objet et
bibliothèques partagées. Afin de poursuivre les
opérations, taper la commande suivante:
#
freebsd-update install
En fonction d'un changement ou non de numérotation d'une ou plusieurs bibliothèques, il pourra y avoir deux phases d'installation au lieu de trois.
Tous les logiciels tierce-partie doivent être maintenant recompilés et réinstallés. Cela est nécessaire comme certains logiciels peuvent dépendre de bibliothèques qui ont été supprimées lors du processus de mise à jour. La commande ports-mgmt/portupgrade peut être employée pour automatiser la chose. Les commandes suivantes peuvent être utilisées pour initier le processus:
#
portupgrade -f ruby
#
rm /var/db/pkg/pkgdb.db
#
portupgrade -f ruby18-bdb
#
rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db
#
portupgrade -af
Une fois cela effectué, terminer le processus de
mise à jour avec un dernier appel à
freebsd-update
. Taper la commande suivante
pour régler les derniers détails:
#
freebsd-update install
Si le noyau GENERIC
a été
utilisé temporairement, il est temps de compiler et
d'installer un nouveau noyau personnalisé suivant la
méthode habituelle.
Redémarrer la machine avec la nouvelle version de FreeBSD. Le processus de mise à jour est terminé.
L'utilitaire freebsd-update
peut
être utilisé pour comparer l'état du
système FreeBSD installé avec une copie de
confiance. Cette fonctionnalité inspecte la version
actuelle des utilitaires système, des
bibliothèques et des fichiers de configuration. Pour
lancer la comparaison, utiliser la commande suivante:
#
freebsd-update IDS >> outfile.ids
Bien que le nom de la commande soit
IDS, elle ne devrait en aucun cas
être considérée comme un système
de détection d'intrusion du type de security/snort. Etant
donné que freebsd-update
stocke
des données sur le disque, le risque de modification
des données est évident. Alors que cette
possibilité peut être minimisée en
utilisant le paramétrage
kern.securelevel
et en stockant les
données freebsd-update
sur un
système de fichiers en lecture seule quand elles ne
sont pas utilisées, une bien meilleure solution
serait de comparer le système avec un disque
sécurisé comme un DVD ou un
disque USB conservé à
l'extérieur.
Le système sera analysé, et une liste de
fichiers ainsi que la valeur de leur empreinte
numérique sha256(1), celle de la version d'origine
et celle de la version actuellement installée, seront
affichés. C'est pour cela que cet affichage est
copié dans le fichier outfile.ids
.
L'affichage défile trop rapidement une comparaison
visuelle et remplira rapidement le tampon de la
console.
Ces lignes sont également très longues mais le format de sortie peut être facilement passé par une analyse syntaxique. Par exemple, pour obtenir une liste des fichiers qui diffèrent avec ceux de la version d'origine, utiliser la commande suivante:
#
cat outfile.ids | awk '{ print $1 }' | more
/etc/master.passwd /etc/motd /etc/passwd /etc/pf.conf
La sortie de cette commande a été
tronquée, bien plus de fichiers sont concernés.
Certains de ces fichiers sont naturellement modifiés,
le fichier /etc/passwd
a
été modifié en raison de l'ajout
d'utilisateurs au système. Dans certains cas, d'autres
fichiers apparaîtrons, comme les modules du noyau, qui
diffèrent puisque freebsd-update
peut les avoir mis à jour. Pour exclure des fichiers
ou des répertoires spécifiques, ajoutez-les au
paramètre IDSIgnorePaths
dans le
fichier /etc/freebsd-update.conf
.
Ce système peut prendre part à une méthode de mise à jour élaboré, en dehors de ce qui a été présenté précédemment.
Ce document, ainsi que d'autres peut être téléchargé sur ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Pour toutes questions à propos de FreeBSD, lisez la
documentation avant de contacter
<questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez
<doc@FreeBSD.org>.