Configurer un serveur NIS

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

OpenBSD, NIS, YP, ypserv, ypbind, rpc.yppasswdd, portmap, rpc

Introduction

Ce document décrit comment mettre en place un serveur NIS (aussi connu sous le nom de YP) sur OpenBSD (testé en version 3.8, 3.9).

Le service NIS permet la gestion réseau des données des fichiers passwd, group et hosts grâce aux fonctions getpwent(3), getgrent(3) et gethostbyname(3). D'autres bases peuvent être gérées par ce système. Des programmes tesl que amd(8), bootparamd(8), peuvent accéder à leurs fichiers de tables via le système NIS.

Dans notre exemple, il n'existe qu'un seul serveur NIS. Il n'y a pas de serveur de secours. Dans une configuration de production il est préferrable d'avoir au moins un serveur esclave. En effet, si le serveur maître s'arrête, plus aucun utilisateur du réseau ne peut se s'authentifier.

Paramètres du domaine NIS

Nom  du domaine NIS	= leaves
Nom  du domaine DNS	= leaves.org
FQDN du Serveur NIS	= smoking.leaves.org
IP   du Serveur NIS	= 192.168.1.1

Note

Toutes les commandes présentées ici, sont à executer, sauf mention contraire, en tant qu'administrateur de la machine.

Présentation des daemons

Les daemons suivants vont être mis en oeuvre :

  • portmap

Le daemon portmap(8) est nécessaire pour tous les services rpc(3).

  • ypserv

Le daemon ypserv(8) est le serveur NIS (YP) qui distribue l'information (les maps).

  • rpc.yppasswdd

Le daemon rpc.yppasswdd(8) permet aux utilisateurs NIS distants de mettre à jour leur mot de passe sur le serveur NIS maître. Il prend comme paramètres yppasswdd_flags depuis le fichier /etc/rc.conf.

  • ypbind

Le daemon ypbind(8) permet aux clients NIS d'obtenir les informations (maps) du serveur NIS.

Nom de domaine

Créez le fichier /etc/defaultdomain :

# echo "leaves" > /etc/defaultdomain

Activer le service NIS au démarrage

Modifiez comme suit le fichier /etc/rc.conf.local :

# portmap is used to look up RPC-based svc.
# Required for any rpc(3) services (include NFS, NIS, ...)
portmap=YES                    # Note: inetd(8) rpc services need portmap too

# Start nis (yp) daemons
ypserv_flags=""                # E.g. -1 for YP v1, -d for DNS etc
yppasswdd_flags="-d /etc/yp"   # "-d /etc/yp" if passwd files are in /etc/yp

Initialiser les fichiers et les répertoires du serveur NIS

La commande ypinit initialise les fichiers et les répertoires nécessaires pour un client et/ou un serveur NIS. Exécutez la commande suivante :

# domainname leaves
# ypinit -m
Server Type: MASTER Domain: leaves

Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.

Do you want this procedure to quit on non-fatal errors? [y/n: n]  y

At this point, we have to construct a list of this domain's YP servers.
roulaiz.ajoute.org is already known as master server.
Please continue to add any slave servers, one per line. When you are
done with the list, type a <control D>.
        master server   :  smoking.leaves.org
	next host to add:  ^D
The current list of NIS servers looks like this:

smoking.leaves.org

Is this correct?  [y/n: y]  y
[...]
smoking.leaves.org  has been setup as an YP master server without any errors.

Le répertoire /var/yp/binding est créé.

Initialiser les maps NIS

Modifier le fichier /var/yp/Makefile.yp

  • NOPUSH

Le serveur NIS maître doît être averti des modifications effectuées sur ses maps, motamment les maps d'authentifications (passwd.*, master.passwd.*, shadow.*). Dans le cas contraire, quand un utilisateur modifiera son mot de passe, les maps seront bien modifiées, mais le serveur continuera de publier les anciennes versions. L'utilisateur ne pourra pas alors s'authentifier avec son nouveau mot de passe.

