Opzione comando SSH authorized_keys: più comandi?


17

Authorized_keys ha un'opzione command = "..." che limita una chiave a un singolo comando. C'è un modo per limitare una chiave a più comandi? Ad esempio avendo una regex lì o modificando qualche altro file di configurazione?

Risposte:


9

No. Non è un comando "consentito", ma un comando "forzato" (come opzione ForceCommand ).

L'unica possibilità è usare tasti diversi per comandi diversi o leggere parametri da stdin.


27

Puoi avere un solo comando per tasto, perché il comando è "forzato".

Ma puoi usare uno script wrapper. Il comando chiamato ottiene la riga di comando originale come variabile di ambiente $SSH_ORIGINAL_COMMAND, che può valutare.

Ad esempio, inseriscilo in ~/.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

Quindi fare riferimento in ~/.ssh/authorized_keyscon

command="/home/user/.ssh/allowed-commands.sh",…

1
Utile. Potrebbe valere la pena chiarire che è sshd stesso che aggiunge SSH_ORIGINAL_COMMAND(per man sshd) in modo che sia disponibile negli script. Anche per dare un esempio di script automatici che consentono l'esecuzione di determinati schemi SSH_ORIGINAL_COMMAND. Vedi anche unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight

7

Nel grande SSH, The Secure Shell: The Definitive Guide book di O'Reilly, nel capitolo otto, c'è un bell'esempio dato usando una sceneggiatura come la seguente:

#!/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

Usando questo nel tuo .authorized_keysfile come:

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

... ti dà questo quando fai ssh:

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

Ma tale script in fondo le pause scp, sftpe tutte le altre cose che potrebbe risultare utile un giorno.
Jakuje,

3
@Jakuje Non è valido per l' commandopzione in generale?
gf_

1

Altri approcci usano ad esempio una shell limitata per l'utente dato o usano un wrapper che limita i comandi a tutti i file / script trovati in una directory specifica, permettendo così di aumentare l'elenco dei comandi senza cambiare il wrapper.

Un altro articolo descrive uno script generico, che consente anche argomenti della riga di comando ai comandi consentiti, ma consente di bloccarli con regole espresse come espressioni regolari.

Questo esempio sarebbe espresso nel modo seguente:

command="only systemctl shutdown"

E un .onlyrulesfile verrebbe creato con questo contenuto:

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

Il vantaggio di questo approccio "unico" è che non è necessario scrivere singoli script per ciascun utente e situazione.


Il problema con la modifica della shell è che si applicherà a tutti gli accessi, anche quelli con una chiave che non è destinata a essere limitata. Inoltre, se si esegue solo l'accesso alla shell e non si accede all'amministratore, non è possibile modificare la shell configurata come desiderato. Ma puoi ancora modificare il tuo file authorized_keys.
Kasperd,

Puoi usare una "shell limitata" comeForcedCommand
Georg Lehner

Mi viene in mente, per la situazione in cui l'account in uso è un normale account utente e le azioni richieste sono privilegiate, che si può fare affidamento su sudo per eseguire il controllo e impostare l'opzione di comando authorized_keys su "sudo $ SSH_ORIGINAL_COMMAND"?
Steve Dee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.