[HOWTO] vsFTP und Samba mit Benutzerrechten für FAT32-USB-Platte

Ich würde eher auf ein Freetz oder pebcac Problem tippen. Was du auch immer mit technisch meinst...

Gruß
Oliver
 
Mit "technischem Problem" meinte ich, dass es hier vermutlich zu einer Kollision von Diensten kommt, d.h. die von AVM implementierten Dienste zu NAS können nicht mit dem Freetz-Samba.

Wenn du von einem pebkac-Problem sprichts, dann wäre es schon hilfreich, dies mit sachlichen Aussagen zu belegen.
Ich habe versucht alle Informationen zur Konfiguration und den Aktionen zur Verfügung zu stellen. Wenn etwas fehlt, dann kann man danach fragen.
Und ausserdem ist es doch interessant, dass auch andere Probleme mit SAMBA und der FB7390 haben.
 
Zuletzt bearbeitet:
So, ich habe jetzt ein aktuelles Trunk-Release: freetz-devel-6941

Das Original NAS, FTP und SAMBA Modul von AVM habe ich entfernt.

Code:
root@192:/var/mod/root# cat /mod/etc/samba/smb.conf
### global
[global]
netbios name = FRITZ.BOX
workgroup = ARBEITSGRUPPE
server string = %h (Samba %v)
syslog = 1
syslog only = yes
encrypt passwords = true
passdb backend = smbpasswd
obey pam restrictions = yes
socket options = TCP_NODELAY
unix charset = ISO-8859-1
preferred master = yes
os level = 20
security = user
guest account = ftpuser
username map = /mod/etc/samba/users.map
### expert
socket options = TCP_NODELAY IPTOS_LOWDELAY
read raw = yes
write raw = yes
oplocks = yes
max xmit = 65535
dead time = 15
getwd cache = yes
log file = /var/media/ftp/uStor01/log/samba.log.%m
log level = 4
max log size = 1000
### default
### shares
[public]
 comment = Freigabe fuer Gast
 path = /var/media/ftp/uStor01/public
 guest ok = yes
 read only = no
 write cache size = 65536
 user = ftpuser
[homes]
 comment = Home-Verzeichnisse
 path = /var/media/ftp/uStor01/home
 guest ok = no
 read only = no
 create mask = 0700
 browseable = no
 write cache size = 65536
 user = ftpuser
### fin

Wie man leicht erkennen kann wird in jeder Freigabe [public] und [homes] der Parameter user = ftpuser übernommen.

Dies ist nicht aktzeptabel.

Frage:
An welcher Stelle muss die Datei /mod/etc/default.samba/samba_conf modifiziert werden, damit dieser Parameter aus der Konfiguration verschwindet?

Code:
root@192:/var/mod/root# cat /mod/etc/default.samba/samba_conf
#!/bin/sh

. /etc/default.samba/modlibsamba


echo "### global"

cat << EOF
[global]
netbios name = $SAMBA_NETBIOS_NAME
workgroup = $SAMBA_WORKGROUP
server string = $SAMBA_SERVER_STRING
syslog = 1
syslog only = yes
encrypt passwords = true
passdb backend = smbpasswd
obey pam restrictions = yes
socket options = TCP_NODELAY
unix charset = ISO-8859-1
preferred master = $SAMBA_MASTER
os level = $SAMBA_OS_LEVEL
security = share
guest account = $SAMBA_SYSTEMUSER
username map = /mod/etc/samba/users.map
EOF

if [ -n "$SAMBA_INTERFACES" ]; then
cat << EOF
interfaces = $SAMBA_INTERFACES
bind interfaces only = yes
EOF
fi

echo "### expert"

[ -r "/tmp/flash/samba/sharesx" ] && cat /tmp/flash/samba/sharesx

echo "### default"

