le but de centraliser la gestion des serveurs est de s’assurer du bon fonctionnement du service et surtout d’en avoir une cartographie pour la résolution de panne.

Le but ici n’est pas de constituer un SI complet d’une grande structure, mais d’utiliser des techniques accessibles pour maintenir et gérer un parc de serveur.

Nous n’aborderons pas la mise en place d’outil de ticketing, de monitoring etc…

 

Les premières briques à déployer sont un serveur DHCP, un serveur DNS et un serveur de temps.

 

Serveur DNS

Le service DNS est un service primordial. Il est très bien possible de gérer localement les correspondances ip avec des noms humainement lisible. Cependant, cette solution n’est pas « scalable ».

Il existe une offre importante d’application serveur DNS sur le marché. Les crtières de seléction que nous avons retenu sont :

– respect des standards;

– prise en charge ipv4 et ipv6;

– solution active et mature;

– prise en charge de protocole de sécurisation dnssec.

Il y a beaucoup de solution qui réponde à ces critères, dans notre cas, nous choisissons la suite logiciel isc avec l’application bind9.

Pour rappel, notre objectif est d’héberger les zones DNS sur notre annuaire pour d’une part prendre en compte dynamiquement des changements de zones et d’autre part de gérer des zones facilements.
ISC Bind propose un module pour ldap qu’il faut installer. Par la même occasion, nous installons aussi les outils de manipulation dns.
L’installation s’effectue avec les outils systèmes

sudo apt-get install bind9-dyndb-ldap dnsutils

Préparation de l’annuaire LDAP

La première étape est de déclarer le nouveau schéma dont à besoin Bind pour construire ses zones.

Un schéma est distribué dans le fichier compressé suivant : /usr/share/doc/bind9-dyndb-ldap/schema.ldif.gz

Il faut lire attentivement les instructions présentes dans le fichier en question. En effet, ce format de schéma est adapté pour l’annuaire directory 389 de la suite FreeIPA. Historiquement, c’est l’équipe FreeIPA qui a dévelopé le module dyndb-ldap pour ISC Bind.

Voici ce fichier avec ajout d’un attribut pour la gestion de la double pile (ipv4 et ipv6). Nous en aurons besoin avec l’activation de ipv6.

cat bind9.schema 
# This schema contains OIDs from Uninett and FreeIPA.
#
# Unninet: http://drift.uninett.no/nett/ip-nett/dnsattributes.schema
#          Base OID for DNS records is 1.3.6.1.4.1.2428.20.1,
#          see http://drift.uninett.no/nett/ip-nett/oids.html
#
# FreeIPA: http://freeipa.org/
#          Base OID for DNS records is 2.16.840.1.113730.3.8.5
#          Base OID for DNS objectClasses is 2.16.840.1.113730.3.8.6
#
# If you want to add some record types that are defined by IANA,
# please define it similar to what is done for the existing ones. The
# name should be {TYPE}Record, and OID should be
# 1.3.6.1.4.1.2428.20.1.value. For instance the RR type LOC has value
# 29, so attribute name should be LocRecord (casing shouldn't matter),
# and the OID is 1.3.6.1.4.1.2428.20.1.29. If you follow this, you
# know that it will be compatible with what others use, and one is
# guaranteed that the OIDs are unique.
# The IANA DNS record type values are available from
# .
#
# If you define new attributes, please report them to drift@uninett.no
# to get them added of this schema.
#
# The basic record types like A, CNAME etc are defined in the cosine
# schema and not by UNINETT or FreeIPA.  This means that your LDAP server
# should use the old COSINE schema (RFC 1274) plus this one to get
# all the DNS attributes defined.
#
# Alternativelly you can use included excerpt from COSINE schema to get all
# the missing attributes.
#
#
# 389 DS requires following DN
#dn: cn=schema
#
# OpenLDAP 2.4 requires following DN + objectClass + different attribute names
# s/^attributeTypes:/olcAttributeTypes:/
# s/^objectClasses:/olcObjectClasses:/
dn: cn=dns,cn=schema,cn=config
objectClass: olcSchemaConfig
#cn=dns
#
#
# COSINE schema
# comment out if your server has COSINE schema installed
#olcAttributeTypes: ( 0.9.2342.19200300.100.1.26 
# NAME 'aRecord' 
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
# EQUALITY caseIgnoreIA5Match )
#
#olcAttributeTypes: ( 0.9.2342.19200300.100.1.27 
# NAME 'mDRecord' 
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
# EQUALITY caseIgnoreIA5Match )
#
#olcAttributeTypes: ( 0.9.2342.19200300.100.1.28 
# NAME 'mXRecord' 
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
# EQUALITY caseIgnoreIA5Match )
#
#olcAttributeTypes: ( 0.9.2342.19200300.100.1.29 
# NAME 'nSRecord' 
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
# EQUALITY caseIgnoreIA5Match )
# CNAME record was originally defined as multi-value
# but we redefined it as single-value to conform with RFC 2136, section 1.1.5.
#olcAttributeTypes: ( 0.9.2342.19200300.100.1.31 
# NAME 'cNAMERecord' 
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
# EQUALITY caseIgnoreIA5Match 
# SINGLE-VALUE )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.0.0 
 NAME 'dNSTTL' 
 DESC 'An integer denoting time to live' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 
 EQUALITY integerMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.0.2 
 NAME 'dNSdefaultTTL' 
 DESC 'An integer denoting default time to live, RFC 2308' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 
 EQUALITY integerMatch 
 ORDERING integerOrderingMatch )
