W Ubuntu 11.10 stwierdziłem, że mogę blokować polecenia ssh, wysyłane z i bez -T oraz blokować kopiowanie scp, jednocześnie pozwalając na przekazywanie portów.
W szczególności mam serwer redis na "somehost" powiązany z localhost: 6379, który chcę bezpiecznie udostępniać przez tunele ssh do innych hostów, które mają plik klucza i ssh ssh za pomocą:
$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost
Spowoduje to, że serwer redis, „localhost”, port 6379 na „somehost”, pojawi się lokalnie na hoście wykonującym polecenie ssh, przemapowany na port „localhost” 16379.
Na zdalnym „jakimś hoście” Oto czego użyłem do autoryzacji kluczy:
cat .ssh/authorized_keys (portions redacted)
no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost
No-pty wyzwala większość prób ssh, które chcą otworzyć terminal.
Zezwolenie otwarte wyjaśnia, które porty mogą być przekierowywane, w tym przypadku port 6379 jest portem serwera redis, który chciałem przekierować.
Polecenie = "/ bin / echo do-not-send-commands" odbija echo "do-not-send-commands", jeśli komuś lub czemuś udało się wysłać polecenia do hosta przez ssh -T lub w inny sposób.
Z najnowszego Ubuntu man sshd
, Authorized_keys / command jest opisane w następujący sposób:
command = "polecenie" Określa, że polecenie jest wykonywane zawsze, gdy ten klucz jest używany do uwierzytelniania. Polecenie podane przez użytkownika (jeśli istnieje) jest ignorowane.
Próby użycia bezpiecznego kopiowania plików scp również kończą się niepowodzeniem z echem „nie wysyłaj-polecenia”. Odkryłem, że sftp również nie działa w tej konfiguracji.
Myślę, że sugestia powłoki ograniczonej, przedstawiona w niektórych poprzednich odpowiedziach, jest również dobrym pomysłem. Zgadzam się również, że wszystko, co tu wyszczególniono, można ustalić czytając „man sshd” i wyszukując w nim „author_keys”
no-pty
nie pozwala na otwarcie widoku interaktywnego, nie robi nic, aby uniemożliwić wykonanie polecenia, więc użytkownik może edytowaćauthorized_keys
plik, jeśli ma dostęp za pomocą czegoś podobnegossh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
.~user/.ssh/authorized_keys
byłby własnościąuser
iuser
zarządzałby autoryzowanymi kluczami używanymi do uzyskiwania dostępu do konta. SSH jest wybredny, jeśli chodzi o uprawnienia i może narzucać oczekiwania~/.ssh/
i zawartość. Zrobiłemsudo chown root: .ssh/authorized_keys
i wygląda na to, że nie mogę się zalogować, ale wiem z doświadczenia, że użytkownik nie musi posiadać tego pliku -root
może nim zarządzać, jeśli wolisz.Prawdopodobnie będziesz chciał ustawić powłokę użytkownika na powłokę z ograniczeniami . Usuń ustawienie zmiennej PATH w ~ / .bashrc lub ~ / .bash_profile użytkownika, a użytkownik nie będzie mógł wykonywać żadnych poleceń. Później, jeśli zdecydujesz, że chcesz zezwolić użytkownikowi (użytkownikom) na wykonywanie ograniczonego zestawu poleceń, na przykład
less
lubtail
na przykład, możesz skopiować dozwolone polecenia do oddzielnego katalogu (takiego jak/home/restricted-commands
) i zaktualizować ścieżkę PATH, aby wskazywała na ten katalog.źródło
ssh use@host "/bin/bash"
, prawda?user@host
ma wysypkę jako powłokę. Zobacz The Restricted Shell/bin/bash
nie powiedzie się, ponieważ zawiera ukośniki.less
jest prawdopodobnie złym pomysłem, ponieważ stamtąd można uciec do nieograniczonej skorupy za pomocą!/bin/bash
. Zobacz pen-testing.sans.org/blog/2012/06/06/ ... po inne przykłady. Dlatego zezwalanie na poszczególne polecenia powinno być wykonywane bardzo, bardzo ostrożnie, jeśli w ogóle.Oprócz opcji authorised_keys, takiej jak no-X11-forwarding, jest dokładnie taka, o którą prosisz: allowopen = "host: port". Korzystając z tej opcji, użytkownik może skonfigurować tunel tylko do określonego hosta i portu.
Aby uzyskać szczegółowe informacje na temat formatu pliku AUTHORIZED_KEYS, zobacz man sshd.
źródło
no-pty
nie ogranicza również dostępu do powłoki, nadal będziesz mieć dostęp do powłoki, po prostu nie pokaże ci zachęty; Nadal możesz wydawać polecenia i dobrze widzieć wynik. Potrzebujesz tejcommand="..."
opcji, jeśli chcesz ograniczyć dostęp do powłoki z.ssh/authorized_keys
.Moim rozwiązaniem jest zapewnienie użytkownikowi, który może tylko tunelować, bez interaktywnej powłoki , aby ustawić tę powłokę w / etc / passwd na / usr / bin / tunnel_shell .
Po prostu utwórz plik wykonywalny / usr / bin / tunnel_shell z nieskończoną pętlą .
W pełni wyjaśnione tutaj: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
źródło
tunnel_shell
, będzieszshell -> /bin/bash tunnel_shell
mógł oczywiście uciec z powrotem do powłoki, ale jeśli ustawisztunnel_shell
jako powłokę użytkownika, będziesz mieć tylko/bin/bash tunnel_shell
bieg, bez powłoki, do której można uciec o ile widzę. Przetestowałem to i nie mogłem uciec z ctrl-z. Jeśli nie spróbować i mógł uciec, można zakładać instalację? Podobnie, jeśli znasz jakąkolwiek dokumentację, która mówi, że powinno to działać w ten sposób, czy możesz to opublikować?Chciałbyś, aby wiersz w pliku authorised_keys wyglądał następująco.
źródło
Jeśli chcesz zezwolić na dostęp tylko dla określonego polecenia - takiego jak svn - możesz również określić to polecenie w pliku kluczy autoryzowanych:
Z http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks
źródło
Tutaj masz fajny post, który uznałem za przydatny: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/
Pomysł jest następujący: (z nową zastrzeżoną nazwą użytkownika „sshtunnel”)
Zauważ, że używamy rbash (limited-bash), aby ograniczyć to, co może zrobić użytkownik: użytkownik nie może cd (zmieniać katalogu) i nie może ustawiać żadnych zmiennych środowiskowych.
Następnie edytujemy zmienną env użytkownika PATH
/home/sshtunnel/.profile
na nic - sztuczka, która sprawi, że bash nie znajdzie żadnych poleceń do wykonania:Na koniec nie zezwalamy użytkownikowi na edycję jakichkolwiek plików, ustawiając następujące uprawnienia:
źródło
Zrobiłem program w C, który wygląda następująco:
Ustawiłem powłokę użytkownika z ograniczeniami na ten program.
Nie sądzę, żeby użytkownik z ograniczeniami mógł cokolwiek wykonać, nawet jeśli to robi
ssh server command
, ponieważ polecenia są wykonywane przy użyciu powłoki, a ta powłoka niczego nie wykonuje.źródło
Zobacz ten post na temat uwierzytelniania kluczy publicznych .
Dwie główne rzeczy, o których musisz pamiętać, to:
chmod 700 ~/.ssh
źródło
Wygenerujesz klucz na maszynie użytkownika za pośrednictwem dowolnego używanego przez nich klienta ssh. Na przykład PUTTY ma narzędzie do robienia dokładnie tej rzeczy. Wygeneruje zarówno klucz prywatny, jak i publiczny.
Zawartość wygenerowanego pliku klucza publicznego zostanie umieszczona w pliku Authorized_keys.
Następnie należy upewnić się, że klient ssh jest skonfigurowany do używania klucza prywatnego, który wygenerował klucz publiczny. Jest to dość proste, ale nieco różni się w zależności od używanego klienta.
źródło