Absicherung Ihres Jenkins-Servers: Wesentliche Best Practices

Härten Sie Jenkins mit Zugriff nach dem Prinzip der geringsten Privilegien, HTTPS, Plugin-Hygiene, sicheren Pipelines, Berechtigungskontrollen und Überwachung.

Sicherung Ihres Jenkins-Servers: Wesentliche Best Practices

Die Sicherung Ihres Jenkins-Servers ist wichtig, da er auf Ihren Quellcode, Bereitstellungsziele, Anmeldeinformationen und Build-Artefakte zugreifen kann. Wenn Jenkins exponiert oder locker konfiguriert ist, könnte ein Angreifer Repositories lesen, Builds ändern, Geheimnisse stehlen oder Build-Agenten als Weg in Ihr Netzwerk nutzen.

Die sichersten Jenkins-Setups verwenden Schichten: starke Identität, Berechtigungen nach dem Prinzip der geringsten Privilegien, verschlüsselter Zugriff, sorgfältige Plugin-Verwaltung, sichere Pipeline-Muster und nützliche Audit-Logs. Beginnen Sie mit den untenstehenden Kontrollen, bevor Sie Jenkins einem größeren Team zugänglich machen oder es mit Produktionssystemen verbinden.

Benutzerverwaltung und Zugriffskontrolle

Eine robuste Benutzerverwaltung ist die erste Verteidigungslinie. Jenkins ermöglicht eine fein granulare Kontrolle darüber, was Benutzer sehen und tun können. Die Umsetzung des Prinzips der geringsten Privilegien stellt sicher, dass Benutzer und Dienste nur die notwendigen Berechtigungen zur Ausführung ihrer Aufgaben haben, wodurch der potenzielle Schaden durch kompromittierte Konten minimiert wird.

Authentifizierung

Jenkins kann in mehrere Authentifizierungssysteme integriert werden. Für Teamumgebungen verwenden Sie zentrale Authentifizierung, anstatt sich nur auf die interne Benutzerdatenbank von Jenkins zu verlassen.

  • LDAP- oder Active Directory-Integration: Nutzen Sie Ihre vorhandenen Verzeichnisgruppen und Kontenlebenszyklus-Kontrollen.
  • SAML oder OpenID Connect: Verwenden Sie Single Sign-On über Ihren Identitätsanbieter, wenn Ihr Jenkins-Plugin-Set dies unterstützt.
  • Lokale Konten: Behalten Sie ein sorgfältig geschütztes Notfall-Admin-Konto, aber machen Sie gemeinsame lokale Konten nicht zu Ihrem normalen Zugriffsmodell.

Autorisierungsstrategien

Sobald Benutzer authentifiziert sind, bestimmt die Autorisierung ihre Zugriffsrechte.

  • Matrix-basierte Sicherheit: Diese integrierte Strategie ermöglicht es Ihnen, Berechtigungen für Benutzer oder Gruppen zuzuweisen. Sie funktioniert gut für kleine Setups, kann aber mit wachsenden Teams schwer zu auditieren sein.
  • Rollenbasierte Strategie: Das Plugin "Role-Based Authorization Strategy" ermöglicht es Ihnen, Rollen wie Entwickler, Operator und Admin zu definieren und dann Benutzer oder Gruppen diesen Rollen zuzuordnen.

Beispiel: Einrichten der rollenbasierten Autorisierung

  1. Installieren Sie das Plugin Role-Based Authorization Strategy über den Jenkins-Plugin-Manager.
  2. Gehen Sie zu Jenkins verwalten > Sicherheit.
  3. Wählen Sie unter Autorisierung die Option Rollenbasierte Strategie.
  4. Definieren Sie Rollen wie entwickler, release-manager und jenkins-admin.
  5. Geben Sie jeder Rolle nur die benötigten Berechtigungen, wie Job/Lesen, Job/Bauen oder Anmeldedaten/Anzeigen.
  6. Ordnen Sie nach Möglichkeit Verzeichnisgruppen Rollen zu, anstatt einzelnen Personen.

Sicherung der Jenkins-Kommunikation

Die Sicherstellung, dass die an Ihren Jenkins-Server gesendeten und von ihm empfangenen Daten verschlüsselt sind, ist entscheidend, insbesondere beim Umgang mit Anmeldeinformationen und sensiblen Build-Informationen.

HTTPS-Konfiguration

Konfigurieren Sie Jenkins so, dass HTTPS verwendet wird, um die gesamte Kommunikation zwischen Clients und dem Server zu verschlüsseln. Dies verhindert Lauschangriffe und Man-in-the-Middle-Angriffe.

