Laatste berichten

Meer koffie dankzij Puppet

  • Door: Miek Gieben
  • 03 mei 2012 - 15:45 uur

Of; hoe SIDN Puppet inzet voor beheer.

Puppet is een ‘configuratie management systeem’. Met zo'n systeem automatiseer je de inrichting van je Unix-(Linux/FreeBSD/Solaris/...) omgeving. Een ander, soortgelijke toepassing is bijvoorbeeld CFengine.[meer...]

Met een configuratie management systeem kun je tal van repeterende routinewerkzaamheden automatiseren. Bijvoorbeeld: ‘Plaats dit configuratie-bestand in die directory en herstart daarna BIND’.

Bij SIDN hadden we hier behoefte aan. We wilden:

  • Een consistente/automatische installatie van alle machines;
  • Historie van veranderingen beter bijhouden;
  • Alle software als packages (deb, rpm, etc.) installeren;
  • De grootte van de back-up minimaliseren.

Met de introductie van Puppet is de situatie nu zo dat we een ‘kale’ machine in DNS/DHCP opvoeren en dan aanzetten. De rest gaat daarna ‘vanzelf’. Tijd voor een kop koffie dus. Tegen de tijd dat die op is, staat er een volledig geïnstalleerd en geconfigureerd systeem tot je beschikking.

Er zijn vier pijlers waarop dit rust:

  • Een ‘build’-infrastructuur om packages mee te maken;
  • Een ‘repository server’ waar de eigen (supplementaire) packages op worden neergezet, zodat ze eenvoudig uitgerold kunnen worden;
  • PXE-boot omgeving, die werkt voor alle ondersteunde OS-en, op dit moment is dat bij ons: RedHat/CentOS en Ubuntu;
  • Puppet-configuratie.

Build-infrastructuur
Om zelf packages te kunnen maken, hebben we een (virtuele) server ingericht (builder1). Deze beschikt over alle ‘sources’ van de packages die we nodig hebben. Denk bijvoorbeeld aan de source-code tar-files van BIND. Verder bevat hij de specifieke configuratie om .deb of .rpm packages te maken, zoals ‘rules’ en ‘spec’-files. Deze configuratie wordt (uiteraard) ook weer via Puppet beheerd.

Verder zijn er nog enkele ‘satellietmachines’ die de specifieke OS-en draaien waar we de packages voor willen bouwen. De hiervoor benodigde bestanden komen, via NFS-mounts, van de builder1.

Om op zo'n satellietmachine een package te bouwen is het geven van één commando voldoende:

makebind    # bouwt de nieuwste BIND9
makensd     # bouwt de nieuwste NSD

Hierna wordt het gemaakte package naar onze ‘repository server’ gekopieerd.

Repository server
Onze software-repositories worden om de zoveel tijd gesynchroniseerd met de officiële repositories van Redhat en Ubuntu. Op deze manier is SIDN in control over wat er precies op het netwerk draait. De packages die we zelf gemaakt voegen we vervolgens toe aan onze eigen repository server.

De rest van de systemen kan daarna op de gangbare manier geüpdatet worden: apt-get upgrade, yum update, etc.

PXE-boot omgeving
De derde pijler is onze PXE-boot omgeving. Deze omgeving heeft slechts één taak: zorg dat er op een willekeurige machine een OS komt te staan en een paar basis packages. Dat kan zowel een fysieke server zijn, als een virtueel systeem.

(Virtuele) harde schijven worden tijdens dit proces volautomatisch gepartitioneerd (met behulp van 'LVM'). Daarbij kan er voor worden gekozen om het filesysteem volledig te versleutelen, wat we in een aantal gevallen ook daadwerkelijk doen.

Het laatste pakket dat geïnstalleerd wordt is Puppet. Die neemt daarna de installatie over en zorgt ervoor dat de machine helemaal af-geconfigureerd wordt.

Puppet
Als vierde en laatste pijler is er een Puppet ‘master–machine’, die de configuraties bewaart in Subversion. We hebben bewust hiervoor gekozen en niet voor bijvoorbeeld Git, omdat Subversion zaken als $Id$ en $URL$ ondersteund. Zo kan je als beheerder op een machine altijd zien dat een bestand uit Subversion (en dus Puppet) komt en dat je die dus op de Puppet master machine moet veranderen en niet lokaal.

De Puppet configuratie is simpel gehouden, veel van de resource types die we gebruiken zijn:

De gedachte hierachter is, dat we niet de ambitie hebben om Puppet experts te willen worden, maar gewoon ‘gebruikers’ zijn. En met deze relatief simpele Puppet configuratie kun je al heel veel.

