VSFTPD @ Raspberry Pi 2

corax228

Cadet 3rd Year
Registriert
Okt. 2012
Beiträge
37
Hi,

ich bin gerade daran, einen Webserver und einen FTP-Server auf meinem PI zu installieren. Der Webserver funktioniert soweit, jedoch gibt es mit dem FTP ein Problem... Folgendes soll er können:

  • TLS (Verschlüsselung)
  • User auf das Homeverzeichnis begrenzen
  • Im Homeverzeichnis Ordner/Dateien anlegen

Zum letzten Punkt: Es soll wirklich im Home-Ordner chmod 777 herrschen, da ich sonst nur im Subverzeichnis Verzeichnisse und/oder Dateien erstellen kann.

Hier meine Config:
Code:
listen=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/ssl/vsftpd/vsftpd.key
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=AES128-SHA
debug_ssl=YES

Erstellt sind 2 Benutzer, ein Benutzer ist beispielsweise: htdocs_root mit dem Homeverzeichnis /var/www. Ein weiterer erhält den Ordner /var/www/mypage.

Angenommen, ich schalte die Verzeichnisse auf chmod 777 /var/www bzw. chmod 777 /var/www/mypage erhalte ich bei der FTP-Connection folgenden Fehler:

Status: Verbinde mit ***.***.***.***:21...
Status: Verbindung hergestellt, warte auf Willkommensnachricht...
Status: Initialisiere TLS...
Status: Überprüfe Zertifikat...
Status: TLS-Verbindung hergestellt.
Befehl: USER htdocs_root
Antwort: 331 Please specify the password.
Befehl: PASS ***********
Fehler: GnuTLS-Fehler -15: An unexpected TLS packet was received.
Fehler: Herstellen der Verbindung zum Server fehlgeschlagen

Setze ich chmod a-w /var/www kann ich mich wieder ganz normal einloggen, kann aber halt keine Ordner erstellen. Der Workaround mit dem Flag allow_writeable_chroot=YES bringt den gleichen Fehler, wie chmod 777 ...

Der User pi dagegen, kann sich einloggen und kann Ordner erstellen (bis auf einen neuen ordner in /, also dem physikalischen Root. In seinem Home /home/pi kann er jedoch.). Der User pi ist in der vsftpd.chroot_list eingetragen. :freak:

Was mache ich falsch?!
 
Zuletzt bearbeitet:
strace mal den vsftpd prozess war er in den ssl-socket reinschreiben will. wahrscheinlich ein rechteproblem auf das home-verzeichnis, bzw es fehlt die einstellung, dass das root-verzeichnis schreibbar ist.
 
mittels strace -p {PID} -o {path} konnte ich nicht viel herausfinden; die beiden logs gleichen sich stark.. daher habe ich 2 logs mit strace -p {PID} -f -v -t -o {PATH} erstellt.


