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_config
file di configurazione. NOTA: Ciò limiterà l'utente, backup
a 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_config
file. 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_config
file.
# 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 chmod
esso per accedere in scrittura. Esistono molte soluzioni possibili, come mettere i ~/.ssh/authorized_keys
file 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_keys
file. 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_config
per tutti i dettagli su questo interruttore.
Limitare la shell dell'utente
Per entrambe le soluzioni sopra, probabilmente vorrai bloccare l' backup
utente limitando anche la shell di questo utente nel /etc/passwd
file. 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/nologin
può anche essere usato se si sceglie di utilizzare la funzione chroot sshd_config
come indicato nel n. 1 sopra. Tuttavia, se si sceglie di utilizzare il metodo descritto in # 2 , è probabile che sia necessario utilizzare scponly
o 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_keys
file in questo modo:
command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
L' backup
utente 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