NEU! UPGRADE IP 10 verfügbar!
Optimierte Darstellung von VISU Editor und VISU Client - sowie viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/8HzePCm3

Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Ab sofort kann jeder die neue VISU & IFTTT testen. Info: viewtopic.php?f=8&t=5074

Release V 4 am 15. Juni 2024
Es gibt nun einen fixen Termin. Info: viewtopic.php?f=8&t=5117

NEU! Ausführliches Video Tutorial zur IP 10
Jetzt werden alle Fragen beantwortet. Das Video: https://youtu.be/_El-zaC2Rrs

Zugriff auf Docker Volumes

Allgemeine Themen & Feature Requests für APPs und Docker-Funktionen
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

Ersteller
jockel
Reactions:
Beiträge: 424
Registriert: Mo Aug 13, 2018 6:31 pm
Hat sich bedankt: 193 Mal
Danksagung erhalten: 147 Mal

Zugriff auf Docker Volumes

#1

Beitrag von jockel »

Hallo zusammen,

hier war ja schon ein paar mal die Diskussion, wie man "von außen" auf Docker Volumes zugreifen kann. Nach ein wenig Recherche im Netz bin ich jetzt zu einer Lösung gekommen, die ich hier kurz vorstellen will. Die Idee dahinter ist, einen zweiten Container zu starten, der einen ssh Server enthält und die gleichen Volumes mountet, wie der Container, dessen Volumes gemountet werden sollen. Ein zweiter Container deswegen, da es in Docker nicht ganz unproblematisch ist, einen zweiten Serverprozess im Hintergrund zu starten und es außerdem eher der Philosophie entspricht.

Vorweg ein Disclaimer: Das Ganze ist nicht fertig sondern eher als Konzeptstudie und "Work in Progress" zu verstehen, trotzdem könnte es ja schon für andere interessant sein. Außerdem ist es nicht ausgetestet, insbesondere habe ich es bislang auch nur mit meiner lokalen Docker Installation auf meinem Laptop getestet. Das werde ich noch nachholen, sobald ich wieder Zugriff auf den Timberwolf und etwas Zeit habe. Die Beschreibung ist an einigen Stellen Linux/Unix spezifisch, sollte sich analog aber auch mit Windows umsetzen lassen.

Der Docker Container basiert auf dieser Beschreibung: https://docs.docker.com/engine/examples ... h_service/


Zum Vorgehen:


1. Erstellen eines Schlüsselpaars

Es ist deutlich praktischer, wenn man nicht für jedes Login ein Passwort eingeben muss. Daher habe ich zunächst ein Schlüsselpaar für den Login am Container erstellt, Länge und Typ können dabei an das eigene Sicherheitsbedürfnis angepasst werden.

Code: Alles auswählen

ssh-keygen -t rsa -b 2048
Bei der Erzeugung wird nach einem Namen gefragt, ich habe SSHKey-docker gewählt. Wenn Ihr einen anderen Namen angebt, bitte im Dockerfile anpassen. Die Passphrase für den Schlüssel kann leer bleiben, was die spätere Nutzung bequemer macht, aber auch jedem, dem der Key in die Hände fällt, den Login erlaubt. Bei einem Key, der nur im eigenen Netz und von eigenen Geräten verwendet wird, halte ich persönlich das Risiko für vertretbar, aber auch da muss jeder selber entscheiden.

Das erzeugt zwei Dateien, einmal SSHKey-docker (den privaten Schlüssel), zum anderen SSHKey-docker.pub (den öffentlichen Schlüssel). Der öffentliche Schlüssel muss später auf den Server wandern, um sich dann dort mit dem privaten Schlüssel authentifizieren zu können.

Alternativ kann man sich am Container auch per Password authentifizieren, das ist in der gepostetet Variante auch aktiviert, kann aber bei Bedarf deaktiviert werden.
WICHTIG: Das Passwort im Dockerfile ändern!!


2. Kopieren des öffentlichen Schlüssels in das Verzeichnis, in dem auch das Dockerfile liegt


3. Docker Image erstellen.

Dockerfile:

Code: Alles auswählen

# Based on https://docs.docker.com/engine/examples/running_ssh_service/

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd

# Please change password to a unique value
RUN echo 'root:Tu5ahK8w' | chpasswd

# Root login only with public key authentification (which should be the default):
# RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config

# Root login with password and public key authentication
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

# Add ssh public key to /root/.ssh/
ADD ./SSHKey-docker.pub /root/.ssh/authorized_keys

# Change access rights for /root/.ssh and /root/.authorized_keys
RUN chmod 0700 /root/.ssh && \
    chmod 0600 /root/.ssh/authorized_keys

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Kommando zum Erstellen:

Code: Alles auswählen

