Limitare il backup senza password con SFTP


11

Devo eseguire il backup di un server sul mio computer usando Duplicity:

duplicity /etc sftp://backup@my.dynamic.ip.address//home/backup

Prima di poter eseguire questa operazione, devo consentire l'accesso senza password procedendo come segue:

$ ssh-keygen
$ ssh-copy-id backup@my.dynamic.ip.address
$ ssh backup@my.dynamic.ip.address

La mia domanda è: come posso limitare il comando solo a questo trasferimento SFTP nella chiave pubblica che viene generata?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

E poiché mi trovo su un indirizzo IP dinamico, come posso superare il problema "host noto mancante" ogni volta che il mio IP cambia?



1
"problema host noto mancante": utilizzare StrictHostKeyChecking = nessuna opzione per ssh
Marki

@Marki, grazie, l'impostazione che su ssh_config funziona.
Domanda Overflow del

Risposte:


15

Domanda 1

La mia domanda è: come posso limitare il comando solo a questo trasferimento SFTP nella chiave pubblica che viene generata?

Esistono 2 metodi per farlo.

1. - Limitazione tramite sshd

Questo metodo comporta l'impostazione della funzione SFTP all'interno del tuo demone SSH, sshd. Questo è controllato attraverso il /etc/ssh/sshd_configfile di configurazione. NOTA: Ciò limiterà l'utente, backupa essere autorizzato solo a SFTP nel server.

# /etc/ssh/sshd_config

Subsystem       sftp    internal-sftp

## You want to put only certain users (i.e users who belongs to sftpusers 
## group) in the chroot jail environment. Add the following lines at the end 
## of /etc/ssh/sshd_config

Match User backup
  ForceCommand internal-sftp

2. - Limitazione tramite le chiavi autorizzate

Questo metodo non comporta alcuna modifica al sshd_configfile. Puoi limitare un utente + una chiave SSH a un singolo comando tramite la command=funzione che hai già menzionato nella tua domanda. Il trucco sta nel comando che includi. È possibile inserire il server SFTP in questa command=riga, il che ha lo stesso effetto della configurazione del server SFTP nel sshd_configfile.

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

NOTA: se l'utente ha accesso in scrittura ~/.ssh/authorized_keys, può leggerlo e / o modificarlo. Ad esempio, potrebbero scaricarlo, modificarlo e ricaricarlo rimuovendo il file commmand=..., concedendogli l'accesso al comando senza restrizioni, inclusa la shell. Se l'utente ha accesso in scrittura ~/.ssh, potrebbe anche semplicemente scollegare e ricreare il file o chmodesso per accedere in scrittura. Esistono molte soluzioni possibili, come mettere i ~/.ssh/authorized_keysfile in un posto non scrivibile dall'utente, come con:

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

Domanda 2

E poiché mi trovo su un indirizzo IP dinamico, come posso superare il problema "host noto mancante" ogni volta che il mio IP cambia?

Questo è più complicato ma fattibile utilizzando anche la from=funzione all'interno del authorized_keysfile. Qui stiamo limitando l'accesso dal solo l'host, somehost.dyndns.org.

from = "somehost.dyndns.org", command = "/ usr / libexec / openssh / sftp-server", no-port-forwarding, no-X11-forwarding, no-agent-forwarding, no-pty ssh-dss AAAAC8ghi9ldw == backup @ host

Le impostazioni aggiuntive dopo command=sono ugualmente importanti, poiché limiteranno ulteriormente l'uso della chiave SSH.