In Puppet definieer je ‘manifests’, die aangeven hoe een stukje software met eventuele configuratiebestanden op een machine moet worden neergezet. Een voorbeeld van een (onvolledig) Puppet manifest is deze:

# Class: generic::ntp
# Control the ntp configuration (/etc/ntp.conf).
# Package 'ntp' is also installed.
class generic::ntp {
    file { "/etc/ntp.conf":
        source  => [ "puppet://puppet/modules/generic/etc/ntp.conf=$hostname",
                     "puppet://puppet/modules/generic/etc/ntp.conf" ],
        require => Package["ntp"],
    }
}

Dit kleine stukje Puppet laat zien hoe we een ntp.conf neerzetten. Veel moeilijker dan dit zijn onze Puppet manifests niet.

Wat staat hier precies?

Allereerst wordt er een klasse ‘generic::ntp’ gedefinieerd. Als deze klasse wordt aangeroepen, dan zal die ervoor zorgen dat het ntp-package wordt geïnstalleerd (vanwege de ‘require’ regel). En is er voor de betreffende machine een specifieke ntp.conf (ntp.conf=$hostname), gebruik die dan. Anders vallen we terug op de generieke versie.

Voordelen
De voordelen voor SIDN zijn legio:

  • Het installeren van een machine kost eigenlijk nauwelijks tijd meer. Je kunt tijdens de installatie koffie gaan halen, opdrinken, terug lopen en dan inloggen op je nieuwe server;
  • Alle systeem-specifieke data is opgeslagen in Subversion;
  • Software-uitrol verloopt netjes via packages;
  • Het documenteren kost minder tijd, want Puppet is bijna zelf-documenterend. Alleen one-off zaken moeten nu nog apart gedocumenteerd worden.

Inmiddels is het woord ‘Puppetized’ een veel gebruikte term geworden binnen SIDN.

Bijgaand een afbeelding van een /etc/motd van een machine die door middel van Puppet is uitgerold. Rechtsboven is te zien dat deze ‘puppetized’ is.

RESTful EPP (EPP maar dan anders)

  • Door: Maarten Wullink
  • 26 april 2012 - 13:30 uur

Het Domeinnaamregistratiesysteem (DRS) van SIDN kan via twee verschillende kanalen worden aangesproken. Er is een Web-GUI, waarmee handmatig de DRS-handelingen kunnen worden uitgevoerd. En er is een EPP-interface (API), die erg geschikt is om op een geautomatiseerde manier DRS aan te spreken.[meer...]

EPP (Extensible Provisioning Protocol) is een op XML gebaseerd protocol en een internet standaard van de IETF. Het protocol beschrijft de interface en de input/output van een registratiesysteem. Wie geïnteresseerd is in de details, kan kijken naar RFC 5730, RFC 5731, RFC 5732, RFC 5733 en RFC 5734.

Bij SIDN wordt sinds de introductie van DRS5 gebruik gemaakt van EPP als vervanging van de voormalige e-mailformulieren. De EPP-interface maakt gebruik van een TCP-verbinding die met TLS wordt gecodeerd.  Een cliënt maakt een connectie met de EPP-server en zal vervolgens XML-requests versturen. Dit werkt op zich prima, alleen hebben we gemerkt dat het gebruik van een ‘stateful’ TCP verbinding een aantal bezwaren kent.

Bezwaren van EPP
EPP is gedefinieerd als een ‘stateful protocol’. Dat wil zeggen dat de server van elke cliënt informatie moet bijhouden over de lopende sessie. Dat impliceert (in onze setup), dat de cliënt gedurende de duur van een sessie steeds bij dezelfde server moet terug komen voor een volgend EPP-verzoek. Onze load-balancers zorgen daar dan ook voor.  Dat maakt het echter lastig om een bepaalde server, waarop sessies actief zijn, voor onderhoud uit de pool van beschikbare servers te halen. En het is jammer dat een load-balancer verzoeken niet simpelweg kan doorsturen naar de op dat moment minst belaste EPP-server. Als oplossing kan ‘session state’ op een andere manier worden bijgehouden, maar dat maakt de infrastructuur weer complexer.

Wanneer de TCP-verbinding van een lopende sessie onverwachts verbroken wordt  (zonder eerst het <logout> commando te versturen), bestaat de EPP-sessie nog steeds op de server. Dat kan een probleem opleveren, aangezien bij SIDN sprake is van een maximaal aantal simultane sessies. Wanneer nieuwe sessies worden opgezet, terwijl de oude sessie nog niet is opgeruimd, kan een registrar tegen een sessie-limiet aan lopen. Ook hier moet dus omheen worden gewerkt.