#
#
# UNINETT and FreeIPA attributes
# dnsClass attribute is in fact unsupported by bind-dyndb-ldap
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.0.1 
 NAME 'dNSClass' 
 DESC 'The class of a resource record' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.12 
 NAME 'pTRRecord' 
 DESC 'domain name pointer, RFC 1035' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.13 
 NAME 'hInfoRecord' 
 DESC 'host information, RFC 1035' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.14 
 NAME 'mInfoRecord' 
 DESC 'mailbox or mail list information, RFC 1035' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.16 
 NAME 'tXTRecord' 
 DESC 'text string, RFC 1035' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.18 
 NAME 'aFSDBRecord' 
 DESC 'for AFS Data Base location, RFC 1183' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.28 
 NAME 'aAAARecord' 
 DESC 'IPv6 address, RFC 1886' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.29 
 NAME 'LocRecord' 
 DESC 'Location, RFC 1876' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.30 
 NAME 'nXTRecord' 
 DESC 'non-existant, RFC 2535' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.33 
 NAME 'sRVRecord' 
 DESC 'service location, RFC 2782' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.35 
 NAME 'nAPTRRecord' 
 DESC 'Naming Authority Pointer, RFC 2915' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.36 
 NAME 'kXRecord' 
 DESC 'Key Exchange Delegation, RFC 2230' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.37 
 NAME 'certRecord' 
 DESC 'certificate, RFC 2538' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.38 
 NAME 'a6Record' 
 DESC 'A6 Record Type, RFC 2874' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.39 
 NAME 'dNameRecord' 
 DESC 'Non-Terminal DNS Name Redirection, RFC 6672' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.43 
 NAME 'dSRecord' 
 DESC 'Delegation Signer, RFC 3658' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.44 
 NAME 'sSHFPRecord' 
 DESC 'SSH Key Fingerprint, draft-ietf-secsh-dns-05.txt' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.51 
 NAME 'nSEC3PARAMRecord' 
 DESC 'RFC 5155' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch 
 SINGLE-VALUE ) 
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.52 NAME 'TLSARecord' 
 DESC 'DNS-Based Authentication of Named Entities - Transport Layer Security Protocol, RFC 6698' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.32769 
 NAME 'DLVRecord' 
 DESC 'RFC 4431: DNSSEC Lookaside Validation' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