suddivisione delle funzionalità

  • from='hostname1,hostname2,'' - Limita l'accesso dall'IP specificato o dai modelli di nomi host
  • command='command' - Esegue il comando specificato dopo l'autenticazione
  • no-pty - Non alloca un pty (non consente l'accesso interattivo)
  • no-port-forwarding - Non consente il port forwarding
  • no-X11-forwarding - l'utente non sarà in grado di rimuovere le GUI X11 di visualizzazione
  • no-agent-forwarding - l'utente non sarà in grado di inoltrare questo host ad altri host interni

Per sbarazzarsi del messaggio sugli "host noti mancanti" è possibile aggiungere questa opzione SSH al client quando si connette in questo modo:

$ ssh -o StrictHostKeyChecking=no ....

Vedi la pagina man, ssh_configper tutti i dettagli su questo interruttore.

Limitare la shell dell'utente

Per entrambe le soluzioni sopra, probabilmente vorrai bloccare l' backuputente limitando anche la shell di questo utente nel /etc/passwdfile. In genere ti consigliamo di impostarlo su scponly, ma ci sono anche altre opzioni per questo. Vedi queste domande e risposte U&L intitolate: " Hai bisogno di una shell per SCP? " Per i modi per farlo.

L'uso di /sbin/nologinpuò anche essere usato se si sceglie di utilizzare la funzione chroot sshd_configcome indicato nel n. 1 sopra. Tuttavia, se si sceglie di utilizzare il metodo descritto in # 2 , è probabile che sia necessario utilizzare scponlyo qualcos'altro per la shell dell'utente /etc/passwd.


BONUS - Estensione n. 2 sopra

Se è necessario esporre un set di comandi per questo utente, è anche possibile farlo. Crea uno script in questo modo /home/backup/commands.sh:

#!/bin/sh

case $SSH_ORIGINAL_COMMAND in
  "diskspace")
    df -h
    ;;
  "dirlist")
    ls -1
    ;;
  "apache_restart")
    /etc/init.d/apache restart
    ;;
  *)
    echo "Unknown command"
esac

Quindi impostare il authorized_keysfile in questo modo:

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

L' backuputente può quindi eseguire questi comandi in questo modo:

# diskspace
$ ssh -q user@remote_host diskspace
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/dev-root   39G  2.2G   35G   6% /

# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql

Riferimenti


Prestare attenzione a quali comandi si consente all'utente di accedere o l'utente potrebbe avere la possibilità di ottenere una shell completa. Ad esempio, se dai a qualcuno l'accesso a vim, potrebbe facilmente:! / Bin / bash o:! / Bin / someotherprogram.
rking

@rking - sì, va da sé ...
slm

Grazie per avermi dato una risposta così dettagliata. La restrizione del comando funziona perfettamente. Ma ci sono due problemi. 1) L'ip dinamico si riferisce al mio computer, non al server. I nomi host nel campo "da" del file authorized_keys limitano solo l'indirizzo da cui il server può accedere al mio computer e non fa nulla per risolvere il problema "host noto mancante" sul mio computer. 2) La disabilitazione dell'accesso alla shell per l'utente di backup sul mio computer /sbin/nologinimpedirà al server di accedere al mio computer con SFTP. Questo ho provato.
Domanda Overflow del

1
Dispiace per la confusione. Il server S diventa client quando esegue la connessione SFTP back-end al mio computer C. Il problema "host noto mancante" si verifica ogni volta che il server S che esegue il backup si connette a una posizione non elencata nel suo known_hostsfile ssh . Marki ha fornito la soluzione corretta nel suo commento. Il fromparametro nel authorized_keysfile sul mio computer C limita solo la posizione dalla quale S può connettersi a C.
Overflow delle domande

Sì, vai avanti per apportare la modifica. A proposito, mi rendo conto che /sbin/nologinfunziona se uso il comando force internal-sftpinvece di quello /usr/libexec/openssh/sftp-serverche hai specificato sul certificato. Immagino che questi siano due sottosistemi diversi. E la creazione di una directory chroot per la prima è molto più semplice.
Domanda Overflow

0

Shell limitato

È necessario assegnare una shell con restrizioni come scponly o rssh.

Quando usi scp o sftp ti stai connettendo al sito remoto tramite ssh e quindi la shell remota esegue un processo scp proccess o sftp. Ciò di cui hai bisogno è una shell limitata che consenta a scp o sftp di bloccare l'accesso.

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.