Questão 1
Minha pergunta é: como restringir o comando apenas a essa transferência SFTP na chave pública gerada?
Existem 2 métodos para fazer isso.
1. - Restringindo através do sshd
Este método envolve a configuração do recurso SFTP no seu daemon SSH sshd,. Isso é controlado através do /etc/ssh/sshd_configarquivo de configuração. OBSERVAÇÃO: Isso restringirá o usuário, backupque só pode receber SFTP no servidor.
# /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. - Restringindo por meio de teclas autorizadas
Este método não envolve nenhuma alteração no sshd_configarquivo. Você pode limitar um usuário + uma chave SSH a um único comando através do command=recurso que você já mencionou na sua pergunta. O truque está em qual comando você inclui. Você pode colocar o servidor SFTP nessa command=linha, que tem o mesmo efeito que configurar o servidor SFTP no seu sshd_configarquivo.
# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host
NOTA: se o usuário tiver acesso de gravação ~/.ssh/authorized_keys, ele poderá lê-lo e / ou modificá-lo. Por exemplo, eles poderiam baixá-lo, editá-lo e reenviá-lo, retirando o arquivo commmand=..., concedendo-lhe acesso irrestrito ao comando, incluindo o shell. Se o usuário tiver acesso de gravação ~/.ssh, ele também poderá simplesmente desvincular e recriar o arquivo, ou chmodele para acesso de gravação. Existem muitas soluções possíveis, como guardar os ~/.ssh/authorized_keysarquivos em um local não gravável pelo usuário, como:
Match Group sftponly
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
Questão 2
E como estou com um endereço IP dinâmico, como supero o problema de "host conhecido ausente" toda vez que meu IP é alterado?
Isso é mais complicado, mas possível usando o from=recurso dentro do authorized_keysarquivo também. Aqui estamos limitando o acesso apenas do host somehost.dyndns.org,.
from = "somehost.dyndns.org", comando = "/ usr / libexec / openssh / sftp-server", encaminhamento sem porta, encaminhamento X11, encaminhamento sem agente, sem-pty ssh-dss AAAAC8ghi9ldw == backup @ host
As configurações adicionais após o command=são igualmente importantes, pois limitarão ainda mais o uso da chave SSH.
discriminação de recursos
from='hostname1,hostname2,'' - Restringe o acesso dos padrões de IP ou nome de host especificados
command='command' - Executa o comando especificado após a autenticação
no-pty - Não aloca um pty (não permite logon interativo)
no-port-forwarding - Não permite encaminhamento de porta
no-X11-forwarding - o usuário não poderá remover as GUIs da tela X11
no-agent-forwarding - o usuário não poderá encaminhar esse host para outros hosts internos
Para se livrar da mensagem sobre os "hosts conhecidos ausentes", você pode adicionar esta opção SSH ao cliente quando ele se conectar da seguinte maneira:
$ ssh -o StrictHostKeyChecking=no ....
Consulte a página do manual ssh_configpara obter detalhes completos sobre essa opção.
Restringindo o shell do usuário
Para as duas soluções acima, você provavelmente desejará bloquear o backupusuário limitando também o shell do usuário no /etc/passwdarquivo. Normalmente, você deseja defini-lo como scponly, mas há outras opções para isso também. Veja estas perguntas e respostas da U&L intituladas: " Você precisa de um shell para o SCP? " Para saber como fazer isso.
O uso de /sbin/nologintambém pode ser usado se você optar por usar o recurso chroot, sshd_configconforme descrito no item 1 acima. No entanto, se você optar por usar o método descrito em # 2 , provavelmente precisará usar scponlyou algo mais para o shell do usuário /etc/passwd.
BÔNUS - Estendendo o nº 2 acima
Se você precisar expor um conjunto de comandos para esse usuário, também poderá fazê-lo. Crie um script assim /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
Você então configura o authorized_keysarquivo da seguinte maneira:
command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
O backupusuário pode então executar estes comandos da seguinte maneira:
# 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
Referências