Création d'un NAS encrypté sous OpenBSD, utilisation du raid et encryption du fs

Dans ce document je tenterai d'expliquer comment créer un NAS encrypté sous OpenBSD. Cela implique le raid logiciel et l'encryption du système de fichiers, comme mentionné dans cet article.

Avant tout, ce how to est une combinaison de how-to of Manolis Tzanidakis on NewsForge on Software RAID on OpenBSD using RAIDframe : et mon propre Encryption de système de fichier HOWTO sous OpenBSD (qui est en partie basé sur le travail effectué par backwatcher.org(toujours off line apparemment). Cela reflète à présent d'une meilleur façon ce que je fais tourner chez moi depuis quelques mois maintenant par rapport à ce que mon ancien how to fit.

Dans cette installation nous aurons un disque séparé pour l'OS (dans ce cas sd0) et deux disques (dans ce cas, Wd0 et whd1) pour la baie RAID 1. Au total nous allons mirrorer les deux gros disques et au sommet de la baie nous allons créer un système de fichier encrypté.

A propos des conditions requises niveau matériel. Eh bien, vous aurez besoin de cartes mères vous permettant de connecter 3 disques durs (ça ne devrait pas être trop dur je suppose). Puis pour l'encryption, j'ai utilisé un MP1800+ avant et cela me donnait aux alentours de 8MB/SEC. A présent, j'utilise un Opteron 146 (2.0Ghz) et cela me donne environ 20MB/SEC (25MB/SEC en lecture, 16MB/SEC en écriture). Donc si vous ne prenez rien de trop vieux (Les AMD64s sont super dans ce but à mon avis) tout ira bien. Personnellement, j'utilise également OpenBSD/AMD64 mais il n'y a rien de mal à utiliser OpenBSD/i386. C'est comme cela vous convient.

Pour cette installation, une installation minimale du kernel bsd, base, comp et etc seront suffisant. Sentez vous libre d'installer tout ce que vous voulez en plus. Configurez le réseau, les pass, et les services comme à l'accoutumée, et rebootez sur la nouvelle installation.

Le code source du kernel est inclus sur le CD-ROM d'installation sous le nom de src.tar.gz et sur le miroir OpenBSD sous le nom de sys.tar.gz. Décompressez le code source depuis le CDROM en utilisant la commande qui suit en root :

# mount /dev/cd0a /mnt
# tar -zxvpf /mnt/src.tar.gz -C /usr/src ./sys
# umount /mnt

Remplacez cd0 par le nom de votre CD-ROM (il serait préférable de ne pas connecter un lecteur CD-ROM en esclave sur l'emplacement IDE, mais depuis que les CDs sont rarement utilisés sur les serveurs, ça ne devrait pas causer d'ennuis.)

Il s'agit du bon moment pour appliquer les patchs sortis depuis la release de votre version d'OpenBSD, pour éviter une autre perte de temps en compilation dans le futur. Les patchs sont annoncés sur la page errata, et chaque patch contient des instructions sur comment les appliquer.

Il est à présent temps de compiler et d'installer un kernel avec le support RAIDframe et RAID auto configuration. Allez dans le repertoire de configuration du kernel en faisant :

cd /sys/arch/‘uname -m’/conf

Et créez une nouvelle configuration kernel, GENERIC.RAID en utilisant les commandes :

cat >> GENERIC.RAID << EOF
include “arch/‘uname -m’/conf/GENERIC # include GENERIC configuration
option RAID_AUTOCONFIG # automatically configure RAIDframe arrays on boot
pseudo-device raid 4 # RAIDframe disk driver
EOF

Maintenant, lancer les commandes suivantes pour configurer, compiler, et installer le noyau :

config GENERIC.RAID
cd ../compile/GENERIC.RAID
make clean depend && make
cp /bsd /bsd.noraid
install -o root -g wheel -m 644 bsd /

Une fois ceci effectué, redémarrez le système avec le Kernel RAIDframe activé. Si quelque chose tournait mal et que le kernel ne bootait pas, l'ancien est sauvegardé en tant que 'bsd.noraid' et pourrait être utilisé pour booter grâce à cette commande à l'invite du boot :

boot> boot sd0a:/boot.noraid

Après avoir booté avec succès sur le nouveau kernel, initialisez le second disque, wd0, en utilisant fdisk. Si OpenBSD est le seul système installé, vous pouvez utiliser l'ensemble du disque comme une partition OpenBSD avec la commande :

fdisk -i wd0

Maintenant vous pouvez créer plusieurs partitions. Par expérience je fais en sorte que la partition 'a' ne soit pas de type FS_RAID pour plusieurs raisons (probablement parce que cette première partition doit être utilisée pour booter, et booter depuis un raid logiciel est une situation assez spéciale … ;-)). Mais laisser la première parition de type FS_BSDFFS (e.g 4.2BSD) fonctionnera également. Si ceci vous tracasse d'une façon ou d'une autre, vous pouvez créer une petite première partition et créer une seconde partition de type FS_RAID (RAID).

