SSH opcja komendy autoryzowanych kluczy: wiele komend?

17

Klawisze autoryzowane mają opcję polecenie = „...”, która ogranicza klucz do pojedynczego polecenia. Czy istnieje sposób ograniczenia klucza do wielu poleceń? Np. Poprzez wyrażenie regularne lub edycję innego pliku konfiguracyjnego?

dkaeae
źródło

Odpowiedzi:

9

Nie. To nie jest polecenie „dozwolone”, ale „wymuszone” (jako opcja ForceCommand ).

Jedyną możliwością jest użycie różnych klawiszy dla różnych poleceń lub odczytanie parametrów z stdin.

Jakuje
źródło
27

Możesz mieć tylko jedno polecenie na klawisz, ponieważ polecenie jest „wymuszone”.

Ale możesz użyć skryptu opakowania. Wywołane polecenie pobiera oryginalny wiersz polecenia jako zmienną środowiskową $SSH_ORIGINAL_COMMAND, którą może ocenić.

Np. Wstaw to ~/.ssh/allowed-commands.sh:

#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

case "$SSH_ORIGINAL_COMMAND" in
    "systemctl restart cups")
        systemctl restart cups
        ;;
    "shutdown -r now")
        shutdown -r now
        ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

Następnie odwołaj się do tego za ~/.ssh/authorized_keyspomocą

command="/home/user/.ssh/allowed-commands.sh",…
hfs
źródło
1
Przydatny. Warto wyjaśnić, że to sam sshd dodaje SSH_ORIGINAL_COMMAND(per man sshd), aby był dostępny w skryptach. Daje również przykład automatycznych skryptów, które pozwalają SSH_ORIGINAL_COMMANDna uruchomienie określonych wzorców . Zobacz także unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight
7

W wielkim SSH, The Secure Shell: The Definitive Guide O'Reilly, w rozdziale ósmym znajduje się ładny przykład z wykorzystaniem skryptu, takiego jak:

#!/bin/sh

/bin/echo "Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit"

/bin/echo "Your choice:"

read ans

while [ "$ans" != "q" ]
do
   case "$ans" in
      1)
         /bin/date
         ;;
      2)
         /usr/bin/who
         ;;
      3)
         /usr/bin/top
         ;;
      q)
         /bin/echo "Goodbye"
         exit 0
         ;;
      *)
         /bin/echo "Invalid choice '$ans': please try again"
         ;;
   esac
   /bin/echo "Your choice:"
   read ans
done
exit 0

Używając tego w swoim .authorized_keyspliku, takich jak:

command="/path/to/your/script.sh" <ssh-key>

... daje to, wykonując ssh:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:
gf_
źródło
Ale taki scenariusz w zasadzie przerwy scp, sftpa wszystkie inne rzeczy, które mogą być użyteczne niektóre dni.
Jakuje
3
@Jakuje Czy to nie dotyczy commandogólnie tej opcji?
gf_
1

Inne podejścia wykorzystują np. Ograniczoną powłokę dla danego użytkownika lub opakowują, która ogranicza polecenia do wszystkich plików / skryptów znalezionych w określonym katalogu, umożliwiając w ten sposób powiększenie listy poleceń bez zmiany opakowania.

W innym artykule opisano ogólny skrypt, który dopuszcza również argumenty wiersza poleceń do dozwolonych poleceń, ale pozwala zablokować je za pomocą reguł wyrażonych jako wyrażenia regularne.

Ten przykład byłby wyrażony w następujący sposób:

command="only systemctl shutdown"

I .onlyrulespliki zostaną wykonane z tego materiału:

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

Zaletą tego podejścia „tylko” jest to, że nie ma potrzeby pisania indywidualnych skryptów dla każdego użytkownika i sytuacji.

Georg Lehner
źródło
Problem ze zmianą powłoki polega na tym, że będzie ona miała zastosowanie do wszystkich loginów, nawet tych z kluczem, który nie jest przeznaczony do ograniczenia. Co więcej, jeśli tylko logujesz się do powłoki i nie masz dostępu administratora, nie możesz po prostu zmienić skonfigurowanej powłoki na cokolwiek chcesz. Ale nadal możesz edytować plik autoryzowanych_kluczy.
kasperd
Możesz użyć „zastrzeżonej powłoki” jakoForcedCommand
Georg Lehner
Przychodzi mi do głowy, że w sytuacji, gdy używane konto jest zwykłym kontem użytkownika, a wymagane działania są uprzywilejowane, że można polegać na sudo w celu sprawdzenia i ustawić opcję komendy autoryzowane klucze na „sudo $ SSH_ORIGINAL_COMMAND”?
Steve Dee