Das gängigste Produktionsmuster besteht darin, Jenkins hinter einem Reverse-Proxy wie Nginx, Apache, HAProxy oder einem Cloud-Load-Balancer zu platzieren. Beenden Sie TLS am Proxy, leiten Sie HTTP auf HTTPS um und setzen Sie die öffentliche URL von Jenkins unter Jenkins verwalten > System.

Wenn Sie den integrierten Webserver von Jenkins direkt mit HTTPS betreiben, konfigurieren Sie dies über Jenkins-Startoptionen wie --httpsPort, --httpsKeyStore und --httpsKeyStorePassword oder über die paketspezifische Dienstkonfiguration. Die genaue Datei unterscheidet sich je nach Installationsmethode. Überprüfen Sie daher, wie Ihr Jenkins-Dienst gestartet wird, bevor Sie Änderungen vornehmen.

Stellen Sie außerdem sicher, dass der Reverse-Proxy die korrekten Weiterleitungs-Header sendet. Fehlerhafte Proxy-Header können zu falschen Weiterleitungs-URLs, fehlgeschlagenen CSRF-Prüfungen oder Links führen, die auf einfaches HTTP verweisen.

Jenkins- und Plugin-Sicherheit

Die Erweiterbarkeit von Jenkins durch Plugins ist eine seiner größten Stärken, birgt aber auch potenzielle Sicherheitsrisiken, wenn sie nicht sorgfältig verwaltet wird.

Halten Sie Jenkins und Plugins aktuell

Veraltete Versionen von Jenkins Core und seinen Plugins sind eine häufige Quelle von Schwachstellen. Aktualisieren Sie beide regelmäßig, um bekannte Sicherheitslücken zu schließen.

  • Jenkins Core-Updates: Folgen Sie den Jenkins-Sicherheitshinweisen und planen Sie regelmäßige Wartungsfenster.
  • Plugin-Updates: Überprüfen Sie Update-Benachrichtigungen häufig. Testen Sie kritische Plugin-Updates nach Möglichkeit in einem Nicht-Produktions-Controller.

Plugin-Whitelisting und -Auditierung

Nicht alle Plugins sind gleich. Einige Plugins können Sicherheitslücken aufweisen oder nicht mehr gewartet werden.

  • Verwenden Sie vertrauenswürdige Plugins: Bevorzugen Sie gewartete Plugins aus dem Jenkins-Update-Center.
  • Begrenzen Sie die Plugin-Installation: Jedes Plugin fügt Code hinzu, der in Ihrem Controller ausgeführt wird.
  • Entfernen Sie ungenutzte Plugins: Auditieren Sie Plugins vierteljährlich oder nach größeren Prozessänderungen.

Verwalten von Plugin-Sicherheitswarnungen

Jenkins kann Sie vor installierten Plugins mit bekannten Sicherheitshinweisen warnen. Achten Sie genau auf Warnungen unter Jenkins verwalten und aktualisieren, ersetzen oder entfernen Sie betroffene Plugins.

Jenkinsfile-Sicherheit

Jenkinsfiles definieren Ihre Build-Pipelines. Ihre Sicherung ist entscheidend, um das Einschleusen von bösartigem Code in Ihren Build-Prozess zu verhindern.

  • Speichern Sie Jenkinsfiles in der Versionskontrolle: Überprüfen Sie Pipeline-Änderungen genauso wie Anwendungscode.
  • Behandeln Sie Pipeline-Code als ausführbaren Code: Ein Jenkinsfile kann Shell-Befehle ausführen, Artefakte veröffentlichen und Anmeldeinformationen anfordern.
  • Seien Sie vorsichtig mit der Skriptfreigabe: Das Script Security Plugin erfordert möglicherweise, dass Administratoren bestimmte Groovy-Methoden oder -Skripte genehmigen. Genehmigen Sie nur Code, den Sie verstehen.
  • Vermeiden Sie Inline-Pipeline-Skripte in der Benutzeroberfläche: Bevorzugen Sie repository-gestützte Jenkinsfiles mit Code-Review.

Beispiel: Genehmigen von Skripten

Wenn eine Pipeline auf eine nicht genehmigte Groovy-Signatur stößt, listet Jenkins sie unter Jenkins verwalten > Prozessinterne Skriptgenehmigung auf. Überprüfen Sie die angeforderte Signatur und den Job, der sie ausgelöst hat, bevor Sie sie genehmigen. Eine breite Genehmigung kann mehr als einen Job betreffen.

