scp/sftp bez shell'a
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:
- Zrobić ftpd po SSL'u (ftps).
- 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).
- Instalacja (proponuje zajrzeć do pliku Makefile i zapoznać się z innymi opcjami kompilacji)
# cd /usr/ports/shells/
# make -DWITH_SCPONLY_CHROOT install clean - 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:
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 - 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.shPo 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
- 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
