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.
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 ) )
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.
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é.

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 ...
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.