Restrinja o backup sem senha com SFTP

11

Preciso executar o backup de um servidor no meu computador usando o Duplicity:

duplicity /etc sftp://[email protected]//home/backup

Antes que isso possa ser feito, preciso permitir acesso sem senha, fazendo o seguinte:

$ ssh-keygen
$ ssh-copy-id [email protected]
$ ssh [email protected]

Minha pergunta é: como restringir o comando apenas a essa transferência SFTP na chave pública gerada?

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

E como estou com um endereço IP dinâmico, como supero o problema de "host conhecido ausente" toda vez que meu IP é alterado?

Pergunta Overflow
fonte
1
"falta de problema com o host conhecido": use a opção StrictHostKeyChecking = no no ssh
Marki
@ Marki, obrigado, definindo isso no ssh_config funciona.
Pergunta estouro

Respostas:

15

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

slm
fonte
Tenha cuidado com os comandos que você permite que o usuário acesse ou o usuário poderá obter um shell completo. Por exemplo, se você der a alguém acesso ao vim, ele poderá facilmente:! / Bin / bash ou:! / Bin / someotherprogram.
26614
@rking - sim, isso não é preciso dizer ... #
slm
Obrigado por me dar uma resposta tão detalhada. A restrição de comando funciona perfeitamente. Mas existem dois problemas. 1) O ip dinâmico refere-se ao meu computador, não ao servidor. Os nomes de host no campo "de" do arquivo allowed_keys apenas restringem o endereço do qual o servidor pode acessar meu computador e não fazem nada para resolver o problema de "host conhecido ausente" no meu computador. 2) Desativar o login do shell para o usuário de backup no meu computador /sbin/nologinimpedirá que o servidor acesse o meu computador com SFTP. Isso eu tentei.
Pergunta estouro
1
Desculpe pela confusão. O servidor S se torna o cliente quando faz a conexão SFTP de back-end com o meu computador C. O problema "host conhecido ausente" ocorre sempre que o servidor S que faz o backup se conecta a um local não listado em seu known_hostsarquivo ssh . Marki forneceu a solução correta em seu comentário. O fromparâmetro no authorized_keysarquivo no meu computador C restringe apenas o local a partir do qual S pode conectar-se a C.
Transbordamento de perguntas
Sim, faça a edição. A propósito, eu sei que isso /sbin/nologinfunciona se eu usar o comando force em internal-sftpvez do /usr/libexec/openssh/sftp-serverque você especificou no certificado. Eu acho que esses são dois subsistemas diferentes. E criar um diretório chroot para o primeiro é muito mais direto.
Pergunta Overflow
0

Shell restrito

Você precisa atribuir um shell restrito como scponly ou rssh.

Quando você usa scp ou sftp, está se conectando ao site remoto pelo ssh e, em seguida, o shell remoto executa um processo scp ou processo sftp. O que você precisa é de um shell restrito que permita apenas que scp ou sftp bloqueiem o login.

rking
fonte