docker build -t ssh-server .

4. Konfiguration der Verbindung auf dem Client

Um sich das Leben etwas leichter zu machen, kann die Verbindung alternativ auf dem Client fest konfiguriert werden.

Dazu in .ssh/config einen Eintrag ähnlich wie dem folgenden anlegen:

Code: Alles auswählen

Host docker
        HostName localhost
        port 9022
        User root
        IdentityFile ~/.ssh/SSHKey-docker
Unter Windows kann Putty verwendet werden, dazu bitte in der Dokumentation schauen. Insbesondere müssen für Putty wohl Schlüssel konvertiert werden.


5. Starten des Docker Containers auf dessen Volumes zugegriffen werden soll

Da der ssh Container im folgenden per --volumes-from auf die Volumes dieses Containers zugreift, muss er zwingend vor dem ssh Container gestartet werden.


6. Starten des ssh Containers

Code: Alles auswählen

docker run -d -p 9022:22 --volumes-from CONTAINER1 --name ssh-container1 ssh-server
Dabei ist Port 9022 der nach außen sichtbare Port des ssh Containers, zu dem man sich verbinden kann. Darf auf dem Timberwolf natürlich nicht schon genutzt werden. CONTAINER1 ist der Container aus Schritt 5, auf dessen Volumes zugegriffen werden soll.


7. Zugriff

Bei meinen Tests konnte ich damit sowohl auf der Kommandozeile per ssh, als auch mit einem SFTP Client auf den ssh Container zugreifen. Die Dateien des Containers CONTAINER1 finden sich darin am gleichen Ort, wie im Container1


8. Sonstiges
  • Durch die Option --volume-from muss der SSH Container nach dem Container gestertet werden, dessen Volumes genutzt werden sollen. Alterbativ könnte man die Volumes im Container expliziert angeben, hätte dann aber einen etwas höheren Anpassungsbedarf beim Ändern der Container.
  • Je nachdem, wozu man den ssh Zugang nutzen möchte, sind im ssh Container unter Umständen weitere Tools nützlich, z.B. ein Editor.
  • Ein ähnliches Vorgehen könnte man z.B. auch für Backups von Daten im Container verwenden, z.B. wenn ein einfaches Kopieren nicht reicht.

Ausblick:

Bei meiner Suche habe ich auch noch eine Beschreibung gefunden, nach der die Volumes per Samba freigegeben werden. Finde ich sehr elegant, habe ich aber noch nicht zum Laufen bekommen:
https://www.guidodiepen.nl/2017/08/shar ... via-samba/

Nach einer kleinen Anpassung, weil der verwendete Samba Container inzwischen zu Alpine als Basis gewechselt ist, startet der in dem Blog vorgestellte Container zwar, aber ich kann die Freigaben nicht mounten.

Jockel
TWS 2500 ID: 145 + 1x TP-UART + 2x DS9490R, VPN geschlossen, Reboot nach Absprache / wiregate198 (im Ruhestand)
Benutzeravatar

Chris M.
Reactions:
Beiträge: 1194
Registriert: Sa Aug 11, 2018 10:52 pm
Wohnort: Oberbayern
Hat sich bedankt: 237 Mal
Danksagung erhalten: 857 Mal
Kontaktdaten:

#2

Beitrag von Chris M. »

Sehr schön!

Um das aber halbwegs massentauglich zu bekommen würde schon erwarten, dass ElabNet eine Methode anbietet um auf den Inhalt vom Container zu kommen. Evtl. basierend auf dieser Beschreibung ;)

Wenn man das SSH Passwort durch eine Environment-Variable ersetzen kann, dann müsste es nicht fest eincompiliert werden und wäre somit als fixes Image für viele verwendbar und öffentlich hostbar.
CometVisu Entwickler - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

CometVisu Fragen, Bugs, ... bitte im Entwicklungs-Forum, hier nur spezifisches für CV<->Timberwolf.

TWS 2500 ID: 76 + TP-UART - VPN offen, Reboot nur nach Absprache

Ersteller
jockel
Reactions:
Beiträge: 424
Registriert: Mo Aug 13, 2018 6:31 pm
Hat sich bedankt: 193 Mal
Danksagung erhalten: 147 Mal

#3

Beitrag von jockel »

Da in einem anderen Thread die Frage aufkam, wie das am Timberwolf mit dem Portainer umgesetzt werden kann, hier noch eine kleine Ergänzung:

Vorab:
Portainer unterstützt die Option "--volumes-from" nicht und wird das, wenn ich das entsprechende Issue aus deren Bugtracker richtig interpretiere wohl auch zukünftig nicht...


Mit folgenden Schritten hat es bei mir trotzdem geklappt

