Puppet Policy-based Autosign

Het goedkeuren van een node-certificaat op de Puppetmaster is ‘by default’ een handmatige actie en wordt uitgevoerd met het commando

puppet cert sign node.domain.ext

Nu zou je in de configuratie van de Puppetmaster een regel aan de [master]-sectie kunnen toevoegen:

autosign = true

Dit wordt naïve autosigning genoemd maar dat is niet veilig want dan wordt elke node automatisch goedgekeurd. Een betere methode is dan om van te voren een lijst met hostnames in een autosign.conf bestand te plaatsen waardoor alleen die nodes goedgekeurd worden. Dit bestand is dan /etc/puppetlabs/puppet/autosign.conf en deze methode noemen we basic-autosigning. Er is echter een nog betere manier die het handmatig invullen van node-namen overbodig maakt en dat heet dan policy-based autosigning.

Deze methode biedt de mogelijkheid om telkens wanneer de puppetmaster een CSR ontvangt, een executable uit te voeren die de metadata van de CSR kan inzien en aan de hand van bepaalde attributen een beslissing kan nemen om de aanvraag wel of niet te laten accorderen door de master.

We gaan een script op de puppetmaster maken dat in de CSR aanvraag gaat zoeken naar een pre-shared key attribuut met de waarde ‘digitalinfo’. Alleen als deze gevonden wordt laten we de puppetmaster de aanvraag automatisch signen. Het script wordt: /etc/puppetlabs/puppet/autosign-policy.rb

#!/usr/bin/env ruby

require "openssl"
include OpenSSL

csr = OpenSSL::X509::Request.new $stdin.read
atts = csr.attributes()
if atts.empty?
   exit 1
end
key = nil
atts.each do |a|
   if (a.oid=="extReq")
      val = a.value.value.first.value.first.value
      if val[0].value == "1.3.6.1.4.1.34380.1.1.4"
         key = val[1].value
      end
   end
end
if key == "digitalinfo""
   print "Match\n"
   exit 0
else
   print "No match\n"
   exit 1
end

We zoeken eerst of er attributes in de aanvraag aanwezig zijn en vervolgens naar de OID van een ‘Puppet pre-shared key’ en als die aanwezig is vergelijken we de waarde hiervan met de tekst “digitalinfo” en indien dat gevonden wordt hebben we een match.

Maak het script executable met

chmod 755 /etc/puppetlabs/puppet/autosign-policy.rb

In de puppet.conf van de puppetmaster dienen we nu te verwijzen naar dit script en voeg daarvoor de volgende regel toe aan /etc/puppetlabs/puppet/puppet.conf in de [master] sectie:

autosign = /etc/puppetlabs/puppet/autosign-policy.rb

Nu gaan we de node zodanig configureren dat het pre-shared-key attribuut met de waarde ‘digitalinfo’ meegegeven wordt aan de CSR. We maken een yaml-bestand dat de pre-shared-key bevat, /etc/puppet/csr_attributes.yaml met de volgende inhoud:

 ---
    extension_requests:
       pp_preshared_key: digitalinfo

Als we nu de puppet agent testen wordt onze aanvraag automatisch ge-signed door de puppetmaster: