Docker Samba mit Loginmaske

tester

New member
Hallöchen

Ich habe mir einen Docker Samba auf Ubuntu Basis Image gebaut. Ich kann auch mit meinem Windows 10 PC auf die erstellten Freigaben schreibend und lesend zugreifen .
Ich bin es jedoch von meinem alten Linux Samba gewohnt, das ich beim Verbindungsaufbau erstmal einen Benutzernamen und ein Passwort eingeben muss. Im erstellten Docker Container ist es ja derzeit möglich dass sich jeder Rechner mit den gleichen Berechtigungen mit den Freigaben verbinden kann.

Die dafür entsprechenden User können ja bereits im Dockerfile mit angelegt werden
Wie kann man es einstellen, dass beim Verbinden eine Abfrage erscheint in der man sich mit den Zugangsdaten authentifizieren muss?
 
Hier das Dockerfile

Code:
FROM ubuntu:18.04

USER root

RUN apt-get -y update

RUN apt-get -y install samba && \
    apt-get clean && \
    groupadd -g 1000 smbuser && \
    useradd -m -u 1000 -g 1000 smbuser

COPY samba.sh /usr/bin/
COPY smb.conf /etc/samba/
RUN chmod +x /usr/bin/samba.sh


CMD ["/usr/bin/samba.sh"]
 
Da es hier inhaltlich tatsächlich nur um Samba geht, werde ich hier nicht viel beitragen können.

Allerdings würde ich dir den Tipp geben zu schauen, wie andere Samba Images damit umgehen, bpsw: https://github.com/crazy-max/docker-samba, und entweder auf deren Image umzusteigen, oder sich zumindest von deren Lösung inspirieren zu lassen.

p.s. die Ubuntu Version des Basis-Images ist veraltet, sicher das Du das verwenden willst?
 
Danke für den Hinweis wegen der Version. Ich bin noch in dem Status "lernen" so dass ich erstmal die Zusammenhänge verstehen möchte bevor ich da was produktives draus machen möchte.

Ich habe nun meine smb.conf angepasst dass ich eine Loginmaske bekomme. Ich habe im Dockerfile zwar den User 'smbuser' angelegt aber bisher noch kein Passwort. Somit kann ich mich ja noch garnicht einloggen. Wie kann ich in dem Container ein Passwort für den Sambauser setzen?
 
Na das ist doch der gleiche Weg - Samba bleibt Samba? Wenn es Dir konkret um das Passwort geht, vielleicht hilft Dir sowas ja:

echo -e "$SMBPASS\n$SMBPASS" | smbpasswd -a -s $SMBUSER

Ist halt mit Variablen... kannst statt den Variablen natürlich auch die Dinge im Klartext hinschreiben (nur zu Versuchszwecken, da ansonsten die Credentials im Klartext im Dockerfile stehen!). Ansonsten kannst Du die Variablen nutzen und beim Container-Start mit übergeben (z.B. via docker container run ..... --env SMBUSER=smbuser --env SMBPASS=meinpasswort).

Alternativ einfach über vorher deklarierte Umgebungsvariablen. Innerhalb der SSH-Session (ich gehe mal davon aus, dass Du Dich via SSH zum Docker-Host verbindest) die Variablen deklarieren (die dann auch nur während der Sitzung vorhanden sind), den Container hochfahren (welcher dann Bezug auf die Umgebungsvariablen nimmt) und fertig. Hat allerdings den Nachteil, dass man das bei jedem Container-Start machen müsste.

Es wäre ggf. einen Versuch wert (weiss nicht, ob das funktioniert), wenn Du mal via smbd -b | grep "PRIVATE_DIR" schauen würdest, wo Samba die Credentials speichert. Das Verzeichnis könntest Du dann auf den Host verfrachten (Volume oder bind mount), womit die initiale Konfiguration dann bei einem Container-Neustart erhalten bleiben sollte. Ist aber auch nur ganz grob daher geraten, probier es vielleicht einfach mal aus :)
 