disklabel -E wd0
newfs wd0a

Vous pouvez répéter cette action pour le second disque, en bref :

fdisk -i wd1
disklabel -E wd1
(make one big partition)
newfs wd1a

Maintenant, vous pouvez créer raid0.conf, notre fichier de configuration pour le raid.

Sur mon système celà ressemble à :

# cat raid0.conf
START array
1 2 0
START disks
/dev/wd0a
/dev/wd1a
START layout
128 1 1 1
START queue
fifo 100

Une fois créé, nous allons devoir démarrer l'array :

raidctl -C /etc/raid0.conf raid0 
(la première fois il est nécessaire d'utiliser -C, une fois créé et qu'aucun changement de configuration n'a été fait
 , -c suffit, lisez 'man raidctl' pour plus d'informations).
raidctl -I raid0

Maintenant ce numéro de série de l'array est spécifié par l'utilisateur. Si vous pensez à expérimenter avec de multiples arrays , il est fortement recommandé de se servir de ces derniers : 0707150

Donc la commande devient :

raidctl -I 0707150 raid0

Si d'une façon ou d'une autre vous obtenez des erreurs à propos de raidctl ne voulant pas ajouter de lecteur ou autre, redémarrer le système.

Vérifions notre array :

raidctl -s raid0

Maintenant le statut de parité sera sale, nous y retournerons après. Si wd1a a échoué, nous pouvons le reconstruire en utilisant :

raidctl -R /dev/wd1a raid0

Et après ca, raidctl -s raid0 nous montrera : ‘reconstructing’

Après cela, nous avons besoin de rendre la parité propre et nous pouvons faire ceci :

raidctl -vP raid0

(Avec l'option -v (verbose), nous recevons une estimation du temps restant, sur mon système, avec deux disques de 320GB et Opteron 2.0Ghz, cela prend environ 1 heure et 45minutes).

Une fois terminé, nous devrions avoir un raid 1 array propre, sur mon système j'obtiens ceci :

# raidctl -s raid0
raid0 Components:
/dev/wd0a: optimal
/dev/wd1a: optimal
No spares.
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
#

Nous devons à présent initialiser l'array et nous pouvons le faire comme ceci :

fdisk -i raid0
disklabel -E raid0 (et encore, faites une gros partition, de type 4.2BSD)
newfs raid0a

Donc, maintenant nous avons notre base, il est temps de construire un système de fichier encrypté sur cela.

Je dispose d'un répertoire /datacrypt spécialement pour garder le système de fichier encrypté, le non crypté sera monté ailleurs.

cd /
mkdir datacrypt
chmod 655 datacrypt
cd /datacrypt
mkdir raid0
chmod 655 raid0

Puis nous avons besoin de monter tout le raid-array et également ajouter ceci à notre fstab, dans le mien c'est à cette ligne :

/dev/raid0a /datacrypt/raid0 ffs rw,nodev,nosuid 1 2

A la main nous pouvons le monter simplement comme ceci :

mount /dev/raid0a /datacrypt/raid0

Une fois que nous avons fait ça, nous devons y créer un gros fichier, comme base pour notre système de fichiers encrypté.

touch /datacrypt/raid0/cryptfile

Sur l'HOW TO originel j'avais rempli le fichier de zéros. Maintenant quelques personnes ont avancées qu'il était préférable (plus sécurisé) de le remplir avec la sortie de /dev/prandom et en effet,c'est mieux, donc allons y :

dd if=/dev/prandom of=/datacrypt/raid0/cryptfile bs=512 count=615278084

Depuis le disklabel et le fdisk que nous avons effectué précédemment, nous devons savoir combien de blocs (512 ou 1024-byte blocs) il y a sur le disque. (Par expérience cela fonctionne même si vous mettez un nombre trop élevé).

Maintenant nous devons décider où nous voulons que la partie accessible/lisible soit montée. Dans mon cas il s'agit de /data.

Nous allons utiliser vnconfig pour associer le fichier crypté sur le disque avec ce point de montage et bien sûr y inclure l'encryption …

/usr/sbin/vnconfig -ck -v svnd0 /datacrypt/raid0/cryptfile

Maintenant la clé d'encryption va vous être demandée … entrez quelque chose de potable (et quelque chose que vous n'oublierez jamais !)

Si tout a bien fonctionné, il vous montre comment votre nouveau disque est :

# /usr/sbin/vnconfig -ck -v svnd0 /datacrypt/raid0/cryptfile
Encryption key: svnd0: 314945404928 bytes on /datacrypt/raid0/cryptfile
#

A présent, nous devons initialiser le disque et faire un nouveau système de fichiers sur la partition encryptée :

fdisk -i svnd0
disklabel -E svnd0 (et encore, faites ‘a’ grosse partition, de type 4.2BSD)
newfs /dev/rsvnd0a

Maintenant nous pouvons aller plus loin et la monter :

mount /dev/svnd0a /data

Et tadaaaaa ! /data est juste comme votre volume monté quotidien … seulement il est entièrement encrypté :-)

