Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe
allgemeine Kategorie => Installation & Einrichtung => Thema von: Chris am 16. Juli 2020, 21:12:32

Titel: [S]erver [S]eitige [H]ölle und Docker
Beitrag von: Chris am 16. Juli 2020, 21:12:32

Moin!

Vielleicht kann mir ja hier jemand helfen.

Aktueller Stand
Ich möchte auf meinem Server eine Webseite hosten. Diese ist in mehrere Docker-Container unterteilt:
  • Container "db" für MariaDB
  • Container "web" für PHP/HTML/CSS
  • Der Reverse-Proxy ist korrekt eingestellt und ich bekomme im Browser auch die das gewünschte Ergebnis.
    Bin ich per SSH auf meinem Server, kann ich mittels "docker exec" und "docker cp" Dateien erstellen und kopieren.

    Was ich möchte
    Ich möchte einer dritten Person Zugriff auf die Webseite geben. Der Zugriff soll jedoch auf den "web"-Container beschränkt sein.
    Zugriff per CLI ist optional. Wichtiger ist die Möglichkeit, per SCP oder SFTP Dateien tauschen zu können.
    Ein Zugriff auf den Server direkt möchte ich aus Gründen der Sicherheit nicht.

    Der Philosophie von Docker folgend, besitzt der "web"-Container keinen integrierten SSH-Server. Daher habe ich ein SSH-Image heruntergeladen ("ssh"). "ssh" hat Zugriff auf das Verzeichnis von "web".
    "ssh" hat einen hohen Port: 30022. Der Standard-SSH Server des Systems jedoch den Standard-Port 22.

    Der Benutzer soll nun vie SSH bzw. SFTP/SCP auf "ssh" Zugreifen können. Im Internet liest man viel über "Tunneling" in diesem Zusammenhang.

    Vor allem soll nur dieser eine Benutzer davon betroffen sein.

    Das Problem
    ALLES! Okay, ernsthaft: Ich habe viele Ansätze ausprobiert. Fast alles funktioniert. Sofern ich direkt mit SSH-Arbeite.
    Gemeint ist sowas hier:
    Code:
    ssh foo@bar.de
    Sobald ich jedoch versuche, mittels SCP oder SFTP (fish:// in Dolphin) darauf Zugreife, wird die Verbindung geschlossen. Ohne "wenn" und "aber".

    Was ich bisher versucht habe
    #1 - ForceCommand Nr. 1
    Mein erster Ansatz war es, den Benutzer mittels sshd_config direkt in den Docker-Container zu bewegen:

    Code:
    Match User foo:
    ForceCommand docker exec -it web bash
    Das funktioniert - wie gesagt - mit direktem SSH perfekt. Mit SCP/SFTP jedoch nicht.
    SCP bricht mit der Meldung "The input device is not a TTY" ab.
    Laut Recherche liegt das an der "-it" Option. Also habe ich diese entfernt. Und siehe da, keine Meldung mehr. Leider auch keine Verbindung.

    #2 - ForceCommand Nr. 2
    Mein zweiter Ansatz bestand darin, einen Tunnel aufzubauen.
    Die Idee dabei:
    Nutzer sieht: Nutzer --> Server
    Nutzer macht: Nutzer --> Server --> Container
    Das habe ich mit dieser sshd_config versucht:

    Code:
    Match User foo
    PermitEmptyPasswords yes
    ForceCommand ssh -t -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -p 20022 dusker@localhost "cd /var/www/html/ ; bash"
    Das gepaart mit dem Entfernen des Passwortes für "foo" (das wird vom Ziel-Container ohnehin abgefragt) erreichte erneut das Ziel: CLI klappt!
    Aber auch hier SCP/SFTP nicht. Auch das Entfernen des "-t" Parameters hatte keine Auswirkungen auf das Ergebnis.

    #3 - ForceCommand Nr. 3
    Im Grunde wie der vorherige Versuch. Lediglich "ssh" durch "sftp" ersetzt. Ergebnis bleibt.

    #4 - Tunnel-Konfiguration
    Dem Beispiel dieses Eintrages: https://www.ch.cam.ac.uk/computing/scp-over-ssh-tunnel folgend, habe ich eine solche Datei angelegt. Ebenfalls kein Ergebnis. Leider.

    #5 - Jail
    Nach Stunden erfolgloser Suche und vielen Experimenten (auch wenn das oben nicht so wirkt!), dachte ich an ein SSH-Jail. Also eine Chroot-Umgebung, in dem der Benutzer eingesperrt wird.
    Die Lösung schien ziemlich einfach zu sein:
    Code:
    Match User foo
    ChrootDirectory /home/foo/www
    ForceCommand internal-sftp
    Ach wäre das schön, wenn das so funktioniert hätte.

    #6 - Gitea
    Gitea ist ein git-Server den man selbst hosten kann. Es gibt Gitea auch als Docker-Image. In deren Dokumentation steht wie man den SSH-Server des Hosts nach Gitea leiten kann.
    https://docs.gitea.io/en-us/install-with-docker/#ssh-container-passthrough
    Tatsächlich hoste ich einen Gitea-Server, der sich das Zunutze macht.
    Bisher konnte ich das jedoch nicht für mein aktuelles Problem nutzen.

    Danke!
    Wer es bis hier geschafft, alles zu lesen: Danke!
    Wenn euch etwas einfällt, was ich noch probieren kann oder ihr einen Fehler findet, gebt mir bitte Bescheid.

    Schöne Grüße
    Chris

Titel: Re:[S]erver [S]eitige [H]ölle und Docker
Beitrag von: Andreas am 17. Juli 2020, 06:36:53

Hast Du diese Option in der sshd_config deines Dockers:
Code:
Subsystem sftp /usr/lib/ssh/sftp-server
?? Ich nutze auf meinen Servern ausschließlich diese Variante und sie funktioniert bisher in allen möglichen und auch unmöglichen Lebenslagen (via autossh-Tunnel über nicht-priviligierte Ports etc.).

LG
Andreas


Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
© 2001-2003, YaBB SE Dev Team. All Rights Reserved.