Na das ist doch der gleiche Weg - Samba bleibt Samba? Wenn es Dir konkret um das Passwort geht, vielleicht hilft Dir sowas ja:

echo -e "$SMBPASS\n$SMBPASS" | smbpasswd -a -s $SMBUSER

Ist halt mit Variablen... kannst statt den Variablen natürlich auch die Dinge im Klartext hinschreiben (nur zu Versuchszwecken, da ansonsten die Credentials im Klartext im Dockerfile stehen!). Ansonsten kannst Du die Variablen nutzen und beim Container-Start mit übergeben (z.B. via docker container run ..... --env SMBUSER=smbuser --env SMBPASS=meinpasswort).

Alternativ einfach über vorher deklarierte Umgebungsvariablen. Innerhalb der SSH-Session (ich gehe mal davon aus, dass Du Dich via SSH zum Docker-Host verbindest) die Variablen deklarieren (die dann auch nur während der Sitzung vorhanden sind), den Container hochfahren (welcher dann Bezug auf die Umgebungsvariablen nimmt) und fertig. Hat allerdings den Nachteil, dass man das bei jedem Container-Start machen müsste.

Es wäre ggf. einen Versuch wert (weiss nicht, ob das funktioniert), wenn Du mal via smbd -b | grep "PRIVATE_DIR" schauen würdest, wo Samba die Credentials speichert. Das Verzeichnis könntest Du dann auf den Host verfrachten (Volume oder bind mount), womit die initiale Konfiguration dann bei einem Container-Neustart erhalten bleiben sollte. Ist aber auch nur ganz grob daher geraten, probier es vielleicht einfach mal aus :)

ich habe es nun geschafft ...

Code:
FROM ubuntu:18.04

# Standardbenutzer
ARG USER=smbuser
ARG PASS="smbtest"

# Basis Linux System aktualisieren
RUN apt-get -y update && apt-get upgrade -y

# Samba Pakete installieren
RUN apt-get -y install samba && apt-get clean

# Vorbereitete smb.conf in den Container kopieren
COPY files/smb.conf /etc/samba/

# Gruppe für Sambauser erstellen
RUN groupadd -g 1000 smbuser && useradd -m -u 1000 -g 1000 $USER

# Passwort Benutzer festlegen
RUN echo "$USER:$PASS" | chpasswd

# Samba Benutzer erstellen
RUN (echo "$PASS"; sleep 5; echo "$PASS" ) | smbpasswd -s -a $USER

# Ports festlegen
EXPOSE 137/udp 138/udp 139 445

# Samba Startfile in den Container kopieren
COPY files/samba.sh /usr/bin/

# Samba Startfile ausführbar machen
RUN chmod +x /usr/bin/samba.sh

# Samba starten
CMD ["/usr/bin/samba.sh"]

Die Ubuntu Version musste ich nehmen da es die letzte Version für meine 32bit Testbüchse ist
Mit Dieser Konfiguration kann ich mich von meinem Windows 10 Rechner anmelden. Bin zwar noch nicht am Ende
meines Vorhabens aber die erste Hürde ist geschafft. Wenn einer Verbesserungen hat kann er mir diese gerne mitteilen ;-)
 
Die Ubuntu Version musste ich nehmen da es die letzte Version für meine 32bit Testbüchse ist
Nimm doch einfach eine Distro die ein i386 Image bereitstellt, bspw. `debian:bookworm`

Du definierst mit CMD bereits ein Entrypoint-Skript. Hast Du schon mal in Erwägung gezogen, die Anlage des Users im Entrypoint-Skript zu machen?

Noch ein Tipp zum Image: Idealerweise sollte ein Image umbebungsneutral sein. Ein daraus erzeugte Container sollte dann unterstützen das man die umgebungsspezifische Konfiguration entweder über das Mounten von fertigen Konfigurationsdateien, oder im Entrypoint-Skipt die Konfiguration anhand gesetzter Environmen-Variable rendert.
 
