Netatalk : installation sur NetBSD
Netatalk fournit une implémentation du protocole AFP (Apple Filing Protocol) 3.3 (Documentation Netatalk). Depuis Mac OS X 10.5, on peut utiliser un volume AFP pour Time Machine.
Compiler le paquet net/netatalk
(j'utilise http://www.pkgsrc.org) avec l'option pam
; l'option slp
(http://www.openslp.org/) n'est plus franchement utile, Mac OS X utilise maintenant Bonjour (net/avahi
) plutôt que SLP (net/openslp
).
Activer les daemons afpd(8)
et cnid_metad(8)
(seuls requis pour AFP sur TCP). Le daemon cnid_metad(8)
se charge de la gestion des CNID : les Catalog Node ID : le protocole AFP identifie les fichiers et répertoires par des identifiants (et non pas par leur chemin). Voir la documentation sur le site d'Apple.
Netatalk a donc besoin de faire correspondre chemins et identifiants ; pour cela il utilise des bases de données (dont le backend est spécifié via l'option cnidscheme
dans le fichier AppleVolumes.default
). Parmi les backends possibles, choisir DBD (une base Berkeley DB) pour la robustesse ou CDB pour des accès concurrents. On peut indiquer où seront stockées les bases via dbpath:
, par exemple dbpath:/var/db/netatalk
(ici dans /var/db/netatalk/.AppleDB
).
afpd(8)
. Pour les modifications à la main, utiliser les commandes apple_cp(1)
, apple_mv(1)
, apple_rm(1)
et leurs amies.
dbd(1)
pour manipuler ces bases.
AFP sur TCP utilise le port TCP 548
; il faut donc ajouter la ou les règles de filtrage kivonbien pour laisser entrer les connexions vers ce port local. Avec pf(4)
ça donne quelque chose comme :
pass in log quick on re0 proto tcp from 192.168.1.0/24 \ to 192.168.1.254/32 port = 548 flags S/SA keep state
(adapter le nom de l'interface et les adresses).
Le partage de fichiers se configure via les fichiers afpd.conf
et AppleVolumes.*
(situés dans /usr/pkg/etc/netatalk
), le lancement des daemons se configure dans /etc/rc.conf
sur un système BSD moderne utilisant rcNG ; ignorer le fichier netatalk.conf
(héritage de la version 1 de Netatalk ou utile pour les scripts d'initialisation SystemV ? En tous cas, les scripts rc(8)
ne l'utilisent pas).
Spécifier que cnid_metad(8)
écoute sur le port 4700
sur 127.0.0.1
⇒ dans /etc/rc.conf
on a alors :
cnid_metad=YES cnid_metad_flags="-p 4700 -h 127.0.0.1 -s /usr/pkg/libexec/netatalk/cnid_dbd"
Pour le daemon afpd(8)
, indiquer dans /etc/rc.conf
:
afpd=YES afpd_flags="-T -U uams_dhx.so,uams_dhx2.so,uams_pam.so"
Ici, le daemon utilise TCP et les UAMs (User Authentication Module) spécifiés.
On passe aux fichiers dans /usr/pkg/etc/netatalk
. Dans afpd.conf
, on commence avec :
- -tcp -noddp -nosavepassword -setuplog "default log_maxdebug" \ -setuplog "AFPDaemon log_maxdebug" \ -setuplog "UAMSDaemon log_maxdebug" \ -setuplog "Logger log_maxdebug" \ -ipaddr 192.168.1.254
Les options -setulog “xxx log_maxdebug”
peuvent être ôtées dès qu'on a fini de tester.
/etc/rc.conf
et dans afpd.conf
sont contradictoires, celles dans ce dernier fichier sont prises en compte.
Dans AppleVolumes.default
, on commence avec :
:DEFAULT: options:upriv,usedots,allowed_hosts=192.168.1.0/24
On configure ensuite trois volumes dans ce même fichier AppleVolumes.default
:
/users/kabs/TM "Time Machine kabs" allow:kabs rwlist:kabs rolist:foo cnidscheme:dbd options:tm /users/foo/TM "Time Machine foo" allow:foo rwlist:foo rolist:kabs cnidscheme:dbd options:tm /users/exports/afp "Data" allow:kabs,foo rwlist:kabs,foo cnidscheme:cdb
L'option tm
marque un volume Time Machine. Les options allow:
, rolist:
et rwlist:
sont triviales. On a alors deux volumes pour les sauvegardes de deux utilisateurs kabs
et foo
(chacun pouvant accéder en lecteur seule à la sauvegarde de l'autre) et un dernier volume, partagé entre les deux.
cdb
est le schéma CNID par défaut dans le fichier fournit. Par contre, le support de CDB (Concurrent Database) n'est pas inclus dans le binaire compilé via pkgsrc ⇒ passer à DBD (Berkeley DB).
Pour utiliser CDB, ajouter :
CONFIGURE_ARGS+= --with-cnid-cdb-backend
dans /usr/pkgsrc/net/netatalk/Makefile
. En relançant les deux daemons, on voit dans le journal :
Registering CNID module [cdb]
Sur un volume partagé :
- les utilisateurs autorisés sont dans un même groupe Unix ;
- le répertoire est propriété de ce groupe ;
- les droits sont
rwx
pour le groupe avec un setgid bit (2770
par exemple ie.drwxrws-
-
-
).
Pour utiliser l'authentification modulaire PAM, copier /usr/pkg/share/examples/netatalk/netatalk.pam
dans /etc/pam.d/netatalk
; dans les sources, dans etc/uams/uams_pam.c
, les appels à pam_start(3)
utilisent la chaîne netatalk
et non pas le nom du daemon (afpd
)).
On peut, au lieu d'utiliser PAM, définir des mots de passe. Utiliser la commande afppasswd(1)
pour créer pour gérer les mots de passe des utilisateurs dans un fichier /usr/pkg/etc/netatalk/afppasswd
. Indiquer alors -passwdfile:/usr/pkg/etc/netatalk/afppasswd
. Ce fichier a pour format :
kabs:****************:****************:******** foo:****************:****************:********
Le second champ est le mot de passe chiffré ( : avec quel algorithme ?) ;
: signification des deux derniers champs ? Le créer (
-c -p path
) avec :
$ sudo afppasswd -u 100 -c -p /usr/pkg/etc/netatalk/afppasswd
puis supprimer les utilisateurs indésirables (l'option -u 100
prend tous ceux d'UID ≥ 100). Pour changer le mot de passer de kabs
:
$ sudo afppasswd -a -p /usr/pkg/etc/netatalk/afppasswd kabs
La commande afppasswd(1)
refuse d'ajouter un utilisateur qui n'existe pas sur le système.
Comme on n'a pas indiqué de chemin pour les bases de données, elles seront à la racine de chacun des trois répertoires ie. dans /users/kabs/TM/.AppleDB
, etc.
Pour vérifier un serveur, utiliser le script asip-status.pl
:
$ asip-status.pl 192.168.1.254 AFP reply from 192.168.1.254:548 Flags: 1 Cmd: 3 ID: 57005 Reply: DSIGetStatus Request ID: 57005 Machine type: Netatalk AFP versions: AFP2.2,AFPX03,AFP3.1,AFP3.2 UAMs: Cleartxt Passwrd,DHX2,DHCAST128 Flags: SupportsCopyFile,DontAllowSavePwd,SupportsServerMessages,SupportsServerSignature,SupportsTCP/IP,SupportsSrvrNotifications,SupportsOpenDirectory,SupportsUTF8Servername,SupportsSuperClient Server name: mini-server Signature: a1 c3 06 90 1e d0 a4 3b 68 a2 26 db 6f ae a5 44 .......;h.&.o..D Network address: 192.168.1.254 (TCP/IP address) UTF8 Servername: mini-server
S'assurer que le fichier
afp_signature.conf
dans /usr/pkg/etc/netatalk
a bien les droits 0600
et est propriété de root:wheel
.
Dans cette configuration, on n'utilise ni OpenSLP ni Avahi.
Je préciserai ultérieurement cet article dans d'autres billets.