Maintenant vous pouvez continuer et par exemple, configurer Samba pour partager ce volume dans un réseau Windows (si ces machines savaient seulement ….)

Vous pouvez démonter le volume de cette façon :

umount /data
vnconfig -u -v /dev/svnd0a

J'ai ajouté un script par convenance, cryptfs (et avec de multiples disques, vous pouvez juste copier ce script en tant que cryptfs1 cryptfs2 et ainsi de suite), mettez le quelque part dans votre répertoire et vous pourrez le monter de cette manière :

1. cryptfs -m Encryption key: secretstring

Et le démonter par :

2. cryptfs -u

Pour monitorer le statut de l'array et le statut des disques individuels (merci, Scott!) automatiquement, vous devriez créer une script Shell similaire à celui ci :

#!/bin/sh

ARRAY=raid0
DRIVE1=wd0
DRIVE2=wd1
MAILTO=mark@geektechnique.org
if ! raidctl -s $ARRAY | grep -q ‘Parity status: clean’; then
raidctl -s $ARRAY 2>&1 | mail -s “`hostname -s`‘s Array failed: $ARRAY$MAILTO
fi
if ! atactl $DRIVE1 smartstatus | grep -q ‘No SMART threshold exceeded’; then
atactl $DRIVE1 smartstatus 2>&1 | mail -s “`hostname -s`‘s SMART-errors on drive: $DRIVE1$MAILTO
fi
if ! atactl $DRIVE2 smartstatus | grep -q ‘No SMART threshold exceeded’; then
atactl $DRIVE2 smartstatus 2>&1 | mail -s “`hostname -s`‘s SMART-errors on drive: $DRIVE2$MAILTO
fi

Faites tourner le script avec cron toutes les 15minutes et il vous avertira par mail si un disque commence à défaillir.

Maintenant, j'ai écrit ce how to, après avoir été forcé à me refamiliariser avec tout ceci après une coupure de courant dans ma maison. Ma machine (je fais tourner un système de fichier encrypté maintenant depuis plus de 2 ans et avec raid depuis plus de 8mois) arrive facilement à plus de 100 jours d'uptime. Dans mon cas, pendant le boot, la machine freeze au calcul de la parité … pas terrible.

Un mauvais aspect de faire tourner du raid logiciel sous OpenBSD est tout le travail qui doit être fait en cas d'un mauvais arrêt du système, qui doit être effectué avant que la machine ne boot complètement, tout ceci bien avant que le démon SSH ne tourne ;-). Dans une installation maison, avec un accès physique à la machine ce n'est pas un gros problème, mais réfléchissez y lorsque vous pensez le lancer dans un environnement de production (ce que je ne recommande absolument pas). Quoi qu'il en soit, au boot vous pouvez utiliser CTRL-C pour stopper le calcul de parité et permettre à la machine de booter de toute façon. Maintenant, ces derniers jours, depuis que je ne savais pas pourquoi il freezait, j'ai joué avec le possibilités de raidctl.

Quoi qu'il en soit, à la fin il semble que j'ai eu plutôt un root-filesystem plein (*Ahem* J'aurais dû repérer ca plutôt …) et quoique j'ai fait une vérification du système de fichiers sur le disque de l'OS (en partant en mode singleuser) et sur le raid-array, j'ai oublié de faire un filesystem-checks sur le système de fichiers virtuel encrypté et exactement là il y avait un bon nombre d'erreurs à réparer (ce qui causait le freeze de la machine).

Donc, comme leçon à tirer, si votre machine freeze à ce stade comme la mienne (pour la première fois en plus de 2ans) assurez vous d'avoir effectué un fsck sur svnd0c (dans mon cas.)

Traduction

Traduction du texte original : http://geektechnique.org/projectlab/797/openbsd-encrypted-nas-howto

Par Angeli Matthieu.

J'ai gardé les termes : Boot, Kernel, Array qui je pense sont acquis de tous, dans le cas contraire faites moi savoir si une traduction est préférable.

documentations/admin/creation_nas_encrypte.txt · Dernière modification: 2009/07/21 14:29 par sirpuffy
OpenBSD Apache Driven by DokuWiki
CC Attribution-Noncommercial-Share Alike 3.0 Unported