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 auchrsync
- 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.