Abspaltung der CA-Komponente vom Puppet-Master

Abspaltung der CA-Komponente vom Puppet-Master

Wir skalieren unsere Puppet-Infrastruktur und möchten die CA-Komponente vom Puppet-Master-Server auf einen anderen Server auslagern. Teil der Änderung ist auch eine Servernamenänderung für den Puppetmaster.

Ich habe ein Problem, bei dem ich die ca_server-Direktive weder im Abschnitt [main] noch im Abschnitt [agent] richtig zum Laufen bekomme. Sie wird einfach nicht wirksam. Wenn ich also server= in den neuen Servernamen ändere, kann der Agent nicht mehr einchecken, da sich der Servername geändert hat und nicht mehr mit dem Zertifikat übereinstimmt.

Ich bin kein Puppet-Experte, aber ich denke, ich muss ein SAN-Zertifikat erstellen, das sowohl den alten als auch den neuen Namen enthält (um sicherzugehen) und dann alle Agentenknoten noch einmal neu signieren, was ein echter Ärger wird.

Gibt es eine schnellere/intelligentere Möglichkeit, dies zu tun? Wir haben bereits Hunderte von Agentenknoten da draußen und sie einzeln neu zu signieren wird eine mühsame Aufgabe sein.

Antwort1

Wir sind anders an die Sache herangegangen, was uns auf lange Sicht flexibler und zuverlässiger erscheint.

Wir haben einen Frontend-Apache-Server erstellt, auf dem mod_proxy und mod_balancer laufen. Dieser identifiziert dann die eingehende URL-Anfrage und leitet CA-bezogene Anfragen an einen lokalen CA-Server und Puppetmaster-Anfragen an einen Pool von Puppetmastern weiter. Dies hat den zusätzlichen Vorteil, dass wir einen oder mehrere separate Server haben können, die unterschiedliche Umgebungen handhaben.

Die Puppetmaster müssen so konfiguriert werden, dass sie die Authentifizierungsinformationen vom Frontend-Server akzeptieren.

Definieren Sie den Balancer (beachten Sie, dass ein Timeout von 600 wichtig ist):

<Proxy balancer://puppetmaster>
  BalancerMember http://pupappprd01.its.auckland.ac.nz:18140 timeout=600
  BalancerMember http://pupappprd02.its.auckland.ac.nz:18140 timeout=600
  BalancerMember http://pupappprd03.its.auckland.ac.nz:18140 timeout=600
</Proxy>
# CA, facts and filebucket server
<Proxy balancer://puppetmasterca>
  BalancerMember http://puprepprd01.its.auckland.ac.nz:18140
</Proxy>

Definieren Sie nun das Frontend:

Listen 8140
<VirtualHost *:8140>
  SSLEngine on
  SSLProtocol -ALL +SSLv3 +TLSv1
  SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP
  SSLCertificateKeyFile /var/lib/puppet/ssl/private_keys/puppet.auckland.ac.nz.pem
  SSLCertificateFile /var/lib/puppet/ssl/certs/puppet.auckland.ac.nz.pem
  SSLCACertificateFile /var/lib/puppet/ssl/ca/ca_crt.pem
  SSLCertificateChainFile /var/lib/puppet/ssl/ca/ca_crt.pem
  SSLCARevocationFile     /var/lib/puppet/ssl/ca/ca_crl.pem
  SSLVerifyClient optional
  SSLVerifyDepth  1
  SSLOptions +StdEnvVars

  # Send info to downstream workers
  RequestHeader set X-SSL-Subject %{SSL_CLIENT_S_DN}e
  RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
  RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

  <Location / >
    SetHandler balancer-manager
    Order allow,deny
    Allow from all
  </Location>

  # The manifest can take up to 10min to build (default timeout is 2min)
  Timeout 600
  ProxyTimeout 600
  # This is required to prevent a race condition that can cause
  # the puppet agent to lock up
  SetEnv proxy-nokeepalive 1
  SetEnv proxy-initial-not-pooled 1

  ProxyPreserveHost On

  # CA - centralise the authentication
  # members of the puppetmasterca cluster will rsync the cert stores
  ProxyPassMatch   ^(/.*?)/(certificate.*?)/(.*)$ balancer://puppetmasterca
  ProxyPassReverse ^(/.*?)/(certificate.*?)/(.*)$ balancer://puppetmasterca

  # Filebucket - this be on the central server to minimise duplication
  # members of the puppetmasterca cluster will rsync the file bucket
  ProxyPassMatch   ^(/.*?)/file_bucket_file/(.*)$ balancer://puppetmasterca
  ProxyPassReverse ^(/.*?)/file_bucket_file/(.*)$ balancer://puppetmasterca

  # ALL Report uploads handled by central servers
  # These will in turn upload reports to dashboard, depending on settings
  # in the puppet.conf for that environment
  ProxyPassMatch   ^(/.*?)/report/(.*)$ balancer://puppetmasterca
  ProxyPassReverse ^(/.*?)/report/(.*)$ balancer://puppetmasterca

  # Production servers - catalogue, cache, facts, file metadata and fetch
  # These servers all synchronise with subversion every 15 min
  # Need the extended timeout because some manifest generation can
  # be slow. 5min should be sufficient.
  ProxyPassMatch   ^/production/ balancer://puppetmaster timeout=600
  ProxyPassReverse ^/production/ balancer://puppetmaster timeout=600

</VirtualHost>

Jetzt können wir den Puppetmaster definieren, der die Anfragen auf dem CA-Server und auf dem Puppetmaster verarbeitet. Beachten Sie, wie wir die Authentifizierungsinformationen in den zusätzlichen Header-Feldern übergeben:

Listen 18140
<VirtualHost *:18140>
  SSLEngine off

  # Obtain Authentication Information from Client Request headers
  SetEnvIf X-Client-Verify "(.*)" SSL_CLIENT_VERIFY=$1
  SetEnvIf X-Client-DN "(.*)" SSL_CLIENT_S_DN=$1

  RackAutoDetect On
  DocumentRoot /usr/share/puppet/rack/puppetmasterd/public
  <Directory /usr/share/puppet/rack/puppetmasterd/>
      Options None
      AllowOverride None
      Order allow,deny
      allow from 127.0.0.1
      allow from puprepprd01.its.auckland.ac.nz
      deny from all
    </Directory>

    LogLevel warn
    ErrorLog /var/log/httpd/puppetmaster_error.log
    CustomLog /var/log/httpd/puppetmaster_access.log combined
</VirtualHost>

In der Datei puppet.conf benötigen Sie noch ein paar Zeilen, um die Authentifizierungsinformationen aus der Umgebung abzurufen:

[master]
    ssl_client_header = HTTP_X_CLIENT_DN
    ssl_client_verify_header = HTTP_X_CLIENT_VERIFY

Dies ist zwar komplexer, ermöglicht uns jedoch eine horizontale Erweiterung und die Aufteilung von Umgebungen auf eigene Puppetmaster-Server, so oft wir möchten. Ein separater Server enthält das Berichts-Frontend und die CA (dies kann jedoch auf mehrere CA-Backends aufgeteilt werden, wenn Sie eine Art Zertifikatsreplikation einrichten).

verwandte Informationen