CHMOD a-w
Code:
2121  23:14:03 accept(3, {sa_family=AF_INET, sin_port=htons(53369), sin_addr=inet_addr("***.***.***.***")}, [16]) = 4
2121  23:14:08 clone(child_stack=0, flags=0x28000000|SIGCHLD) = 9459
2121  23:14:08 close(4)                 = 0
9459  23:14:08 prctl(PR_SET_PDEATHSIG, 9 <unfinished ...>
2121  23:14:08 accept(3,  <unfinished ...>
9459  23:14:08 <... prctl resumed> )    = 0
9459  23:14:08 close(3)                 = 0
9459  23:14:08 dup2(4, 0)               = 0
9459  23:14:08 dup2(4, 1)               = 1
9459  23:14:08 dup2(4, 2)               = 2
9459  23:14:08 close(4)                 = 0
9459  23:14:08 fstat64(0, {st_dev=makedev(0, 7), st_ino=22513, st_mode=S_IFSOCK|0777, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=0, st_atime$
9459  23:14:08 getpeername(0, {sa_family=AF_INET, sin_port=htons(53369), sin_addr=inet_addr("***.***.***.***")}, [16]) = 0
9459  23:14:08 getsockname(0, {sa_family=AF_INET, sin_port=htons(21), sin_addr=inet_addr("***.***.***.***")}, [16]) = 0
9459  23:14:08 setsid()                 = 1
9459  23:14:08 getpid()                 = 1
9459  23:14:08 getpgrp()                = 1
9459  23:14:08 umask(077)               = 022
9459  23:14:08 gettimeofday({1431638048, 345290}, NULL) = 0
9459  23:14:08 open("/etc/localtime", O_RDONLY) = 3
9459  23:14:08 fstat64(3, {st_dev=makedev(179, 6), st_ino=1705270, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=2309, st$
9459  23:14:08 fstat64(3, {st_dev=makedev(179, 6), st_ino=1705270, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=2309, st$
9459  23:14:08 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f91000
9459  23:14:08 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\10\0\0\0\0"..., 4096) = 2309
9459  23:14:08 _llseek(3, -28, [2281], SEEK_CUR) = 0
9459  23:14:08 read(3, "\nCET-1CEST,M3.5.0,M10.5.0/3\n", 4096) = 28
9459  23:14:08 close(3)                 = 0
9459  23:14:08 munmap(0x76f91000, 4096) = 0
9459  23:14:08 stat64("/etc/localtime", {st_dev=makedev(179, 6), st_ino=1705270, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st$
9459  23:14:08 stat64("/usr/share/zoneinfo/UTC-02:00", 0x7e844a08) = -1 ENOENT (No such file or directory)
9459  23:14:08 open("/usr/share/zoneinfo/UTC-02:00", O_RDONLY) = -1 ENOENT (No such file or directory)
9459  23:14:08 rt_sigaction(SIGPIPE, {0x76faf08c, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9459  23:14:08 SYS_369(0, 0x9, 0x7e844b30, 0, 0x7e844b30) = 0
9459  23:14:08 open("/var/log/vsftpd.log", O_WRONLY|O_CREAT|O_APPEND|O_NONBLOCK|O_LARGEFILE, 0600) = 3
9459  23:14:08 setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
9459  23:14:08 setsockopt(0, SOL_TCP, TCP_NODELAY, [1], 4) = 0
9459  23:14:08 setsockopt(0, SOL_SOCKET, SO_OOBINLINE, [1], 4) = 0
9459  23:14:08 stat64("/dev/urandom", {st_dev=makedev(0, 5), st_ino=4327, st_mode=S_IFCHR|0666, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_rdev=m$
9459  23:14:08 open("/dev/urandom", O_RDONLY) = 4
9459  23:14:08 read(4, "\37| \246\200\v\206\334fY\6M^h]\210", 16) = 16
9459  23:14:08 close(4)                 = 0
9459  23:14:08 rt_sigaction(SIGTERM, {0x76faf08c, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9459  23:14:08 rt_sigaction(SIGALRM, {0x76faf084, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9459  23:14:08 prctl(PR_SET_PDEATHSIG, 15) = 0
9459  23:14:08 socketpair(PF_FILE, SOCK_STREAM, 0, [4, 5]) = 0
9459  23:14:08 socketpair(PF_FILE, SOCK_STREAM, 0, [6, 7]) = 0
9459  23:14:08 rt_sigaction(SIGCHLD, {0x76faf08c, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9459  23:14:08 rt_sigaction(SIGALRM, {0x76faf084, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9459  23:14:08 uname({sysname="Linux", nodename="Server", release="3.18.11-v7+", version="#781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015", machine="armv7l"}) = 0
9459  23:14:08 clone(child_stack=0, flags=0x40000000|SIGCHLD) = 2
9459  23:14:08 close(5)                 = 0
9459  23:14:08 close(7)                 = 0
9459  23:14:08 read(4,  <unfinished ...>


CHMOD 777
Code:
2121  23:15:49 accept(3, {sa_family=AF_INET, sin_port=htons(53373), sin_addr=inet_addr("***.***.***.***")}, [16]) = 4
2121  23:15:55 clone(child_stack=0, flags=0x28000000|SIGCHLD) = 9551
2121  23:15:55 close(4)                 = 0
9551  23:15:55 prctl(PR_SET_PDEATHSIG, 9 <unfinished ...>
2121  23:15:55 accept(3,  <unfinished ...>
9551  23:15:55 <... prctl resumed> )    = 0
9551  23:15:55 close(3)                 = 0
9551  23:15:55 dup2(4, 0)               = 0
9551  23:15:55 dup2(4, 1)               = 1
9551  23:15:55 dup2(4, 2)               = 2
9551  23:15:55 close(4)                 = 0
9551  23:15:55 fstat64(0, {st_dev=makedev(0, 7), st_ino=27192, st_mode=S_IFSOCK|0777, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_size=0, st_atime$
9551  23:15:55 getpeername(0, {sa_family=AF_INET, sin_port=htons(53373), sin_addr=inet_addr("***.***.***.***")}, [16]) = 0
9551  23:15:55 getsockname(0, {sa_family=AF_INET, sin_port=htons(21), sin_addr=inet_addr("***.***.***.***")}, [16]) = 0
9551  23:15:55 setsid()                 = 1
9551  23:15:55 getpid()                 = 1
9551  23:15:55 getpgrp()                = 1
9551  23:15:55 umask(077)               = 022
9551  23:15:55 gettimeofday({1431638155, 205395}, NULL) = 0
9551  23:15:55 open("/etc/localtime", O_RDONLY) = 3
9551  23:15:55 fstat64(3, {st_dev=makedev(179, 6), st_ino=1705270, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=2309, st$
9551  23:15:55 fstat64(3, {st_dev=makedev(179, 6), st_ino=1705270, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=2309, st$
9551  23:15:55 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f91000
9551  23:15:55 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\10\0\0\0\0"..., 4096) = 2309
9551  23:15:55 _llseek(3, -28, [2281], SEEK_CUR) = 0
9551  23:15:55 read(3, "\nCET-1CEST,M3.5.0,M10.5.0/3\n", 4096) = 28
9551  23:15:55 close(3)                 = 0
9551  23:15:55 munmap(0x76f91000, 4096) = 0
9551  23:15:55 stat64("/etc/localtime", {st_dev=makedev(179, 6), st_ino=1705270, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st$
9551  23:15:55 stat64("/usr/share/zoneinfo/UTC-02:00", 0x7e844a08) = -1 ENOENT (No such file or directory)
9551  23:15:55 open("/usr/share/zoneinfo/UTC-02:00", O_RDONLY) = -1 ENOENT (No such file or directory)
9551  23:15:55 rt_sigaction(SIGPIPE, {0x76faf08c, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9551  23:15:55 SYS_369(0, 0x9, 0x7e844b30, 0, 0x7e844b30) = 0
9551  23:15:55 open("/var/log/vsftpd.log", O_WRONLY|O_CREAT|O_APPEND|O_NONBLOCK|O_LARGEFILE, 0600) = 3
9551  23:15:55 setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
9551  23:15:55 setsockopt(0, SOL_TCP, TCP_NODELAY, [1], 4) = 0
9551  23:15:55 setsockopt(0, SOL_SOCKET, SO_OOBINLINE, [1], 4) = 0
9551  23:15:55 stat64("/dev/urandom", {st_dev=makedev(0, 5), st_ino=4327, st_mode=S_IFCHR|0666, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_rdev=m$
9551  23:15:55 open("/dev/urandom", O_RDONLY) = 4
9551  23:15:55 read(4, "\220\237\365\335n\332U\367)\220\377\5\374O\322\315", 16) = 16
9551  23:15:55 close(4)                 = 0
9551  23:15:55 rt_sigaction(SIGTERM, {0x76faf08c, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9551  23:15:55 rt_sigaction(SIGALRM, {0x76faf084, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9551  23:15:55 prctl(PR_SET_PDEATHSIG, 15) = 0
9551  23:15:55 socketpair(PF_FILE, SOCK_STREAM, 0, [4, 5]) = 0
9551  23:15:55 socketpair(PF_FILE, SOCK_STREAM, 0, [6, 7]) = 0
9551  23:15:55 rt_sigaction(SIGCHLD, {0x76faf08c, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9551  23:15:55 rt_sigaction(SIGALRM, {0x76faf084, ~[RTMIN RT_1], 0x4000000 /* SA_??? */}, NULL, 8) = 0
9551  23:15:55 uname({sysname="Linux", nodename="Server", release="3.18.11-v7+", version="#781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015", machine="armv7l"}) = 0
9551  23:15:55 clone(child_stack=0, flags=0x40000000|SIGCHLD) = 2
9551  23:15:55 close(5)                 = 0
9551  23:15:55 close(7)                 = 0
9551  23:15:55 read(4,  <unfinished ...>


Der aufälligste Unterschied befindet sich in Zeile 40, aber das verstehe ich leider überhaupt nicht :(
 
Zuletzt bearbeitet:
SSL-Stream lesen macht keinen Spass :) Teste den Zugang mal ohne Verschlüsselung und schau dir den strace nochmal an (mit -s 1000).

Bei mir läuft er mit folgender (funktionsrelevanter) config:
Code:
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
pam_service_name=vsftpd

$HOME muss existieren und darf für den User nicht schreibbar sein, sonst verweigert vsftpd den Zugriff.

Siehe auch:
http://www.sigerr.org/linux/setup-v...rectories-users-accounts-ubuntu-step-by-step/

Falls dir das mit dem schreibbaren $HOME nicht ins Konzept passt, müsstest du ggf. ne andere Version nehmen:
https://security.appspot.com/vsftpd/Changelog.txt schrieb:
At this point: v2.3.4 released!
- Add stronger checks for the configuration error of running with a writeable
root directory inside a chroot(). This may bite people who carelessly turned
on chroot_local_user but such is life.

At this point: v2.3.5 released!
- Add new config setting "allow_writeable_chroot" to help people in a bit of
a spot with the v2.3.5 defensive change. Only applies to non-anonymous.
 
Zurück
Oben