Szukałem realnej odpowiedzi na to pytanie, a większość odpowiedzi zawiera porady, jak tego nie robić. Oto jednak scenariusz i jego konieczność:
Mam aplikację konsolową, aw każdym pliku .profile każdego użytkownika znajduje się polecenie uruchamiania aplikacji, a bezpośrednio po poleceniu, które ją uruchamia, jest polecenie „exit”, które wylogowuje ich z systemu. Chcę tylko, aby mogły uzyskać dostęp do tej aplikacji konsoli za pośrednictwem dostarczonego przez nią interfejsu. Po uruchomieniu aplikacja wyświetla użytkownikowi listę klientów, do których można uzyskać dostęp za pośrednictwem aplikacji, przy czym każdy klient ma własny katalog danych. Użytkownicy mają dostęp tylko do klientów, do których będą potrzebować dostępu.
Teraz jest problem: jeśli dam użytkownikom dostęp SSH, będą oni mogli również zalogować się przy użyciu klienta SFTP, co da im bezpośredni dostęp do katalogów danych aplikacji, co jest BARDZO niepożądane, ponieważ to również da mają dostęp do katalogów danych, do których nie powinni mieć dostępu.
To była tak prosta rzecz do zrobienia przy użyciu kombinacji telnet / FTP, ale teraz, gdy chcę dać użytkownikom dostęp z dowolnego miejsca w Internecie, nie byłem w stanie znaleźć sposobu na wyłączenie ich z SFTP, podczas gdy nadal pozwalając im na dostęp do powłoki, w której mogą uruchomić aplikację.
.profile
do tego brzmi jak złe rozwiązanie. Wierzę, że skonfigurowanie użytkownika z alternatywną powłoką miałoby o wiele więcej sensu..profile
sztuczki, aby ograniczyć dostęp, ponieważ omijanie jest trywialne. (szczegóły znajdują się w mojej odpowiedzi)Odpowiedzi:
Edytować:
W przypadku, gdy nie jest to oczywiste, poniższa odpowiedź nie jest przeznaczona jako bezpieczna metoda zapobiegania używaniu SFTP przez osoby mające dostęp do powłoki z serwera. To tylko odpowiedź, która wyjaśnia, jak wyłączyć to z widoczności zewnętrznej. Dyskusję na temat bezpieczeństwa na poziomie użytkownika można znaleźć w odpowiedziach @cpast i @Aleksi Torhamo. Jeśli Twoim celem jest bezpieczeństwo, ta odpowiedź nie jest właściwa. Jeśli koncentrujesz się na widoczności prostych usług, to jest to twoja odpowiedź.
Przechodzimy teraz do oryginalnej odpowiedzi:
Skomentuj obsługę sftp w sshd_config (i oczywiście zrestartuj
sshd
):#Subsystem sftp /usr/lib/openssh/sftp-server
źródło
Subsystem sftp internal-sftp
Subsystem sftp /usr/libexec/sftp-server
Ale to załatwiło sprawę. Dziękuję bardzossh user@host command
, ponieważ.profile
nie zostaną uruchomione, jeśli to zrobisz, a zatem Twoja aplikacja w ogóle się nie uruchomi. Mogą uzyskać pełny dostęp do powłoki, po prostu mówiącssh -t user@host bash
. Po prostu spróbuj, a zobaczysz. Podsystem jest tylko aliasem poleceń; jeśli mogliby wcześniej używać sftp, nadal mogliby go używać - i każdego innego polecenia, jakie chcieli. Przeczytaj moją odpowiedź poniżej..profile
ponieważ nie jest on przeznaczony dla bezpieczeństwa i można go łatwo ominąć. W mojej odpowiedzi wymieniłem trzy różne metody robienia tego za pomocą ssh. W skrócie, po prostu przenieś wywołanie aplikacji z.profile
skryptu powłoki i albo 1) ustaw skrypt powłoki jako powłokę użytkownika 2) ustaw skrypt powłoki jako (odpowiednio dopasowany)ForceCommand
wsshd_config
3) przełącz na uwierzytelnianie za pomocą klucza publicznego i ustaw skrypt powłoki jakcommand
w.ssh/authorized_keys
. (Ponadto powinieneś używać @name, aby ludzie byli powiadamiani o komentarzach)Jak wspomnieli inni, wyłączenie
sftp
nie jest prawie wystarczające - użytkownik z nieograniczonymssh
dostępem może przeglądać każdy plik, do którego konto ma uprawnienia do przeglądania, może modyfikować wszystko, do czego ma uprawnienia, i może łatwo pobrać wszystko, co może przeczytać samodzielnie maszyna. Jedynym sposobem na powstrzymanie ich przed tym jest ograniczenie ich dostępu. Nie jest też idealnym poleganiem na.profile
ograniczaniu użytkowników, ponieważ nie po to jest (Edycja: jak wspomina Aleksi w swojej odpowiedzi, omijanie jest w rzeczywistości banalne.profile
; chodzi o.profile
to, że jest to dla wygody, a nie bezpieczeństwa, więc nie jest przeznaczone do ograniczenia użytkownika. Używaj rzeczy zaprojektowanych dla bezpieczeństwa, takich jak rzeczy poniżej, aby zapewnić bezpieczeństwo).Można to zrobić na dwa podstawowe sposoby: możesz ograniczyć je za pomocą uprawnień do plików lub zmusić je do uruchamiania tylko aplikacji konsoli. Drugi sposób jest lepszy: Przypisz użytkowników, którzy powinni być ograniczeni do aplikacji konsoli do grupy (np.
customers
); następniesshd_config
dodaj następujące wiersze:Dzięki temu wszystkie połączenia od użytkowników w tej grupie otwierają aplikację konsoli; nie mogą uruchomić niczego innego, w tym
sftp
narzędzia serwera. To również powstrzymuje ich przed robieniem czegokolwiek innego w systemie, i w przeciwieństwie do tego.profile
, używa samego serwera SSH (.profile
ogranicza je w powłoce,ForceCommand
zapobiega także robieniu innych rzeczy, które nie wymagają uruchomienia powłoki). Również w przeciwieństwie do.profile
tego, jest to zaprojektowane jako kwestia bezpieczeństwa; jest specjalnie zaprojektowany, aby opierać się unikaniu go przez złośliwego użytkownika.(Prawdopodobnie gorsza) alternatywa polegałaby na utworzeniu nowego użytkownika do uruchomienia aplikacji konsoli. Następnie ograniczysz katalogi danych do tego użytkownika, ustawisz aplikację konsolową należącą do tego użytkownika i uruchomisz
u+s
program. To jestsetuid
trochę; oznacza to, że ktoś, kto uruchamia program konsoli, robi to z uprawnieniami właściciela programu. W ten sposób użytkownik sam nie ma dostępu do katalogów, uzyskuje je tylko przez program. Jednakże, należy prawdopodobnie wystarczy użyćForceCommand
, jako że ogranicza cały dostęp do „po prostu uruchomić ten program”.źródło
ForceCommand
nie uniemożliwia przekierowania portów SSH..profile
czymś więcej niż „nie jest idealne”; łatwo go ominąć (szczegóły w mojej odpowiedzi), a zatem nie zapewnia żadnej ochrony, tylko fałszywe poczucie bezpieczeństwa.Nie próbuj tego robić,
.profile
ponieważ nie zapewnia żadnych zabezpieczeń i nie ogranicza dokładnie niczego!To nie ma znaczenia, co można umieścić w
.profile
, gdyż można go po prostu bypass daje komendę, aby uruchomić w wierszu polecenia ssh, tak:ssh user@host command
. W ten sposób nadal możesz uzyskać normalny dostęp do powłokissh -t user@host bash
.Wyłączenie podsystemu sftp, jak wspomniano w innej odpowiedzi, wcale nie pomaga. Podsystemy są w zasadzie tylko aliasami do poleceń i nadal możesz normalnie używać sftp, wykonując to
sftp -s /path/to/sftp-executable user@host
.Jak powiedzieli cpast i niektórzy komentatorzy, powinieneś użyć odpowiednich mechanizmów ograniczających dostęp. To jest,
ForceCommand
wsshd_config
command="..."
do.ssh/authorized_keys
Uwagi:
command="..."
dotyczy tylko jednego klucza, więc nie ogranicza logowania ssh dla użytkownika używającego hasła lub innego kluczaAllowTcpForwarding
itp. wsshd_config
no-port-forwarding
itp. w.ssh/authorized_keys
script -c 'command-the-user-wanted-to-run'
ForceCommand
icommand="..."
uruchom polecenie przez powłokę użytkownika, aby nie działały, jeśli powłoka użytkownika jest ustawiona na np./bin/false
lub/sbin/nologin
Oświadczenie: W żadnym wypadku nie jestem ekspertem w tej sprawie, więc chociaż mogę powiedzieć, że
.profile
rzecz nie jest bezpieczna, nie mogę obiecać, że nie ma „gotcha” innymi metodami, których nie znam o. O ile mi wiadomo, są bezpieczne, ale nie byłbym pierwszą osobą, która się myli w Internecie.źródło
ForceCommand
i zmuszony pozbawione hasła logowania zcommand=
Wauthorized_keys
, a to zostało pominięte wcześniej, że to z powodu błędu na serwerze: jest przeznaczony do zabezpieczania zawartości przed złośliwego użytkownika, a użytkownik z pominięciem liczy się jako poważna luka na serwerze SSH (i dlatego jest poprawką priorytetową). Jak zauważyłeś, można go.profile
obejść z założenia: ponieważ nie jest uważany za funkcję bezpieczeństwa, obejście go przez użytkownika jest całkowicie OK z punktu widzenia dewelopera powłoki.ForceCommand
do ograniczenia dostępu, a miałeś demona, który tylko nasłuchuje połączeń lokalnie i nie wykonuje uwierzytelnienia, użytkownik ssh może nadal uzyskać dostęp do demona. Wymienione przeze mnie funkcje to np. Rozwiązania hostingowe git zwykle wyłączają się i nie widziałem żadnych innych „złych” wyglądających na stronach podręcznika, ale nie znalazłem też żadnych oficjalnych „w ten sposóbForceCommand
bezpiecznie używasz ” dokumentu.~/.profile
jest edytowalny przez użytkownika i nie jest pomocny ze względów bezpieczeństwa, ale czy możesz uczynić technikę cpast znaczącą, wprowadzając ją/etc/profile
? Możesz sprawdzić identyfikator UID, aby ograniczyć go do odpowiednich użytkowników.ssh user@host
, ale jeśli powiesz ssh, aby uruchomił polecenie - tj.ssh user@host command
- nie masz już powłoki logowania, a pliki w ogóle nie są dotykane. Możesz więc w prosty sposób ominąć wszelkie ograniczenia, które ktoś próbował stworzyć z plikami, po prostu podając dodatkowy argument ssh..profile
, używasshd_config
i powinna być bezpieczna. Wymienia tylko.profile
jako metodę, której nie powinieneś używać do tego.Możliwe jest włączenie SSH i wyłączenie SFTP zarówno globalnie, jak i dla użytkownika / grupy.
Potrzebuję tego osobiście, ponieważ chcę dać dostęp do niektórych repozytoriów git przez SSH i lubię wyłączać systemy, które nie są potrzebne. W takim przypadku SFTP nie jest potrzebne.
Globalnie
Możesz wyłączyć SFTP dla wszystkich użytkowników na kilka sposobów.
Brakujący podsystem
Demon SFTP używany przez SSH można skonfigurować za pomocą
Subsystem
słowa kluczowego. Zsshd_config(5)
instrukcji:Ostatni wiersz sugeruje, że powinno wystarczyć, aby nie definiować żadnego podsystemu dla „sftp”.
Fałszywe kłamstwo
Możesz także wyłączyć SFTP, ustawiając demona SFTP używanego przez SSH na coś nieużytecznego. Na przykład skonfiguruj podsystem „sftp”, aby
/bin/false
:Gdy coś próbuje się zalogować przez SFTP, demon SSH próbuje odrodzić się „demon sftp”
/bin/false
./bin/false
Program robi tylko jedno, a to zwraca kod błędu. Próba połączenia SFTP została skutecznie odrzucona.Na użytkownika / grupę
Możliwe jest również wyłączenie SFTP dla użytkownika, grupy lub kilku innych kryteriów.
To nie działa, jeśli chcesz, aby użytkownik otrzymywał regularne polecenia powłoki. Nie ma to również sensu, ponieważ można obejść większość rzeczy, jeśli masz dostęp do powłoki. Działa to tylko wtedy, gdy chcesz dać dostęp do określonego programu.
Pasujący
Aby dopasować zestaw użytkowników, możesz skonfigurować SSH za pomocą
Match
słowa kluczowego. Zsshd_config(5)
instrukcji:Kilka przykładów:
Match User eva
pasuje do użytkownika „eva”Match User stephen,maria
pasuje do użytkowników „stephen” i „maria”Match Group wheel,adams,simpsons
dopasowuje grupy „koło”, „adams”, „simpsonowie”Jeśli chcesz uzyskać więcej informacji, w
sshd_config(5)
instrukcji jest mnóstwo .Wymuszone polecenie
Zwykle dostajesz powłokę logowania użytkownika, gdy łączysz się przez SSH, ale SSH można skonfigurować tak, aby wymuszał określone polecenie. Polecenie jest wymuszone dla dowolnego połączenia SSH, w tym SFTP, dlatego możesz mieć możliwość wymuszenia żądanego polecenia.
Polecenie wymuszenia można skonfigurować za pomocą
ForceCommand
słowa kluczowego. Zsshd_config(5)
instrukcji:Możesz więc wymusić ograniczoną komendę, której chcesz użyć
ForceCommand <your command>
. Na przykład:Przykład
W moim przypadku, w którym chcę dać dostęp do git, potrzebuję tylko użytkownika
git-shell
. To jest sekcja, która wyłącza SFTP dla moich użytkowników git, wraz z kilkoma opcjami bezpieczeństwa:źródło