Jak skonfigurować serwer openSSH SFTP w systemie Linux?

10

Chcę skonfigurować serwer sftp do udostępniania katalogu, ale nie wiem, jak to zmienić /etc/ssh/sshd_config.

Moje wymagania to:

1) Zaloguj się nie będzie używać certyfikatów, tylko hasło (tj. Autoryzacja używa metody hasła)

2) Chcę zalogować się do użytkownika: ftp, hasło: foo i udostępnij katalog / home / ftp.

3) Mam aplikację, która od czasu do czasu musi pobierać plik z serwera, nie muszę się logować przy użyciu pełnego klienta operacyjnego.

Do tej pory dodałem następujące wiersze do / etc / ssh / sshd_config:

Protocol 2
Subsystem sftp /usr/libexec/sftp-server
Match User ftp
   ForceCommand internal-sftp
   ChrootDirectory /home/ftp

Cała reszta jest komentowana.

/home/ftp jest obecnie pustym katalogiem.

Access działa, jeśli próbuję pobrać plik przy użyciu poświadczeń użytkownika root, ale nie działa, jeśli używam poświadczeń ftp. Czy muszę ustawić powłokę logowania? Czy muszę jakoś wypełnić / home / ftp?

EDYCJA: To jest mój dziennik sshd:

subsystem request for sftp
debug1: subsystem: exec() internal-sftp
debug1: Forced command (config) 'internal-sftp '
debug2: fd 3 setting TCP_NODELAY
debug2: fd 9 setting O_NONBLOCK
debug2: fd 8 setting O_NONBLOCK
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 17613
debug1: session_exit_message: session 0 channel 0 pid 17613
debug2: channel 0: request exit-status confirm 0
debug1: session_exit_message: release channel 0
debug2: channel 0: write failed
debug2: channel 0: close_write
debug2: channel 0: send eow
debug2: channel 0: output open -> closed
debug2: channel 0: read<=0 rfd 9 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug2: channel 0: input drain -> closed
debug2: channel 0: send close
debug2: notify_done: reading
debug3: channel 0: will not send data after close
debug3: channel 0: will not send data after close
User child is on pid 17611
debug3: mm_request_receive entering

* Klient zawiesza się tutaj (aż do przekroczenia limitu czasu) *

Pamiętaj, że jeśli zaloguję się jako „root”, plik zostanie pobrany poprawnie. Pobiera również poprawnie, jeśli skomentuję ostatnie trzy wiersze pliku konfiguracyjnego (tj. MatchWiersz i kolejne 2).

Emiliano
źródło
Czy próbowałeś tylko określić jedną z opcji dopasowania ? Co dzieje się, gdy używasz prawdziwego klienta SFTP? Czy nadal możesz połączyć się za pomocą normalnego klienta SSH, np. sshLub PuTTY w systemie Windows? Jakiej wersji OpenSSH używasz?
Daniel Beck

Odpowiedzi:

7

Musisz upewnić się, że /home/ftpjest własnością, roota ta grupa i inne osoby nie mają uprawnień do zapisu, np chmod 0755. Musisz dodać podkatalogi, ftpaby dodać pliki.


Potrzebujesz również internal-sftppodsystemu, w przeciwnym razie musisz zapewnić odpowiednie chrootśrodowisko w /home/ftp:

Subsystem sftp internal-sftp

Aby zabronić logowania bez hasła, wprowadź

ChallengeResponseAuthentication no
GSSAPIAuthentication no
PubkeyAuthentication no

Są one domyślnie aktywowane.

Daniel Beck
źródło
Zamiana mojego wiersza podsystemu na twój (i ustawienie uprawnień do katalogu) powoduje, że mój ciąg błędów znika, jednak moje programy klienckie „zawieszają się” i nie pobierają potrzebnego pliku (mogę go pobrać przy użyciu poświadczeń użytkownika root). Czy jest jakiś sposób, aby wyjście sshd było bardziej szczegółowe?
Emiliano
Spróbuj dodać tylko jeden element konfiguracji po kolei i sprawdź, czy możesz się połączyć, aby ustalić, która z opcji jest winna, czy może jest to kombinacja opcji. Powinieneś mieć jakieś wyjście /var/log/secure, przynajmniej tam dostaję je w moim systemie.
Daniel Beck
Podniosłem poziom logowania przy użyciu dyrektywy LogLevel. Mogę odczytać ciąg znaków /var/log/messages. Mam następujące: Failed none for ftp [...]następnie Accepted password for ftp [...]i User child is on pid 7658. Klient się zawiesza, a następnie
Emiliano
@happy_emi Rozważ dodanie tej informacji do pytania.
Daniel Beck
Wygląda na to, że był to problem z uprawnieniami do katalogu. sshd_configbyło w porządku.
Emiliano,