Eu quero que um host de backup seja capaz de extrair backups de um host remoto.
O host de backup usa autenticação de chave ssh para autenticar como um usuário restrito no host remoto, esse usuário é restrito ao rsync
comando usando o authorized_key
arquivo.
/etc/sudoers
permite ao usuário executar o rsync como superusuário.
O host de backup deve, logicamente, apenas ser capaz de ler arquivos/copiar arquivos do host remoto, não gravar arquivos/copiar arquivos para o host remoto, pois poderia facilmente comprometer o host remoto substituindo /etc/passwd
ou apenas adulterando os arquivos se estivessem comprometidos em si.
Como posso conseguir isso? Eu já li sobre rrsync
, mas não vi uma opção que permitisse isso.
O
-ro
sinalizador derrsync
garante que o rsync seja chamado com a--sender
opção, que deve, de acordo com arrsync
documentação, garantir que os arquivos só possam ser lidos - no entanto, não consegui encontrar uma fonte autorizada (também conhecida como documentação do rsync) que confirme isso. Em meus testes, foi suficiente para impedir gravações no servidor.Dê uma olhada em authprogs - eu estava usando para um cenário bastante semelhante (backuppc via ssh)
Isso está próximo da necromancia, mas ainda assim encontrei essa questão primeiro e sinto que está incompleta, porque depende de programas externos.
Portanto, no modo pull, do lado do receptor, o modo somente leitura pressupõe confiança. Como método de backup, os comandos acima podem funcionar bem, desde que apenas o cliente configurado corretamente solicite os dados. Se você deseja restringir o que o rsync sobre ssh pode fazer, uma configuração remota
ro
do lado do cliente pode não ser suficiente.Se você tiver acesso ao servidor, os dados estão sendo extraídos do SSH, há alguma configuração extra simples a ser feita para restringir o que o usuário conectado pode fazer. O SSH, usado com uma chave pública e uma chave privada, oferece essa forma adicional de garantir que o cliente possa chamar
command
apenas um específico.Assim que se faz. No servidor, de onde os dados estão sendo extraídos, há um
~/.ssh/known_hosts
arquivo nouser
diretório inicial do. O arquivo contém uma linha por host que conhece a chave pública, assimssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
Prefixe isso com o
command
que você deseja permitircommand="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
para tê-lo de tal forma que
user@host
só pode ser executado/bin/myscript.sh
remotamente.Uma pergunta relacionada com boas respostas está no site do SO .
[Divulgação: eu escrevi sshdo que é descrito abaixo]
Como mencionado acima, o rrsync pode ser usado para controlar o que o rsync pode fazer pelo ssh, mas, como a maioria dos usos de comandos forçados do ssh, é limitado a um único comando rsync por chave autorizada.
Outra maneira de controlar o que o rsync pode fazer sobre o ssh é usar um controle de lista branca de comando genérico para o ssh.
Existe um programa chamado sshdo para fazer isso. Ele controla quais comandos podem ser executados por meio de conexões ssh de entrada. Está disponível para download em:
Ele tem um modo de treinamento para permitir todos os comandos que são tentados e uma opção --learn para produzir a configuração necessária para permitir comandos aprendidos permanentemente. Então o modo de treinamento pode ser desligado e quaisquer outros comandos não serão executados.
Ele também tem uma opção --unlearn para parar de permitir comandos que não estão mais em uso, de modo a manter o privilégio mínimo estrito à medida que os requisitos mudam com o tempo.
É muito exigente quanto ao que permite. Não permitirá um comando com nenhum argumento. Somente comandos shell completos podem ser permitidos.
Mas suporta padrões simples para representar comandos semelhantes que variam apenas nos dígitos que aparecem na linha de comando (por exemplo, números de sequência ou carimbos de data/hora).
É como um firewall ou controle de lista branca para comandos ssh.