Nimm doch einfach eine Distro die ein i386 Image bereitstellt, bspw. `debian:bookworm`

Du definierst mit CMD bereits ein Entrypoint-Skript. Hast Du schon mal in Erwägung gezogen, die Anlage des Users im Entrypoint-Skript zu machen?

Noch ein Tipp zum Image: Idealerweise sollte ein Image umbebungsneutral sein. Ein daraus erzeugte Container sollte dann unterstützen das man die umgebungsspezifische Konfiguration entweder über das Mounten von fertigen Konfigurationsdateien, oder im Entrypoint-Skipt die Konfiguration anhand gesetzter Environmen-Variable rendert.

im Echtbetrieb wechsel ich auf eine 64bit Version

Das mit dem Entrypoint habe ich aus einer Anleitung übernommen. Die Funktion habe ich noch nicht so ganz verstanden. Daher ist die Datei zwar vorhanden aber leer. Das wäre das nächste mit dem ich mich mal tiefer auseinander setzen muss.
 
So, neuer Versuch neues Glück.

Habe es nun geschafft, dass der Samba Server läuft. Habe dafür das Alpine Dist verwendet
Hier das Dockerfile

Code:
FROM alpine

RUN apk --no-cache --no-progress upgrade && apk --no-cache --no-progress add bash samba shadow tini tzdata

USER root

COPY samba.sh /usr/bin/samba.sh
RUN chmod +x /usr/bin/samba.sh

RUN /bin/bash /usr/bin/samba.sh -u "testuser;testpasswort;smbuser;1000" -s "Default;/workdir;no;yes;no;testuser;smbuser"

RUN ./usr/sbin/smbd

Der Container wird mit dem Aufruf gestartet

Code:
docker run -it -p 139:139 -p 445:445 -v /docker/samba/volumes:/workdir samba

und meldet sich mit

Code:
/ #
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
    8 root      0:00 ps
/ #

Der Befehl ps zeigt mir aber das der Sambadienst offensichtlich nicht gestartet ist und daher auch keine Verbindungen möglich sind.

Nach der Eingabe von

Code:
smbd

startet der Dienst und alles funktioniert wie gewünscht. Verbindungen über die IP Adresse sind möglich.

Was muss ich tun um den Dienst im Container zu starten? Der Run Befehl, der übrigens nur einer von vielen ist den ich ausprobiert habe, scheint nicht zu funktionieren. Habe dann auch versucht mit einem separaten Shellscript ohne Erfolg zu starten
 
Was ist denn mit diesem Teil vom alten Dockerfile passiert?
# ...

# Ports festlegen
EXPOSE 137/udp 138/udp 139 445

# ...

# Samba starten
CMD ["/usr/bin/samba.sh"]
Wenn Du von einem Tutorial auf ein anderes umsteigst, solltest Du schon hinterfragen, warum plötzlich Teile fehlen, und ob diese überhaupt notwendig sind.

Statt CMD kann man auch ENTRYPOINT verwenden. Wenn ENTRYPOINT und CMD verwendet wird, wird der Inhalt von CMD zum Argument von ENTRYPOINT.
 
Was ist denn mit diesem Teil vom alten Dockerfile passiert?

Wenn Du von einem Tutorial auf ein anderes umsteigst, solltest Du schon hinterfragen, warum plötzlich Teile fehlen, und ob diese überhaupt notwendig sind.

Statt CMD kann man auch ENTRYPOINT verwenden. Wenn ENTRYPOINT und CMD verwendet wird, wird der Inhalt von CMD zum Argument von ENTRYPOINT.
Ich habe soweit alles verstanden und nur das übernommen was ich verstanden habe. Lediglich das starten des Dienstes mach mir Probleme. Die Portangabe hat tatsächlich gefehlt. Hatte aber soweit funktioniert ;-)

