rsync todos os arquivos da máquina remota através do SSH sem usuário root?

63

Eu tenho este comando para fazer backup de uma máquina remota. O problema é que eu preciso de direitos de root para ler e copiar todos os arquivos. Eu não tenho nenhum usuário root habilitado por razões de segurança e uso sudo do caminho do Ubuntu. Eu precisaria de alguma coisa legal para fazer isso?

rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/
    
por redanimalwar 24.09.2013 / 05:43

7 respostas

78

Recomendamos que você use apenas a conta raiz. Se você configurá-lo assim:

  • Configure seu sshd_config na máquina de destino para PermitRootLogin without-password .
  • Use ssh-keygen na máquina que puxa o backup para criar uma chave privada SSH (somente se você ainda não tiver uma chave SSH). Não defina uma frase secreta. Google um tutorial se você precisar de detalhes para isso, deve haver muito.
  • Anexe o conteúdo de /root/.ssh/id_rsa.pub da máquina de backup ao /root/.ssh/authorized_keys de sua máquina de destino.
  • Agora, sua máquina de backup tem acesso raiz à sua máquina de destino, sem precisar usar a autenticação de senha.

a configuração resultante deve ser bastante segura.

sudo , especialmente combinado com NOPASSWD , conforme recomendado nos comentários, não tem benefícios de segurança apenas com o uso da conta raiz. Por exemplo, esta sugestão:

add the following to your /etc/sudoers file: rsyncuser ALL= NOPASSWD:/usr/bin/rsync

essencialmente concede rsyncuser de permissões de raiz. Você pergunta:

@MartinvonWittich Easy to gain a full root shell because rsync executed with sudo? Walk [m]e [through] that please.

Bem, simples. Com a configuração recomendada, rsyncuser agora pode executar rsync como root sem ter uma senha solicitada. rsync é uma ferramenta muito poderosa para manipular arquivos, então agora rsyncuser tem uma ferramenta muito poderosa para manipular arquivos com permissões de root. Encontrar uma maneira de explorar isso me levou apenas alguns minutos (testado no Ubuntu 13.04, requer dash , bash não funcionou):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

Como você pode ver, eu criei um shell de raiz; whoami identifica minha conta como root, posso criar arquivos em /etc e posso ler em /etc/shadow . Meu exploit era definir o bit setuid no dash binário; Isso faz com que o Linux sempre execute esse binário com as permissões do proprietário, neste caso, root.

Having a real root is not [recommended] for good reasons. – redanimalwar 15 hours ago

Não, trabalhar desajeitadamente em torno da conta raiz em situações em que é absolutamente apropriado usá-la não é por boas razões. Esta é apenas outra forma de programação de cultos de carga - você não entende realmente o conceito por trás do sudo vs root, você apenas cegamente aplique a crença "raiz é ruim, sudo é bom" porque você leu isso em algum lugar.

Por um lado, há situações em que sudo é definitivamente a ferramenta certa para o trabalho. Por exemplo, quando você está trabalhando interativamente em um desktop gráfico Linux, digamos que o Ubuntu, então usar sudo é bom nos raros casos em que às vezes você precisa de acesso root. O Ubuntu intencionalmente tem uma conta root desativada e obriga você a usar sudo por padrão para evitar que os usuários usem a conta root apenas para efetuar login. Quando o usuário apenas deseja usar, por exemplo, o navegador da Web, em seguida, fazer login como root seria uma coisa perigosa e, portanto, não ter uma conta root por padrão impede que pessoas estúpidas façam isso.

Por outro lado, há situações como a sua, em que um script automatizado requer permissões de root para algo, por exemplo, para fazer um backup. Agora, usar sudo para contornar a conta raiz não é apenas inútil, mas também perigoso: à primeira vista, rsyncuser parece uma conta comum sem privilégios. Mas como já expliquei, seria muito fácil para um invasor obter acesso root completo se ele já tivesse ganhado rsyncuser access. Então, basicamente, agora você tem uma conta root adicional que não se parece com uma conta root, o que não é uma coisa boa.

    
por 25.09.2013 / 22:54
65

Use a opção --rsync-path para executar o comando rsync remoto com sudo privileges. Seu comando deve então ser, por exemplo:

rsync -chavzP --rsync-path="sudo rsync" --stats [email protected]:/ .

Se sudo solicitar uma senha, você terá que evitar isso usando um privilégio NOPASSWD com a conta de usuário remoto (sem sentido para raiz, pode fazer sentido em outros casos de uso) ou se você não usa Não quero fazer isso:

  • Verifique se a opção tty_tickets está desativada para o usuário que você estão usando, por exemplo, executando %código% e entrando:

    Defaults:your.username.for.rsync !tty_tickets
    
  • Verifique se a opção sudo visudo -f /etc/sudoers.d/local-rsync está desativada para o usuário que você é usando - pode estar desativado por padrão. O método é o mesmo que acima.

  • Semente a senha requiretty na máquina remota, executando, e. sudo

por 24.09.2013 / 06:00
17

Uma maneira simples de fazer isso é usar o programa ssh-askpass com sudo , isso contorna o fato de que sudo não está conectado ao terminal e permite inserir a senha com segurança:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  [email protected]:/ .

É claro que o programa ssh-askpass deve ser instalado no local indicado e você deve estar executando uma sessão X na máquina em que está trabalhando. Existem algumas variações no programa ssh-askpass que também deve funcionar (versões do Gnome / KDE). Além disso, um programa gráfico de substituição de sudo como gksu ou kdesudo também deve funcionar.

    
por 19.06.2014 / 10:34
7

Se o seu usuário já possui privilégios sudo que são protegidos com uma senha, eu os manteria no estado em que se encontram e apenas adicionaria uma sub-rotina para usar o rsync sem uma senha:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 
    
por 11.06.2014 / 20:39
5

Eu encontrei esse problema hoje e o resolvi sem a necessidade de modificar arquivos de configuração ou conceder permissões de nível raiz a contas de usuário. Minha configuração em particular foi que o usuário A na máquina foo teve que copiar todos os diretórios do usuário de foo para a máquina bar em um diretório backup que o usuário A possuía. (O usuário A tem privilégios sudo em foo .)

O comando que usei está abaixo. Ele foi chamado pelo usuário A no diretório /home em foo .

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

Isso executa o rsync como sudo para que todos os diretórios de usuário em foo possam ser acessados, mas diz ao rsync para usar o ssh para acessar a máquina bar usando as credenciais do usuário A . Minhas necessidades eram um pouco diferentes da pergunta acima, mas isso me permitiu obter rapidamente um backup de todos os diretórios de usuários em uma máquina específica que gerencio sem prejudicar a configuração do sistema.

    
por 14.09.2015 / 02:11
3

A execução do rsync como daemon na máquina de destino permite que você faça o que quiser.

    
por 09.09.2014 / 18:16
2

Minha solução é usar --rsync-path="sudo rsync" , mas ele pede senha, solução alternativa:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  [email protected]:/ .
    
por 25.12.2017 / 10:29