W tej części mieliśmy zająć się tworzeniem kont zdalnego dostępu do SFTP dla wielu użytkowników, w oparciu o skrypt automatyzujący i uwalniający nas od wielokrotnego modyfikowania pliku sshd_config.
Niestety, z racji braku czasu, nadmiaru innych obowiązków i tematów, wpisu tego nie udało mi się doprowadzić do zadowalającego stanu. Dlatego poniżej załączam skrypt, który przygotowałem wcześniej. Uprzedzam lojalnie, że to wersja rozwojowa, zawierająca błędy i nie wszystko działa jak należy. Postanowiłem jednak udostępnić go wam z nadzieją, że ktoś z czytelników znajdzie motywację, by go poprawić i z powodzeniem używać na swoim komputerze. Przypuszczam, że istnieją spore szanse, że nastąpi to szybciej niż ja tego dokonam :)
echo "Utworzony został użytkownik #$USERID: $USERNAME ($FULLNAME) w grupie Zdalni z uprawnieniami do łączenia z serwerem SFTP"
Powyższy skrypt wymaga również jednorazowej modyfikacji pliku sshd_config:
#Subsystem sftp /usr/libexec/sftp-server Subsystem sftp internal-sftp Match Group Zdalni X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ChrootDirectory /chroot/%u
W poprzednim odcinku dowiedzieliście się jak w ogóle uruchomić serwer SFTP w OS X. Jest to wręcz trywialne, ale taki dostęp – w domyślnej konfiguracji – ma swoje wady. Najważniejszą z nich jest to, że zdalny użytkownik może w prosty sposób przeglądać zawartość folderów systemowych. Nie może nic usuwać ani dodawać, ale po co w ogóle dawać możliwość wyświetlania zawartości folderów?
Zróbmy taki przykład. Zakładamy nowego użytkownika (Preferencje systemowe > Użytkownicy i grupy), prawym klawiszem myszy wybieramy na nim Opcje zaawansowane…
Mój użytkownik nazywa się „Intruz”. Zmieniłem jego Katalog domowy, podając ścieżkę do folderu Publiczne, przynależącego do mojego konta. Ponadto wybrałem inną Powłokę logowania (domyślnie jest to bash, ja ustawiłem sh – co powinno zawęzić możliwości ew. „grzebactwa” ze strony Intruza). Oczywiście, należy jeszcze uaktywnić opcję Zdalne logowanie w Preferencje systemowe > Udostępnianie jeśli tego wcześniej nie zrobiliśmy i/lub dodać tego nowego użytkownika do grupy użytkowników, posiadających możliwość zdalnego dostępu – o ile nie daliśmy takich uprawnień wszystkim.
Sprawdźmy więc jak wygląda kwestia dostępu z poziomu sftp:
iMadlo:~ marek$ sftp intruz@192.168.1.14 Password: Connected to 192.168.1.14. sftp> ls Drop Box sftp> pwd Remote working directory: /Users/marek/Public sftp>
Jak zauważyliście, połączyłem się w Terminalu jako Intruz do swojego komputera. Po podaniu hasła serwer SFTP autoryzował dostęp. Komendą ls wyświetlam zawartość folderu, natomiast poleceniem pwd weryfikuję ścieżkę do określonego folderu roboczego. Wszystko się zgadza, jest to folder Publiczne, który określiłem w opcjach zaawansowanych użytkownika Intruz.
Niestety mogę śmiało zmienić ścieżkę i zobaczyć np. zawartość folderów systemowych:
sftp> cd / sftp> ls (null)-in (null)-out Applications Incompatible Software Library Network System Users Volumes bin cores dev
etc homemach_kernel
net opt private
sbin tmp usr
var sftp>
To i tak nie jest to raczej to czego oczekujemy… Po za tym jeśli zdalny użytkownik będzie korzystać z jakiegoś klienta SFTP to musiałby w konfiguracji tego programu podać dokładną ścieżkę, czyli /Users/marek/Public, by przy każdym połączeniu się w tym folderze znaleźć. Gdy zostawi domyślną, tj. „/”, zobaczy foldery systemowe naszego komputera.
Dlaczego tak się dzieje? Sprawdźcie uprawnienia np. folderu Biblioteki na dysku waszego komputera (skrót: Command+I):
Zauważyliście, że każdy (everyone) posiada uprawnienia odczytu? To domyślne ustawienie w OS X, którego zdecydowałem się nie zmieniać, by nie ryzykować unieruchomienia systemu. Zastanawiałem się też nad utworzeniem grupy „Zdalni” (do ktorej dodałbym Intruza) i zabraniem dostępu tejże grupie, do wszystkich folderów po za Publiczne. Niestety, na obecnym etapie moja pewność w posługiwaniu się Terminalem, oraz zabawie przywilejami nie jest wystarczająca. Nic nie stoi na przeszkodzie, by „terminalowi wyjadacze” spróbowali takich modyfikacji – i podzielili się efektami na naszym blogu :)
Jeśli powyższy rezultat wam wystarczy możecie zakończyć lekturę. Jeśli jednak chcecie dowiedzieć się, jak ograniczyć uprawnienia zdalnego użytkownika wyłącznie do obsługi SFTP, oraz uniemożliwić przeglądanie innych folderów komputera – kontynuujcie!
Rozwiązaniem problemu jest tzw. chroot jail – dzięki któremu zmienimy katalog główny zdalnego użytkownika. Poniżej kroki, które przeprowadziłem:
Utworzyłem użytkownika „eseftep” podobnie jak Intruza, ale nie zmieniałem domyślnych ustawień (Opcje zaawansowane… pozostały nietknięte), dałem nowemu użytkownikowi możliwość zdalnego dostępu, następnie w Terminalu wprowadziłem poniższe:
Pierwsza linia to zrobienie kopii zapasowej pliku sshd_config, który później zmodyfikuję. Dalej: zmiana właściciela – każdy folder w chroot jail musi należeć do roota, oraz ustalenie uprawnień. Poleceniem mkdir z parametrem -p tworzę kompletne drzewo folderów w katalogu głównym komputera – folder „chroot” zawiera folder o nazwie użytkownika, a ten – folder zwany „zdalny”, do którego będą wrzucane pliki. Dla nowych folderów wymagana jest kolejna zmiana własności oraz uprawnień.
UWAGA: Lepiej nie logować się lokalnie na konto użytkownika zdalnego, tzn. z poziomu systemu/okna logowania, ponieważ zostanie stworzony regularny profil wraz z domyślnymi folderami, tj. Biurko, Dokumenty, Obrazki, itp. Sugeruję ukrycie konta według metody opisanej tutaj.
Czas na modyfikację pliku sshd_config (ja edytowałem w programie TextEdit, ale jeśli znacie edytor tekstowy, jak np. vi, to możecie dokonać zmian bezpośrednio w Terminalu :)).
Najpierw zahaszowałem istniejący wpis:
#Subsystem sftp /usr/libexec/sftp-server
Następnie, na końcu pliku umieściłem poniższe:
Subsystem sftp internal-sftp Match User eseftep X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ChrootDirectory /chroot/eseftep
Od teraz, użytkownik eseftep, po zalogowaniu trafia bezpośrednio do folderu eseftep, który jest dla niego katalogiem głównym!
iMadlo:~ marek$ sftp eseftep@192.168.1.14 Password: Connected to 192.168.1.14. sftp> pwd Remote working directory: / sftp> ls zdalny sftp>
Próba zmiany ścieżki nic nie da:
sftp> cd /Users/marek Couldn't canonicalise: No such file or directory sftp>
Ponadto, użytkownik eseftep może łączyć się tylko korzystając z protokołu SFTP. Pomimo faktu, że udostępniłem mu dostęp zdalny w panelu preferencji, to połączenie SSH nie będzie zrealizowane pomyślnie:
iMadlo:~ marek$ ssh eseftep@192.168.1.14 ssh eseftep@192.168.1.14 Password: This service allows sftp connections only. Connection to 192.168.1.14 closed. iMadlo:~ marek$
No to najbardziej spektakularna część pracy za nami. Ale to jeszcze nie koniec. Pamiętajmy, że folder zdalnego użytkownika znajduje się w odizolowanym sandboksie, i do niego należą prawa własności do plików oraz uprawnienia zarówno do odczytu jak i zapisu. Oczywiście, jeśli jesteśmy administratorami komputera nie jest to większy problem, wystarczy utworzyć skrót do folderu „zdalny” w wybranym miejscu, w naszym katalogu domowym (np. na biurku) korzystając z Findera, lub utworzyć tzw. dowiązanie symboliczne korzystając z Terminala.
Żeby jednak nie było zbyt różowo, pojawia się kolejny problem: Finder nie odświeża zawartości folderu „zdalny” automatycznie po zakończeniu uploadu pliku. Zachowanie jest dziwne, czasem kilka plików się pojawi w oknie Findera, innym razem nie. Oczywiście gdy wyświetlimy zawartość tego folderu w Terminalu wszystkie pliki będą widoczne. Problemu z odświeżeniem nie ma też np. manager plików ForkLift. Zakładam więc, że jest efekt stanu zaśmiecenia mojego systemu, lub faktycznie Finder w Mavericksie „kuleje” w tej materii…
Postanowiłem wykorzystać rozwiązanie systemowe – Automatora. Zrobiłem w nim megaprosty workflow, którego działanie polega na sprawdzeniu czy w folderze „zdalny” pojawiły się nowe pliki, a następnie skopiowanie ich do folderu „sftp” na biurku.
Skryp wyręcza mnie od sprawdzania zawartości folderu „zdalny”, ponadto operacja kopiowania powoduje, że właścicielem plików z pełnymi do nich prawami zostaję ja. Jeszcze jedno: chwilę po wykonaniu operacji na ekranie pojawia się komunikat o tym, że użytkownik „eseftep” skończył przesyłać do mnie pliki!
W kolejnej – ostatniej – części poświęconej konfugurowaniu serwera SFTP w OS X zajmiemy się tworzeniem grupy zdalnych użytkowników. Do przeczytania wkrótce.
Pomimo dostępności wielu rozwiązań bazujących na „chmurze”, pozwalających na składowanie danych na dysku sieciowym (Dropbox, OneDrive, Cubby, itp.) zdarza się, że chcielibyśmy mieć możliwość udostępnienia przestrzeni dyskowej swojego komputera innym. W przypadku sieci lokalnej problem właściwie nie istnieje, bo w prosty i intuicyjny sposób możemy skonfigurować udostępnianie plików i folderów dzięki panelowi Preferencji systemowych. Nieco gorzej wygląda sprawa, gdy chcemy umożliwić to z Internetu. Oczywiście, dobrze w takim wypadku posiadać stały publiczny adres IP albo usługę DDNS. Możemy wtedy pomyśleć nad wykorzystaniem usługi VPN, dzięki której „oszukamy” komputer kliencki i będziemy mogli zdalnie korzystać z zasobów sieciowych tak jak byśmy byli w sieci lokalnej. W kolejnych artykułach zajmiemy się jednak czym innym: skonfigurujemy serwer SFTP na naszym komputerze.
Osoby pracujące nieco dłużej na komputerach Mac mogą pamiętać, że w starszej wersji systemu OS X (do 10.6 włącznie) w Preferencjach systemowych można było aktywować udostępnianie plików przy użyciu FTP. Od OS X w wersji 10.7, opcja ta zniknęła z panelu, choć nadal da się zastartować serwer FTP prostym poleceniem w Terminalu:
I jeśli nie mamy totalnie „rozjechanego” :) systemu, zobaczymy podobny do poniższego rezultat:
iMadlo:~ marek$ ftp localhost
Trying ::1...
Connected to localhost.
220 ::1 FTP server (tnftpd 20100324+GSSAPI) ready.
Name (localhost:marek):
Wykorzystując Terminal, Finder (opcja Połącz z serwerem… z menu Idź) lub dowolnego klienta FTP (ForkLift, Cyberduck, itd.) możemy uzyskać zdalny dostęp do swoich folderów i plików (z uprawnieniami zgodnymi z tymi które posiada zalogowany zdalnie użytkownik).
Aby wyłączyć serwer FTP wprowadzamy następujące wyrażenie:
Apple porzuciło (czy raczej odrobinę utrudniło korzystanie z serwera FTP) na rzecz SFTP – podobnie jak w przypadku Telnet kontra Secure Shell – ze względów bezpieczeństwa. FTP wykorzystuje dwa połączenia TCP: dla poleceń oraz do transmisji danych (wymaga to zwolnienia dwóch portów na routerze/firewallu, port nr 21 oraz 20 dla trybu aktywnego i 21 oraz dowolny >1024 dla trybu pasywnego). Jednak najważniejszą wadą protokołu File Transfer Protocol jest fakt, że oba kanały komunikacyjne nie są szyfrowane, więc dość łatwo przechwycić hasło i dane. Oczywiście istnieje rozwiązanie – FTPS (FTP/S) protokół, w którym polecenia i dane są szyfrowane dzięki użyciu SSL.
Jednak lepszym i nowocześniejszym rozwiązaniem jest SFTP, który korzysta z szyfrowanego protokołu SSH i używa jednego połączenia na tym samym porcie o numerze 22. Włączenie serwera SFTP w systemie OS X sprowadza się do zaznaczenia opcji Zdalne logowanie w panelu Udostępnianie w Preferencjach systemowych. W ten sam prosty sposób, tj. odznaczając tę opcję, wyłączamy SFTP (oraz SSH). Zdalny dostęp możemy oczywiście uaktywnić tylko wybranym użytkownikom.
Weryfikacja działania serwera SFTP – w Terminalu wpisujemy:
sftp localhost
Przy pierwszym połączeniu zostanie wygenerowany klucz RSA i zostaniemy poproszeni o hasło. Dalej już z górki :) Gdy korzystamy z komunikacji w Terminalu wpisanie słowa help wyświetli listę dostępnych opcji, natomiast bye zakończenie połączenia.
W przypadku łączenia się z Internetu nie powinniśmy zapomnieć o dodaniu przekierowania portu w ustawieniach routera/zapory ogniowej.
Powyższa konfiguracja SFTP ma pewne niedoskonałości. Po pierwsze: na komputerze musi istnieć profil użytkownika, który będzie się zdalnie łączył. Tworzymy go zakładając konto w panelu Użytkownicy i grupy w Preferencjach systemowych. Po drugie: taki zdalny użytkownik ma uprawnienia identyczne z użytkownikiem zalogowanym lokalnie na komputerze. Ma do dyspozycji cały swój katalog domowy, może również przeglądać zawartość większości folderów systemowych. To zdecydowanie wada, którą zajmiemy się w następnym wpisie dotyczącym konfiguracji serwera SFTP już jutro.