Patcher et mettre à jour 
une machine OpenBSD

 

 

 




Pour mettre à jour une machine OpenBSD il vous faut : 
1 Rapatrier les sources
    1.1 En utilisant cvs
    1.2 En utilisant cvsup
2 Mettre à jour
    2.1 Recompiler une seule application ex : SSH
        2.1.1 Sans utiliser cvsup
        2.1.2 En utilisant cvsup
    2.2 Recompiler toute la machine depuis /usr/src
    2.3 Mettre à jour un package
    2.4 Mettre à jour via les ports
3 Passer d'une version d'OpenBSD à une version plus récente
    3.1 Exemple : passage de la 3.0 à la 3.1
    3.2 Exemple : passage de la 3.1 à la 3.2

1 Les sources OpenBSD

Le projet OpenBSD est géré sur un serveur CVS. Ce serveur dispose de deux branches :
La current : On trouve dans cette branche les derniers développements. Cette branche doit être réservée aux développeurs.
La stable : Cette version doit être choisie pour les serveurs en production.
Pour rapatrier les sources directement de ce serveur cvs, vous disposez de deux outils : cvs et cvsup.

Une autre possibilité est d'utiliser les snapshots, en fait les binaires qui sont fabriqués à partir de la branche current, que vous pouvez obtenir à partir du ftp (ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/).

Pour savoir si vous devez patcher votre machine OpenBSD, vous pouvez avoir sur le site d'OpenBSD dans l'espace patches la liste des patches de sécurité à appliquer. Je ne peux que vous conseiller de l'avoir régulièrement sous les yeux.Un petit script perl, à mettre dans la crontab ,qui vous alertera dès qu'un patche de sécu est sorti.

1.1 Utiliser cvs

CVS est un outil qui permet de mettre à jour les sources de votre machine, en allant les télécharger sur des serveurs cvs. En fait cvs est une commande en ligne. Pour en savoir plus sur cvs vous pouvez consulter la documentation suivante

Placez vous dans le répertoire /usr et 
# setenv CVSROOT anoncvs@anoncvs.ca.openbsd.org:/cvs  ou si vous utilisez le bourne shell export à la place de setenv.
# cvs -q get -rOPENBSD_3_0 -P src

vous pouvez aussi directement utiliser la ligne
cvs -danoncvs@anoncvs.ca.openbsd.org:/cvs get -rOPENBSD_3_0    src/chemin_de_ce_que_vouv_voulez

Si vous souhaitez l'ensemble de src, mettre simplement src.
Je ne détaille pas plus cette méthode, mais sachez qu'il est possible si vous êtes un peu parano d'utiliser ssh. Je vous renvoie à la doc en anglais sur le site d'OpenBSD.

1.2 Installer et utiliser cvsup

cvsup permet de mettre à jour les sources sur votre système. En fait il récupère les  mises à jour sur un serveur cvsupd et permet de ne pas avoir à taper des lignes de commandes à la cvs.
Le préalable est d'avoir installé les sources sur votre système (src.tar.gz et srcsys.tar.gz) que l'on trouve sur le cd ou sur le ftp d'OpenBSD, même si ce n'est pas obligatoire, cela vous fait gagner pas mal de temps la première fois, surtout sur des liens basse vitesse.

Si vous essayez d'installer cvsup en passant par les ports, vous allez avoir un problème avec modula-3 et pm3. Il vous indique qu'il a besoin de X11 (Si vous avez installé le serveur X cela ne doit pas poser de problème pour utiliser le port qui se trouve dans /usr/ports/net/cvsup).
Sinon télécharger sur le site d'openBSD le package cvsup-16.1f-no_x11-static.tgz, puis faire pkg_add cvsup-16.1f-no_x11-static.tgz. (ou directement en faisant pkg_add -v ftp://ftp.openbsd.org/pub/OpenBSD/3.2/packages/i386/cvsup-16.1f-no_x11-static.tgz)
Un pkg_info vous confirme que cvsup est bien installé. Vous pourriez choisir d'utiliser la version de cvsup qui gère l'affichage graphique (sans le -no_x11), mais vous devez alors avoir installé, au préalable l'ensemble de Xfree86.

Vous devez créer un fichier supfile que vous placez dans /etc par exemple. Vous allez alors indiquer quel serveur utiliser, quels fichiers télécharger ou placer les mises à jour sur votre serveur, et quelles mises à jour télécharger.
Ce fichier doit contenir les lignes suivantes :

