Netværksbrugere – på den gammeldags måde

Tirsdag, den 15. februar 2011

For nyligt har vi for en kunde implementeret en relativ gammeldags måde at styre brugere på tværs af flere maskiner. I dag vil de fleste måske vælge en LDAP-server. Men der findes en anden løsning hvor selve brugeroplysningerne ligger i DNS og kan opdateres i en zone-fil. Dette kaldes “Hesiod” og er en teknologi der stammer fra MIT.

Fordele
DNS/Hesiod har en række fordele fremfor LDAP. For det første er skalering noget DNS er rigtigt godt til. DNS indgår allerede i enhver IT-infrastuktur. DNS har automatisk indbygget fail-over. Alle egenskaber man skal konfigurere særskilt på en LDAP-server.

Ulemper
DNS/Hesiod har også en række ulemper. Først og fremmest, så er det nok muligt at gøre oplysningerne pålidelige via DNSSEC, men det er ikke umiddelbart muligt at skjule dem på samme måde som man kan kryptere en LDAP-forbindelse. En anden ulempe er passwd-formatets begrænsede oplysninger. I LDAP kan man benytte forskellige schemes, med forskelligt sæt af attributter tilknyttet et objekt. Dette er ikke muligt med DNS/Hesiod.

Serveropsætning
Først skal man have sig et hesiod-domæne på vores navne-server. Det er blot en named-zone som enhver anden, men al data er TXT-records med brugeroplysninger. Det kan være lettere, men ikke nødvendigt, at bruge en helt adskilt zone. Indføring af brugeroplysninger er dog nem. Se dette eksempel, et udsnit fra en zone-fil:

$ORIGIN ns.example.users.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Grupper
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
udv.group    IN TXT    "udv:x:1500:"
1500.group   IN CNAME  udv.group
1500.gid     IN CNAME  udv.group

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Brugere
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
jh.passwd    IN TXT    "jh:x:2205:2205:Jonas Hansen,,,:/home/jh:/bin/bash"
2205.passwd  IN CNAME  jh.passwd
2205.uid     IN CNAME  jh.passwd
jh.group     IN TXT    "jh:x:2205:"
2205.group   IN CNAME  jh.group
2205.gid     IN CNAME  jh.group
jh.grplist   IN TXT    "jh:2205:udv:1500"

hs.passwd    IN TXT    "hs:x:2206:2206:Heidi Schultz,,,:/home/hs:/bin/bash"
2206.passwd  IN CNAME  hs.passwd
2206.uid     IN CNAME  hs.passwd
hs.group     IN TXT    "hs:x:2206:"
2206.group   IN CNAME  hs.group
2206.gid     IN CNAME  hs.group
hs.grplist   IN TXT    "hs:2206:udv:1500"

Er man bekendt med named-zone-filer vil det være ganske ligetil. De records der benyttes er næsten identiske med den måde /etc/passwd og /etc/group er opbygget på:

  • <brugernavn>.passwd for erklæring om en bruger. Brugeren kan slås på forskellige måder. Derfor nogle CNAME-records.
  • <gruppenavn>.group for erkæring om en gryppe. Igen kan grupper slås op på forskellige måder. Derfor nogle CNAME-records.
  • Undergrupper udgør en speciel udfordring. Grundet den måde DNS slås op på må vi finde en anden metode end i /etc/groups, så her benyttes en <brugernavn>.grplist record

Har man en større mængde brugere burde man måske findes sig en måde at scripte sådan en zone-fil på, men det vil variere fra projekt til projekt.

Klientmaskinerne
På klientmaskinerne er alt der kræves at man installere pakken “hesiod”, og aktiverer “hesiod” i /etc/nsswitch.conf:

passwd:         compat hesiod
group:          compat hesiod
shadow:         compat hesiod

Så skal man vælge sit hesiod-domæne i /etc/hesiod.conf:

lhs=.ns
rhs=.example.users
classes=IN,HS

Nu er man sådan set færdig. Som root kan man nu:

root@myhost:~# su - hs
No directory, logging in with HOME=/
hs@myhost:/$ id
uid=2206(hs) gid=2206(hs) groups=1500(udv),2206(hs)

Er vi virkeligt færdige?
Nej, ikke helt. Vi skal stadig have ting som godkendelse af brugerne og oprettelse eller montering af hjemmemapper, men det er en projekt for sig.

Det er ikke muligt at skrive kommentarer.