Sichere rsync-Deployments mit GitHub Actions und rrsync

Deployments direkt von GitHub zu einem eigenen Server? Klar! Aber bitte sicher. In diesem Beitrag zeige ich dir, wie du rrsync verwendest, um rsync-Deployments aus einer GitHub Action auf einen eigenen VPS einzurichten, ohne dass du gleich SSH-Zugriff mit Vollzugriff ermöglichen musst.

Ziel: Sicheres Deployment per rsync mit eingeschränktem SSH-Zugriff

Wir wollen GitHub Actions nutzen, um z.B. eine Hugo-Website automatisch auf einen eigenen Server zu deployen – und dabei sicherstellen, dass der Zugriff wirklich nur auf ein bestimmtes Verzeichnis beschränkt ist. Kein Shell-Zugriff, keine Ausflüge ins Dateisystem.

1. GitHub Action Setup

Die folgende GitHub Action (siehe unten) verwendet burnett01/rsync-deployments, um mit rsync das public/-Verzeichnis auf einen Server zu übertragen:

name: Hugo CI & deploy

on:
  push:
    branches:
      - main

jobs:
  build:
    name: Build and deploy website
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          submodules: true
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v3
        with:
          hugo-version: ${{ env.HUGO_RELEASE }}
          extended: true
        env:
          HUGO_RELEASE: 'latest'
      - name: Check Hugo installation
        run: hugo env
      - name: Build website with Hugo
        run: hugo --minify --printI18nWarnings
      - name: Deploy website with rsync
        uses: burnett01/rsync-deployments@7.0.2
        with:
          switches: -avzr --delete --protocol=31
          path: public/
          remote_path: ${{ secrets.DEPLOY_DIRECTORY }}
          remote_host: ${{ secrets.DEPLOY_HOST }}
          remote_user: ${{ secrets.DEPLOY_USER }}
          remote_key: ${{ secrets.DEPLOY_KEY }}

Alles was mit secrets anfängt musst Du in dem Repo unter settings/secrets/actions als „Repository secrets“ hinterlegen.

  • DEPLOY_USER = der SSH-User
  • DEPLOY_HOST = der DNS-Name deines VPS
  • DEPLOY_KEY = Der Private-SSH-Schlüssel
  • DEPLOY_DIRECTORY = in dem Fall den wir hier durchspielen ist das „./“ (siehe unten)

Damit das sicher ist, kommt jetzt der spannende Teil: rrsync.

2. Was ist rrsync?

rrsync steht für „restricted rsync“ und ist ein kleines Script, das mit rsync ausgeliefert wird. Es sorgt dafür, dass ein SSH-User nur rsync ausführen darf – und das auch nur auf ein einziges Verzeichnis.

3. Server vorbereiten

a) Benutzer anlegen

Als Beispiel nutzen wir hier den User „rsyncuser“, du kannst ihn aber nennen wie Du magst, er muss nur überall (VPS und GitHub) den selben Namen haben.

sudo adduser --disabled-password rsyncuser

b) rrsync-Skript installieren

Auf Ubuntu 24.04 LTS habe ich ihn schon ausführbar unter /usr/bin/rrsync gefunden. Er war gleich im rsync Paket enthalten. Eine weitere Quelle wäre das github-Projekt: https://github.com/RsyncProject/rsync/blob/master/support/rrsync

Diese Datei (wenn Du sich nicht über das rsync-Paket schon auf dem System hast) sollte dann im Path liegen und Ausführungsrechte bekommen z.B.:

sudo chmod +x /usr/local/bin/rrsync

c) SSH-Key autorisieren

sudo mkdir -p /home/rsyncuser/.ssh
sudo nano /home/rsyncuser/.ssh/authorized_keys

Eintragen:

command="/usr/local/bin/rrsync /home/rsyncuser/deploy",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-ed25519 AAAAC3NzaC1...= github-deploy-key

Wichtig: Die Pfadangabe in rrsync ist die Wurzel, auf die rsync Zugriff bekommt. Alles darüber hinaus wird verweigert. (In diesem Beispiel /home/rsyncuser/deploy)
Solltest Du rrsync wo anders installiert haben ist der Path auch anzupassen.

d) Rechte und Verzeichnis vorbereiten

sudo mkdir -p /home/rsyncuser/deploy
sudo chown rsyncuser:rsyncuser /home/rsyncuser/deploy

4. remote_path richtig setzen

Wie oben schon beschrieben ist für den Aufruf aus der GitHub-Action der Path dann auf:

remote_path: ./

zu setzen. Alternativ auch . oder ./unterordner, aber niemals einen absoluten Pfad wie /var/www/html!

5. Sicherheitshinweise

  • Nicht nologin oder /bin/false als Shell verwenden – das blockiert auch rsync
  • Der Benutzer hat keine Shell, da rrsync + no-pty greift
  • Übergebe nur den einen Key in authorized_keys

Fazit

Mit rrsync kannst du Deployments per rsync super abgesichert einrichten. Zusammen mit GitHub Actions ergibt sich ein komfortabler und gleichzeitig restriktiver Workflow, der den Zugriff auf deinen VPS auf das Minimum beschränkt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert