Boekbespreking

Twee boeken over Puppet, een tool voor configuratiemanagement

17 december 2015
In dit artikel:

Hieronder volgt de bespreking van een tweetal boeken over Puppet. In een bijlage geeft de auteur van de bespreking een korte introductie op Puppet en de mogelijkheden ervan.

Puppet, een open sourcetool voor configuratiemanagement, maakte de afgelopen jaren een grote groei door. Puppet is gebouwd voor het managen van bestaande configuraties, maar is ook geschikt om software te installeren, upgraden en de-installeren. Hierdoor overlapt het werkgebied van Puppet deels met provisioning, het inrichten van een basissysteem met een standaardconfiguratie. Daarnaast is Puppet schaalbaar, uitbreidbaar en multiplatform. Puppet is primair gericht op Linux/Unix en varianten hiervan (BSD, OS X); voor het Windows platform wordt een vertaling gemaakt van de Unix-implementatie (van bijvoorbeeld de wijze waarop een gebruiker wordt beheerd) naar het doelplatform. Dit maakt Puppet tot een bijzonder krachtige beheertool waaraan het zijn populariteit te danken heeft.

Puppet bestaat sinds 2005, en kent een gestaag groeiende groep gebruikers, waardoor het belang van Puppet voor de beheerder en auditor flink toeneemt. Reden om deze materie eens nader te bekijken via deze bespreking van twee boeken over Puppet. Het eerste is Puppet Essentials, een inleidend boek over Puppet. Het tweede boek is Learning Puppet Security, een boek gericht op securitygerelateerde aspecten van Puppet.

Puppet Essentials

Schermafbeelding 2015-12-17 om 15.51.25Het boek Puppet Essentials beschrijft de grondbeginselen van Puppet en geeft een samenvatting van de mogelijkheden ervan. In hoofdstuk 1 Writing Your First Manifests wordt uitgelegd hoe een manifest, een statement waarin gespecificeerd is aan welke eis een systeem dient te voldoen, eruitziet en welke logica achter de opbouw ervan zit. Vervolgens gaat het boek in hoofdstuk 2 The Master and Its Agents in op de interactie tussen de master en de agents, respectievelijk de server en clients, om de manifests uit te voeren en de manier waarop Puppet de opdrachten in de manifests uitvoert. Begrippen als facts, de eigenschappen van de clientsystemen zoals processortype en OS-versie, providers, geclusterde objecten op de systemen die manipuleerbaar zijn met Puppet, en resourcetypes passeren de revue. Hoofdstuk 3 A Peek Under the Hood – Facts, Types, and Providers behandelt de wijze waarop aan de hand van facts binnen manifests keuzen gemaakt kunnen worden, bijvoorbeeld om aan de hand van het type processor, OS of versienummer te bepalen welke updates of patches geïnstalleerd moeten worden. Ook het structureren van de manifests in classes en modules, voor onderhoudbaarheid en overzicht, komt aan de orde in respectievelijk de hoofdstukken 4 Modularizing Manifests with Classes and Defined Types en 5 Extending Your Puppet Infrastructure with Modules. Hoofdstuk 6 Leveraging the Full Toolset of the Language heeft een software-engineeringachtige insteek voor de gevorderde gebruiker, en gaat in op hoe alle behandelde onderwerpen met elkaar samenhangen en hoe je op een slimme manier alle delen kunt laten samenwerken. Dynamische configuraties, overerving en defaults, virtual resources en antipatterns komen hier aan bod. In hoofdstuk 7 Separating Data from Code Using Hiera wordt uitgelegd hoe de Puppet-manifests, de code die uitgevoerd wordt, te scheiden zijn van data en parameters voor de systemen, zoals IP-adressen, configuratiebestanden en instellingen. Dit gebeurt met behulp van Hiera. Voordat deze tool beschikbaar kwam, was het nodig om grote stukken code te wijden aan het onderhoud van sites. Die code was vaak complex en daarmee slecht onderhoudbaar.

