Outils pour utilisateurs

Outils du site


config:openbsd:nas

Création et configuration d'un NAS sous OpenBSD

D'abord, quoi c'est, un NAS ?

Selon la terminologie, c'est un “Network Attached Storage” ou “Stockage attaché au réseau”. Bref, un disque dur en réseau quoi.

En gros, il va falloir qu'une partie de nos disques durs soient visibles par les machines du réseau (quel que soit leur OS…).

La mise en place se fera en une succession d'étapes, chacune étant facultative.

Go, go, go !

Cryptage des données

Histoire de me la péter grave (après tout, OpenBSD est supposé être sécurisé par défaut, non ?), je décide de crypter les partitions qui seront partagées : le cryptage se fait en direct, toutes les données inscrites sur le disques sont chiffrées “à la volée” et indéchiffrables sans la passphrase adéquate.

Comme vu sur sur la page de mise en place du RAID logiciel, l'utilitaire bioctl est utilisé pour créer une partition cryptée.
Pour que cela fonctionne, il faut que la partition source soit de type RAID (et non 4.2BSD).

Résumé de l'épisode précédent : j'ai créé deux partitions de taille identique et de type RAID sur deux disques différents (sd0 et sd1 d'un côté et sd2 et sd3 de l'autre), pour créer deux miroirs RAID1 (sd4 et sd5).

Mise en place et configuration

Voici l'état des lieux sur sd4 :

#                size           offset  fstype [fsize bsize  cpg]
  a:           864.5G               64    RAID                   
  c:           864.5G                0  unused                   

et sd5 :

#                size           offset  fstype [fsize bsize  cpg]
  a:           931.5G               64    RAID                   
  c:           931.5G                0  unused                   

Vient le moment crucial, la création du volume crypté :

/root #> bioctl -c C -l /dev/sd4a softraid0

et

/root #> bioctl -c C -l /dev/sd5a softraid0

A chaque fois, bioctl va demander une passphrase (dont il faut se souvenir !!!) et créer un nouveau volume.

IMPORTANT : il est impossible de créer un volume crypté à distance (SSH par exemple), car il faut impérativement rentrer la passphrase sur le clavier relié à la machine !!!

Vérifions ça:

/root #> bioctl softraid0
Volume      Status               Size Device  
softraid0 0 Online       928263709184 sd4     RAID1
          0 Online       928263709184 0:0.0   noencl <sd0i>
          1 Online       928263709184 0:1.0   noencl <sd1i>
softraid0 1 Online      1000201970176 sd5     RAID1
          0 Online      1000201970176 1:0.0   noencl <sd2a>
          1 Online      1000201970176 1:1.0   noencl <sd3a>
softraid0 2 Online       928255446016 sd6     CRYPTO
          0 Online       928255446016 2:0.0   noencl <sd4a>
softraid0 3 Online      1000193744896 sd7     CRYPTO
          0 Online      1000193744896 3:0.0   noencl <sd5a>

Il faut ensuite initialiser le premier secteur :

/root #> dd if=/dev/zero of=/dev/rsd6c bs=1m count=1

et

/root #> dd if=/dev/zero of=/dev/rsd7c bs=1m count=1

Et créer les partitions puis les formater (dans les deux cas, créer une partition 'a' de type 4.2BSD occupant tout le volume) :

disklabel -E sd6
disklabel -E sd7
newfs -m 0 /dev/sd6a
newfs -m 0 /dev/sd7a

(Notez que l'utilisation de '-m 0' n'est pas recommandé par la manpage de tunefs…)

Et voilà, il ne vous reste plus qu'à monter tout ça !

/root #> mount -o nodev,nosuid,softdep /dev/sd6a /data/Misc
/root #> mount -o nodev,nosuid,softdep /dev/sd7a /data/Videos
/root #> mount
/dev/sd0a on / type ffs (NFS exported, local)
/dev/sd0h on /home type ffs (local, nodev, nosuid, softdep)
/dev/sd0f on /tmp type ffs (local, nodev, nosuid, softdep)
/dev/sd0d on /usr type ffs (local, nodev, softdep)
/dev/sd0e on /usr/local type ffs (local, nodev, softdep)
/dev/sd0g on /var type ffs (local, nodev, nosuid, softdep)
/dev/sd6a on /data/Misc type ffs (local, nodev, nosuid, softdep)
/dev/sd7a on /data/Videos type ffs (local, nodev, nosuid, softdep)
/root #>

