sudo para super-usuário após scp

1

Para implantar código em um servidor eu executo um script que scp é o arquivo de implantação no servidor usando minha chave privada. Mas depois scp eu tenho que manualmente ssh para a máquina   sudo para uma conta de superusuário e execute um script de implantação.

Eu também gostaria de automatizar o segundo passo, mas não consigo descobrir como.

Quaisquer outras alternativas para este processo de duas etapas?

    
por user5967 14.07.2009 / 20:23

6 respostas

4

Se quem controla o arquivo sudoers irá alterá-lo para que você possa executar certos comandos sem uma senha, ele será tão simples quanto a execução:

$ ssh other-host sudo /path/to/deployment.script

Se não, então você pode ter o sudo recebendo sua entrada de um arquivo:

$ ssh other-host 'sudo -S /path/to/deployment.script < password.file'

Mas não faça isso, pois significa que você está colocando sua senha em um arquivo. E o administrador do servidor deve chutar sua bunda por isso.

Uma opção melhor do que todas as opções acima é fazer com que o administrador do servidor configure uma entrada no arquivo authorized_keys do root, que só tem permissão para executar o script de implantação. Dessa forma, para executar o script, você precisa apenas fazer ssh no servidor como root com uma chave especial.

    
por 14.07.2009 / 20:34
2

Crie um par de chaves no host remoto apenas para essa finalidade e adicione-o ao arquivo de chaves autorizadas do root no servidor em que você está implantando. Na frente da chave, adicione 'command="cat - > > file.name; deploy_script.sh", sem encaminhamento de porta, sem encaminhamento X11, sem encaminhamento de agente, no-pty' No remoto host run "cat / caminho / para / arquivo | ssh -i / caminho / para / chave"

Você também pode configurá-lo com o scp usando o seguinte no arquivo de chaves autorizado

command="scp -t /destination/directory/;deploy_script.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user @ remote_server

Se você não conseguir acessar o arquivo authorized_keys2 do root, combine-o com password less sudo. Se isso não for permitido, use ssh, scp e espere.

    
por 14.07.2009 / 20:47
1

Você pode fazer isso com bastante facilidade com algum tipo de solução baseada no cron.

#!/bin/bash

if [ -f /path/to/deployment.script ]; then
    mv /path/to/deployment.script /path/to/somewhere/else
    do_deployment
fi

A execução de um script como esse a cada poucos minutos do cron como root deve fazer o que você precisa. Há provavelmente uma maneira mais elegante de fazer isso, mas é o mais simples / rápido que me veio à mente.

    
por 14.07.2009 / 20:32
1

Acho que sua melhor solução é discutir o assunto com quem realmente controla o servidor. Todas as soluções potencialmente violam algum tipo de política de segurança ou exigem alterações que você pode não estar autorizado a fazer. Basicamente, parece que a política é que para executar algo como root você precisa digitar sua senha toda vez.

No entanto, aqui está uma função de shell local que pode funcionar:

deploy_bypassing_security () {
  if [ -z "$REMOTEPASSWORD" ]; then
    read -s -p "Password: " REMOTEPASSWORD
  fi
  scp deployment_file username@remotehost
  echo $REMOTEPASSWORD | ssh -t username@remotehost sudo -S deployment_script
}

Isso lhe pedirá a senha se ela não tiver uma (assim você terá que acertar na primeira vez!) e então ecoará a senha para o sudo, dizendo ao sudo para ler a senha do stdin ao invés da via tty .

Em seguida, basta executar deploy_bypassing_security na CLI. A primeira vez que ele é executado, ele pede uma senha antes de fazer qualquer outra coisa, então, da próxima vez, ela é executada sem aviso. Pode ser necessário adicionar um " ssh username@remotehost sudo -k " após o scp.

    
por 14.07.2009 / 21:17
0

Eu sugeriria usar algo como Chef ou Marionete para lidar com isso, pois eles provavelmente serão mais seguros do que os métodos que você escreve.

    
por 14.07.2009 / 21:04
0

Você pode fazer algo como o seguinte para copiar um arquivo e depois executar comandos depois de copiar o arquivo, tudo dentro de um comando ssh:

cat testfile | ssh root@superServer 'dd of=/home/testcopy; chown root/home/testcopy; chmod o+rx /home/testcopy; sudo /home/testcopy'

Eu acho que você pode precisar do sudo sem senha para isso ... não tenho certeza.

    
por 14.07.2009 / 21:48

Tags