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ć).
your_user $ sudo -Hu ssh_forwarder /bin/bash
ssh_forwarder $ cd ~
ssh_forwarder $ mkdir .ssh
ssh_forwarder $ ( umask 066 && cat > .ssh/authorized_keys ) <<EOF
no-agent-forwarding,no-X11-forwarding,command="read a; exit" ssh-rsa AAAB3NzaC1y....2cD/VN3NtHw== smoser@brickies
EOF
- Wyłącz dostęp do tego konta hasłem.
your_user $ sudo usermod --lock ssh_forwarder
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 =”:
command="f=./.fifo.$$ && mkfifo $f && trap \"rm -f $f\" EXIT && read a <$f && echo $a; exit;"
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:
your_user$ echo GOODBYE | sudo tee ~ssh_forwarder/.fifo.*
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.
sleep 1h; echo You have been here too long. Good bye.
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.