Rsync + segurança de autenticação de chave pública

6

Eu li vários artigos sobre como fazer backup de arquivos automaticamente com autenticação Rsync e de chave pública. Todos eles são muito parecidos. Acabei de terminar tudo e tudo funciona bem, mas ... Acabei de encontrar um artigo que diz que não é seguro. Eu fiz o seguinte:

  1. No servidor de backup, geramos chaves públicas e privadas.
  2. copiei a chave pública para o diretório de servidores remotos (originais): /var/sites/.ssh (file authorized_keys ). O diretório é de propriedade de "user12"
  3. Adicionei o seguinte ao arquivo authorized_keys: from="BACKUP.SERVERS.IP.ADDRESS",command="/root/validate_rsync"
  4. Eu criei um arquivo / root / validate_rsync com o seguinte conteúdo:

    #!/bin/sh
    echo $SSH_ORIGINAL_COMMAND >> /var/log/synchronize-log.log
    case "$SSH_ORIGINAL_COMMAND" in
    *\&*)
    echo "Rejected"
    ;;
    *\;*)
    echo "Rejected"
    ;;
    *\(*)
    echo "Rejected"
    ;;
    *\{*)
    echo "Rejected"
    ;;
    *\<*)
    echo "Rejected"
    ;;
    *\>*)
    echo "Rejected"
    ;;
    *\'*)
    echo "Rejected"
    ;;
    *\|*)
    echo "Rejected"
    ;;
    rsync\ --server*) 
    $SSH_ORIGINAL_COMMAND
    ;;
    *)
    echo "Rejected"
    ;;
    esac
    

Eu corro o comando rsync:

rsync -avzp --del -e "ssh -p 2211" [email protected]:/var/sites/photos/ /var/sites/sync/photos

Recebi uma mensagem de erro: problemas de permissão com o arquivo /root/validate_rsync . Mudei o arquivo /root/validate_rsync para /var/sites/validate_rsync e fiz o chown para user12: user12

Agora a sincronização funciona. Mas eu encontrei um artigo que diz que é inseguro:

1- o comando validate_rsync não deve ser de propriedade nem gravável por o userid que executa o comando rsync. Caso contrário, o rsync pode ser usado sobrescrever o script de validação com outro script que não validar ou até mesmo executar comandos arbitrários.

2- Da mesma forma, o arquivo de chaves autorizadas não deve ser de propriedade ou gravável por o usuário rsync, caso contrário o rsync pode ser usado para sobrescrever esse arquivo, com um que elimina o requisito para executar o validate-rsync, ou com um que executa algum outro comando em seu lugar.

Fonte

O que posso fazer? Se validate_rsync for de propriedade de root, a sincronização não será iniciada porque user12 não pode acessar os arquivos de root . Se authorized-keys do arquivo pertencer a outro usuário, não poderei fazer o login com o nome de usuário user12 .

Minhas perguntas:

  1. Onde devo colocar os arquivos validate_rsync e authorized-keys, em qual diretório? Quais permissões e propriedades devem ter?

  2. Existe alguma maneira de informar ao arquivo validate_rsync para permitir a sincronização de apenas duas pastas: /var/sites/photos/ , /var/sites/photos2/

por tfegc 16.09.2014 / 17:56

2 respostas

3

Essas preocupações de segurança estão certas. Então, para responder a sua primeira pergunta: para que funcione como quiser, você deve colocar validate_rsync em um diretório em que user12 tenha permissão de execução, mas não escreva. O mesmo arquivo validate_rsync deve ter permissões de leitura e execução para o usuário, mas é claro que não deve ser gravado. O problema aqui é que /root por padrão é acessível apenas por root user, você precisa de um caminho onde cada diretório tenha permissão de execução para user12 . Por exemplo, você pode copiar validate_rsync para /usr/local/bin e torná-lo de propriedade de root . Enquanto user12 puder executar e ler, tudo bem.

Você não precisa proteger seu arquivo authorized_keys . Seria melhor forçar user12 a executar um comando por configuração, colocando em sshd_config o seguinte:

Match user user12
  ForceCommand /usr/local/bin/validate_rsync

Acho que esta solução é melhor do que mexer com authorized_keys.

Além disso, no seu validate_rsync , citaria $SSH_ORIGINAL_COMMAND (mais seguro), e alteraria sua sentença case para verificar a validade do comando para uma expressão regular usando grep ; mais fácil, mais compacto e mais potente:

echo "$SSH_ORIGINAL_COMMAND" >> /var/log/synchronize-log.log
if echo "$SSH_ORIGINAL_COMMAND" | grep -qE '[&;<>'|]'; then
  echo Rejected
elif [[ "${SSH_ORIGINAL_COMMAND:0:14}" == "rsync --server" ]]; then
  $SSH_ORIGINAL_COMMAND
else
  echo Rejected
fi

Para responder sua segunda pergunta, enquanto você está registrando o SSH_ORIGINAL_COMMAND, você pode executar um teste com os diretórios que deseja considerar e, em seguida, examinar o SSH_ORIGINAL_COMMAND que você está obtendo. Então você pode fazer validate_rsync validar apenas esse comando.

    
por 17.09.2014 / 13:47
2

Para proteger o arquivo authorized_keys , deparei com essa solução: link

It's pretty common to simply remove write-access to that file if you're not planning to change it often.

chmod 400 ~/.ssh/authorized_keys

Now, of course, that write access could be added back in by a malicious script, so you need to set the file and its parent directory to be immutable:

sudo chattr +i ~/.ssh/authorized_keys
sudo chattr +i ~/.ssh
    
por 07.03.2017 / 12:08