1. Vorbereitung des Dockerfiles
Zum Login per Public Key Authentifizierung müssen zunächst, wie oben beschrieben, die SSH-Keys erzeugt werden. Reicht die Authentifizierung per Kennwort, muss dieses in das Dockerfile eingetragen werden. Werden Keys verwendet, muss der Public-Key in das gleiche Verzeichnis wie das Dockerfile kopiert und sein Name, wie oben beschrieben, in das Dockerfile eingetragen werden. Wenn root login per Kennwort unterbunden und nur per Public Key Authentifizierung erlaubt werden soll, die Zeile mit "PermitRootLogin yes" auskommentieren und das Kommentarzeichen vor der Zeile mit "PermitRootLogin prohibit-password" antfernen.

2. Tar File erstellen
Dieser Schritt kann übersprungen werden, wenn die Authentifizierung nur über das Kennwort erfolgt und keine SSH-Keys in das Image kopiert werden müssen. Ansonsten in das Verzeichnis mit dem Dockerfile wechseln und dort folgenden Befehl ausführen. Damit wird ein Tar-Archiv "ssh.tar" im übergeordneten Verzeichnis erzeugt. Das wird auch unter Windows gehen, ich habe aber keine Ahnung wie...:

Code: Alles auswählen

tar -cvf ../ssh.tar *
3. Das Image erzeugen

a. Den Portainer auf dem Timbewolf aufrufen, in der Seitenleiste "Images" und dann "Build a new Image" auswählen (siehe Screenshot)
Bild

b. Im nächsten Fenster In der Mitte "Upload" auswählen, unter Name einen beliebigen Namen eingeben und unter "Select File" entweder das unter 2. erstellte Tar-Archiv oder, wenn ausschließlich Kennwort-Authentifizierung gewünscht ist, das Dockerfile direkt auswählen. Anschließend "Build the image" auswählen. Das Image sollte ohne Fehler erstellt werden, anschließend gibt es die Logausgaben des Erstellens.
Bild


4. Den Container erstellen

a. In der Seitenleiste "Container" und anschließend oben "Add Container" auswählen
Bild

b. Im folgenden Dialog oben einen sinnvollen Namen angeben und das zuvor erstellte Image auswählen. Unter "Port Mapping" bei Host den Port angeben, unter dem der Container später per SSH zu erreichen ist. In meinem Beispiel 9022, 22 kann nicht verwendet werden, da der dieser Port auf dem Timberwolf schon belegt ist. Unter "Container" muss der Port 22 stehen bleiben, es sei denn diese Konfiguration wurde im Dockerfile geändert.
Bild

c. Die zu mountenden Volumes angeben
Im Reiter "Volumes" "map additional Volume" auswählen. Anschließend unter "Volume" ein zuvor definiertes Datenvolumen auswählen und unter Container angeben, wo dieses im SSH-Container im Dateipfad eingehängt werden soll. Die Volumes müssen im Dockerfile des SSH-Containers nicht vorher konfiguriert werden und es ist auch problemlos möglich, mehrere Volumes in einem SSH-Container einzubinden.
Bild


5. Den Container starten
Gestartet wird der Container mit der Schaltfläche "Deploy the Container" (siehe vorheriger Screenshot)
TWS 2500 ID: 145 + 1x TP-UART + 2x DS9490R, VPN geschlossen, Reboot nach Absprache / wiregate198 (im Ruhestand)

Robert_Mini
Reactions:
Beiträge: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1171 Mal
Danksagung erhalten: 2076 Mal

#4

Beitrag von Robert_Mini »

Schreit förmlich nach der KB!
Hoffe ich komme auch bald mal dazu, mich dem Thema zu stellen!
Danke
Robert
Zuletzt geändert von Robert_Mini am Di Okt 30, 2018 9:43 pm, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Robert_Mini
Reactions:
Beiträge: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1171 Mal
Danksagung erhalten: 2076 Mal

#5

Beitrag von Robert_Mini »

Hallo @jockel !

Bin nun endlich dazu gekommen, deiner Beschreibung zu folgen! Die Beschreibung ist perfekt auch für mich als Docker Anfänger!

Hier die Befehle, dich ich über Portainer Image Editor eingegeben habe.
Im Zuge der Fehlersuche habe ich alles authorization key bezogene mit ### auskommentiert.

Code: Alles auswählen

 # Based on https://docs.docker.com/engine/examples/running_ssh_service/

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd

# Please change password to a unique value
RUN echo 'root:12345' | chpasswd

# Root login only with public key authentification (which should be the default):
# RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config

# Root login with password and public key authentication
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

# Add ssh public key to /root/.ssh/
### ADD ./SSHKey-docker.pub /root/.ssh/authorized_keys