*default host=cvsup.ac-creteil.fr       # Le serveur que vous souhaitez utiliser. (voir ici la liste des serveur cvsup).
*default prefix=/usr                                # Le répertoire ou vous souhaitez placer vos mises à jour. Par exemple pour mettre à jour les ports (avec OpenBSD-ports) indiquer simplement /usr.#Vous n'avez pas besion d'indiquer le sous répertoire ports.
*default base=/usr/local/cvsup               # Le répertoire ou cvsup va garder la trace des modifications (il faut le créer avant de lancer la commande).
*default tag=OPENBSD_3_2                # Si vous souhaitez indiquer un tag.  (pour avoir la version stable d'openBSD 3.2). Si vous ne mettez rien vous allez rapatrier l'ensemble du serveur CVS, donc une partie encore non stable (curent). A moins d'être un développeur je ne vous le conseille pas. 
*default release=cvs
*default delete use-rel-suffix
# Indiquez maintenant ce que vous souhaitez mettre à jour
#OpenBSD-all      ----------> tout
OpenBSD-src   ----------> Le répertoire /usr/src là ou vous avez installé les sources d'OpenBSD (src.tar.gz et srcsys.tar.gz)
#OpenBSD-www   --------> Uniquement la doc html
OpenBSD-ports  ---------> Mettre à jour vos ports.
#OpenBSD-x11 ------------> Mise à jour de Xfree
#OpenBSD-xf4  ------------> Mise à jour de Xfree4

Vous pouvez indiquer une branche différente par exemple entre OpenBSD-src tag=. et OpenBSD-ports en indiquant la branche de cvs que vous souhaitez utiliser dérrière OpenBSD-ports
.
Si vous avez une interface graphique lancez simplement cvsup supfile. Vous obtenez alors une interface graphique. Sinon lancez la commande
cvsup -g -L 2 /etc/cvs-supfile (-g pour ne pas avoir l'interface graphique). Cette commande est aussi utile pour automatiser cette opération.
Si vous souhaitez faire un test avant de mettre à jour afin de voir le résultat, créez un répertoire /tmp/test par exemple et lancer la commande
cvsup -g -L 2 supfile /tmp/test (il faut avoir créé le répertoire avant) Cela vous permet de faire des tests sans conséquences.
Si rien ne fonctionne, essayez de détruire le répertoire /usr/local/cvsup et de le recréer.

Vous avez mis à jour vos sources sur la machine. Et maintenant que faire. Et bien il faut mettre à jour la machine ;-)

2 Mettre à jour

Patcher une seule appli me parait d'un intérêt assez limité. Patcher n'est une opération ni anodine, ni quotidienne; par conséquent, autant tout patcher d'un coup.

2.1.1 une seule application sans utiliser cvsup : ex :Patcher SSH

