Aller au contenu

La configuration

Comment la configuration HCL est organisée, ce que porte un bloc user, et ce qui est refusé au démarrage.

Un seul fichier, ou un répertoire de petits fichiers. --config /etc/fileshare.d les fusionne : un utilisateur dans un fichier et un partage dans un autre vont donc ensemble.

name = "ATTIC"

user "alice" { password_file = "/etc/fileshare/alice.pw" }
user "bob"   { password_file = "/etc/fileshare/bob.pw" }

group "family" { members = ["alice", "bob"] }

share "photos" {
  image   = "/srv/photos.img"
  allow   = ["@family"]        # a group, or a person, in either list
  writers = ["alice"]          # bob gets it read-only
}

share "scratch" {
  image = "/srv/scratch.img"   # anyone who authenticates, read-write
}

tls {
  cert_file = "/etc/fileshare/tls/fullchain.pem"
  key_file  = "/etc/fileshare/tls/key.pem"
}

serve "smb"    { addr = "0.0.0.0:445" }
serve "webdav" {
  addr = "0.0.0.0:443"
  tls  = true                  # HTTP Basic is the password: never in the clear
}
serve "sftp"   { addr = "0.0.0.0:2222" }
serve "nfs"    { addr = "0.0.0.0:2049" }
serve "s3"     { addr = "0.0.0.0:9000" }

Depuis la v0.9.0, WebDAV avec mots de passe n’est pas servi en clair

serve "webdav" { addr = "0.0.0.0:8080" } — l’exemple que montrait cette page jusque-là — est désormais refusé au démarrage dès que quelqu’un s’authentifie : HTTP Basic, c’est le mot de passe à chaque requête. Indiquez tls = true avec un bloc tls, comme ci-dessus, ou plaintext = true quand un proxy termine TLS devant lui. Voir TLS.

Un partage peut aussi être un périphérique ou un répertoire de l’hôte plutôt qu’une image.

Ce que peut porter un bloc user

Tous les exemples ci-dessus utilisent password_file, le cas courant, qui fut un temps le seul que ce programme lisait. Ce n’est pas tout le bloc, et la différence décide sur quels protocoles une personne peut être servie — elle mérite donc d’être réunie en un seul endroit plutôt que découverte lors d’un montage.

champce que c’estce que cela permet
passwordun mot de passe, dans le fichiertous les protocoles auxquels un mot de passe répond
password_filela même chose, dans un fichier à partla même chose, sans le secret dans la configuration
nt_hashMD4(UTF16LE(password)), 32 caractères hexadécimauxSMB, pour une personne dont ce site ne détient pas le mot de passe
authorized_keysdes lignes authorized_keys, en ligneSFTP
authorized_keys_filela même chose, depuis un fichierSFTP
totp_secretun secret de code à usage unique en base32rien pour l’instant : il est lu et vérifié, et aucun protocole ici ne demande de second facteur

⛔ password et password_file ensemble sont refusés au démarrage, avec le nom de la personne : deux réponses à « quel est son mot de passe » posent la question de savoir laquelle l’emporte, et une configuration ne devrait pas avoir à être lue deux fois pour le savoir. De même pour authorized_keys et authorized_keys_file ensemble.

⛔ Un bloc user qui n’a ni password, ni password_file, ni authorized_keys, ni authorized_keys_file est refusé lui aussi — has no way to authenticate — sauf si trusted_user_ca_file est défini. nt_hash et totp_secret ne comptent pas ici.

Un utilisateur défini en ligne PEUT être servi en SMB

Jusqu’à récemment, ce bloc ne lisait que les champs de mot de passe : servir SMB à quelqu’un inscrit ici revenait à confier à ce fichier son mot de passe en clair — ou à le déplacer dans une base de données. Avec nt_hash, ce n’est plus le cas : un site qui stocke ce que stocke Samba peut écrire cela à la place. Le bloc a toujours besoin, à côté, de l’un des champs ci-dessus — des clés, par exemple — ou de trusted_user_ca_file : nt_hash seul est refusé au démarrage. Voir ce qu’une source peut prouver, qui est le même tableau, une couche plus haut.

Un groupe s’écrit @name partout où une personne pourrait figurer.

Ce qui est refusé au démarrage, plutôt que plus tard

Un nom qui n’appartient à personne

allow = ["alise"] exclurait sinon Alice de son propre partage et démarrerait sans broncher. Un nom qu’aucun bloc user ni aucun annuaire users ne connaît est refusé, tout comme un @group qu’aucun d’eux n’a.

Un partage qui nomme qui peut l’utiliser, en NFS

Une configuration qui dit photos appartient à alice et un protocole qui remet photos à quiconque se connecte ne peuvent pas être honorés tous les deux. Un tel partage n’est pas exporté en NFS — sauf si un bloc kerberos ou identity = "certificate" permet à NFS de distinguer les personnes — et un bloc serve nfs qui n’a plus rien à porter est refusé. Voir NFS.

Un fournisseur qui n’a nulle part où donner sa parole

Un bloc oidc est refusé sauf si WebDAV est servi — le seul protocole qui porte un en-tête Authorization — ou si SFTP est servi avec les certificats du fournisseur activés (ssh_ca_file ou opkssh_client_id, voir SFTP). SMB et NFS n’ont de place ni pour l’un ni pour l’autre.

Des mots de passe en clair

WebDAV sur une adresse que d’autres machines peuvent atteindre, sans tls = true ni plaintext = true, avec des personnes à authentifier. Voir TLS.

Un bloc qui ne peut pas être servi en sécurité

Un bloc admin sans state_file, ou qui écoute en TCP sans TLS mutuel ; un bloc tls qu’aucun bloc serve n’utilise ; un reload plus court qu’une seconde ; une liste de révocation récupérée en HTTP simple. Chacun est décrit là où il a sa place : administration, TLS, rechargement, révocation.

Un protocole avec lequel ce binaire n’a pas été compilé

On le dit tel quel, plutôt que « ce protocole n’existe pas » — la différence entre une faute de frappe et une étiquette de compilation.

Un bloc serve sans addr écoute sur la boucle locale, 127.0.0.1, sur un port qui ne demande aucun privilège : 4445 pour SMB, 8080 pour WebDAV, 2222 pour SFTP, 2049 pour NFS, 9000 pour S3.

protocols sur un partage

share "photos" {
  image     = "/srv/photos.img"
  protocols = ["smb"]
}

Indique quels protocoles le portent. Utile en soi — un partage déclaré SMB seul est un partage dont on ne parle jamais au processus WebDAV — et obligatoire dans certaines configurations sous --isolate. Un bloc serve qui finirait par ne rien porter est refusé lui aussi, avant qu’aucune image ne soit ouverte, en nommant les partages qui lui ont été retirés et pourquoi — sauf si un bloc admin est là pour lui donner des partages plus tard.

Créée le par tannevaled

Modifiée le par tannevaled