Door Hiera is het mogelijk om een hiërarchie op basis van facts aan te brengen en wordt het eenvoudiger om data die nodig zijn voor het beheer op te slaan. Door modellering van specifiek naar algemeen toe te passen wordt het eenvoudig om met defaultwaarden te werken en deze waarden, afhankelijk van facts, te overrulen op site-, omgevings- of systeemniveau.

Dit is zeker relevant voor Puppet, omdat het juist functioneren van systemen de verantwoordelijkheid van de afdeling technisch beheer is, terwijl zaken zoals de inhoud van configuratiebestanden de verantwoordelijkheid kunnen zijn van andere afdelingen zoals applicatiebeheer. Door Hiera kan deze verantwoordelijkheid ook in de praktijk juist belegd worden. Hoofdstuk 8 Configuring Your Cloud Application with Puppet gaat in op de toepassing van Puppet in IaaS-omgevingen en de specifieke problemen die daarbij spelen zoals beveiliging van de communicatie en distributie van de manifests.

Door de gestructureerde en gefaseerde opbouw van het boek wordt duidelijk welke onderdelen Puppet kent en hoe deze samenwerken. Ook schetst de auteur problemen en bijzondere eigenschappen van Puppet, zoals volgtijdelijkheid van tests. Risico’s en aandachtspunten bij commando’s zijn duidelijk aangegeven in tekstkaders, wat het boek een duidelijke binding met de praktijk geeft. Wel verwijst de schrijver voor details veel door naar websites, waardoor het boek op dit punt soms aandoet als een samenvatting, of een wel hele korte introductie.

Learning Puppet Security

Schermafbeelding 2015-12-17 om 15.51.31Daar waar Puppet Essentials vooral ingaat op de beginselen en mogelijkheden van Puppet, focust het boek Learning Puppet Security meer op de wijze waarop Puppet ingezet kan worden voor beheer en auditing van beveiligingsaspecten van de productiesystemen. Hierover gaan de hoofdstukken 1, 2, 3, 4 en 9. Puppet is een zeer krachtige beheertool waarmee het mogelijk is om zowel IT-beheer als IT-audit op een hoger niveau te brengen. Zo is het bijvoorbeeld mogelijk om in plaats van een steekproef op individuele systemen te doen, een volledige uitdraai van alle systemen op alle kritieke punten te genereren. Met de introductie van een krachtige tool als Puppet wordt echter ook een nadeel geïntroduceerd: ongeautoriseerde toegang tot Puppet is direct een groot risico voor de hele beheerde infrastructuur. Het is bijvoorbeeld mogelijk om volautomatisch wijzigingen te laten doen en vervolgens de sporen hiervan uit te wissen. En daarmee heeft de auditor er weer een auditobject bij: Puppet zelf. Het boek Learning Puppet Security gaat niet alleen in op de beveiliging van Puppet zelf, maar ook op de beveiliging van de doelsystemen.

Het boek begint met de opzet van de Puppetomgeving en de samenstellende delen. In tegenstelling tot Puppet Essentials gaat dit boek uit van een Puppet-installatie aangevuld met de tools Hiera, YUM, Vagrant en VirtualBox. Vanuit deze volledige installatie wordt beschreven op welke manier Puppet bijdraagt aan de beheersing van beveiliging van omgevingen. Hoofdstuk 2 Tracking changes to objects begint met een eenvoudig voorbeeld van het instellen van een controle op een object, en legt uit hoe Puppet de initiële waarde vastlegt, hoe controle hierop plaatsvindt met behulp van de parameter ‘audit = all’, wat er ‘onder water’ gebeurt bij wijziging en hoe Puppet dit detecteert. Door deze uitleg krijgt de lezer echt een fundamenteel begrip van de werking van Puppet. Daarnaast wordt hiermee uit de doeken gedaan hoe een systeemstatus ten behoeve van auditors bewaakt kan worden. De in het voorbeeld gebruikte auditparameter wordt overigens uitgefaseerd en vervangen door de parameter NOOP, NO OPeration. Ook hiervan wordt een uitgebreid voorbeeld gegeven. Als laatste wordt de purge-optie besproken. Hiermee kan men resources verwijderen die niet expliciet gemanaged worden. In hoofdstuk 3 Puppet for compliance wordt beschreven op welke wijze Puppet kan bijdragen aan het uitrollen of auditen van vastgestelde standaarden zoals PCI-DDS of Sarbanes-Oxley. Een aantal hiervan is reeds in Puppet geïmplementeerd en vrij beschikbaar voor download. Dat het downloaden van code van internet ook risico’s met zich meebrengt is evident. Wat doet die code eigenlijk precies, sluit dat wel aan bij onze wensen en eisen? Het boek rept hier vreemd genoeg niet over, maar volstaat met het noemen van een aantal in Puppet-manifests geïmplementeerde standaarden en de vindplaatsen hiervoor.