Si vous avez installé les sources sur votre machine (src.tar.gz et srcsys.tar.gz) dans /usr/src, vous pouvez utiliser directement cvsup pour faire votre mise à jour. Dans /usr/src/usr.bin vous avez alors un répertoire ssh. Voir plus bas sur comment faire avec cvsup.
Si vous ne souhaitez pas installer les sources et utiliser cvsup (ou cvs) vous pouvez utiliser la méthode suivante :
Télécharger sur le site d'openBSD la dernière version d'openssh (pour moi Openssh.3.1-tar.gz) et le patch openbsd30-3.1.patch. 
Copier openssh.3.1-tar.tgz dans /usr/src/ssh par exemple. 
Faire un tar xvfz openssh.3.1-tar.tgz. Aller dans le répertoire obtenu cd ssh/ puis placez dedans le patch que vous avez téléchargé. Une chose à toujours faire : lire le contenu de ce fichier. La démarche à suivre est assez bien documentée.
Faire patch -p0 < openbsd30-3.1.patch. Puis
make obj --------------> (éventuellement si il existe déjà il faut le supprimer, à voir dans /usr/obj)
make cleandir  
make depend   ---------> Pour construire les dépendances
make  ------------------> Reconstruit le programme exécutable
make install.
Puis copier les fichiers de conf dans /etc : cp ssh_config sshd_config /etc (Je vous conseille vivement ici de garder une copie de vos fichiers de configuration avant) ou d'utiliser la commande diff pour connaître les différences si il y en a. 
Vérifiez en faisant ssh -V que vous avez bien mis à jour ssh (d'ailleurs le mieux est de le faire avant et après). Si sshd tourne sur la machine relancez le.

2.1.2 Mettre à jour une seule application en utilisant cvsup

Mettre à jour une seule application (qui appartient aux paquets de base d'openBSD).
Les paquets qui se trouvent dans /usr/src appartiennent aux paquets d'openBSD. On y trouve ssh, sendmail et d'autres. 
Reprenons l'exemple de ssh. Allez dans le répertoire /usr/src/usr.bin/ssh. Puis passez les commandes suivantes :  
rm -rf /usr/obj
make obj  
make cleandir
make depend
make 
make install.
Puis copier les fichiers de conf dans /etc : cp ssh_config sshd_config /etc (Je vous conseille vivement ici de garder une copie des fichiers d'origine avant). Si sshd tourne sur la machine relancez le. Vérifiez avec un ssh -V.

Maintenant le but est de mettre l'ensemble de votre machine à jour.

2.2 Mettre à jour  l'ensemble de votre machine

Attention on parle ici de ce qui est natif du monde OpenBSD, que l'on trouve donc dans /usr/src. Par exemple sendmail, mais aussi les shells...etc. 
Je traite plus loin les applications qui se trouvent dans les ports.

Le noyau
Comment et pourquoi le recompiler ?
Quelles sont les options à valider ou invalider ?
Les réponses.


Le système

Voila une version pas trop ancienne (5/1/3) du fichier des ports de la 3.2 : port.tgz et du fichier des sources du système en 3.2 : src.tgz. Les deux sont à décompacter dans /usr.


On ne souhaite pas ici mettre à jour application par application, mais une mise à jour de l'ensemble de la machine. Soyez prudent lorsque vous faites cela. Je vous propose de lire la doc suivante http://openbsd.org/faq/upgrade-minifaq.html
Le principe est toutefois le même que pour mettre une seule application à jour ....sauf qu'il faut un peu plus de temps. J'ai eu un problème la première fois, sans pouvoir arriver à la fin de la compilation, car je n'avais pas installé misc30.tgz. 

D'abord commençons à faire le ménage :
rm -rf /usr/obj                      On enlève tout ce qu'il y a dans le répertoire obj, pour aller plus vite on le détruit.
mkdir /usr/obj                      On le recrée.
cd /usr/src                           On se place dedans
make obj                             On le reconstruit, on recrée la structure il n'y a rien dedans.
Le répertoire /usr/obj est utilisé pour placer les binaires obtenus par un make build.

N'oubliez pas d'en profiter pour recompiler le noyau!
Maintenant, on recompile le système .
cd /usr/src
make build

Le problème qui se pose à vous à la fin de cette mise à jour touche les fichiers de configuration. On va donc comparer les anciens fichiers avec les nouveaux. Pour cela on crée un répertoire mkdir /home/newroot, puis export DESTDIR=/home/newroot et enfin on lance 
cd /usr/src/etc && make distribution-etc-root-var

Puis on compare les fichiers obtenus avec les fichiers qui se trouvent dans /etc (Commande diff).

De même pour le répertoire /dev, qui n'est pas mis à jour automatiquement vous devez faire (Il y a peu de chances d'avoir des différences sur une même version 3.0 par exemple). 
cd /dev
cp /usr/src/etc/etc.i386/MAKEDEV ./
           On copie MAKEDEV dans /dev
./MAKEDEV all                                            On l'exécute. MAKEDEV est utilisé pour créer les fichiers spéciaux qui sont dans /dev.

2.3 Mettre à jour  une application que vous avez installé via les packages

La différence est la suivante entre les ports et les packages. Un package est une application déjà compilée. On a donc les binaires, et non pas les sources. Cela vous évite d'avoir à faire la compile vous même. Les packages se trouvent sur le ftp  d'OpenBSD. Vous les installez avec un pkg_add nom_du_package.

La meilleure façon pour faire une mise à jour consiste à enlever le package (pkg_delete) et à le réinstaller en utilisant le package que l'on peut trouver sur le ftp d'OpenBSD. Attention à bien faire une copie de vos fichiers de configuration avant de faire cette opération. 
En fait il n'existe pas de pkg_update (apt-get update ??) sous OpenBSD. Vous n'avez donc pas trop de choix que de supprimer et de réinstaller.

La question est bien sur comment savoir qu'il faut mettre à jour une application. 
- D'abord en connaissant la version que vous avez installé. 
- En surveillant les problèmes de sécurité qui surviennent aux applications que vous avez installé. N'est ce pas l'un des rôles le plus important de l'administrateur systéme.
- En regardant dans /usr/ports/INDEX les différences de version.

2.4 Mettre à jour  une application que vous avez installé via les ports

Lorsque vous installez une application via les ports, vous compilez vous même l'application, puis il y a création du paquetage correspondant. 
Donc pour savoir ce que vous avez installé en utilisant les ports la démarche est la même qu'avec les paquetages. Faites un pkg_info pour cela. 

Puis, vous devez  mettre à jour vos ports via cvsup (voir plus haut), en fait on fait cela en même temps que pour l'ensemble des sources.
Puis désinstaller l'ancienne version avec un pkg_delete (attention à prendre soin de conserver vos fichiers de configurations), puis relancer la compile  un make && make install afin que celle-ci soit mise à jour. Pensez à mettre à jour les packages dépendants.

Puis vérifier que des mises à jour sont disponibles. En fait le travail étant un peu plus complexe, il est plus simple de mettre à jour uniquement les applications dont vous avez besoin. 
Comment alors connaître les packages à mettre à jour. Et bien il faut se tenir informé des problèmes de sécurité que posent les applications que l'on utilisent.

3 Passer d'une version OpenBSD à une autre 

C'est LA difficulté d'OpenBSD. L'équipe ne maintient  les versions que sur n et n-1 (un an donc). Vous devez donc réinstaller tout ou appliquer les upgrades (apt-get upgrade ne fonctionne pas ici hélas...).

Avant toute chose est ce que cela vous est nécessaire ?
Qu'est ce que cela vous apporte en plus que vous ne possédez pas sur la  version actuelle.
En fait cela est assez simple puisqu'il faut simplement aller chercher la version  n à la place de la n-1 avec cvs ou cvsup, puis recompiler. Encore une fois attention à vos fichiers de configuration.
Pensez aussi à aller sur le site d'OpenBSD voir si il n'y a pas de problèmes ou de modifications majeures entre les versions.
Par contre pensez à faire la même chose avec les packages et les ports, afin de garder autant que possible une version homogène. Enfin, je ne saurais que vous conseiller de ne pas sauter de version. Passer de n-2 à n-1 puis à n, me parait plus sain que de sauter l'étape n-1.

3.1 Exemple passage de 3.0 à 3.1

Vous disposez d'un OpenBSD 3.0 et vous souhaitez passer à la version 3.1.
J'ai commencé à faire un rm -rf /usr/src  && rm -rf /usr/ports && rm -rf /usr/ports. Cela n'est pas nécessaire on peut directement faire un cvsup sur la stable de 3.1. 
lancer cvsup après avoir changé 3.0 en 3.1 dans le fichier de conf de cvsup.
Puis cd /usr/src && make obj. J'ai ici obtenu un message d'erreur regress/etc Could not find bsd.regress.mk. 
Rien de grave faire un cd /usr/src/share/mk && make && make install, puis relancer cd /usr/src && make obj.
Puis lancer la mise à jour de l'ensemble de votre machine en commençant par le noyau.
Après la recompile du noyau et un reboot, on vérifie que l'on est en 3.1 : dmesg | less. J'obtiens OpenBSD 3.1-stable.
Puis recompile de "tout le reste" avec un cd /usr/src && make build. Bien penser à vérifer les fichiers de configurations qui ne sont pas changés par cette opération. Vous devez donc le faire vous même.
En fait il n'y a pas de différence avec le fait de recompiler toute la machine dans une même version. Sauf qu'il vous faut être plus vigilant dans la lecture de la FAQ sur le sujet d'OpenBSD http://www.openbsd.org/faq/upgrade-minifaq.html#1.1
Attention en passant de la version 3.0 à la version 3.1, les fichiers de configuration de SSH ne se trouvent plus dans /etc, mais dans /etc/ssh. Vous devez donc penser à les changer de place. 

3.2 Passage de 3.1 à 3.2

Le modus opérandi officiel.

Un script de ma conception pour faire tout cela automatiquement.  Attention !!   Vous lancez sous l'identité root un script shell qui va aller bricoler plein de fichiers "sensibles" mot de passe, groupes .... Toute erreur risque de vous détruire une installation qui fonctionnait. Je suis très mauvais en scripting, donc relisez, mettez des tests, des pauses.... Tout ce que vous voulez; et si en plus vous me faites parvenir la version corrigée, je la remettrais en ligne avec plaisir.

Un petit coup de cvsup en n'oubliant pas que vous avez maintenant une version 3.2 dans le /etc/cvs-supfile. Et on recompile le noyau et la machine. Ca y est,vous êtes tranquille. (Pour 6 mois!)

3.3 Passage de la 3.2 à la 3.3

Encore une fois vous devez consulter le "modus opérandi"  avant toute chose. Si vous cherchez à recompiler le noyau après avoir rapatrié les sources avec cvsup, vous allez avoir un message d'erreur du type : cc1: invalid option `-fno-stack-protector'.
En fait, il vous faut utiliser les snapshots ou recompiler gcc avant. Il me semble que cela est plus rapide en passant par les snapshots, vous les téléchargez sur le ftp d'OpenBSD, et vous les détarez sur la machine. Puis vous relancez une recompile du noyau sans rien modifier. Voir pour cela la  recompile du noyau.
Une autre possibilité consiste à recompiler gcc avant, puis lancer la compile du noyau.
Pendant la compile des sources, j'ai du créer un group _token, _radius, _lkm en raison d'un arrêt de la compile sur le message unknown group _token. Dans /usr/src/libexec/login_token j'ai relancé un make && make install. 

 


© Philippe Chadefaux - philippe schwarz - $Id: OpenBSD-maj.html,v 1.7 2002/06/19 12:38:49 philippe Exp $