Performances

Lors de l'installation, j'avais fait un test rapide de création de fichier et j'étais à environ 120Mo/s.

Sur le RAID1, les performances en écritures sont réduites (ce qui est normal) : environ 90Mo/s.

Sur le RAID1 crypté, j'obtiens ceci :

/root #> dd if=/dev/arandom of=/data/Videos/testfile bs=1m count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 22.394 secs (47946226 bytes/sec)
/root #> bc
scale=2
47946226/1024/1024
45.72
quit
/root #> 

soit 45Mo/s.

C'est relativement lent, mais largement assez rapide pour les transferts en réseau !

N.B : pour remettre les choses dans leur contexte, sur mon portable Alienware M11Xr2, avec un disque dur Toshiba SATA-II 300GiB 7200tr/min, j'obtiens un taux de 8.5Mo/s, et sur un clevo W110ER, avec un disque dur Toshiba SATA-II 750GiB 5400 tr/min, j'ai du 14.3Mo/s. Du coup, les 45Mo/s ne semblent pas si mal… :-)

Redémarrage douloureux

Pour voir comment tout ceci se comporte, on redémarre !

Et là, catastrophe : la machine boote, les volumes en RAID1 sont reconnus sur le contrôleur softraid0, mais pas les partitions cryptées.
Aïe.

Bon, en fait, ce n'est pas très grave. Il “suffit” de demander à bioctl de les ré-activer et hop !

/root #> bioctl -c C -l /dev/sd4a softraid0

On entre la passphrase et… bioctl nous insulte gentiment :

softraid0: sd6 was not shutdown properly

Mouais. A priori ce n'est “pas trop” grave et le volume se monte correctement.

Par contre, il existe un revers : il faut impérativement être physiquement présent devant la machine (sur le clavier) pour entrer la passphrase… 8-o

Ne nous énervons pas, il existe au moins trois solutions pour remédier à cela.
Selon la manpage de bioctl :

  -k keydisk
          Use special device keydisk as a key disk for a crypto volume.
[...]
  -p passfile
          Passphrase file used when crypto volumes are brought up.  This
          file must be root owned and have 0600 permissions.  This option
          cannot be used during the initial creation of the crypto volume.
[...]
  -s      Read the passphrase for the selected crypto volume from
          /dev/stdin rather than /dev/tty.  This option cannot be used
          during the initial creation of the crypto volume.

Donc…

  • Utiliser un périphérique comme clé pour le cryptage. Vous pouvez par exemple laisser une (petite) clé USB branchée en permanence qui servira de “dongle” de cryptage : si vous la débranchez, impossible de monter le volume crypté. Par contre, si vous la perdez ou qu'elle part en sucette, tout est fichu (il est possible de dumper les secteurs utilisés sur un autre périphérique : google).
  • Utiliser un fichier comme clé de cryptage. Mouais. Quel est l'intérêt de crypter une partition si la simple présence d'un fichier permet de tout décrypter ? A moins de mettre ce fichier sur un périphérique amovible comme une clé USB. Voir le point précédent.
  • Utiliser une option en ligne de commande pour pouvoir rentrer la clé, même si nous ne sommes pas devant la console (accès en SSH par exemple). C'est la solution que j'ai retenu…

IMPORTANT : dans tous les cas, il faut être devant la console lors de la création du volume crypté pour entrer la passphrase la première fois…

Remède maison

Ajouter d'abord ce genre de lignes dans le fichier /etc/fstab :

/dev/sd6a /data/Misc ffs rw,nodev,nosuid,noauto,softdep 0 0
/dev/sd7a /data/Videos ffs rw,nodev,nosuid,noauto,softdep 0 0