Internet draft: RESTful EPP (REPP)
Toen we aan het nadenken waren over dit onderwerp, ontstond het idee om EPP te gaan doen op een ‘stateless’ manier, dus op een manier waarop ‘state’ niet meer bijgehouden hoeft te worden. Dat idee hebben we uitgewerkt in een internet-draft, waarvan versie ‘00’ onlangs is ingediend bij de IETF.

We hebben er bij ons idee voor gekozen om gebruik te maken van ‘Representational state transfer’ (REST), een bepaalde software-architectuurstijl, die de laatste jaren toenemende belangstelling geniet.

De oplossing moest zo dicht mogelijk bij de bestaande EPP-standaarden blijven, vonden we, omdat deze wereldwijd al veel wordt gebruikt. Daarnaast hadden we de volgende wensen:

  • Stateless;
  • XML-gebruik minimaliseren;
  • Simpel te integreren.

Het was al snel duidelijk dat een ‘stateless’ API veel van de bezwaren zou oplossen. Stateless  is de natuurlijke tegenhanger van stateful. HTTP is het misschien wel bekendste voorbeeld van een stateless protocol. 

REST is een architectuurstijl die bovenop HTTP is gedefinieerd. Met REST is het mogelijk om een API te ontwerpen die eenvoudig leesbaar is en ook eenvoudig te gebruiken is. REST definieert een zogenaamde ‘resource’, die een object definieert waarop een operatie moet worden uitgevoerd. Deze operatie wordt bepaald door de ‘HTTP method’, zoals GET of POST. Een API die werkt volgens de principes van REST wordt aangeduid als ‘RESTful’ API. De nieuwe interface heeft dan ook de naam REPP gekregen, wat staat voor “RESTful EPP”.

Eigenlijk werkt REPP heel eenvoudig. Een domein <check> commando is bijvoorbeeld:

HEAD /rest/v1/domains/sidn.nl

Met de RESTful EPP-interface wordt een EPP-commando dus niet meer verstuurd door middel van een XML request, maar als een REST resource. Bijvoorbeeld een domeinnaam-resource “/rest/v1/domains/sidn.nl” en een  HTTP methode die aangeeft wat er met deze resource moet  gebeuren, bijvoorbeeld een GET voor een <info> of een HEAD voor een <check> commando.

Zie hieronder het verschil tussen een RESTful en een stateful domeinnaam check:

RESTful

HEAD /rest/v1/domains/sidn.nl
X-REPP-cltrid: ABC-12345

Stateful

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
   <command>
      <check>
        <domain:check
          xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
          <domain:name>sidn.nl </domain:name>
        </domain:check>
      </check>
      <clTRID>ABC-12345</clTRID>
   </command>
</epp>

Het verschil t.o.v. het huidige EPP is, dat er minder XML nodig is en een aantal commando’s veel efficiënter zijn geworden. De <login> en <logout> commando’s zijn zelfs helemaal niet meer nodig.

Er is een nieuwe EPP-extensie ontworpen welke gebruikt kan worden om, als het nodig is, een EPP XML request naar de server te versturen. Daarnaast is een ‘mapping’ gemaakt van de bestaande EPP-commandostructuur naar een RESTful-interface in de vorm van een verzameling van URL’s.

Het resultaat is een hybride oplossing, een API die bestaat uit een mix van een EPP-extensie en een ‘EPP protocol mapping’. Of het resultaat officieel nog EPP genoemd kan worden was al snel onderwerp van discussie. Dit, omdat REPP afwijkt van een duidelijke uitspraak uit RFC 5730, namelijk dat EPP stateful moet zijn. En dat was het nou net niet  :-)

Referentie implementatie
Om het resultaat te testen is er een referentie implementatie gemaakt, maar dat is iets voor het volgende artikel.

Onze draft is te lezen op: http://tools.ietf.org/html/draft-wullink-restful-epp-00 .

Tags
meer

DNS-onderhoud voor .nl

  • Door: Marco Davids
  • 19 april 2012 - 12:00 uur

De oplettende .nl-watcher zal het zijn opgevallen dat we bezig zijn met het veranderen van de NS RR-set van de .nl-zone. Twee NS-records uit het 'nic.nl' domein zijn inmiddels (via een zogenaamde IANA-procedure) vervangen door NS-records die eindigen op 'dns.nl'. De overige volgen binnen afzienbare tijd.[meer...]

Voor het .nl-domein is zo’n IANA-procedure af en toe nodig, bijvoorbeeld wanneer een name server een ander IP-adres krijgt.

Ook hebben we in het verleden de name servers uit het 'domain-registry.nl-domein’ gehaald en in het veel kortere 'nic.nl-domein’ geplaatst. Dat scheelde een aantal bytes, die weer van pas kwamen voor het toevoegen van 'AAAA' glue-records ten behoeve van IPV6.

