Aggiunta di un utente che può eseguire solo script in remoto


14

Vorrei creare un utente che può fare solo una cosa: tramite ssh specificare uno script (e argomenti della riga di comando per lo script) che risiede in una cartella particolare (ai fini di questa domanda chiamiamolo /local/remote_only_scripts/foo) e fare eseguire quello script e restituisce il suo output.

Per essere chiari alcuni esempi di cose non voglio che l'utente sia in grado di fare:

  • Accedere localmente all'account. L'applicazione di accesso è /bin/login. Non è uno script nella /local/remote_only_scripts/foocartella, quindi non deve essere chiamato dall'utente.
  • Accedi in remoto all'account. Anche in questo caso il login (è quello che viene chiamato da ssh?) Non è uno script nella relativa cartella.
  • Elencare il contenuto della directory. È dentro /bin/ls. Non è uno script nella directory appropriata.
  • Modifica un file in quella directory. emacs, vi, gedit molti altri editor non sono script in quella directory.
  • Visualizza il contenuto di un file in quella directory.
  • Eseguire un file in quella directory che non ha il permesso di eseguire.

Si noti che questi sono esempi che ci sono molte altre azioni che non voglio che l'utente sia in grado di fare. Nel considerare un'azione, chiedi "questo viene fatto da uno script in /local/remote_only_scripts/foo?" se la risposta è no l'utente non dovrebbe essere in grado di farlo. Se la risposta è sì, l'utente dovrebbe essere in grado di farlo.

PS: Vorrei chiarire cosa intendo per "aggiungere un utente". Non intendo aggiungere un utente ad alcuni sottosistemi ssh. Piuttosto intendo aggiungere un utente al sistema informatico. Quindi, per esempio, ho un sistema che esegue debian stable, chiamalo con il suo indirizzo, www.hg.bar.com. Voglio aggiungere un utente (tramite kuser, users-admin o useradd o in qualche modo simile) chiamarlo hg_guest. hg_guest non può accedere localmente o fare nessuna delle cose nell'elenco sopra. Tutto ciò che hg_guest può fare è eseguire gli script "da remoto". Ho detto che dovrebbe essere in grado di farlo tramite ssh, ma pensandoci ora, forse consentirgli di usare ssh potrebbe consentirgli di accedere localmente, quindi potrebbe essere necessario qualche altro meccanismo.

Risposte:


12

C'è un'opzione di comando nel file authorized_keys. Questa opzione sembra fare esattamente quello che vuoi.

Nota che non è un chroot o una shell limitata. Permette di eseguire solo quei comandi tramite ssh. Con il tuo esempio, sarebbe:

ssh somehost /local/remote_only_scripts/foo

Per questo file authorized_keys:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

C'è un sacco di modo se non vuoi che il tuo utente sia in grado di accedere localmente. Puoi:

  • imposta semplicemente la sua shell su / bin / false (forse avrai bisogno di / bin / true poiché ssh ha bisogno di un login valido)
  • blocca la sua password, vedi passwd -l

EDIT : aggiunte ulteriori opzioni di restrizione e chiarito come rimuovere l'accesso locale.


Non penso che sia necessario specificare quel comando in ssh sul lato client, è un comando 'forzato' quindi sarà sempre eseguito;) L'utente sul sito remoto necessita ancora di una shell valida definita in / etc / passwd.
jirib,

1
Inoltre command=, no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptysono necessarie le opzioni per limitare realmente l'account.
jofel

Ok. Mi sono svegliato nel cuore della notte e ho deciso di controllare le risposte. Poiché sono assonnato, non assimilerò l'intera risposta, ma chiederò qualcosa che mi lascia confuso. In che modo ciò impedisce a hg_quest di accedere da un tty?
HandyGandy

@HandyGandy Questa è la parte più semplice. Ho aggiunto 2 modi per farlo, ma penso che ce ne siano altri
Coren,

0

Prova questo come shell di login per l'utente:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Probabilmente vorrai anche avere questo nel authorized_keysfile esplicitamente come nella risposta di Coren; ma sostituisci '... / pippo; con il programma qui. Che impedirà comandi da SSH come sftp, scpe ssh hostname command.


Se vuoi solo che l'utente sia in grado di eseguire i comandi dalla tua directory (e non ce ne sono troppi), potresti prendere "prog" dalla lettura sopra e usare un'istruzione select per offrire un menu di testo di scelte di quei programmi e quindi fare la lettura per gli argomenti. Lo testerei anche per assicurarmi cosa succede se si digita un gruppo di Ctrl-C in vari punti dello script. Potresti volere anche un comando trap.
Joe

0

Nel caso in cui hanno solo bisogno di accedere a uno script, questo funziona davvero bene per me. Aggiungi l'utente e modifica la shell predefinita nel percorso dello script. Quando si connettono tramite SSH, eseguirà lo script e chiuderà la sessione.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

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.