Daarnaast gaat het boek in op de opzet en de eigenaardigheden van SSL en Puppet: de Puppetmaster vervult namelijk ook de rol van SSL certification authority voor de agents. Kort worden opzet, eigenaardigheden en meest voorkomende problemen behandeld. Ten slotte gaat het boek in hoofdstuk 4 Security Reporting with Puppet kort in op tools om rapportages te genereren, waaronder scripts om file- en databasegebaseerde rapportages te bouwen. Dit hoofdstuk is echter te onoverzichtelijk om goed inzicht te bieden in de mogelijkheden. Dat is opmerkelijk omdat het boek zelf stelt dat ‘there is nothing most system administrators hate more than dealing with an auditor for several days’. Dit zou te voorkomen zijn met goede rapportages over de systeemstatussen. Het is een gemiste kans dat het boek niet meer inzicht biedt in de mogelijkheden hiervoor, want juist betrouwbare rapportages kunnen vertrouwen in het beheer van de omgeving geven.

Hoofdstuk 5 Securing Puppet behandelt de communicatie tussen agent en master met gebruik van SSL. Hoofdstuk 6 Community Modules for Security behandelt verschillende community-maintained modules voor beveiliging, waarbij de beveiliging van Puppet zelf en host-security door elkaar heen lopen. In hoofdstuk 7 Network Security and Puppet komt de Linux firewall chain aan bod. Hoofdstuk 8 Centralized logging beschrijft de mogelijkheden voor gecentraliseerde logging met de tools Kibana, Logstash en ElasticSearch, waarmee de logfiles inzichtelijk gemaakt en doorzocht kunnen worden. Hoofdstuk 9 Puppet and OS Security Tools bespreekt SE Linux, de securitymodule voor mandatory acces control en auditd, de audit daemon.

Lezen of niet?

Het boek Puppet Essentials is door zijn brede opzet een goede introductie van de mogelijkheden die Puppet biedt. Deze breedte maakt het boek wel heel praktisch bruikbaar maar dat gaat vanzelfsprekend ten koste van de diepgang. Dit geldt ook voor Learning Puppet Security. Beide boeken geven veel codevoorbeelden en (installatie)commando’s, waardoor de lezer een snelle start kan maken met het gebruik van Puppet. Deze hands-on benadering heeft als nadeel dat beide boeken de lezers geen overzicht van de mogelijkheden en inzicht in de samenhang van de Puppetonderdelen bieden. Door de vaak technische behandeling van de veelheid van vaktermen verlies je snel het overzicht van de handelingen. Ook gaan beide schrijvers ervan uit dat de lezers bekend zijn met (abstracte) vaktermen en afkortingen. Daarnaast passeren er veel mogelijkheden de revue maar ontbreekt een gedegen uitleg, zoals in Essentials, p. 60: ‘will usually produce an error message. Some attributes might just get ignored by Puppet instead.’ Verder heeft het boek een dubbele focus waar het de community-maintained modules voor beveiliging betreft. Dit gaat ten koste van de diepgang en bruikbaarheid voor auditors.

