Sicheres Deployment mit Bitbucket Pipelines
In der modernen Softwareentwicklung ist die Automatisierung von Deployments insbesondere in Testumgebungen unerlässlich. Bitbucket Pipelines bieten eine leistungsstarke und flexible CI/CD-Lösung, die es Entwicklern ermöglicht, Anwendungen bereitzustellen. Erfahren Sie, wie Sie mit Bitbucket Pipelines ein sicheres Deployment über SSH durchführen.
Funktionsweise von Bitbucket Pipelines
Bitbucket Pipelines sind das in Bitbucket von Atlassian integrierte CI/CD-Werkzeug. Es ermöglicht Entwicklern, automatisierte Builds, Tests und Deployments in einer Konfigurationsdatei bitbucket-pipelines.yml zu definieren. Diese Datei beschreibt die verschiedenen Schritte, die beim Erstellen, Testen und Bereitstellen einer Anwendung durchgeführt werden.
Deployment mit SSH
SSH (Secure Shell) ist ein weit verbreitetes Protokoll zur sicheren Remote-Verbindung und -Verwaltung von Servern. Dementsprechend bietet es sich auch an, hierüber Deployments aus den Bitbucket Pipelines anzustoßen.
Um ein Deployment mit SSH durchzuführen, sollte ohne Passwörter gearbeitet werden. Für eine passwortlose Authentifizierung wird ein SSH-Schlüsselpaar mit einem öffentlichen und einem privaten SSH-Schlüssel erstellt. Der öffentliche Schlüssel wird auf dem Zielserver für das Deployment hinterlegt. Der private Schlüssel wird in den Pipeline-Einstellungen von Bitbucket gespeichert.
Bitbucket Einstellungen
Als Nächstes wird in der bitbucket-pipelines.yml Datei ein Schritt hinzugefügt, der die SSH-Verbindung zum Zielserver herstellt und die Deployment-Skripte ausführt.
Die zu installierenden Artefakte können beispielsweise zunächst über SCP zum Zielserver übertragen werden, oder sie können auch mithilfe der Deployment-Skripte
aus einer Docker-Registry geladen werden. In der Datei bitbucket-pipelines.yml steht im Idealfall nur ein Befehl für den Aufruf eines Bash-Skripts, das alle weiteren
Deployment-Schritte auf dem Zielserver kapselt.
Der nachfolgende Pipeline-Schritt zeigt den Aufruf für das Deployment eines Docker-Images aus der Registry. Variablen, die in der Pipeline gesetzt werden, teilen dem Skript das zu installierende Image sowie das Installationsverzeichnis mit.
- step: &deploy
name: deploy
image: atlassian/default-image:4
trigger: manual
runs-on:
- linux
script:
- ssh deploy@application.exensio.de SERVER_DIRECTORY=${SERVER_DIRECTORY} IMAGE=${IMAGE}
Was verursacht hier Bauchschmerzen?
Die Verwendung von SSH mit einem Schlüssel kann generell als sichere Methode angesehen werden. Allerdings ist zu bedenken, dass der private Schlüssel in irgendeiner Weise bei Atlassian gespeichert ist.
Damit hat zumindest Atlassian Zugriff auf den Schlüssel und er könnte bei einem Hackerangriff auf die Atlassian-Server gestohlen werden. Wenn der private Schlüssel kompromittiert wird, kann damit ein Angreifer Zugriff auf den Deployment-Server erhalten.
Minimierung der Sicherheitsrisiken
Für die Minimierung von Sicherheitsrisiken bei der Nutzung von SSH über Bitbucket sollten drei Vorkehrungen getroffen werden:
- Verwendung des Schlüssels nur zum Deployment: Anstatt eines generischen SSH-Schlüssels werden spezifische Deploy-Keys verwendet, die nur für ein bestimmtes Repository gültig sind.
- Eingeschränkte Berechtigungen: Der SSH-Benutzer auf dem Zielserver wurde mit minimalen Rechten ausgestattet, die für das Deployment notwendig sind.
- Einschränken des SSH-Schlüssels auf ein Kommando
Die dritte Vorkehrung bedarf einer separaten Erläuterung, da sie eher unbekannt ist.
Bei SSH ist auf der Server-Seite die Datei authorized_keys im .ssh-Ordner eines Benutzers in erster Linie zur Konfiguration der Public-Key-Authentifizierungen zustündig. Normalerweise kann ein Benutzer nach dem Login auf dem System alle Kommandos auf dem Server ausführen, für die er Berechtigungen besitzt.
Ein Eintrag kann wie folgt aussehen:
ssh-ed25519 AAAAC3..lwrOO13dZTh deploy@ex-server
Es besteht allerdings auch die Möglichkeit, zusätzlich ein Kommando in dieser Datei zu hinterlegen, das beim Verbinden ausgeführt wird. Wird dieser Schlüssel verwendet, dann darf der Benutzer auch nur genau dieses Kommando ausführen. Er wird nach dem Ausführen des Kommandos direkt wieder ausgeloggt und kommt somit gar nicht auf die Kommandozeile.
Diesen Mechanismus machen wir uns zunutze und tragen hier den Befehl zum Ausführen des Deployment-Skripts ein. Dies sieht folgendermaßen aus:
command="/srv/app/deploy.sh", ssh-ed25519 AAAAC3..lwrOO13dZTh deploy@ex-server
In dem oben aufgeführten Bitbucket-Pipeline-Schritt ist zu sehen, dass lediglich eine Verbindung zum Deploy-Server aufgebaut wird, ohne Mitgabe eines Befehls. Es werden lediglich Parameter für das Deployment-Skript auf der Serverseite mitgegeben. Nach dem Login erfolgt automatisch die Ausführung des Deployments.
Zusammenfassung
Durch die Verwendung von SSH können Deployments sicher und effizient durchgeführt werden. Es ist jedoch wichtig, sich der potenziellen Sicherheitsprobleme bewusst zu sein und entsprechende Maßnahmen zu ergreifen.
Durch die Implementierung von spezifischen Deploy-Keys, eingeschränkten Berechtigungen sowie insbesondere der Hinterlegung des auszuführenden Befehls können sichere Deployments über SSH mit Bitbucket Pipelines realisiert werden.