Jenkins-Anmeldeinformationsverwaltung

Jenkins muss oft sensible Anmeldeinformationen wie API-Schlüssel, Passwörter und SSH-Schlüssel speichern, um auf andere Dienste zuzugreifen. Die sichere Verwaltung dieser Daten ist entscheidend.

  • Verwenden Sie den Jenkins-Anmeldeinformationsspeicher: Speichern Sie API-Tokens, Passwörter, Zertifikate und SSH-Schlüssel als Anmeldeinformationen, nicht als Klartext in Job-Definitionen.
  • Vermeiden Sie hartcodierte Geheimnisse: Setzen Sie keine Geheimnisse in Jenkinsfiles, Shell-Skripte, Build-Logs oder Repository-Variablen.
  • Begrenzen Sie den Geltungsbereich von Anmeldeinformationen: Verwenden Sie Ordner und Berechtigungen, um Produktionsanmeldeinformationen von Jobs fernzuhalten, die sie nicht benötigen.
  • Rotieren Sie Anmeldeinformationen: Rotieren Sie Bereitstellungsschlüssel und Dienst-Tokens, wenn Personen das Unternehmen verlassen, Jobs gelöscht werden oder ein Geheimnis möglicherweise in Logs aufgetaucht ist.

Beispiel: Verwenden von Anmeldeinformationen in einer Pipeline

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                withCredentials([sshUserPrivateKey(credentialsId: 'prod-deploy-key', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
                    sh 'ssh -i "$SSH_KEY" -o IdentitiesOnly=yes "[email protected]" "deploy_command"'
                }
            }
        }
    }
}

In diesem Beispiel ist prod-deploy-key die ID eines gespeicherten SSH-Private-Key-Anmeldeinformationssatzes. Jenkins schreibt den Schlüssel für die Dauer des Schritts in eine temporäre Datei und maskiert unterstützte Geheimniswerte in Logs.

Netzwerksicherheit und Zugriffskontrolle

Über die interne Sicherheit von Jenkins hinaus ist der Schutz des Servers auf Netzwerkebene unerlässlich.

  • Firewall-Regeln: Beschränken Sie den Jenkins-Zugriff auf vertrauenswürdige Netzwerke, VPN-Bereiche oder identitätsbewusste Proxy-Einstiegspunkte.
  • Reverse-Proxy-Kontrollen: Verwenden Sie einen Reverse-Proxy für TLS, HTTP-zu-HTTPS-Weiterleitungen, Anforderungslimits und konsistente Header.
  • Agenten-Isolation: Führen Sie keine nicht vertrauenswürdigen Builds auf dem Controller aus. Verwenden Sie für riskante Arbeitslasten wegwerfbare oder streng kontrollierte Agenten.
  • Netzwerksegmentierung: Halten Sie Jenkins von breitem internem Netzwerkzugriff fern, es sei denn, ein Job benötigt ihn wirklich.

Auditierung und Überwachung

Die regelmäßige Überprüfung von Jenkins-Logs und die Überwachung von Aktivitäten können helfen, Sicherheitsvorfälle zu erkennen und darauf zu reagieren.

  • Aktivieren Sie die Audit-Protokollierung: Protokollieren Sie Anmeldungen, Berechtigungsänderungen, Änderungen an Anmeldeinformationen, Job-Bearbeitungen und administrative Aktionen. Plugins wie Audit Trail können helfen.
  • Überwachen Sie Jenkins-Logs: Überprüfen Sie Controller-Logs und Build-Logs auf unerwartete Nutzung von Anmeldeinformationen, neue Admin-Konten, ungewöhnliche Job-Bearbeitungen oder wiederholte fehlgeschlagene Anmeldungen.
  • Sichern Sie die Konfiguration: Sichern Sie das Jenkins-Home-Verzeichnis, die Job-Konfiguration, Plugin-Listen und Metadaten zu Anmeldeinformationen gemäß Ihrem Wiederherstellungsplan. Schützen Sie Backups wie Produktionsgeheimnisse.

Halten Sie Jenkins langweilig

Das Ziel ist ein Jenkins-Server, bei dem der Zugriff vorhersehbar ist, Änderungen überprüft werden, Plugins bekannt sind und Anmeldeinformationen nicht in Jobs oder Logs gelangen. Beginnen Sie mit SSO, Rollen mit geringsten Privilegien, HTTPS, Plugin-Updates und sicherer Nutzung von Anmeldeinformationen. Planen Sie dann regelmäßige Überprüfungen ein, damit die vorübergehende Ausnahme von gestern nicht zum Vorfall von morgen wird.