Ich habe auch bereits folgendes ausprobiert wie von @blurrrr vorgeschlagen:

Eine init.sh mit folgendem Inhalt erstellt

#!/bin/sh
exec /usr/sbin/smbd

Im Dockerfile folgenden Eintrag hinzugefügt

ENTRYPOINT ["/entrypoint.sh"]

Build erneuert. Jetzt startet der Container nicht mehr.

Wo kann ich sehen warum der Container nicht startet? Mit docker logs <ID> kann ich ja nur das log eines laufenden Containers sehen
 
Eine init.sh mit folgendem Inhalt erstellt
Im Dockerfile folgenden Eintrag hinzugefügt

ENTRYPOINT ["/entrypoint.sh"]

Build erneuert. Jetzt startet der Container nicht mehr.
Das wäre schon mal so das erste, was mir auffällt... Du kannst nicht Datei A anlegen und ihm dann sagen, er soll Datei B ausführen 😁

Was dann noch auffällt... Wenn es bei o.g. Dockerfile geblieben ist und Du "nur" den ENTRYPOINT-Eintrag hinzugefügt hast... Wo "im" Container liegt denn dann das Entrypoint-Script? Pack besser nochmal folgende Zeile "über" die Entrypoint-Zeile im Dockerfile:
Code:
COPY --chmod=0755 entrypoint.sh /entrypoint.sh
Damit landet das Entrypoint-Script dann auch im Image und kann auch innerhalb des Containers ausgeführt werden :)
 
Zuletzt bearbeitet:
ENTRYPOINT ["/entrypoint.sh"]
Das sollte richtigerweise ENTRYPOINT ["/usr/bin/init.sh"] heissen

Bei diesem Eintrag startet der Container nicht. Wenn ich diesen Aufruf im Dockerfile auskommentiere, kann ich nach einem neuen Build den Container im Bash Modus starten. Ich kann dann auch die Datei im Ordner /usr/bin mit den Rechten 755 finden. Ich kann sie dann auch in der Shell mit ./init.sh ausführen und der Dienst startet korrekt.
 
Poste vielleicht doch besser nochmal Dein vollständiges Dockerfile und den Inhalt Deiner init.sh, irgendwie ist das grade alles sehr verwirrend... 😅
 
Hier das Dockerfile

Code:
FROM alpine

RUN apk --no-cache --no-progress upgrade && apk --no-cache --no-progress add bash samba shadow tini tzdata

COPY samba.sh /usr/bin/samba.sh
RUN chmod +x /usr/bin/samba.sh

COPY init.sh /usr/bin/init.sh
RUN chmod +x /usr/bin/init.sh

# Ports festlegen
EXPOSE 137/udp 138/udp 139 445

# Sambauser und Freigabe einrichten -> funktioniert einwandfrei
RUN /bin/bash /usr/bin/samba.sh -u "testuser;testpasswort;1000;smbuser;1000" -s "Default;/workdir;no;yes;no;testuser;smbuser"

# Versuche den Dienst zu starten
# RUN /bin/bash  /usr/bin/init.sh  -> Container startet aber Dienst startet nicht
# RUN /usr/sbin/smbd               -> Container startet aber Dienst startet nicht
# CMD ["/usr/sbin/smbd"]         -> Container startet aber Dienst startet nicht

ENTRYPOINT ["/usr/bin/init.sh"]  -> Container startet nicht mehr

Hier die init.sh

Code:
#!/bin/bash

exec /usr/sbin/smbd

Der Container wird mit folgenden Befehl aufgerufen

Code:
 docker run -it -p 139:139 -p 445:445 -v /volumes:/workdir samba
 

Zurzeit aktive Besucher

Keine Mitglieder online.

Letzte Anleitungen

Statistik des Forums

Themen
5.021
Beiträge
50.325
Mitglieder
4.712
Neuestes Mitglied
ChristianH
Zurück
Oben