Dit keer was er nog een andere reden. We willen toe naar een andere setup met minder 'name server afhankelijkheden'. Wat we daarmee bedoelen kan het beste duidelijk gemaakt worden aan de hand van een afbeelding. Onze collega's van Verisign Labs hebben daarvoor een mooie tool in het leven geroepen met de indrukwekkende aanduiding: The Transitive Trust and DNS Dependency Graph Portal:

http://trans-trust.verisignlabs.com/

Deze tool visualiseert heel fraai hoe veelzijdig het resolven van een domeinnaam kan verlopen. Voor een .nl-domeinnaam moest eerst 'nic.nl' worden geresolved, maar daarvoor moeten eerst tal van andere domeinnamen worden afgelopen. Al met al vereist dat voor een resolver met een nog lege cache een flink aantal stappen, waarbij de resolver zelfs tot in Japan kan uitkomen alvorens hij resultaat heeft. Dat kan kostbare milliseconden vergen.
 


http://trans-trust.verisignlabs.com/pix/nl.-names.png

Hoewel het DNS prima werkt in de huidige situatie, geloven we dat het vereenvoudigen van de ‘name server afhankelijkheden’ een goede stap voorwaarts is. Het maakt de situatie meer 'lean and mean' en in het meest gunstigste geval levert het ook nog een sneller DNS op.

Als de transitie straks helemaal is voltooid, zal de situatie voor .nl meer lijken op die van (bijvoorbeeld) Zweden:

http://trans-trust.verisignlabs.com/pix/se.-names.png
 
De domeinnaam 'dns.nl' die we voor de nieuwe NS records gebruiken, is een zogeheten 'empty non-terminal'. Er is geen 'apex' of ‘start of authority’ en geen aparte zonefile, want de 'ns[13].dns.nl' records staan rechtstreeks in de .nl-zone. Exact zoals de Zweedse collega's al een tijdje doen. Dat heeft een groot voordeel; alles wat belangrijk is voor de .nl-zone staat nu ook in die zone. En passant zijn de nieuwe NS records ook DNSSEC gesigned, wat voor ‘nic.nl’ nog niet het geval was.

We hebben ook nog even overwogen om het model van .fi, de Finse collega's te volgen. Zij gebruiken 1-teken .fi-domeinnamen als NS-records, zoals 'a.fi', b.fi' enz. Daarmee wordt de NS RR-set nog wat compacter.

Uiteindelijk hebben we hier voor niet gekozen, omdat dit effectief zou betekenen dat er voor .nl 1-teken domeinnamen zouden ontstaan en dat zou een nogal revolutionaire, niet geheel onomstreden verandering betekenen.

1-teken domeinnamen zijn tot op de dag van vandaag niet toegestaan in .nl, dank zij een, zo je wilt, ‘voorzienige blik’ van Piet Beertema, die destijds goed op de hoogte was van RFC952, waarin letterlijk staat:

"Single character names or nicknames are not allowed."

Nu hebben we het hier niet over hostnamen, maar over domeinnamen en DNS. In de DNS RFC's, zoals RFC1034 (en haar voorloper RFC882) wordt echter wel naar bovengenoemde RFC verwezen. Er staat dat: 'labels' (de stukjes tekst tussen de punten in een domeinnaam) moeten voldoen aan de eisen voor een hostnaam, dus aan RFC952. Geen 1-teken namen dus.

Piet Beertema en zijn collega Jaap Akkerhuis hadden het dus scherp gezien: “1-teken domeinnamen 'mogen' eigenlijk niet”, constateerden ze (al werkt het  technisch prima). Jon Postel, toen nog beheerder van alle gTLD's (.com, .net.  enz.), verkreeg dit inzicht pas in 1992, maar toen waren er al enkele 1-teken  domeinnamen geregistreerd:

http://en.wikipedia.org/wiki/Single-letter_second-level_domain
 
Dus, hoewel 1-letter domeinnamen (als NS records) prima hadden kunnen werken, hebben we er vooralsnog voor gekozen het besluit van Piet Beertema van destijds in ere te houden.

DNS.nl en geen NIC.nl
De keuze voor 'dns.nl', een beschermde .nl-domeinnaam, is gemaakt om het transitieproces te vergemakkelijken. Het geeft ons een goede gelegenheid om  onder dat domein nieuwe name servers op te tuigen en dan via de  IANA-procedure de soepele omzetting te doen van 'nic.nl' naar de 'dns.nl'  variant. Uiteraard nemen we deze gelegenheid te baat om ook flink wat  verbeteringen in de infrastructuur aan te brengen, zoals nieuwe hardware en clustering. Maar daarover wellicht een volgende keer.