Zezwalaj SCP, ale nie faktyczne logowanie przy użyciu SSH
62
Czy istnieje sposób skonfigurowania użytkownika na komputerze z systemem Linux (w tym przypadku Centos 5.2), aby mógł używać scp do pobierania plików, ale nie może zalogować się do serwera za pomocą SSH?
... i edytuj, /etc/rssh.confaby skonfigurować powłokę rssh - szczególnie allowscplinię odkomentowania , aby umożliwić dostęp SCP wszystkim użytkownikom rssh.
(Możesz także użyć chroot, aby zatrzymać użytkowników w ich domach, ale to inna historia).
to niesamowite - szukałem też czegoś takiego od dłuższego czasu
ostrzega
6
pomysł za rssh jest fajny, ale iirc rssh nie był cudem bezpieczeństwa pod względem programowania. Proste google na „rssh exploit” daje więcej wyników, niż jestem w stanie ...
Może być konieczne użycie ps do celu, aby ustawić właściwe ustawienia poleceń.
PS: Jeśli uruchomisz testowe polecenie scp z „-v”, zobaczysz coś takiego
debug1: Sending command: scp -v -t myfile.txt
Zauważysz, że „-t” jest nieudokumentowaną opcją scp, używaną przez program na drugim końcu. To daje wyobrażenie o tym, co należy umieścić w uprawnionych kluczach.
Co powstrzyma użytkownika przed przeszukaniem pliku uprawnionych kluczy? Czy można ograniczyć fakt, że użytkownik nie jest właścicielem?
Dan
1
@ Dan - Powinno być możliwe ustawienie uprawnień tylko do odczytu dla pliku autoryzowanych_kluczy, tj. chmod 400 ~/.ssh/authorized_keys.
Roger Dueck,
Powinieneś także zrobić ~/.bashrc(i cokolwiek innego, co Bash wykonuje) i ~/.ssh/rctylko do odczytu. Ale jeśli złośliwy użytkownik ma dostęp do rsync lub sftp, nadal może go usunąć ~/.bashrci przesłać nowy. Ponieważ jest trudny do ochrony, odradzam tę metodę ( command="...").
pkt
31
Jestem trochę spóźniony na imprezę, jednak zasugeruję, abyś przyjrzał się ForceCommanddyrektywie OpenSSH.
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
To prawda, że jest to SFTP, a nie SCP, ale osiąga ten sam cel, bezpieczniej niż w przypadku ograniczonej powłoki. Dodatkowo możesz chrootować użytkownika, jeśli chcesz.
dodaj sekcję „ chrootDirectory %hi” AllowTcpForwarding nopo meczu, aby zmusić użytkowników sftponly do chrootowania w swoim domu. należy pamiętać, że mecz powinien (musi!) być ostatnią sekcją konfiguracji ssh, a opcje to opcje tylko dla dopasowanych użytkowników
higuita
4
ForceCommand internal-sftp -u 0077 -d /uploaddirmoże jeszcze bardziej je zahartować, wymuszając umask w katalogu do przesyłania. W połączeniu z „ChrootDirectory” tworzy bardzo kontrolowane, izolowane środowisko przesyłania. Uwaga dodatkowa: jeśli chcesz, aby działały, domyślny katalog i umask muszą być ustawione w ForceCommand, a nie w Subsystemdyrektywie.
Jest to ograniczona powłoka, która pozwala użytkownikom robić tak, jak to brzmi, pliki SCP na serwerze, ale nie logować się. Informacje i pliki do pobrania kodu źródłowego dla oprogramowania są dostępne tutaj, a wstępnie skompilowane pakiety RPM są dostępne za pośrednictwem Repozytoria EPEL YUM .
Po zainstalowaniu będziesz musiał skonfigurować każde konto użytkownika, do którego chcesz ograniczyć dostęp, aby korzystać z nowo zainstalowanej ograniczonej powłoki. Możesz to zrobić ręcznie za pomocą / etc / passwd lub użyć następującego polecenia: usermod -s /usr/bin/scponly USERNAME
Bardzo późno na imprezę, ale po prostu ustaw powłokę użytkownika git na / usr / bin / git-shell. To ograniczona powłoka, która nie pozwala na interaktywne logowanie. Nadal możesz zalogować się do użytkownika za pomocą polecenia „su -s / bin / bash git” lub dowolnej innej nazwy użytkownika git.
Używamy powłoki psudo o nazwie scponly na naszych bezpiecznych serwerach ftp dla użytkowników, którzy chcą tylko móc skanować pliki, ale nie logować się.
#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
'rsync'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Access Denied"
;;
esac
Wydaje mi się, że prawdopodobnie nadal musisz chronić plik autoryzowanych_kluczy użytkownika, ale moim celem było posiadanie klucza bez hasła, którego mógłbym użyć do tworzenia kopii zapasowych, bez konieczności tworzenia nowego użytkownika, i aby klucz nie dawał powłoki (ok, łatwo)
To całkiem fajne - ale wyobrażam sobie, że można to obalić, wydając polecenie, które wykonuje scp, a następnie uruchom skrypt!
davidgo,
@davidgo przygotowując $ SSH_ORIGINAL_COMMAND z exec może rozwiązać tę lukę, zakładając, że scp i rsync nie próbują uruchamiać wielu programów (w takim przypadku to by to zepsuło)
Phil
Również należy zrobić ~/.ssh/authorized_keys, ~/.bashrc(i co tam jeszcze Bash wykonuje) i ~/.ssh/rctylko do odczytu dla użytkownika. Ale jeśli złośliwy użytkownik ma dostęp do rsync lub sftp, nadal może go usunąć ~/.bashrci przesłać nowy. Ponieważ jest trudny do ochrony, odradzam tę metodę ( command="...").
pkt
1
@pts możesz sprawić, że zarówno pliki rc, jak i zawierające je katalogi będą własnością kogoś innego niż użytkownik (nikt?) i nie będą zapisywane przez użytkownika. Ale w tym momencie lepiej użyć czegoś dedykowanego, takiego jak rssh. Wow, właśnie zdałem sobie sprawę, że to moja odpowiedź! To jest stare! Ha ha!
Phil
Nie zapominaj, że scp -S ... i rsync -e ... pozwalają użytkownikowi wykonywać dowolne polecenia. Więc powinieneś sprawdzić argumenty w $ SSH_ORIGINAL_COMMAND przed jego wykonaniem. Więcej informacji tutaj: exploit-db.com/exploits/24795
pts
1
Zmień powłokę logowania użytkownika na coś ograniczającego, co pozwala użytkownikowi uruchamiać tylko scp , sftp-server i rsync , a także sprawdza, czy niebezpieczne argumenty nie są dozwolone (np. Scp -S ... i rsync -e .. . są niebezpieczne, zobacz tutaj: http://exploit-db.com/exploits/24795 ). Przykład takiej restrykcyjnej powłoki logowania:
Możesz uruchomić jeden z nich w chroot lub w innym ograniczonym środowisku (np. Nsjail w systemie Linux), aby wyłączyć dostęp do sieci i ułatwić (na białej liście) kontrolę, które katalogi mogą być odczytywane i / lub zapisywane.
Nie polecam korzystania command="..."z ~/.ssh/authorized_keys, bo bez starannej dodatkowej ochrony (takich jak chmod -R u-w ~na użytkownika) złośliwy użytkownik może przesłać nową wersję ~/.ssh/authorized_keys, ~/.ssh/rclub ~/.bashrc, a zatem może zawierać i wykonywanie dowolnych poleceń.
To nie jest najbardziej wdzięczne rozwiązanie, ale możesz wrzucić coś takiego do .bashrc użytkowników
if [ "$TERM" != "dumb" ]; then
exit
fi
Przekonałem się, że użytkownicy SCP otrzymują TERM „głupi”, a inni zwykle otrzymują vt100.
Wyobrażam sobie, że użytkownik może prawdopodobnie przeskanować nowy plik .bashrc, co sprawia, że nie jest to najlepsze rozwiązanie, ale w przypadku szybkiego i brudnego rozwiązania to zadziała
Zdecydowanie odradzam proponowane rozwiązanie, ponieważ złośliwy użytkownik jest zbyt łatwy do obejścia (np. Poprzez przesłanie innego ~/.bashrc). Jest także niestabilny w tym sensie, że być może nowsze wersje OpenSSH ustawiłyby TERMzmienną inaczej, lub niektóre ustawienia konfiguracji sshd mogą mieć wpływ TERM.
Odpowiedzi:
Powłoka rssh ( http://pizzashack.org/rssh/ ) została zaprojektowana właśnie do tego celu.
Ponieważ RHEL / CentOS 5.2 nie zawiera pakietu dla rssh, możesz zajrzeć tutaj, aby uzyskać RPM: http://dag.wieers.com/rpm/packages/rssh/
Aby go użyć, po prostu ustaw go jako powłokę dla nowego użytkownika:
.. lub zmień powłokę na istniejącą taką jak ta:
... i edytuj,
/etc/rssh.conf
aby skonfigurować powłokę rssh - szczególnieallowscp
linię odkomentowania , aby umożliwić dostęp SCP wszystkim użytkownikom rssh.(Możesz także użyć chroot, aby zatrzymać użytkowników w ich domach, ale to inna historia).
źródło
Spóźniłem się z tym, ale możesz użyć kluczy ssh i podać dokładne polecenie dozwolone w ich pliku ~ / .ssh / Author_keys, np.
Może być konieczne użycie ps do celu, aby ustawić właściwe ustawienia poleceń.
PS: Jeśli uruchomisz testowe polecenie scp z „-v”, zobaczysz coś takiego
Zauważysz, że „-t” jest nieudokumentowaną opcją scp, używaną przez program na drugim końcu. To daje wyobrażenie o tym, co należy umieścić w uprawnionych kluczach.
EDYCJA: Możesz znaleźć więcej informacji (z kilkoma linkami) w tym pytaniu StackOverflow .
Oto działający przykład tego dla użytkownika o nazwie
backup_user
po stronie serwera.~backup_user/.ssh/authorized_keys
treść po stronie serwera (z pewnymi dodatkowymi ograniczeniami bezpieczeństwa):Utwórz link w ~ backup_user /, który prowadzi do katalogu, w którym zawartość powinna być dostępna.
Teraz po stronie klienta powinno działać następujące polecenie:
Co robi to polecenie:
-v
zarówno z pliku polecenia, jak i pliku autoryzowanych_kluczy)-r
zarówno plik polecenia, jak i plik autoryzowanych_kluczy, jeśli nie chcesz tworzyć kopii rekurencyjnej)-P 2222
z polecenia)-i .ssh/id_rsa_key_file
path/to/data
zostanie skopiowana do/path/to/directory/with/accessible/content/
Aby utworzyć kopię pliku (lub kilku) z serwera na klienta, należy utworzyć skrypt powłoki, który obsługuje to w sposób opisany tutaj
źródło
chmod 400 ~/.ssh/authorized_keys
.~/.bashrc
(i cokolwiek innego, co Bash wykonuje) i~/.ssh/rc
tylko do odczytu. Ale jeśli złośliwy użytkownik ma dostęp do rsync lub sftp, nadal może go usunąć~/.bashrc
i przesłać nowy. Ponieważ jest trudny do ochrony, odradzam tę metodę (command="..."
).Jestem trochę spóźniony na imprezę, jednak zasugeruję, abyś przyjrzał się
ForceCommand
dyrektywie OpenSSH.To prawda, że jest to SFTP, a nie SCP, ale osiąga ten sam cel, bezpieczniej niż w przypadku ograniczonej powłoki. Dodatkowo możesz chrootować użytkownika, jeśli chcesz.
źródło
chrootDirectory %h
i”AllowTcpForwarding no
po meczu, aby zmusić użytkowników sftponly do chrootowania w swoim domu. należy pamiętać, że mecz powinien (musi!) być ostatnią sekcją konfiguracji ssh, a opcje to opcje tylko dla dopasowanych użytkownikówForceCommand internal-sftp -u 0077 -d /uploaddir
może jeszcze bardziej je zahartować, wymuszając umask w katalogu do przesyłania. W połączeniu z „ChrootDirectory” tworzy bardzo kontrolowane, izolowane środowisko przesyłania. Uwaga dodatkowa: jeśli chcesz, aby działały, domyślny katalog i umask muszą być ustawione wForceCommand
, a nie wSubsystem
dyrektywie.Poleciłbym używać scponly.
Jest to ograniczona powłoka, która pozwala użytkownikom robić tak, jak to brzmi, pliki SCP na serwerze, ale nie logować się. Informacje i pliki do pobrania kodu źródłowego dla oprogramowania są dostępne tutaj, a wstępnie skompilowane pakiety RPM są dostępne za pośrednictwem Repozytoria EPEL YUM .
Po zainstalowaniu będziesz musiał skonfigurować każde konto użytkownika, do którego chcesz ograniczyć dostęp, aby korzystać z nowo zainstalowanej ograniczonej powłoki. Możesz to zrobić ręcznie za pomocą / etc / passwd lub użyć następującego polecenia:
usermod -s /usr/bin/scponly USERNAME
źródło
scponly
jest specjalnie zaprojektowany do tego celu.Używam do tego MySecureShell. Możesz także skonfigurować inne ograniczenia.
https://github.com/mysecureshell/mysecureshell
Ogranicza połączenia tylko z SFTP / SCP. Brak dostępu do powłoki.
źródło
Bardzo późno na imprezę, ale po prostu ustaw powłokę użytkownika git na / usr / bin / git-shell. To ograniczona powłoka, która nie pozwala na interaktywne logowanie. Nadal możesz zalogować się do użytkownika za pomocą polecenia „su -s / bin / bash git” lub dowolnej innej nazwy użytkownika git.
źródło
Używamy powłoki psudo o nazwie scponly na naszych bezpiecznych serwerach ftp dla użytkowników, którzy chcą tylko móc skanować pliki, ale nie logować się.
źródło
Znalazłem dobry sposób na użycie funkcji command = "..." w pliku autoryzowanych_kluczy. (Sugerowane mi przez tę stronę )
Polecenie, które uruchomisz, to polecenie sprawdzające argumenty rozpoczynające się od scp (i rsync).
Oto plik autoryzowanych_kluczy:
Oto zawartość pliku remote-cmd.sh:
Wydaje mi się, że prawdopodobnie nadal musisz chronić plik autoryzowanych_kluczy użytkownika, ale moim celem było posiadanie klucza bez hasła, którego mógłbym użyć do tworzenia kopii zapasowych, bez konieczności tworzenia nowego użytkownika, i aby klucz nie dawał powłoki (ok, łatwo)
źródło
~/.ssh/authorized_keys
,~/.bashrc
(i co tam jeszcze Bash wykonuje) i~/.ssh/rc
tylko do odczytu dla użytkownika. Ale jeśli złośliwy użytkownik ma dostęp do rsync lub sftp, nadal może go usunąć~/.bashrc
i przesłać nowy. Ponieważ jest trudny do ochrony, odradzam tę metodę (command="..."
).Zmień powłokę logowania użytkownika na coś ograniczającego, co pozwala użytkownikowi uruchamiać tylko scp , sftp-server i rsync , a także sprawdza, czy niebezpieczne argumenty nie są dozwolone (np. Scp -S ... i rsync -e .. . są niebezpieczne, zobacz tutaj: http://exploit-db.com/exploits/24795 ). Przykład takiej restrykcyjnej powłoki logowania:
Możesz uruchomić jeden z nich w chroot lub w innym ograniczonym środowisku (np. Nsjail w systemie Linux), aby wyłączyć dostęp do sieci i ułatwić (na białej liście) kontrolę, które katalogi mogą być odczytywane i / lub zapisywane.
Nie polecam korzystania
command="..."
z~/.ssh/authorized_keys
, bo bez starannej dodatkowej ochrony (takich jakchmod -R u-w ~
na użytkownika) złośliwy użytkownik może przesłać nową wersję~/.ssh/authorized_keys
,~/.ssh/rc
lub~/.bashrc
, a zatem może zawierać i wykonywanie dowolnych poleceń.źródło
To nie jest najbardziej wdzięczne rozwiązanie, ale możesz wrzucić coś takiego do .bashrc użytkowników
Przekonałem się, że użytkownicy SCP otrzymują TERM „głupi”, a inni zwykle otrzymują vt100.
Wyobrażam sobie, że użytkownik może prawdopodobnie przeskanować nowy plik .bashrc, co sprawia, że nie jest to najlepsze rozwiązanie, ale w przypadku szybkiego i brudnego rozwiązania to zadziała
źródło
~/.bashrc
). Jest także niestabilny w tym sensie, że być może nowsze wersje OpenSSH ustawiłybyTERM
zmienną inaczej, lub niektóre ustawienia konfiguracji sshd mogą mieć wpływTERM
.ssh -o SetEnv TERM=dumb yourserver bash
??