Jak wyłączyć sftp dla niektórych użytkowników, ale nadal włącz ssh?

12

Mój projekt wymaga ode mnie wyłączenia sftp dla niektórych użytkowników, ale ci użytkownicy nadal muszą łączyć się przez ssh. Czy ktoś wie, jak to wdrożyć?

Widziałem sugestie dotyczące zmiany pliku w /etc/ssh/sshd_config, ale nie jestem pewien, co zmienić.

Shaobo Wang
źródło
Jedynym sposobem, w jaki mogłem to sobie wyobrazić, byłoby użycie polityki MLS w SELinux i ograniczenie dokładnie tego, do których plików, katalogów i gniazd osoba może uzyskać dostęp, wykonanie itp. Zrobiłbym to w połączeniu z bardzo restrykcyjną polityką iptables, która korzysta z moduł ownerdostępu wychodzącego. Zakłada się, że zostaniesz poddany próbie pióra przez drużynę czerwoną. Gdyby każdy, kto ma dostęp do twojego systemu, zawsze przestrzega zasad i nigdy nie ma złych zamiarów, moje podejście byłoby trudne i nadmiernie złożone.
Aaron

Odpowiedzi:

7

Ogólnie rzecz biorąc, jest to zła praktyka bezpieczeństwa z powodów wymienionych przez innych. Myślę jednak, że celem twojego zadania jest nauczenie cię, że możesz mieć sekcje konfiguracji warunkowej oparte na różnych kryteriach.

Sposobem na to jest użycie Matchbloku warunkowego *.

Match User bob
Subsystem   sftp  /bin/false

Aby uzyskać więcej informacji, i zapoznaj się sshd_config(5)z Matchsekcją Group.

* Jest na to więcej niż jeden sposób.

bahamat
źródło
7
To nie działa dla mnie. Błąd: Dyrektywa „Podsystem” nie jest dozwolona w bloku meczów
chrw
Błędna odpowiedź, ponieważ podsystem nie jest dozwolony w bloku meczów
mikep
6

To nie ma żadnego sensu, to bezpieczeństwo poprzez bezużyteczne zaciemnianie. Każdy użytkownik, który może SSH, będzie mógł przesłać dowolny plik, który będzie mógł odczytać za pośrednictwem sesji SSH. Będziesz także mógł pisać, jeśli masz na to uprawnienia.

Jak na przykład, możesz pobrać / etc / passwd przez ssh, używając następującej metody (nie wymaga sesji scp / sftp): ssh [email protected] "cat / etc / passwd"> passwdcopy

Jeśli możesz to zobaczyć na ekranie przez SSH, możesz łatwo skopiować go jako plik.

Jedynym sposobem, jaki to ma sens, jest posiadanie niestandardowej ograniczonej powłoki, która wymusza politykę bezpieczeństwa.

Jednak odwrotność tego ma sens (wyłączenie powłoki ssh, ale pozostawienie włączonego scp / sftp włączone), ponieważ nie jesteś w stanie wykonywać dowolnych poleceń za pomocą sftp / scp, które możesz wykonać za pomocą powłoki ssh.

PS: Zakładam, że udzielana powłoka SSH jest standardową powłoką, która umożliwia dowolne wykonanie. Jeśli tak nie jest, zobacz: Jak wyłączyć podsystem sftp dla określonego użytkownika lub grupy? i spójrz na opcję konfiguracji podsystemu sshd_config.

Nathan
źródło
4
Match Group nosft
Subsystem   sftp  /bin/false

Wolę do tego użyć grupy.

Jest to przydatne w połączeniu z użytkownikami, którzy mają ograniczone powłoki. Czasami daję dostęp ssh klientowi, aby mógł uzyskać dostęp do zrzutu bazy danych swojej bazy danych, ustawiając powłokę na skrypt, który zrzuca dane. Odcięcie ich od scp również wydaje się być mądrym pomysłem. Nie mają dostępu do uruchamiania, cataby przesłać plik przez ssh.

singlow
źródło
3
Directive 'Subsystem' is not allowed within a Match block
Patryk,
Zła odpowiedź, ponieważ podsystem nie jest dozwolony w bloku meczów
mikep
4

Możliwe jest globalne włączenie SFTP i wyłączenie SFTP tylko dla niektórych użytkownikó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 tylko wtedy, gdy chcesz dać dostęp do określonego programu.

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.

Pasujący

Aby dopasować zestaw użytkowników, możesz skonfigurować SSH za pomocą Matchsłowa kluczowego. Z sshd_config(5)instrukcji:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

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 otrzymujesz 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ą ForceCommandsłowa kluczowego. Z sshd_config(5)instrukcji:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Możesz więc wymusić ograniczoną komendę, której chcesz użyć ForceCommand <your command>. Na przykład:

Match User kim
        ForceCommand echo 'successful login man, congrats'

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:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no
aude
źródło
1
Nie odpowiedział na pytanie PO, ale to było bardzo pomocne dla mnie, aby osiągnąć to, co chcę osiągnąć w moim przypadku użytkowej
Kidburla
Nie zgadzam się Pytanie OP brzmi: „Jak wyłączyć sftp dla niektórych użytkowników, ale zachować włączoną funkcję ssh?”, A ta odpowiedź wyjaśnia jeden ze sposobów, aby to zrobić. Cieszę się, że i tak ci się przydało!
aude
Według własnego uznania „nie działa, jeśli chcesz, aby użytkownik otrzymywał regularne polecenia powłoki”. więc nie spełnia to wymogu OP „utrzymywania włączonego ssh”
Kidburla,
Trafne spostrzeżenie. Myślę, że pogodziłem się z tym rozwiązaniem, ponieważ „Nie ma to również sensu, ponieważ można obejść większość rzeczy, jeśli masz dostęp do powłoki”. Ale nie znalazłem sposobu, by dokładnie zapytać OP, zgadzam się teraz.
aude
Oto pełniejsza wersja tej odpowiedzi: serverfault.com/a/817482
aude
1
Match User bob
MaxSessions 0

Testowane i działające na CentOS 6.6. Zauważ, że podsystem nie jest dozwolony z dopasowaniem przynajmniej w nowszych wersjach CentOS. Strona podręcznika dla sshd_config zawiera listę ograniczonych słów kluczowych, które są dozwolone z warunkiem dopasowania.

Jeff
źródło
0

Możesz spojrzeć na scponly, aby zrobić odwrotnie, zezwalaj tylko na scp / sftp, ale bez dostępu do powłoki.

Zgadzam się z @Nathan powyżej, to nie ma większego sensu. Jeśli nie możesz tego zrobić, spróbuj edytować plik / etc / ssh / sshd_config i usunąć / skomentować następujący wiersz:

Podsystem sftp / usr / libexec / openssh / sftp-server

dmourati
źródło
0

nie należy podawać katalogu domowego użytkownika

usermod username -d /bin/false

Zmień Podsystem sftp / usr / libexec / openssh / sftp-server w pliku / etc / ssh / sshd_config na Podsystem sftp / dev / null / usr / libexec / openssh / sftp-server

Następnie uruchom ponownie ssh

service ssh restart

działa dla mnie, debian.

Yusufmm
źródło
-2

W ~/authorized_keykonfiguracji klucza użytkownika wykonaj następujące czynności:

command="/bin/bash" ssh-rsa AAAAB3Nz.........
Kazek
źródło