(entre autres : noauto fait que les partitions ne seront pas montées au démarrage par rc et les zéros empêchent fdisk d'essayer de vérifier les partitions automatiquement)

Ensuite, un pense-bête (j'ai la tête comme une passoire) :

/etc/motd
OpenBSD 5.1 (GENERIC.MP) #207: Sun Feb 12 09:42:14 MST 2012

If you just booted, remember to crypto_mount!

Mais ! Quoi c'est ce crypto_mount ?

/usr/local/sbin/crypto_mount
#! /bin/ksh
 
PART1="/data/Misc"
DISK1="sd4a"
CRYPT1="sd6a"
PART2="/data/Videos"
DISK2="sd5a"
CRYPT2="sd7a"
 
for i in 1 2; do
  if [ $i -eq 1 ]; then
    PART=$PART1; DISK=$DISK1; CRYPT=$CRYPT1
  else
    PART=$PART2; DISK=$DISK2; CRYPT=$CRYPT2
  fi
  df | grep -q $PART
  if [ $? -eq 0 ]; then
    echo "$PART is already mounted"
  else
    # Suppress echo
    stty -echo
    read p?"Passphrase for ${PART}: "
    # Echo is back
    stty echo
    echo "$p" | bioctl -s -c C -l /dev/$DISK softraid0
    bioctl softraid0 | grep -q $DISK
    if [ $? -eq 1 ]; then
      echo "Error while bringing up CRYPT volume"
      exit 1
    else
      echo "Checking filesystem, please wait..."
      (fsck -p /dev/$CRYPT && mount $PART) || echo "Not mounted, run fsck manually on $CRYPT (usually mounted on $PART)."
    fi
  fi
done
 
# EoF

Alors oui, c'est moche : j'aurais pu utiliser des tableaux de variables toussa…

Ensuite, ce n'est pas extrêmement hyper sécurisé car la passphrase est lue depuis l'entrée standard.

Essplications : le script vérifie d'abord que le volume n'est pas monté (ce qui sous-entend qu'il a déjà été lancé), puis demande la passphrase.
Il active ensuite le volume sur le contrôleur softraid0 et vérifie que cela s'est bien passé.
Enfin, un fsck est lancé, histoire de vérifier l'état du système de fichier, et le volume est monté.

Histoire de ne plus avoir de message du type “was not shutdown properly” à chaque fois que la machine redémarre, il faut aussi automatiser le démontage.

/usr/local/sbin/crypto_unmount
#! /bin/ksh
 
PART1="/data/Misc"
DISK1="sd6"
PART2="/data/Videos"
DISK2="sd7"
 
sync
 
for i in 1 2; do
  if [ $i -eq 1 ]; then
    PART=$PART1; DISK=$DISK1
  else
    PART=$PART2; DISK=$DISK2
  fi
  df | grep -q $PART
  if [ $? -eq 1 ]; then
    echo "$PART not mounted"
  else
    umount $PART
  fi
  bioctl -d $DISK
done
 
# EoF

Mêmes remarques, mêmes critiques, blablabla…

Le script synchronise d'abord toutes les entrées/sorties sur les disques, vérifie que le disque est monté, le démonte le cas échéant et enfin, supprime le volume du contrôleur softraid0.

Enfin, pour que ceci soit automatique lors d'un arrêt ou un redémarrage, il faut modifier /etc/rc.shutdown :

/etc/rc.shutdown
#       $OpenBSD: rc.shutdown,v 1.12 2011/04/22 06:08:14 ajacoutot Exp $
#
# If it exists, this script is run at system-shutdown by reboot(8),
# halt(8).  If the architecture supports keyboard requested halting,
# it is also run by init(8) when such an event happens.
#

powerdown=NO    # set to YES for powerdown

# Add your local shutdown actions here.
/usr/local/sbin/crypto_unmount

Ca sent la rustine, mais ça fonctionne ! :-P

Conclusion

Voilà, le chiffrement est en place, peut être monté à distance et est démonté automatiquement à l'extinction.

Les performances sont suffisantes (pour moi) et j'ai bien cradouillé en empilant les couches de softraid0, ce qui a pour effet de doubler le nombre de disques vus par le système (4 disques physiques, partition sd7a utilisée)…

Ça me va !!! :-D

Droits d'accès

Histoire de pouvoir accéder aux données avec mes utilisateurs “de base”, je vais créer un utilisateur dédié pour les volumes exportés.

Il s'agira pour moi de l'utilisateur synchro, défini comme suit :

/root #> grep synchro /etc/passwd  
synchro:*:5000:10::/data:/sbin/nologin
/root #> grep 10: /etc/group       
users:*:10:

Tous les autres utilisateurs appartiendrons aussi au groupe users.

Ensuite, il faut que les données appartiennent à synchro dans tous les cas de figure :

/root #> cd /
/ #> mount /data/Misc ; mount /data/Videos
/ #> chown -R synchro:synchro /data
/ #> chmod -R 6775 /data
/ #> ls -l | grep data
drwsrwsr-x   5 synchro  users      512 Sep 24 23:55 data

Exports NFS

Bon, revenons-en au sujet initial : le partage des données sur le réseau.

Il faut que les partitions soient accessibles depuis les autres machines de mon réseau. Pour les autres UNIX, une solution simple est NFS.

Mise en place et configuration

NFS est un standard UNIX et est donc présent dans le système de base (heureusement…).

Voici comment le mettre en place :

/etc/exports
#       $OpenBSD: exports,v 1.2 2002/05/31 08:15:44 pjanzen Exp $
#
# NFS exports Database
# See exports(5) for more information.  Be very careful:  misconfiguration
# of this file can result in your filesystems being readable by the world.
/data/Videos -mapall=synchro -network=192.168.0 -mask=255.255.255.0
/data/Misc   -mapall=synchro -network=192.168.0 -mask=255.255.255.0

Du coup, les deux volumes cryptés seront accessibles depuis le réseau 192.168.0.0/24 en lecture/écriture (et sans contrôle d'accès, c'est maaaal !).

Il faut ensuite ajouter les lignes suivantes à /etc/rc.conf.local pour un démarrage automatique :

portmap_flags=""
mountd_flags=""
nfsd_flags="-tun 4"

et démarrer les services à la main :

/root #> /etc/rc.d/portmap start
portmap(ok)
/root #> /etc/rc.d/nfsd start
nfsd(ok)
/root #> /etc/rc.d/mountd start
mountd(ok)

Tests

Depuis mon portable Linux :

[cyriac@m11xr2 ~]$ sudo mount -t nfs -o nolock azathoth:/data/Videos /mnt/nas/
[cyriac@m11xr2 ~]$ ls /mnt/nas/
DA/  Films/  Series/  testfile
[cyriac@m11xr2 ~]$ rm /mnt/nas/testfile 
[cyriac@m11xr2 ~]$ ls /mnt/nas/
DA  Films  Series
[cyriac@m11xr2 ~]$ dd if=/dev/zero of=/mnt/nas/testfile bs=1M count=45
45+0 enregistrements lus
45+0 enregistrements écrits
47185920 octets (47 MB) copiés, 46,4086 s, 1,0 MB/s

Ça fonctionne, mais le taux de transfert n'est pas idéal…

En parallèle, côté serveur :

/root #> dd if=/dev/arandom of=/data/Videos/tt bs=1m count=45                      
45+0 records in
45+0 records out
47185920 bytes transferred in 0.767 secs (61466091 bytes/sec)

Donc le problème vient du réseau.

Samba

Il y a également des machines Windows sur le réseau. Et j'aimerais qu'elles puissent accéder aux données également.

Pour cela, il existe Samba qui est fait précisément pour ce genre de choses (mais également remplacer un contrôleur de domaine si le besoin s'en fait sentir…)

Installation

En supposant que tout soit bien configuré, un simple :

/root #> pkg_add samba

fait l'affaire (installation de Samba et de ses dépendances).

Configuration

Toute la configuration se fait dans /etc/samba/smb.conf :

/etc/samba/smb.conf
[global]
   workgroup = FREE-UNICES.ORG
   server string = Firewall Shares
   security = user
   hosts allow = 192.168.0. 127.
   hosts deny = all
   load printers = no
   guest account = synchro
   max log size = 50
   interfaces = re0
   wins support = no
   dns proxy = no 
   disable netbios = yes
   guest ok = yes
   guest only = yes
   invalid users = admin root
   netbios name = Firewall
   socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536
   strict sync = no
   sync always = no
   syslog = 1
   syslog only = yes

#============================ Share Definitions ==============================
[Videos]
   comment = Videos
   path = /data/Videos
   read only = no
   public = yes

[Misc]
   comment = Miscellaneous Stuff
   path = /data/Misc
   read only = no
   public = yes

En substance, on autorise l'accès anonyme (pas de contrôle d'accès, c'est le maaaal) avec l'utilisateur synchro depuis le réseau 192.168.0.0/24, sur l'interface réseau interne.
Puis on définit les partages.

Pour le lancement automatique, il faut ajouter samba à la ligne pkg_scripts de /etc/rc.conf.local :

pkg_scripts="samba"

Lancer “à la main” :

/root #> /etc/rc.d/samba start
smbd(ok)
nmbd(ok)

Tests

Bon, pour le coup, je tente le montage depuis une machine Linux, mais ça fonctionnerait pareil depuis un Windows hein ! :-P

[cyriac@m11xr2 ~]$ sudo mount -o sec=none //azathoth/videos /mnt/nas/
[cyriac@m11xr2 ~]$ ls /mnt/nas/
DA  Films  Series
[cyriac@m11xr2 ~]$ dd if=/dev/zero of=testfile bs=1M count=45
45+0 enregistrements lus
45+0 enregistrements écrits
47185920 octets (47 MB) copiés, 46,5104 s, 1,0 MB/s
[cyriac@m11xr2 Videos]$ 
[cyriac@m11xr2 ~]$ rm /mnt/nas/Videos/testfile 
[cyriac@m11xr2 ~]$ 

Les performances sont identiques au NFS, mais ça fonctionne.

/!\ ATTENTION

Depuis la mise à jour de samba sur mon portable ArchLinux (smblient-4.0.7) il me faut utiliser d'autres options de montage, notamment une qui n'est pas documentée dans la manpage

[cyriac@w110er ~]$ sudo mount -o guest,sec=lanman //azathoth/videos /mnt/nas

FTP

Il est également possible de configurer un serveur FTP en local, histoire de pouvoir maximiser les façons d'accéder à nos données.

Pour cela, le serveur par défaut d'OpenBSD sera suffisant.

Mise en place et configuration

D'abord, il faut modifier l'utilisateur synchro pour qu'il puisse se connecter au daemon (il était par défaut configuré pour ne pas avoir de shell interactif et pas de mot de passe).
Premièrement, changer son shell par défaut et lui affecter un mot de passe :

/root #> echo "/usr/bin/false" >> /etc/shells
/root #> chpass -s /usr/bin/false synchro
/root #> passwd synchro

Ajouter cette ligne à /etc/rc.conf.local et lancer le service :

/root #> echo 'ftpd_flags="-Dn4ll" >> /etc/rc.conf.local
/root #> /etc/rc.d/ftpd start                                               
ftpd(ok)

Enfin, si vous utilisez ma configuration de PF, il faut modifier la règle qui concerne ftp-proxy :

pass in quick on $lan_if inet proto tcp to !$lan_if port ftp \
             divert-to 127.0.0.1 port 8021 modulate state

Test

Depuis mon portable Linux :

[cyriac@m11xr2 ~]$ lftp synchro@azathoth
Mot de passe : 
lftp synchro@azathoth:~> ls      
total 36                                    
drwsrwsr-x  12 synchro  users  512 Sep 24 23:21 Misc
drwsrwsr-x   5 synchro  users  512 Sep 26 19:49 Videos
drwxr-xr-x   2 synchro  users  512 Sep 24 22:03 uShare
lftp synchro@azathoth:~> cd Videos/
lftp synchro@azathoth:~/Videos> ls
total 48
drwxrwxr-x   4 synchro  users  3584 Sep 24 00:33 DA
drwxrwxr-x   3 synchro  users  2560 Sep 24 00:33 Films
drwxrwxr-x  19 synchro  users   512 Sep 24 11:50 Series
lftp synchro@azathoth:~/Videos> put testfile
47185920 octets transférés en 46 secondes (992.9Ko/s)                          
lftp synchro@azathoth:~/Videos> bye

On peut voir que j'ai toujours les mêmes performances…

Précisions sur les performances

Pour info, le portable que j'utilise en permanence à des performances réseau (WiFi) nulles à chier (Alienware M11Xr2)…

J'ai depuis réalisé d'autres tests depuis mon ancien laptop (Sony Vaio VGN-SR41M) et c'est bien mieux ! :-P

Pour un fichier de 50Mo, voici les perfs :

Protocole Taux
FTP 6.40Mo/s
SCP 7.1Mo/s
NFS 7.3Mo/s
CIFS 4.9Mo/s

Ce qui me semble bien plus raisonnable sur un réseau Wifi en 100Mb (même si Samba reste “un peu” faiblard).

Bref, vérifiez bien votre carte réseau avant de cracher sur l'installation ! :-|

config/openbsd/nas.txt · Dernière modification: 2013/11/29 01:07 par cyriac