# See https://fedorahosted.org/bind-dyndb-ldap/wiki/Design/UnknownRecord
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.4 
 NAME 'UnknownRecord' 
 DESC 'unknown DNS record, RFC 3597' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.0 
 NAME 'idnsName' 
 DESC 'DNS FQDN' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.1 
 NAME 'idnsAllowDynUpdate' 
 DESC 'permit dynamic updates on this zone' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 
 EQUALITY booleanMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.2 
 NAME 'idnsZoneActive' 
 DESC 'define if the zone is considered in use' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 
 EQUALITY booleanMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.3 
 NAME 'idnsSOAmName' 
 DESC 'SOA Name' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.4 
 NAME 'idnsSOArName' 
 DESC 'SOA root Name' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.5 
 NAME 'idnsSOAserial' 
 DESC 'SOA serial number' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 
 EQUALITY numericStringMatch 
 SINGLE-VALUE ) 
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.6 
 NAME 'idnsSOArefresh' 
 DESC 'SOA refresh value' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 
 EQUALITY numericStringMatch 
 SINGLE-VALUE ) 
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.7 
 NAME 'idnsSOAretry' 
 DESC 'SOA retry value' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 
 EQUALITY numericStringMatch 
 SINGLE-VALUE ) 
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.8 
 NAME 'idnsSOAexpire' 
 DESC 'SOA expire value' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 
 EQUALITY numericStringMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.9 
 NAME 'idnsSOAminimum' 
 DESC 'SOA minimum value' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 
 EQUALITY numericStringMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.10 
 NAME 'idnsUpdatePolicy' 
 DESC 'DNS dynamic updates policy' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.11 
 NAME 'idnsAllowQuery' 
 DESC 'BIND9 allow-query ACL element' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SINGLE-VALUE ) 
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.12 
 NAME 'idnsAllowTransfer' 
 DESC 'BIND9 allow-transfer ACL element' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.13 
 NAME 'idnsAllowSyncPTR' 
 DESC 'permit synchronization of PTR records' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 
 EQUALITY booleanMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.14 
 NAME 'idnsForwardPolicy' 
 DESC 'forward policy: only or first' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch 
 SINGLE-VALUE ) 
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.15 
 NAME 'idnsForwarders' 
 DESC 'list of forwarders' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match 
 SUBSTR caseIgnoreIA5SubstringsMatch )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.18 
 NAME 'idnsSecInlineSigning' 
 DESC 'DNSSEC in-line signing' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 
 EQUALITY booleanMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.31
 NAME 'idnsServerId'
 DESC 'DNS server identifier'
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
 EQUALITY caseIgnoreMatch 
 SINGLE-VALUE )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.30 
 NAME 'idnsSubstitutionVariable' 
 DESC 'User defined variable for DNS plugin' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match )