Je n'ai observé ce comportement que dans l'implémentation OpenBSD du serveur NIS. Sur les autres plateformes que j'ai essayé (Solaris, NetBSD), il n'y a pas besoin de “pusher” les maps vers le serveur maître, uniquement vers les esclaves.

Vérifier que la publication des maps est bien active :

NOPUSH=""
  • DIR

Par défaut, le serveur NIS utilise les fichiers contenus dans /etc pour générer ses map. Il est préferrable de distinguer les fichiers du système (ceux de /etc), des fichiers servis via le service NIS. En effet, le service NIS s'appuie sur le mécanisme des rpc(3) qui est très loin d'être sécurisé. Toute station du réseau peut demander peut lire la map des mots de passe cryptés, et ainsi, par “brute force” obtenir le mot de passe d'un utilisateur. Il est donc préferrable que le mot de passe crypté de root ne soit pas véhiculé via NIS.

Pour ce faire, nous allons créer le répertoire /etc/yp qui contiendra les fichiers sources du service NIS. Pour indiquer le nouvel emplacement des bases, modifier comme suit le fichier Makefile.yp

DIR=/etc/yp
  • AMD

Idem pour les maps amd(8) et autofs(8)

AMDDIR=/etc/yp/amd

Créer le répertoire des Map

Créer le répertoire des bases :

# mkdir /etc/yp
# chown root:wheel /etc/yp
# chmod 700 /etc/yp

Map d'authentification des utilisateurs

Map passwd

A partir du fichier master.passwd, le Makefile de /var/yp générera automatiquement les maps passwd.*

Pour créer le fichier des maps password, procédez comme suit :

# cp /etc/master.passwd /etc/yp/master.passwd

Supprimer TOUS les comptes systèmes (root,tty, daemon, …) et ne garder QUE les comptes des utilisateurs.

# chown root:wheel /etc/yp/master.passwd
# chmod 600 /etc/yp/master.passwd

Map shadow

Par défaut le Makefile de /var/yp ne génére pas de map shadow. Or, les systèmes comme Linux ou Solaris utilisent les mots de passes shadow pour authentifier leurs utilisateurs. Si ces systèmes font partis de votre réseau, il faut générer cette map.

Pour cela, il faut modifier comme suit le fichier /var/yp/Makefile :

--- Makefile.yp.dist    Sat Sep 10 23:22:22 2005
+++ Makefile.yp Sat Nov  5 02:31:15 2005

passwd.time: $(DIR)/master.passwd
        -@if [ -f $(>) ]; then \