if [ "$MODLIBSAMBA_ENABLED" == "yes" ]; then
        for SHARE in /var/media/ftp/*; do
                if [ -d "$SHARE" ]; then
                        SHORTNAME=$(basename "$SHARE" | sed s/-Partition-/-/)
                        [ "$SHORTNAME" == "lost+found" ] && continue
                        echo "[$SHORTNAME]"
                        echo " path = $SHARE"
                        echo " user = $SAMBA_SYSTEMUSER"
                        echo " read only = $MODLIBSAMBA_READONLY"
                        [ "$MODLIBSAMBA_PASSWORD" == "\"\"" ] && echo " guest ok = yes"
                        fi
        done
fi

echo "### shares"

if [ -r "/tmp/flash/samba/shares" ]; then
        cat /tmp/flash/samba/shares | grep -v "^#" | while read -r path name gk ro options comment; do
                if [ -n "$path" -a -n "$name" -a -d "$path" ]; then
                        case $gk in
                                1|y|yes|Y|YES)  gk="yes" ;;
                                0|n|no|N|NO|"") gk="no"  ;;
                        esac
                        case $ro in
                                1|y|yes|Y|YES)  ro="yes" ;;
                                0|n|no|N|NO|"") ro="no"  ;;
                        esac
                        if  [ "$options" != "-" ]; then
                                options=$(echo "$options" | sed -r -e 's,=, = ,g;s,(%20| )+, ,g;')
                        else
                                options=""
                        fi
                        echo "$options" | grep -q "user =" >/dev/null 2>&1 || options="$options,user = $SAMBA_SYSTEMUSER"
                        options=$(echo -e "${options//,/\\n }")
cat << EOF
[${name//%20/ }]
 comment = $comment
 path = $path
 guest ok = $gk
 read only = $ro
 $options
EOF
                fi
        done
fi

echo "### fin"

THX
 
Diese Zeile fügt ein "user = $SAMBA_SYSTEMUSER" ein, sofern nicht bereits "user =" in den Optionen enthalten ist. Wie man einen Wert mit Leerzeichen in den Optionen unterbringen kann, ist eine andere Frage ...
Code:
echo "$options" | grep -q "user =" >/dev/null 2>&1 || options="$options,user = $SAMBA_SYSTEMUSER"
 
Kann man nicht den kompletten Abschnitt in der Experts Sektion unterbringen?

Gruß
Oliver
 
Hi,

Code:
USERS="user1 user2"
DIRS="shared public"

for user in $USERS; do
  for dir in $DIRS; do
    mount -o bind /var/media/ftp/uStor01/$dir /var/media/ftp/uStor01/$user/$dir
  done
done
Wenn ich Pfade per "mount -o bind" in die Home-Verzeichnisse der User einbinde, erscheinen diese als Eintrag im "Eingehängte Partitionen"-Bereich auf der Status-Seite von Freetz. Das heißt, die externe Platte wird mehrfach aufgelistet. Gibt es eine Möglichkeit, das zu unterdrücken?

Meine Daten
=========
Boxtyp:7270_v3
AVM-Firmwareversion:04.88
Sprache:de
Kernelversion:2.6.19.2 (3860) (gcc version 3.4.6)
Freetz-Version:freetz-devel-7055


Vielen Dank,
buergernb
 
Zumindest ist es nicht einfach. Bei verschiedenen Kernel-Versionen werden diese Mounts verschieden angezeigt.

Was kommt bei Dir als Ausgabe von "cat /proc/mounts"?
 
Hi Ralf,

Was kommt bei Dir als Ausgabe von "cat /proc/mounts"?
Ausgabe sieht so aus:
Code:
rootfs / rootfs rw 0 0
/dev/root / squashfs ro 0 0
dev /dev tmpfs rw,nosuid 0 0
devpts /dev/pts devpts rw 0 0
proc /proc proc rw,nosuid,nodev,noexec 0 0
tmpfs /var tmpfs rw 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec 0 0
/dev/mtdblock5 /data jffs2 rw 0 0
usbfs /proc/bus/usb usbfs rw 0 0
/dev/sda1 /var/media/ftp/uStor01 fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user2/docs fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user2/images fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user2/pictures fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user2/music fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user2/programs fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user2/videos fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user2/temp fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user1/docs fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user1/images fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user1/pictures fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user1/music fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user1/programs fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user1/videos fuseblk rw,user_id=0,group_id=0,allow_other 0 0
/dev/sda1 /var/media/ftp/uStor01/user1/temp fuseblk rw,user_id=0,group_id=0,allow_other 0 0
nfsd /proc/fs/nfsd nfsd rw 0 0

Ich finde die Lösung sehr praktisch, weil ich so dynamisch für jeden User gemeinsame Ordner in einer Freigabe zusammenstellen kann.


Vielen Dank,
buergernb
 
Sicher ist die Lösung praktisch.

Aber wie Du siehst, ist die Ausgabe für den richtigen Mount und für die Bind Mounts nahezu identisch.
 
Kleiner Verbesserungvorschlag

Hallo,

nun habe ich schon seit längerem die in diesem Thread beschriebene Konfiguration in Betrieb und war eigentlich auch sehr zufrieden damit, bis auf eine Kleinigkeit:

Nach einer Änderungen an der Samba-Konfiguration, die einen Restart der Dienste Samba-nmbd und Samba-smbd zur Folge haben, entsprach die Passwortdatei smbpasswd nicht mehr der Konfiguration und somit konnte man auf die angegeben Freigaben nicht mehr zugreifen. Deswegen habe ich die Lösung aus diesem Beitrag adaptiert und die Zeile
Code:
cat /var/tmp/flash/smbpasswd > /mod/etc/samba/smbpasswd
aus der rc.custom in die Datei /tmp/flash/samba/samba_conf umgezogen. Danke nibbel für diese Lösung.:cool:

Beste Grüße
buergernb
 
Ab Rev. 9408 funktionier das manuelle Ablegen der smb Passwörter leider nichtmehr, da die Datei jedes mal vom Start-Skript überschrieben wird. Sollte man evtl. nochmal überlegen ob man das so lässt.

Ich hab das bei mir als Workaround erstmal auskommentiert. Hat jemand vllt. ne elegantere Lösung ohne neue bauen + flashen?

Code:
Index: make/samba/files/root/etc/init.d/rc.samba
===================================================================
--- make/samba/files/root/etc/init.d/rc.samba	(Revision 9440)
+++ make/samba/files/root/etc/init.d/rc.samba	(Arbeitskopie)
@@ -27,24 +27,24 @@
 
 	# encrypt password
 	local PASS_FILE=/mod/etc/samba/smbpasswd
-	rm -rf $PASS_FILE 2>/dev/null
-	if which smbpasswd >/dev/null; then
-		if [ -n "$SAMBA_PASS" ]; then
-			local CLEAR_FILE=/var/tmp/smbpasswd.cleartext
-			local SAMBA_UID="$(id -u $SAMBA_SYSTEMUSER)"
-			echo "$SAMBA_SYSTEMUSER:$SAMBA_UID:$SAMBA_PASS:[UX         ]:LCT-00000001:" > $CLEAR_FILE
-			smbpasswd 2>/dev/null
-			rm $CLEAR_FILE
-			# make sure a password is set
-			if [ ! -r $PASS_FILE ]; then
-				echo "can not encrypt password, failed."
-				exit 1
-			fi
-		else
-			# samba complains if the file does not exist
-			touch $PASS_FILE
-		fi
-	fi
+#	rm -rf $PASS_FILE 2>/dev/null
+#	if which smbpasswd >/dev/null; then
+#		if [ -n "$SAMBA_PASS" ]; then
+#			local CLEAR_FILE=/var/tmp/smbpasswd.cleartext
+#			local SAMBA_UID="$(id -u $SAMBA_SYSTEMUSER)"
+#			echo "$SAMBA_SYSTEMUSER:$SAMBA_UID:$SAMBA_PASS:[UX         ]:LCT-00000001:" > $CLEAR_FILE
+#			smbpasswd 2>/dev/null
+#			rm $CLEAR_FILE
+#			# make sure a password is set
+#			if [ ! -r $PASS_FILE ]; then
+#				echo "can not encrypt password, failed."
+#				exit 1
+#			fi
+#		else
+#			# samba complains if the file does not exist
+#			touch $PASS_FILE
+#		fi
+#	fi
 
 	return
 }

Grüße,
pasdVn
 
Die Benutzer-IDs (1000, 1001, 1002) müssen wir uns merken. Sie werden mit den neue Samba-Passwörtern in eine Klartext-Datei eingetragen. (Die Datei wird in /var/tmp/ erstellt und überlebt so einen Reboot der Box nicht.)
/var/tmp/smbpasswd.cleartext....
Die neue Samba-Passwort-Datei wird in die Fritz!Box gespeichert.
Code:
cp /mod/etc/samba/smbpasswd /var/tmp/flash
modsave all
Nun geht es zurück ins Freetz-WebIF
Einstellungen -> rc.custom
Code:
cat /var/tmp/flash/smbpasswd > /mod/etc/samba/smbpasswd
Unter der Vorraussetzung dass das ganze noch für aktuelle Revisionen gültig ist:
Müsste es nicht anders herum sein?
Code:
cat /mod/etc/samba/smbpasswd > /var/tmp/flash/smbpasswd
Aus /samba/ in das temporäre Verzeichnis?
 
Danke für diesen Konstruktiven Einzeiler o_O

Verfährt man wie im Wiki, gibt man natürlich alles für alle frei. Das mag zwar einfach sein, aber nicht wirklich zielführend.
In den von mir zitierten Abschnitten geht es ausdrücklich um das Einrichten von dedizierten Sambaacounts, etwas was Windows Systeme nicht können, und was bestenfalls über eine Domäne oder aufwändige Handarbeit emuliert werden kann.

Ich möchte die genauen Benutzer realisieren, dazu braucht es mehr als was das Wiki hergibt.
 
  • Like
Reaktionen: gismotro
Ich hatte das damals auch versucht, aber nie hinbekommen und deshalb das wiki auf ein minimum reduziert.
 
Hallo CaptainMorgan!

Ich bin nicht sicher ob ich genau verstanden habe was Du machen willst. Wenn ich richtig liege sollen verschiedene Benutzer passwortgeschützt auf Shares zugreifen, oder?

Schon mal überlegt das mittels ssh-Zugang auf die Box direkt einzurichten? Auf einer Fritzbox habe ich das zwar noch nicht gemacht aber auf einem NAS. Das ist zugegebenermaßen aufwändige Handarbeit, sollte aber eigentlich funktionieren. Die Benutzer hatte ich mit useradd angelegt und die Sambapasswörter mit smbpasswd -a [smbuser] vergeben. Die [smbuser] müssen bei der Vergabe schon existieren!

Die Benutzer könnte man vermutlich aber auch über das WEB-IF anlegen. Im Prinzip kann man eventuell (ob das beim FritzOS geht weiß ich aber nicht) die Passwörter auch direkt "übernehmen". Dann muss in der smb.conf etwas stehen wie:
Code:
    auth methods = guest sam
    encrypt passwords = Yes
    passdb backend = tdbsam:/opt/etc/samba/smbpasswd.tdb
    unix password sync = yes
    pam password change = yes
    passwd program = /usr/bin/passwd %u
    passwd chat = *new*password* %n\n *new*password* %n\n*updated*

Wobei der Pfad /opt/etc/samba/smbpasswd.tdb hier natürlich nicht stimmt (ist aus meiner NAS-Konfiguration). Schöner Nebeneffekt ist, dass Passwörter nicht mehr im Klartext abgelegt werden.

Hoffe, dass das irgendwie hilft.
Gruß, bolofar
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.