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