# Change access rights for /root/.ssh and /root/.authorized_keys
RUN chmod 0700 /root/.ssh 
  ### && \ chmod 0600 /root/.ssh/authorized_keys

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Folgenden Fehler erhalte ich als Output. Hast du einen Tipp?

Mit dem auskommentierten ADD ./SSHKey-docker.pub /root/.ssh/authorized_keys erhalte ich fast den gleichen Fehler eben einen Schritt früher.

Danke
Robert
Step 1/11 : FROM debian:latest

---> de8b49d4b0b3

Step 2/11 : RUN apt-get update && apt-get install -y openssh-server

---> Using cache

---> 9d6a02ede204

Step 3/11 : RUN mkdir /var/run/sshd

---> Using cache

---> 185cae11ea10

Step 4/11 : RUN echo 'root:12345' | chpasswd

---> Using cache

---> e10472935852

Step 5/11 : RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

---> Using cache

---> afcb876d9536

Step 6/11 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

---> Using cache

---> 285a51365e61

Step 7/11 : RUN chmod 0700 /root/.ssh

---> Running in f41f6313b012

chmod: cannot access '/root/.ssh': No such file or directory

The command '/bin/sh -c chmod 0700 /root/.ssh' returned a non-zero code: 1
Zuletzt geändert von Robert_Mini am So Jan 20, 2019 6:08 pm, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
jockel
Reactions:
Beiträge: 424
Registriert: Mo Aug 13, 2018 6:31 pm
Hat sich bedankt: 193 Mal
Danksagung erhalten: 147 Mal

#6

Beitrag von jockel »

Auf den ersten Blick vermute ich, dass das Verzeichniss /root/.ssh fehlt, warum auch immer. Bei meinen Tests auf einem Linux Rechner und dem Timberwolf hatte ich das nicht, vielleicht hat sich aber auch beim Posten ein Fehler eingeschlichen.

Versuch mal ein zusätzliches

Code: Alles auswählen

RUN mkdir -p /root/.ssh
im Dockerfile, irgendwo bevor zum ersten mal darauf zugegriffen wird.

Ansonsten werde ich das morgen noch mal auf meinem TW testen!
TWS 2500 ID: 145 + 1x TP-UART + 2x DS9490R, VPN geschlossen, Reboot nach Absprache / wiregate198 (im Ruhestand)

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#7

Beitrag von MiniMaxV2 »

Der Ordner .ssh wird nicht automatisch angelegt. Du hast den Code vorher (ADD ./SSHKey-docker.pub /root/.ssh/authorized_keys) auskommentiert, der diesen Ordner anlegt. Du solltest die Zeile drinne lassen oder halt das Chmod auch auskommentieren :)

Edit hab eben kurz nachgelesen was du eigentlich versuchst - du wills mit passwort auf den Container ohne SSH Key ? Dann musst du auch weiter oben die Login Beschränkung raus nehmen. Und das Chmod aud .ssh kannst du auch ignorieren sprich kommentieren.
Zuletzt geändert von MiniMaxV2 am So Jan 20, 2019 6:57 pm, insgesamt 1-mal geändert.
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Robert_Mini
Reactions:
Beiträge: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1171 Mal
Danksagung erhalten: 2076 Mal

#8

Beitrag von Robert_Mini »

Mit zusätzlich

Code: Alles auswählen

RUN apt-get -y install openssh-client
# RUN ssh-keygen -t rsa -b 2048
# RUN ssh-keygen -t rsa -b 2048 '' -f /id_rsa
RUN mkdir -p /root/.ssh
wurde das Image gerade gebaut.
Kleiner Teilerfolg! :dance:

Mal sehen ob ich mit FTP heute noch drauf kommen!
Die beiden ssh-keygen mag er nicht, ob das openssh-client erforderlich is, weiß ich noch nicht.

Lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#9

Beitrag von MiniMaxV2 »

Für einen reinen Server bruachst du das Client Paket nicht. Ebenso den .ssh Ordner ;)
Den keygen müsstest du lokal bei dir ausführen und den erzeugten öffentlichen Schlüssel im Container speichern (das ist im Prinzip was du auskommentiert hast), der Private ist dein Geheimnis dann :)
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Robert_Mini
Reactions:
Beiträge: 3744
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1171 Mal
Danksagung erhalten: 2076 Mal

#10

Beitrag von Robert_Mini »

Morgen erst geht's weiter.
Ich werde mal den weg wie der EDOMI Docker über macvlan nehmen.
Für reverse proxy fehlt mit grad die Idee, was ich dann im WinFTP eingeben muss???

Ich halte euch am Laufenden...
Lg Robert
Zuletzt geändert von Robert_Mini am Mo Jan 21, 2019 5:40 pm, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297
Antworten

Zurück zu „Allgemeine Themen & Feature Requests“