@@ -61,14 +72,21 @@
                $(CAT) $(>) | \
                $(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
                { print $$3, $$0 }' - | $(MAKEDBM-S) - master.passwd.byuid; \
-               $(TOUCH) $(@); \
                $(ECHO) "updated passwd"; \
+               $(CAT) $(>) | $(CUT) -d: -f1-2 | \
+               $(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
+               { print $$1, $$0":10779:0:99999:7:::" }' - | \
+               $(MAKEDBM-S) - shadow.byname; \
+               $(ECHO) "updated shadow"; \
+               $(TOUCH) $(@); \
                if [ ! $(NOPUSH) ]; then \
                        $(YPPUSH) -d $(DOMAIN) passwd.byname; \
                        $(YPPUSH) -d $(DOMAIN) passwd.byuid; \
                        $(YPPUSH) -d $(DOMAIN) master.passwd.byname; \
                        $(YPPUSH) -d $(DOMAIN) master.passwd.byuid; \
                        $(ECHO) "pushed passwd"; \
+                       $(YPPUSH) -d $(DOMAIN) shadow.byname; \
+                       $(ECHO) "pushed shadow"; \
                else \
                        : ; \
                fi \
@@ -76,7 +94,6 @@
                $(ECHO) "couldn't find $(>)"; \
        fi

Map group

# cp /etc/group /etc/yp/group

Supprimer TOUS les comptes systèmes (root,tty, daemon, …) et ne garder QUE les comptes des utilisateurs.

# chown root:wheel /etc/yp/group
# chmod 600 /etc/yp/group

Génération des bases password

Extrait de la page de manuel de pwd_mkdb(8) :

pwd_mkdb creates db(3) style secure and insecure databases for the speci-
fied file.  These databases are then installed into ``/etc/spwd.db'' and
``/etc/pwd.db'' respectively.

Pour que le daemon rpc.yppasswdd puisse modifier le password d'un utilisateur, il faut créer les bases de données des mots de passe à la racine du service NIS (/etc/yp dans notre exemple). Pour ce faire, utiliser la commande pwk_mkdb(8). Procéder comme suit :

# export DIR=/etc/yp
# /usr/sbin/pwd_mkdb -p -d ${DIR} ${DIR}/master.passwd
# /usr/sbin/pwd_mkdb -d ${DIR} ${DIR}/master.passwd

Map AMD, autofs et aliases

Créer le répertoire des maps

# mkdir  /etc/yp/{amd,mail}
# touch /etc/yp/mail/aliases
# touch /etc/yp/amd/amd.conf
# touch /etc/yp/amd/amd.master
# touch /etc/yp/amd/amd.home
# touch /etc/yp/amd/auto.home
#   
# chown -R root:wheel /etc/yp/{amd,mail}
# chmod 700 /etc/yp/{amd,mail}
# chmod 600 /etc/yp/amd/* /etc/yp/mail/*

Contenu des maps

Contenu de la map NIS : amd.master

/home amd.home

Contenu de la map NIS : amd.conf

-a /amd -l /var/log/amd -x all /home amd.home

Contenu de la map NIS : amd.home

/defaults       type:=nfs;rhost:=smoking
*               rfs:=/home/*;sublink:=${key} \
                opts:=rw,grpid,resvport,vers=3,proto=udp,nosuid,nodev

Contenu de la map NIS : auto.home

*        smoking:/home/&

Modifier le fichier /var/yp/Makefile

Par défaut, le Makefile de /var/yp ne gére que la map amd(8) auto.home. Si vous voulez utiliser d'autres maps amd(8) ou autofs(8) via le service NIS, il faut modifier le Makefile.

La configuration ci-dessous permet de gérer un nombre illimité de map amd(8) ou autofs(8). Il suffit simplement de les déclarer dans la variable AMDMAPS en début de Makefile.

--- Makefile.yp.dist    Sat Sep 10 23:22:22 2005
+++ Makefile.yp Sat Nov  5 02:51:39 2005

-all: passwd group hosts ethers networks rpc services protocols netid netgroup amd.home aliases
+all: passwd group hosts ethers networks rpc services protocols netid netgroup aliases $(AMDMAPS)

[ ... ]

-amd.home.time: $(AMDDIR)/amd.home
+.for MAP in $(AMDMAPS)
+$(MAP).time: $(AMDDIR)/$(MAP)
        -@if [ -f $(>) ]; then \
                $(SED) -e "s/#.*$$//" -e "/^$$/d" $(>) | \
                $(AWK) '{ \
                                else \
                                    printf("%s ", $$i); \
                        }' | \
-               $(MAKEDBM) - amd.home; \
+               $(MAKEDBM) - $(MAP); \
                $(TOUCH) $(@); \
-               $(ECHO) "updated amd.home"; \
+               $(ECHO) "updated $(MAP)"; \
                if [ ! $(NOPUSH) ]; then \
-                       $(YPPUSH) -d $(DOMAIN) amd.home; \
-                       $(ECHO) "pushed amd.home"; \
+                       $(YPPUSH) -d $(DOMAIN) $(MAP); \
+                       $(ECHO) "pushed $(MAP)"; \
                else \
                        : ; \
                fi \
        else \
                $(ECHO) "couldn't find $(>)"; \
        fi
+.endfor # AMDMAPS

[ ... ]

-amd.home: amd.home.time
+.for MAP in $(AMDMAPS)
+$(MAP): $(MAP).time
+.endfor # AMDMAPS

[ ... ]

-$(AMDDIR)/amd.home:
+.for MAP in $(AMDMAPS)
+$(AMDDIR)/$(MAP):
+.endfor # AMDMAPS

Autres maps

Pour éviter les messages d'erreurs à la génération des maps, il est préferable de créer toutes les maps, quitte à en laisser certaines vides.

# touch /etc/yp/ethers /etc/yp/hosts /etc/yp/netgroup \
/etc/yp/networks /etc/yp/rpc /etc/yp/services \
/etc/yp/passwd etc/yp/protocols
#
# chmod 600 /etc/yp/ethers /etc/yp/hosts /etc/yp/netgroup \
/etc/yp/networks /etc/yp/rpc /etc/yp/services \
/etc/yp/etc/yp/protocols
# 

Démarrer les services NIS

Pour démarrer le service NIS, procédez comme suit :

# domainname leaves
# portmap
# ypbind
# ypserv
# rpc.yppasswdd -d /etc/yp                                                     
# 

Contrôle d'accès au service NIS

Lire la page de manuel : ypserv.acl(5)

Gestion des logs

Si le fichier /var/yp/ypserv.log existe, alors les messages y seront écrits.

Pour créer ce fichier, procédez comme suit :

# touch /var/yp/ypserv.log
# chown root:wheel /var/yp/ypserv.log
# chmod 640 /var/yp/ypserv.log

Annexes

/var/yp/Makefile

#	$OpenBSD: Makefile.yp,v 1.13 2002/11/01 23:54:18 fgsch Exp $
#
# Modified by olive :
#	- store base files for yp maps in '/etc/yp' and '/etc/yp/amd' dir 
#	  (see DIR and AMDDIR var)
#	- add support for mutiples amd & autofs maps (see AMDMAPS var)
#	- create 'shadow.byname' map (modify 'passwd.time' section)
#	- force secure maps (see 'UNSECURE=""' var)
#	- push maps to YP servers. If not, maps are badly updated on master
#

YPDBDIR=/var/yp
DIR=/etc/yp
AMDDIR=/etc/yp/amd
NOPUSH=""
AMDMAPS=amd.home amd.master amd.conf auto.home auto.share auto.smbhome
#
AWK=/usr/bin/awk
CAT=/bin/cat
CP=/bin/cp
RM=/bin/rm
CUT=/usr/bin/cut
ECHO=/bin/echo
MAKEDBM=/usr/sbin/makedbm
SED=/usr/bin/sed
SENDMAIL=/usr/sbin/sendmail
STDHOSTS=/usr/sbin/stdhosts
STDETHERS=/usr/sbin/stdethers
MKALIAS=/usr/sbin/mkalias
MKNETID=/usr/sbin/mknetid
REVNETGROUP=/usr/sbin/revnetgroup
TOUCH=/usr/bin/touch
DOMAIN="`/usr/bin/basename ${.CURDIR}`"
YPPUSH=/usr/sbin/yppush

# Password maps in standard YP is unsecure. This is due to the fact that
# passwords are accessable for anyone. FreeBSD, NetBSD, OpenBSD've a common
# solution to this, maps can be secure (makedbm -s). If a map is secure only
# a privileged user can access it.
# For secure maps, leave UNSECURE blank.
MAKEDBM-S=$(MAKEDBM) -s
# UNSECURE="True"
UNSECURE=""

# If you want ypserv to ask DNS for unknown hosts set USEDNS to -b
USEDNS=

all: passwd group hosts ethers networks rpc services protocols netid netgroup aliases $(AMDMAPS)

passwd.time: $(DIR)/master.passwd
	-@if [ -f $(>) ]; then \
		if [ ! $(UNSECURE) ]; then \
			$(CAT) $(>) | $(CUT) -d: -f1-4,8-10 | \
			$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
			{ print $$1, $$1":*:"$$3":"$$4":"$$5":"$$6":"$$7 }' -|\
			$(MAKEDBM) - passwd.byname; \
			$(CAT) $(>) | $(CUT) -d: -f1-4,8-10 |\
			$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
			{ print $$3, $$1":*:"$$3":"$$4":"$$5":"$$6":"$$7 }' -|\
			$(MAKEDBM) - passwd.byuid; \
		else \
			$(CAT) $(>) | $(CUT) -d: -f1-4,8-10 | \
			$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
			{ print $$1, $$0 }' - | $(MAKEDBM) - passwd.byname; \
			$(CAT) $(>) | $(CUT) -d: -f1-4,8-10 |\
			$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
			{ print $$3, $$0 }' - | $(MAKEDBM) - passwd.byuid; \
		fi; \
		$(CAT) $(>) | \
		$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
		{ print $$1, $$0 }' - | $(MAKEDBM-S) - master.passwd.byname; \
		$(CAT) $(>) | \
		$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
		{ print $$3, $$0 }' - | $(MAKEDBM-S) - master.passwd.byuid; \
		$(ECHO) "updated passwd"; \
		$(CAT) $(>) | $(CUT) -d: -f1-2 | \
		$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
		{ print $$1, $$0":10779:0:99999:7:::" }' - | \
		$(MAKEDBM-S) - shadow.byname; \
		$(ECHO) "updated shadow"; \
		$(TOUCH) $(@); \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) passwd.byname; \
			$(YPPUSH) -d $(DOMAIN) passwd.byuid; \
			$(YPPUSH) -d $(DOMAIN) master.passwd.byname; \
			$(YPPUSH) -d $(DOMAIN) master.passwd.byuid; \
			$(ECHO) "pushed passwd"; \
			$(YPPUSH) -d $(DOMAIN) shadow.byname; \
			$(ECHO) "pushed shadow"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

group.time: $(DIR)/group
	-@if [ -f $(>) ]; then \
		$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
		{ print $$1, $$0 }' $(>) | \
		$(MAKEDBM) - group.byname; \
		$(AWK) 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
		{ print $$3, $$0 }' $(>) | \
		$(MAKEDBM) - group.bygid; \
		$(TOUCH) $(@); \
		$(ECHO) "updated group"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) group.byname; \
			$(YPPUSH) -d $(DOMAIN) group.bygid; \
			$(ECHO) "pushed group"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

hosts.time: $(DIR)/hosts
	-@if [ -f $(DIR)/hosts ]; then \
		$(STDHOSTS) $(>) | $(SED) -e s/#.*$$// | \
		$(AWK) '{for (i = 2; i <= NF; i++) print $$i, $$0 }' | \
		$(MAKEDBM) $(USEDNS) - hosts.byname; \
		$(STDHOSTS) $(>) | \
		$(AWK) 'BEGIN { OFS="\t"; } { print $$1, $$0 }' | \
		$(MAKEDBM) $(USEDNS) - hosts.byaddr; \
		$(TOUCH) $(@); \
		$(ECHO) "updated hosts"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) hosts.byname; \
			$(YPPUSH) -d $(DOMAIN) hosts.byaddr; \
			$(ECHO) "pushed hosts"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

ethers.time: $(DIR)/ethers
	-@if [ -f $(DIR)/ethers ]; then \
		$(STDETHERS) $(>) | $(SED) -e s/#.*$$// | \
		$(AWK) 'BEGIN { FS="\t"; OFS="\t"; } { print $$1, $$0 }' | \
		$(MAKEDBM) - ethers.byaddr; \
		$(STDETHERS) $(>) | \
		$(AWK) 'BEGIN { FS="\t"; OFS="\t"; } { print $$2, $$0 }' | \
		$(MAKEDBM) - ethers.byname; \
		$(TOUCH) $(@); \
		$(ECHO) "updated ethers"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) ethers.byaddr; \
			$(YPPUSH) -d $(DOMAIN) ethers.byname; \
			$(ECHO) "pushed ethers"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

networks.time: $(DIR)/networks
	-@if [ -f $(>) ]; then \
		$(SED) -e "/^#/d" -e s/#.*$$// $(>) | \
		$(AWK) '{print $$1, $$0; for (i = 3;i <= NF;i++) print $$i,$$0}' | \
		$(MAKEDBM) - networks.byname; \
		$(AWK) 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' $(>) | \
		$(MAKEDBM) - networks.byaddr; \
		$(TOUCH) $(@); \
		$(ECHO) "updated networks"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) networks.byname; \
			$(YPPUSH) -d $(DOMAIN) networks.byaddr; \
			$(ECHO) "pushed networks"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

rpc.time: $(DIR)/rpc
	-@if [ -f $(>) ]; then \
		$(AWK) 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' $(>) | \
		$(MAKEDBM) - rpc.bynumber; \
		$(TOUCH) $(@); \
		$(ECHO) "updated rpc"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) rpc.bynumber; \
			$(ECHO) "pushed rpc"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

services.time: $(DIR)/services
	-@if [ -f $(>) ]; then \
		$(AWK) 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' $(>) | \
		$(MAKEDBM) - services.byname; \
		$(TOUCH) $(@); \
		$(ECHO) "updated services"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) services.byname; \
			$(ECHO) "pushed services"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

protocols.time: $(DIR)/protocols
	-@if [ -f $(>) ]; then \
		$(AWK) 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' $(>) | \
		$(MAKEDBM) - protocols.bynumber; \
		$(SED) -e "/^#/d" -e s/#.*$$// $(>) | \
		$(AWK) '{print $$1, $$0; for (i = 3;i <= NF;i++) print $$i,$$0}' | \
		$(MAKEDBM) - protocols.byname; \
		$(TOUCH) $(@); \
		$(ECHO) "updated protocols"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) protocols.bynumber; \
			$(YPPUSH) -d $(DOMAIN) protocols.byname; \
			$(ECHO) "pushed protocols"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

netid.time: $(DIR)/passwd $(DIR)/group $(DIR)/hosts $(DIR)/netid
	-@$(MKNETID) -q -d $(DOMAIN) -p $(DIR)/passwd -g $(DIR)/group -h $(DIR)/hosts -m $(DIR)/netid | \
	  $(MAKEDBM) - netid.byname; \
	  $(TOUCH) $(@); \
	  $(ECHO) "updated netid"; \
	  if [ ! $(NOPUSH) ]; then \
		$(YPPUSH) -d $(DOMAIN) netid.byname; \
		$(ECHO) "pushed netid"; \
	  else \
		: ; \
	  fi

netgroup.time: $(DIR)/netgroup
	-@if [ -f $(>) ]; then \
		$(CAT) $(>) | $(MAKEDBM) - netgroup; \
		$(CAT) $(>) | $(REVNETGROUP) -u -f - | \
		$(MAKEDBM) - netgroup.byuser; \
		$(CAT) $(>) | $(REVNETGROUP) -h -f - | \
		$(MAKEDBM) - netgroup.byhost; \
		$(TOUCH) $(@); \
		$(ECHO) "updated netgroup"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) netgroup; \
			$(YPPUSH) -d $(DOMAIN) netgroup.byuser; \
			$(YPPUSH) -d $(DOMAIN) netgroup.byhost; \
			$(ECHO) "pushed netgroup"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

aliases.time: $(DIR)/mail/aliases
	-@if [ -f $(>) ]; then \
		$(CP) -p $(>) $(DOMAIN)-aliases; \
		$(SENDMAIL) -bi -oA$(PWD)/$(DOMAIN)-aliases; \
		$(MAKEDBM) -U $(DOMAIN)-aliases | $(MAKEDBM) - mail.aliases; \
		$(MKALIAS) mail.aliases mail.byaddr; \
		$(TOUCH) $(@); \
		$(RM) $(DOMAIN)-aliases.db $(DOMAIN)-aliases; \
		$(ECHO) "updated aliases"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) mail.aliases; \
			$(YPPUSH) -d $(DOMAIN) mail.byaddr; \
			$(ECHO) "pushed aliases"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi

.for MAP in $(AMDMAPS)
$(MAP).time: $(AMDDIR)/$(MAP)
	-@if [ -f $(>) ]; then \
		$(SED) -e "s/#.*$$//" -e "/^$$/d" $(>) | \
		$(AWK) '{ \
			    for (i = 1; i <= NF; i++) \
				if (i == NF) { \
				    if (substr($$i, length($$i), 1) == "\\") { \
					printf("%s", substr($$i, 1, length($$i) - 1)); \
				    } \
				    else \
					printf("%s\n", $$i); \
				} \
				else \
				    printf("%s ", $$i); \
			}' | \
		$(MAKEDBM) - $(MAP); \
		$(TOUCH) $(@); \
		$(ECHO) "updated $(MAP)"; \
		if [ ! $(NOPUSH) ]; then \
			$(YPPUSH) -d $(DOMAIN) $(MAP); \
			$(ECHO) "pushed $(MAP)"; \
		else \
			: ; \
		fi \
	else \
		$(ECHO) "couldn't find $(>)"; \
	fi
.endfor # AMDMAPS


passwd: passwd.time
group: group.time
hosts: hosts.time
ethers: ethers.time
networks: networks.time
rpc: rpc.time
services: services.time
protocols: protocols.time
netid: netid.time
netgroup: netgroup.time
aliases: aliases.time
.for MAP in $(AMDMAPS)
$(MAP): $(MAP).time
.endfor # AMDMAPS

$(DIR)/passwd:
$(DIR)/group:
$(DIR)/hosts:
$(DIR)/ethers:
$(DIR)/networks:
$(DIR)/rpc:
$(DIR)/services:
$(DIR)/protocols:
$(DIR)/netid:
$(DIR)/master.passwd:
$(DIR)/netgroup:
$(DIR)/mail/aliases:
.for MAP in $(AMDMAPS)
$(AMDDIR)/$(MAP):
.endfor # AMDMAPS

# EOF

Script

Le script ci-dessous met à jour les fichiers password dans /etc/yp

#!/bin/sh
# Update YP maps after adding manualy an user

#
## Settings
#
DIR=/etc/yp
RESPONSE="no"

#
## First off all
#
if [ -d ${DIR} ] ; then
	if [ -f ${DIR}/master.passwd ] ; then
		echo ""
	else
		echo "ERROR: ${DIR}/master.passwd file" ; exit 1
	fi
else
	echo "ERROR: ${DIR} no such directory" ; exit 1
fi

echo -n "Have you updated ${DIR}/master.passwd ? [y/n: n]  "
read RESPONSE
case ${RESPONSE} in
	y*|Y*)	echo "" ;;
	*)	exit 1 ;;
esac

#
## pwd_mkdb(8)  generate the password databases
#
echo "* Generate password databases in ${DIR}"

#Create a 6th Edition-style password file and install it into /etc/passwd.
if /usr/sbin/pwd_mkdb -p -d ${DIR} ${DIR}/master.passwd ; then
	:
else
	echo "ERROR: can not create ${DIR}/passwd" ; exit 1
fi

#Creates db(3) style secure and insecure databases for the specified file.
#These databases are then installed into $DIR/spwd.db & $DIR/pwd.db.
if /usr/sbin/pwd_mkdb -d ${DIR} ${DIR}/master.passwd ; then
	echo "done." ; echo ""
else
	echo "ERROR: can not create ${DIR}/passwd" ; exit 1
fi

#
## Make yp bases
#
echo "* Update YP maps"
if [ -d /var/yp ] ; then
	cd /var/yp
	if /usr/bin/make ; then
		echo "done." ; echo ""
	else
		echo "ERROR: can not update YP maps" ; exit 1
	fi
else
	echo "ERROR: /var/yp no such directory" ; exit 1
fi


exit 0
#EOF
 
doc/openbsd/serveur_nis.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page