#
olcAttributeTypes: ( 1.3.6.1.4.1.2428.20.1.49 NAME 'dHCIDRecord' DESC 'DHC
 P identifier, RFC 4701' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5Subst
 ringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
#
olcAttributeTypes: ( 2.16.840.1.113730.3.8.5.29 
 NAME 'idnsTemplateAttribute' 
 DESC 'Template attribute for dynamic attribute generation' 
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 
 EQUALITY caseIgnoreIA5Match )
#
olcObjectClasses: ( 2.16.840.1.113730.3.8.6.0 
 NAME 'idnsRecord' 
 DESC 'dns Record, usually a host' 
 SUP top 
 STRUCTURAL 
 MUST idnsName 
 MAY ( cn $ idnsAllowDynUpdate $ DNSTTL $ DNSClass $ ARecord $ 
       AAAARecord $ A6Record $ NSRecord $ CNAMERecord $ PTRRecord $ 
       SRVRecord $ TXTRecord $ MXRecord $ MDRecord $ HINFORecord $ 
       MINFORecord $ AFSDBRecord $ LOCRecord $ 
       NXTRecord $ NAPTRRecord $ KXRecord $ CERTRecord $ DNAMERecord $ 
       DSRecord $ SSHFPRecord $ DLVRecord $ TLSARecord $ 
       UnknownRecord $ dHCIDRecord
     ) )
#
olcObjectClasses: ( 2.16.840.1.113730.3.8.6.1 
 NAME 'idnsZone' 
 DESC 'Zone class' 
 SUP idnsRecord 
 STRUCTURAL 
 MUST ( idnsName $ idnsZoneActive $ idnsSOAmName $ idnsSOArName $ 
        idnsSOAserial $ idnsSOArefresh $ idnsSOAretry $ idnsSOAexpire $ 
        idnsSOAminimum 
      ) 
 MAY ( idnsUpdatePolicy $ idnsAllowQuery $ idnsAllowTransfer $ 
       idnsAllowSyncPTR $ idnsForwardPolicy $ idnsForwarders $ 
       idnsSecInlineSigning $ nSEC3PARAMRecord $ dNSdefaultTTL 
     ) )
#
olcObjectClasses: ( 2.16.840.1.113730.3.8.6.2 
 NAME 'idnsConfigObject' 
 DESC 'DNS global config options' 
 STRUCTURAL 
 MAY ( idnsForwardPolicy $ idnsForwarders $ idnsAllowSyncPTR ) )
#
olcObjectClasses: ( 2.16.840.1.113730.3.8.6.3 
 NAME 'idnsForwardZone' 
 DESC 'Forward Zone class' 
 SUP top 
 STRUCTURAL 
 MUST ( idnsName $ idnsZoneActive ) 
 MAY ( idnsForwarders $ idnsForwardPolicy ) )
#
olcObjectClasses: ( 2.16.840.1.113730.3.8.6.6 
 NAME 'idnsServerConfigObject' 
 DESC 'DNS server configuration' 
 SUP top 
 STRUCTURAL 
 MUST ( idnsServerId ) 
 MAY ( idnsSOAmName $ idnsForwarders $ idnsForwardPolicy $ 
       idnsSubstitutionVariable 
     ) )
#
olcObjectClasses: ( 2.16.840.1.113730.3.8.6.5 
 NAME 'idnsTemplateObject' 
 DESC 'Template object for dynamic DNS attribute generation' 
 SUP top 
 AUXILIARY 
 MUST ( idnsTemplateAttribute ) )
Par la même occasion, nous préparons l’initialisation de nos zone dns et zone reverse.

dn: idnsServerId=annuaire,dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata
 ,dc=fr
objectClass: top
objectClass: idnsServerConfigObject
idnsServerId: annuaire

dn: idnsName=lab.ezydata.fr,idnsServerId=annuaire,dc=DNS,dc=servicereseau
 ,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: idnsRecord
objectClass: idnsZone
objectClass: top
idnsName: lab.ezydata.fr
idnsSOAexpire: 604800
idnsSOAminimum: 86400
idnsSOAmName: ns1.lab.ezydata.fr.
idnsSOArefresh: 10800
idnsSOAretry: 900
idnsSOArName: jean-pierre.hoang.lab.ezydata.fr.
idnsSOAserial: 1615143844
idnsZoneActive: TRUE
aRecord: 192.168.200.10
idnsAllowDynUpdate: TRUE
idnsAllowSyncPTR: TRUE
idnsUpdatePolicy: grant clednscloud zonesub ANY;
nSRecord: ns1.lab.ezydata.fr.

dn: idnsName=ns1,idnsName=lab.ezydata.fr,idnsServerId=annuaire,dc=DNS
 ,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: top
objectClass: idnsRecord
idnsName: ns1
aRecord: 192.168.200.10

dn: idnsName=annuaire,idnsName=lab.ezydata.fr,idnsServerId=annuaire
 ,dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: top
objectClass: idnsRecord
idnsName: annuaire
aRecord: 192.168.200.10

dn: idnsName=_ntp._udp,idnsName=lab.ezydata.fr,idnsServerId=annuaire
 ,dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: top
objectClass: idnsRecord
idnsName: _ntp._udp
sRVRecord: 0 100 123 annuaire

dn: idnsName=_ldap._tcp,idnsName=lab.ezydata.fr,idnsServerId=annuaire
 ,dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: top
objectClass: idnsRecord
idnsName: _ldap._tcp
sRVRecord: 0 100 389 annuaire

dn: idnsName=_ldaps._tcp,idnsName=lab.ezydata.fr,idnsServerId=annuaire
 ,dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: top
objectClass: idnsRecord
idnsName: _ldaps._tcp
sRVRecord: 0 100 636 annuaire

root@annuaire:~/dns# cat init_reverse_dns_cloud.ldif
dn: idnsName=200.168.192.in-addr.arpa.,idnsServerId=annuaire
 ,dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: top
objectClass: idnsRecord
objectClass: idnsZone
idnsName: 200.168.192.in-addr.arpa.
idnsSOAexpire: 604800
idnsSOAminimum: 86400
idnsSOAmName: ns1.lab.ezydata.fr.
idnsSOArefresh: 10800
idnsSOAretry: 900
idnsSOArName: jean-pierre.hoang.lab.ezydata.fr.
idnsSOAserial: 1614543408
idnsZoneActive: TRUE
idnsAllowDynUpdate: TRUE
idnsUpdatePolicy: grant clednscloud zonesub ANY;
nSRecord: ns1.lab.ezydata.fr.

dn: idnsName=10,idnsName=200.168.192.in-addr.arpa.,idnsServerId=annuaire
 ,dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr
objectClass: idnsRecord
idnsName: 10
dNSTTL: 86400
pTRRecord: annuaire.lab.ezydata.fr.
Recommendation : il est important de respecté la syntaxe des fichiers zone de Bind. En particulier, les points dans les valeurs pour indiquer le fqdn.
On commence par importer le nouveau schéma

root@annuaire:~/dns# ldapadd -Y EXTERNAL -H ldapi:/// -c -f bind9.schema

Puis ajouter les noeuds associé aux zone lab.ezydata.fr et un enregistrement d’un fqdn. Vous remarquerez que nous avons ajouté un enregistrement de type SRV pour indiquer la présence d’un serveur d’annuaire sur ce domaine.

root@annuaire:~/dns# ldapadd -Y EXTERNAL -H ldapi:/// -c -f init_dns_cloud.ldif
root@annuaire:~/dns# ldapadd -Y EXTERNAL -H ldapi:/// -c -f init_reverse_dns_cloud.ldif

Bind nécessite le droit d’écriture sur le dn: dc=DNS,dc=servicereseau,ou=cloud,dc=la,dc=ezydata,dc=fr. C’est pourquoi, il faut crée un utilisateur spéciale pour lui qui aura les ACL nécessaire.

Remarque, c’est un utilisateur uniquement pour la connexion LDAP qui ne joue aucun role sur l’OS. Par conséquent, il n’a pas les attributs Unix ni de groupe associé.

 

Pour modifier une ACL dans la base config de OpenLDAP, il faut le supprimer et rajouter la règle qui nous intéresse. En effet, les ACL sont évalué dans l’ordre d’apparition et l’évaluation s’arrêt à la première correspondance. Si nous ne faisons pas attention, il se peut que la règle que nous introduisons ne soit jamais évaluer.
Les ACL se situent dans les attributs de la base. Par construction, toutes les base sont indexé. La première base est systématiquement la base config.
Comme nous n’avons qu’une seul base utilisateur, c’est donc le deuxième indexe.
Donc, on récupère les informations avec cette commande
root@annuaire:/etc/bind# slapcat -n 0 -s "olcDatabase={1}mdb,cn=config"
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=lab,dc=ezydata,dc=fr
olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * non
 e
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by * read
olcLastMod: TRUE
...
olcDbCheckpoint: 512 30
olcDbIndex: objectClass eq
olcDbIndex: cn,uid eq
olcDbIndex: uidNumber,gidNumber eq
olcDbIndex: member,memberUid eq
olcDbMaxSize: 1073741824
structuralObjectClass: olcMdbConfig
...
Ce que nous souhaitons c’est que l’access au noeud « dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr » et à ses fils par l’utilisateur « uid=bind,ou=people,ou=cloud,dc=lab,dc=ezydata,dc=fr » soit en écriture. Ce qui se traduit par ceci

olcAccess: to dn.subtree="dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr"
  by dn.exact="uid=bind,ou=people,ou=cloud,dc=lab,dc=ezydata,dc=fr" write
  by anonymous auth
  by * read

Nous aurions pu encore limiter la lecture de ces informations qu’a un sous ensemble d’utilisateur ou group. Vous pouvez vous appuyer sur la documentation officiel pour le faire (https://openldap.org/doc/admin24/access-control.html)

Pour que cet ACL soit évaluer parmis les trois règles, il faut le mettre avant la règle par default « to * by * read » qui veut dire tout lemonde peut lire les informations.

Donc voici les fichiers ldif de modification et les commandes ldap pour modifier.

root@annuaire:~/dns# cat acl_bind_del_index2.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {2}
root@annuaire:~/dns# cat acl_bind.ldif 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to dn.subtree="dc=DNS,dc=servicereseau,ou=cloud,dc=lab,dc=ezydata,dc=fr"
  by dn.exact="uid=bind,ou=people,ou=cloud,dc=lab,dc=ezydata,dc=fr" write
  by anonymous auth
  by * read
-
add: olcAccess
olcAccess: to * by * read
root@annuaire:~/dns# ldapmodify -Y EXTERNAL -H ldapi:/// -c -v -f acl_bind_del_index2.ldif 
root@annuaire:~/dns# ldapmodify -Y EXTERNAL -H ldapi:/// -c -v -f acl_bind.ldif

En résumé, nous avons :

– déployé un nouveau schéma en y ajoutant un attribut;

– créé un utilisateur ayant tous les droits sur une branche de l’annuaire

– créé le conteneur servant à aux zones dns.

La prochaine étape est de déclarer à Bind de retrouver ces zones dans l’annuaire. L’article suivant se consacre à la synchronisation de l’annuaire avec la base dynamique Bind.