Kiedy pisaliśmy jak połączyć się z serwerem (Linux) za pomocą protokołu SSH/SCP, tak by móc swobodnie przesyłać pliki, bez potrzeby instalowania serwera FTP, co nie tylko jest wygodniejsze – te same konta, ale i dużo bezpieczniejsze…
Dziś postaram się rozwinąć temat użytkowników, tak byśmy mogli udzielić dostępu do plików innym użytkownikom, ale bez otwierania przed nimi dostępu do shella (wiersza poleceń).
Spis treści w artykule
Serwer SSH/SCP jako serwer SFTP
Teoretycznie nic nie stoi na przeszkodzie, by przy standardowych ustawieniach SSH dodać nowego użytkownika, i niezbędne dane (login i hasło) przekazać koledze/znajomemu, który np. za pośrednictwem WinSCP będzie mógł połączyć się z naszym serwerem i przeglądać pliki… naszego serwera.
Ale sprawdzi się to tylko wtedy, gdy takiej osobie ufamy, gdyż ma ona dostęp do wszystkich plików na serwerze (oczywiście z ograniczeniami wynikającymi z parametrów konta), jak i może się połączyć z naszym serwerem po SSH.
Również w przypadku mniej zaawansowanych osób zazwyczaj nie potrzebujemy – a wręcz przeciwnie – wyświetlać całego drzewa plików serwera, by nie wprowadzać niepotrzebnego zamętu…
Całość pokażę na przykładzie systemu Debian i Raspberry Pi, ale z ew. lekkimi modyfikacjami powinno to działać również w innych systemach.
Grupa użytkownik z ograniczeniami
Dlatego utworzymy nową grupę użytkowników (np. sftp), która będzie miała pewne ograniczenia:
- Dostęp tylko do zdefiniowanego katalogu, widzianego jako katalog główny (/)
- Możliwość zapisywania plików do zdefiniowanego katalogu w swoim katalogu domowym
- Brak dostępu do shella (powłoki, wiersza poleceń)
Na początek tworzymy nową grupę – w naszym wypadku będzie to grupa „sftp”:
sudo groupadd sftp
Nastepnie tworzymy nowego użytkownika, który w naszym przypadku nazywa się „webinsider”, a jego katalog domowy to „/sftp/webinsider”:
sudo useradd -g sftp -d /sftp/webinsider -s /dev/null webinsider
Na koniec jeszcze ustawiamy hasło:
sudo passwd webinsider
Możemy też zmodyfikować/dostosować już istniejącego użytkownika:
sudo usermod -g sftp -d /sftp/użytkownik -s /dev/null użytkownik
I nasz użytkownik (prawie gotowy)
Shell bez shella, czyli powłoka bez powłoki
Jak już wspomniałem – nasz użytkownik nie będzie mógł korzystać z shella, dlatego za pomocą tego fragmentu podstawiliśmy mu nieistniejący:
-s /dev/null webinsider
Może być jeszcze konieczne dodanie naszego fikcyjnego shella do listy dostępnych w systemie powłok:
sudo nano etc/shells
I gdzieś na końcu dodajemy linijkę:
/dev/null
Konfiguracja serwera SSH
Teraz musimy jeszcze zmodyfikować parametry serwera SSH, i w tym celu edytujemy plik konfiguracyjny:
sudo nano /etc/ssh/sshd_config
Znajdujemy linijkę:
Subsystem sftp /usr/lib/openssh/sftp-server
I zmieniamy ją na:
Subsystem sftp internal-sftp
Teraz jeszcze na końcu dodajemy:
Match Group sftp
ChrootDirectory /sftp/%u
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp
I możemy zrestartować serwer SSH:
sudo /etc/init.d/ssh restart
Katalogi i uprawnienia (do nich)
W naszej przykładowej konfiguracji wszystkie pliki będą przechowywane w katalogu /sftp, w którym każdy użytkownik będzie miał swój indywidualny katalog, w którym znajdzie również katalog „uploads” do wgrywania plików.
Dlatego teraz utworzymy te katalogi:
sudo mkdir /sftp/
sudo mkdir /sftp/webinsider/
sudo mkdir /sftp/webinsider/uploads
I nadamy odpowiednie uprawnienia:
sudo chown -R root:root /sftp/
sudo chown -R webinsider:sftp /sftp/webinsider/uploads
Tutaj od razu małe wyjaśnienie, dlaczego stosujemy podkatalog „uploads”, a nie bezpośrednio katalog z nazwą użytkownika – ma to związek z ograniczeniami wynikającymi z bezpieczeństwa, które w tym przypadku są nam narzucane „odgórnie” i nie ma co z nimi kombinować, bo skończy się to błędem logowania danego użytkownika.
Stąd:
- Właścicielem katalogu /sftp/ jest użytkownik „root”
- Użytkownik „webinsider” ma dostęp „do doczytu” do katalogu /sftp/webinsider, który jest jego katalogiem domowym
- Użytkownik „webinsider” w swoim katalogu domowym ma katalog „uploads” (oczywiście jego nazwa może być dowolna), do którego może zapisywać pliki
A na „prawie sam koniec” na jednym ekranie szybkie dodawanie kolejnego użytkownika:
Łączymy się
Gdy wszystko gotowe – można przystąpić do konfiguracji połączenia.
Wszystkie parametry będą identyczne jak przy połączeniu SCP/SSH (adres serwera, port), z tym, że jako typ połączenia wybieramy „SFTP” i oczywiście wpisujemy poprawną nazwę użytkownika i hasło :-)
W przypadku próby połączenia po SSH (np. PuTTY) nasz użytkownik po autoryzacji utraci połączenie.
Oczywiście przed przekazaniem danych dostępowych nowemu użytkownikowi warto samodzielnie sprawdzić, czy wszystko działa tak, jak sobie założyliśmy.
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
Witam.
Jak ustawić uprawnienia dla nowego użytkownika aby po zalogowaniu do sftp (zdalnie z innej sieci) nie mógł wejść w żaden systemowy katalog tylko w mój głowny czyli /home/pi/folder? Chce żeby miał „Brak dostępu” przy próbie otwarcia danego katalogu systemowego poza katalogiem /home. Wcześniej ogarnąłem to w jakiś prosty sposób ale stawiałem system na nowo (Raspberry Pi 4B) i juz nie pamiętam jakich komend użyć. Można prosić o pomoc?
Dokładnie to masz opisane w tym artykule, z tym że z wykorzystaniem katalogu „sftp” zamiast „home” (ale to nie problem, bo „home” to %h zamiast /sftp/%u). Jeśli chcesz jeszcze bardziej przykręcić śrubę, to możesz zmodyfikować plik /etc/passwd i zmienić dla danego użytkownika fragment „/bin/bash” np. na „/bin/false”.
Chcę też aby miał w tej lokalizacji /home/pi/folder uprawnienia odczytu i zapisu.