{ }
menu zespół linki Logowanie
Stabilny hosting
BSDGuru zawdzięcza
firmie Datanet.pl
Hosting BSDGuru.org - DataNet.pl

scp/sftp bez shell'a

  • warning: Parameter 1 to theme_field() expected to be a reference, value given in /home/bsdguru/domains/bsdguru.org/public_html/includes/theme.inc on line 171.
  • warning: Parameter 1 to theme_field() expected to be a reference, value given in /home/bsdguru/domains/bsdguru.org/public_html/includes/theme.inc on line 171.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.
  • : Function split() is deprecated in /home/bsdguru/domains/bsdguru.org/public_html/includes/common.inc(1497) : eval()'d code on line 14.

Stało się, w końcu musiałem stworzyć użytkowników z bezpiecznym dostępem do plików i bez dostępu do shell'a. Mogłem to rozwiązać na dwa sposoby:

  1. Zrobić ftpd po SSL'u (ftps).
  2. Użyć działającego sshd i jego scp lub sftp.

Pierwszy sposób ma wszystkie zalety wybranego demona ftp (np. nie trzeba dodawać kont do systemu). Mi jednak nie chciało się bawić w wybieranie ftpd i puszczanie go po SSL'u. Dlatego wybrałem sposób drugi.

W tym przypadku każde konto trzeba dodać do systemu, a jako shell wybrać taki który pozwala ograniczać połączenia tylko do scp lub sftp. Do wyboru w drzewie portów znalazłem dwa odpowiednie:

  • shells/rssh
  • shells/scponly

Po krótkim zapoznaniu się z możliwościami obu programów przystąpiłem do testów na domowym komputerze (FreeBSD 5.3). W obu przypadkach działazarówno scp jak i sftp. rssh ma większe możliwości pod względem konfiguracji, ale nie działa pod FreeBSD 4.x. Oba mają możliwość chroot'owania użytkowników po zalogowaniu, ale w praktyce sprawdziłem to tylko dla scponly, który był moim ostatecznym wyborem dla mojego serwera (FreeBSD 4.10).

  1. Instalacja (proponuje zajrzeć do pliku Makefile i zapoznać się z innymi opcjami kompilacji)
    # cd /usr/ports/shells/
    # make -DWITH_SCPONLY_CHROOT install clean
  2. Po pomyślnej instalacji wypadało by przetestować działanie (jeszcze bez chroot'owania).

    Trzeba wybrać jakieś konto testowe (można je założyć) i zmienić dla niego shell'a na /usr/local/bin/scponly. Następnie trzeba zalogować się na to konto np. używając sftp:

    $ sftp konto@moj.host
    Connecting to moj.host...
    Password:
    sftp> ls
    <lista plików>
    sftp> quit

    Jeśli połączenie się nie uda to warto sprawdzić czy odblokowane jest sftp w sshd:

    $ grep sftp /etc/ssh/sshd_config
    Subsystem sftp /usr/libexec/sftp-server

  3. Po pomyślnym przetestowaniu można przystąpić do zamykania użytkowników w ich katalogach.

    Tutaj paczka scponly przychodzi nam z pomocą. W katalogu /usr/local/share/examples/scponly znajduje się skrypt zakładający chroot'owane konta.

    # cd /usr/local/share/examples/scponly
    # ./setup_chroot.sh

    Po wywołaniu skrypt zada kilka pytań i przekopiuje potrzebne pliki do katalogu domowego użytkownika. Tak stworzeni użytkownicy jako domyślnego shell'a będą mieli /usr/local/sbin/scponlyc

  4. Po zamknięciu użytykowników w ich katalogach można sprawdzić czy wszystko działa.

    Można przetestowac czy działa scp, sftp oraz czy rzeczywiście nie działa shell dla tych użytkowników logując się przez ssh.

U siebie wszystkich użytkowników z dostępem tylko do plików trzymam w jednym katalogu wraz z dodatkowymi plikami potrzebnymi do zamknięcia ich. Jeśli jeden z takich użytkowników zapragnąłby sprawdzić czy ma dostęp do shella to domyślnie zobaczyłby motd i inne podobne komunikaty. Można to zmienić dodając takich użytkowników do odpowiedniej klasy i przez ustawienie innej wartości niż domyślna dla motd i copyright w /etc/login.conf. Zachęcam wszystkich do eksperymentowania, bo ten tekst nie wyczerpuje tematu do końca. Dodatkowo proponuje zapoznać się z sshd_config(5), scp(1) i sftp(1) oraz dokumentacją rssh i scponly.

Całość pisałem z głowy po zainstalowaniu i przetestowaniu całego rozwiązania, dlatego mogą wystąpić pewne błędy. Jest to mój pierwszy taki tekst. Wszystkie uwagi mile widziane.

tytus, pt., 18/04/2008 - 19:01