Ook de snelheid van ontwikkelingen rond Puppet gooit roet in het eten. Ondanks hun recente datum – de boeken zijn geschreven in 2014 en 2015 – is de tekst op sommige onderdelen nu al achterhaald. Zo wordt de auditoptie van Puppet 3.8, de huidige versie, in versie 4 vervangen door de parameter NOOP (NO OPeration, waarmee wordt aangegeven dat de opdracht niet uitgevoerd moet worden). Ook wordt WEBrick (meegeleverde server voor http-interactie met Puppet) in een volgende release vervangen omdat deze ‘no way of scaling’ heeft en daardoor ‘hardly fit for production’ is (Essentials, p. 43). Een laatste minpunt is dat Puppet Essentials zeer beperkt ingaat op de ontsluiting van de data en het opstellen van rapportages hieruit, terwijl dat juist het punt is waar zowel beheerders als auditors flink mee kunnen scoren. Een gemiste kans.

Resumerend: vooral de meer technisch onderlegde IT-auditors worden door de twee besproken boeken goed bediend. Beide boeken geven een goed overall beeld van de mogelijkheden en de eigenaardigheden van Puppet. Ook de tekortkomingen en binnenkort te verwachten wijzigingen van Puppet komen aan bod. De boeken bieden geïnteresseerde IT-auditors een goed beginpunt om bekend te raken met Puppet. Daardoor vormen ze een goede basis bij het maken van een opzet voor een onderzoek naar het beheer van infrastructuren die met Puppet beheerd worden.

Minder technisch onderlegde IT-auditors zullen meer moeite met de boeken hebben. Door de anekdotische opzet (veel kleine korte voorbeeldjes) is de samenhang tussen de delen van Puppet niet altijd duidelijk. Bovendien zijn beide boeken voor deze auditors eigenlijk te diepgaand en daarmee minder geschikt.

Wat is Puppet en welke mogelijkheden biedt het?

De bedrijfsprocessen van grote ondernemingen zijn sterk afhankelijk van ICT. Door standaardisering en virtualisatie worden deze processen ondersteund door grote aantallen servers. Optimale kwaliteit en voorspelbaarheid van de ICT-dienstverlening vereist dat alle servers op dezelfde wijze geconfigureerd zijn. Ook dienen de beveiligingsinstellingen van alle systemen gelijk te zijn om te waarborgen dat aan de beveiligingseisen wordt voldaan. De beheerders van deze systemen hebben de taak ervoor te zorgen dat zaken als instellingen, parameters en file-systemrechten identiek zijn en blijven. In grootschalige omgevingen is dit geen sinecure. Verschillen in hardware, software, instellingen en (combinaties van) functies en rollen vergroten deze beheerproblematiek.

Om te toetsen of de beheerder de zaak wel onder controle heeft, dient de auditor – indien hij geen gebruik maakt van (audit)software – een steekproef op een groot aantal instellingen van een groot aantal systemen te nemen. Dit leidt tot een grote werklast voor zowel de beheerder als de auditor. Het uitvoeren van zo’n controle is zeer arbeidsintensief en biedt nooit honderd procent zekerheid; aantonen dat 300 instellingen op alle momenten juist hebben gestaan op 1200 systemen is vrijwel niet te doen. Veel repetitieve ICT-taken zijn geautomatiseerd. Daaronder vallen ook de provisioning (installatie) en configuratie van systemen. Server provisioning is het prepareren van servers zodat deze klaar zijn voor gebruik. Dit omvat bijvoorbeeld het selecteren van een server, installeren van OS, drivers, middleware en applicaties en het customizen en configureren van systeem en software. Veelgebruikte tools hiervoor zijn Cobbler, Kickstart en Microsoft Provisioning System. De activiteiten die de beheerder uitvoert na provisioning, dus na de installatie van de software, vallen onder de noemer configuratiemanagement. Hiervoor worden tools als Microsofts PowerShell DSC, Vagrant, CFEngine en het hier besproken Puppet gebruikt.

Schermafbeelding 2015-12-17 om 15.48.37

Zoals in figuur 1 te zien is, werkt Puppet met een client-server architectuur: de master (server) bevat de gewenste configuratie (SOLL), de agents (clients) voeren controles uit op de feitelijke (IST) configuratie en rapporteren terug aan de master. Op de Puppetmaster wordt in een declaratieve1 taal de gewenste systeemconfiguratie (SOLL) beschreven in een manifest. Op de clients wordt een agent geïnstalleerd, die periodiek contact zoekt met de master. De Facter, onderdeel van de agent, beschrijft de hardware en softwarespecificaties van de client zoals het aantal processoren, het OS en versienummer, in facts. De client stuurt deze naar de master, die vervolgens kan bepalen welke facts van toepassing zijn op de client en vervolgens een systeemspecifieke catalogus op maat samenstelt.

