ændrük zasugerował połączenie odwrotne w celu uzyskania łatwego połączenia SSH z kimś innym (w celu uzyskania pomocy zdalnej). Aby to zadziałało, potrzebny jest dodatkowy użytkownik, aby zaakceptować połączenie. Ten użytkownik musi mieć możliwość przekazania swojego portu przez serwer (serwer działa jako serwer proxy).
Jak utworzyć użytkownika z ograniczonym dostępem, który nie może zrobić nic więcej niż wyżej opisane?
Nowy użytkownik nie może być w stanie:
- wykonać polecenia powłoki
- uzyskiwać dostęp do plików lub przesyłać pliki na serwer
- użyj serwera jako proxy (np. webproxy)
- uzyskać dostęp do lokalnych usług, które w innym przypadku nie byłyby publicznie dostępne z powodu zapory ogniowej
- zabij serwer
Podsumowując, w jaki sposób mogę utworzyć użytkownika SSH z ograniczeniami, który będzie mógł łączyć się tylko z serwerem SSH bez uprawnień, aby można było łączyć się przez to połączenie z jego komputerem?
ssh
security
port-forwarding
Lekensteyn
źródło
źródło
Odpowiedzi:
TL; DR - przejdź do dołu odpowiedzi „Stosowanie ograniczeń”
Dodanie ograniczonego użytkownika składa się z dwóch części: 1. Tworzenie użytkownika 2. Konfigurowanie demona SSH (sshd)
Konfigurowanie sshd
Najlepszym miejscem na zapoznanie się z możliwościami SSH jest przeczytanie powiązanych stron podręcznika:
Gdzie klient SSH może wykonywać działania?
Aby móc coś ograniczyć, musisz poznać funkcje SSH. Przejrzenie stron podręcznika daje:
W sekcji Uwierzytelnianie strony podręcznika sshd (8) :
Opcje ograniczenia funkcji SSH
Pliki i ich opcje zmieniające zachowanie to:
~/.ssh/authorized_keys
- zawiera klucze, które można połączyć, które mogą mieć opcje:command="command"
- Polecenie dostarczone przez użytkownika (jeśli istnieje) jest ignorowane. Pamiętaj, że klient może określić przekazywanie TCP i / lub X11, chyba że jest to wyraźnie zabronione . Zauważ, że ta opcja dotyczy wykonania powłoki, polecenia lub podsystemu.no-agent-forwarding
- Zabrania przekazywania agenta uwierzytelniania, gdy ten klucz jest używany do uwierzytelniania.no-port-forwarding
- Zabrania przekazywania TCP, gdy ten klucz jest używany do uwierzytelnianiano-X11-forwarding
- „Zabrania przekazywania X11, gdy ten klucz jest używany do uwierzytelniania”.permitopen="host:port"
- Ogranicz przekierowywanie lokalnego portu „ssh -L”, tak aby mógł on łączyć się tylko z określonym hostem i portem.~/.ssh/environment
- Ten plik jest wczytywany do środowiska przy logowaniu (jeśli istnieje). Przetwarzanie środowiska jest domyślnie wyłączone i jest kontrolowane za pomocą opcji PermitUserEnvironment~/.ssh/rc
- Zawiera procedury inicjalizacji, które należy uruchomić, zanim katalog osobisty użytkownika stanie się dostępny./etc/ssh/sshd_config
- ogólnosystemowy plik konfiguracyjnyAllowAgentForwarding
- Określa, czy dozwolone jest przekazywanie ssh-agent (1).AllowTcpForwarding
ForceCommand
- „Wymusza wykonanie polecenia określonego przez ForceCommand, ignorując każde polecenie dostarczone przez klienta i ~ / .ssh / rc, jeśli jest obecne. Polecenie jest wywoływane przy użyciu powłoki logowania użytkownika z opcją -c.”GatewayPorts
- "Określa, czy zdalne hosty mogą łączyć się z portami przekierowanymi dla klienta. Domyślnie sshd (8) wiąże przekazywanie portów zdalnych z adresem pętli zwrotnej. Zapobiega to łączeniu się innych portów z portami przekierowanymi. GatewayPorts może być użyty do określenia że sshd powinien umożliwiać zdalne przekierowanie portów na adresy niezwiązane z pętlą zwrotną, umożliwiając w ten sposób łączenie się innych hostów. ”PermitOpen
:PermitTunnel
- Określa, czy dozwolone jest przekazywanie urządzeń tun (4). Domyślnie jest to „nie”X11Forwarding
- Określa, czy dozwolone jest przekazywanie X11. Domyślnie jest to „nie”Stosowanie ograniczeń
Modyfikacja ogólnosystemowego pliku konfiguracyjnego
/etc/ssh/sshd_config
umożliwia zastosowanie konfiguracji, nawet jeśli zastosowano uwierzytelnianie oparte na haśle lub przypadkowe usunięcie ograniczeń~/.ssh/authorized_keys
. Jeśli zmodyfikowałeś globalne ustawienia domyślne, odpowiednio odkomentuj opcje.Teraz dodaj użytkownika:
Opcję tę
ForceCommand
można pominąć, jeśli powłoka jest ustawiona na powłokę inną niż shell, jak/bin/false
(lub/bin/true
), ponieważ/bin/false -c [command]
nic nie zrobi.Teraz klient może połączyć się tylko z portem 62222 na adresie zwrotnym serwera przez SSH (nie będzie nasłuchiwał na publicznym adresie IP)
Wyłączenie
AllowTcpForwarding
uniemożliwiłoby również użycie-R
, a tym samym pokonanie korzystania z takiego ograniczonego konta do przekazywania pojedynczego portu.PermitOpen localhost:62222
zakłada, że port 62222 na serwerze nigdy nie jest używany, ponieważ klient może z radością się z nim połączyć i nasłuchiwać.Jeśli przekazywanie TCP jest dozwolone w konfiguracji ogólnosystemowej i wyłączone uwierzytelnianie oparte na hasłach, możesz również użyć ustawień dla poszczególnych kluczy. Edytuj
~/.ssh/authorized_keys
i dodaj kolejne opcje przedssh-
(ze spacją między opcjami issh-
):Zweryfikować
Aby mieć pewność, że działa zgodnie z oczekiwaniami, należy uruchomić niektóre przypadki testowe. W poniższych poleceniach
host
należy zastąpić rzeczywistym logowaniem, jeśli nie jest ustawione~/.ssh/config
. Za poleceniem znajduje się polecenie, które powinno zostać wykonane na kliencie lub serwerze (jak określono).Wniosek
Lista kontrolna: użytkownik SSH nie powinien:
źródło
useradd
musi być odblokowane. Można to zrobić, zastępując hasło/etc/shadow
gwiazdką (*
) lub ustawiając hasło za pomocąsudo passwd limited-user
.sftp-server
polecenie. Za pomocąForceCommand
tego polecenia nie będzie już wykonywane.from=
opcja wauthorized_keys
. Pozwala ograniczyć użycie klucza do źródeł o określonym adresie IP lub nazwie hosta. Przykładfrom="1.1.1.1"
lubfrom="10.0.0.?,*.example.com"
. Zobacz sekcję „FORMAT PLIKU AUTORYZOWANEGO KLUCZA ” na stronie podręcznika ( linux.die.net/man/8/sshd ), aby uzyskać informacje na temat wszystkich opcji kluczy autoryzowanych.Host * ControlMaster auto
w swoim~/.ssh/config
pliku podczas łączeniassh -N
. Jeśli potrzebujesz, użyjssh -N -o ControlMaster=no
Jestem pewien, że istnieje wiele rozwiązań tego problemu i wiele bardziej niezawodnych niż to, które proponuję. Może to jednak wystarczyć dla twoich potrzeb. Aby to zrobić, zakładam, że użytkownik jest w stanie przeprowadzić uwierzytelnianie oparte na kluczu ssh (kit lub jakikolwiek ssh unix powinien to obsługiwać).
Dodaj użytkownika w normalny sposób („adduser” lub inne narzędzie)
Utwórz użytkowników .ssh dir i .ssh / Author_keys
Teraz jedynym sposobem, w jaki użytkownik może dostać się do twojego systemu, jest dostęp do odpowiedniego klucza ssh, a ssh uruchomi dla nich „/ bin / bash -c 'odczytać'”, bez względu na to, co spróbują uruchomić. „czytaj a” będzie po prostu czytać aż do nowej linii, a następnie powłoka wyjdzie, więc użytkownik musi tylko nacisnąć „enter”, aby zabić połączenie.
Jest wiele innych rzeczy, które możesz zrobić w 'command ='. Zobacz
man authorized_keys
i wyszukaj „polecenie”, aby uzyskać więcej informacji.Jeśli nie podoba ci się fakt, że naciśnięcie Enter zabija połączenie, możesz użyć czegoś takiego jak poniżej dla wpisu „command =”:
To tylko tworzy tymczasowe fifo w katalogu domowym użytkowników, a następnie próbuje je odczytać. Do tego pliku nic nie zapisze, więc zawiesi się ono na czas nieokreślony. Dodatkowo, jeśli chcesz siłą zakończyć połączenie, możesz zrobić coś takiego:
To powinno zużywać bardzo mało zasobów i nic nie powinno się nie udać w tym skrypcie, które nie kończy się na zakończeniu powłoki.
Nie widziałem, jak można pozwolić użytkownikowi na zdalne przekazywanie dalej (
ssh -R
), ale limit (ssh -L
). Być może można by użyć „permopen”. Googling nie był zbyt pomocny. Wydawać by się mogło, że coś takiego jak „bez przekierowania portów, permémoteopen = 10001” byłoby przydatne, aby na to pozwolićssh -R 6901:localhost:6901
.To rozwiązanie. Można to zdecydowanie poprawić, a każde otwarcie zdalnych portów powinno być sprawdzone. Gdyby moim celem było zezwolenie mojej Babci na połączenie się z moją siecią LAN, abym mógł użyć vnc do wyświetlenia jej ekranu, a dostęp do tych kluczy byłby ograniczony do niej, osobiście czułbym się dość bezpiecznie. Gdyby tak było w przypadku przedsiębiorstwa, konieczne byłoby dokładniejsze dochodzenie. Należy pamiętać, że wcale nie żąda powłoki, więc kod „command =” nie jest wykonywany.
ssh -N
Inne, być może bardziej bezpieczne mechanizmy mogą obejmować tworzenie niestandardowej powłoki dla użytkownika, a nawet blokowanie jej za pomocą aparatu.
źródło
ssh
dla-N
opcji. Musi istnieć czystszy sposób na osiągnięcie tego.ssh -N
ogóle nie wykonuje polecenia, nie ma problemu zcommand="something"
zamknięciem sesji.chsh ssh_forwarder -s /bin/false
to wszystko.