Bij de periodieke controlerun wordt eerst de catalogus versleuteld naar de client gezonden. De client verifieert of voldaan wordt aan de gestelde eis (‘zorg dat er een directory xyz met rechten 0700 bestaat’); zo niet dan voert de client de commando’s uit om dit alsnog voor elkaar te krijgen (bijvoorbeeld mkdir ‘xyz’, chmod +0700 xyz) en stuurt een rapportage hiervan naar de master. Het interval tussen de controleruns is naar wens in te stellen, bijvoorbeeld tweemaal per dag. Door de opzet van Puppet staan op de Puppet-master zowel de SOLL als de waargenomen IST (één registratie per controlerun): dit is voor iedere beheerder én auditor een zeer waardevolle bron van informatie!

Schermafbeelding 2015-12-17 om 15.48.48

De SOLL wordt vastgelegd in een manifest. Om manifests die bij elkaar horen te groeperen kunnen classes gemaakt worden. Om een class (hieronder bijvoorbeeld de classes apache en mysql) toe te wijzen aan een doelsysteem wordt een include aangemaakt (zie figuur 2).

In manifests wordt vastgelegd welke controles uitgevoerd moeten worden, bijvoorbeeld controleren of wel de juiste versie van een pakket met de juiste configuratie draait (‘zorg dat versie x geïnstalleerd is, configuratiebestand X toegepast wordt en dat deze gestart is’). Zie het manifest in figuur 3 dat als doel heeft te zorgen dat apache2 geïnstalleerd is, het bestand apache2.conf aanwezig is en gebruikt wordt.

Schermafbeelding 2015-12-17 om 15.49.03

Het voorbeeld hierboven dwingt de aanwezigheid van software en een bijbehorend configuratiebestand af via respectievelijk de package en file resource providers. Maar Puppet kan nog veel meer resources behandelen: Puppet biedt standaard onder andere de volgende Resource types, waarop operaties uitgevoerd kunnen worden:

FILE: voorziet in operaties op bestanden (en inhoud), mappen, eigenaarschap en toegangsrechten.

PACKAGE: voorziet in operaties op geïnstalleerde software-packages, versienummers.

SERVICE: voorziet in operaties voor het beheer van services en daemons op hosts.

USER en GROUP: omvat bewerkingen op gebruikers en groepen op de systemen.

CRON: installeren en beheren van cron jobs (Unix-taakscheduler).

Daarnaast kan met EXEC lokaal een commando uitgevoerd worden (bijvoorbeeld: leeg de prullenbak, verwijder logfiles, et cetera). Ook voorzieningen voor MOUNT (filesystems koppelen) en configuratie van SSH zijn aanwezig. Als klap op de vuurpijl is Puppet ook uit te breiden voor beheer/configuratie van specifieke software om op een host parameters door te geven aan specifieke software. Voor veel softwarepakketten zoals WebSphere, Oracle, MySQL, zijn ook al resource providers geschreven die naar wens gedownload kunnen worden. Hierdoor kan de toolbox van de beheerders fors worden uitgebreid.

De declaratieve taal van Puppet kent alle voorzieningen van een programmeertaal: nestings, loops, if/then/else, parameters, constanten, variabelen en arrays kunnen allemaal gebruikt worden. Puppet is ook geschikt voor het uitrollen of auditen van vastgestelde standaarden zoals Center for Internet Security standard, Payment Card Industry Data Security Standard, Sarbanes-Oxley, interne richtlijnen of welke beveiligingsrichtlijn of standaard dan ook. Een aantal daarvan is al in Puppet geïmplementeerd, vrij beschikbaar voor download.

H.H. (Hilco) Jonkeren RE CISA

Hilco Jonkeren studeerde Bedrijfsinformatica, Politicologie en IT-auditing. Hij werkt als technical IT-auditor. Dit artikel is op persoonlijke titel geschreven.