Como um script pode executar comandos privilegiados em um sistema remoto sem senhas sudo ou ssh?

1

Estou tentando configurar o arquivo sudoers corretamente, mas a documentação que encontrei não parece ajudar.

Eu tenho um usuário, por exemplo user1

Eu tenho dois servidores Debian, server1 e server2 .

Atualmente, posso me conectar a qualquer servidor do meu PC Windows usando SSH e, quando necessário, executar sudo para elevar meus privilégios.

Agora eu preciso conectar-me de server1 a server2 em um script de shell e executar um arquivo em server2 como sudo , sem digitar a senha (no script ou manualmente).

Eu entendo que posso usar o arquivo sudoers para me permitir fazer isso.

Mas como faço isso?

No meu arquivo sudoers (no server2 ) eu tenho:

# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo  ALL=(ALL:ALL) ALL
%user1 ALL=(ALL:ALL) ALL

Eu entendo que posso fazer algo como:

%user1 ALL = NOPASSWD: /path/to/myscript    

Isso permitirá que user1 execute o script em / caminho / para / mysqcript sem digitar a senha. Mas, isso me impedirá de fazer qualquer outra coisa além de executar meu script quando eu conectar do meu PC Windows.

O ideal seria limitar essa funcionalidade NOPASSWD às conexões de server1 .

Estou sentindo falta de algo aqui? Estou relutante em 'testar' as mudanças caso eu me tranque completamente.

    
por IGGt 29.10.2015 / 17:34

2 respostas

3

Uma coisa para ajustar antes de chegar à resposta real. Usando "% user1" significa "pessoas no grupo user1"; você provavelmente quer apenas que "user1" signifique user1.

Em segundo lugar, o sudo não tem idéia de onde você está logado de - somente onde você está atualmente executando o sudo.

Em terceiro lugar, verifique se você está usando "visudo" para fazer suas alterações; tentará impedir que você cometa erros de sintaxe.

Em quarto lugar, adicionar uma linha de sudoers apenas adiciona ao seu acesso atual; isso não impedirá que você execute outros scripts; Se você precisar de sudo para esses scripts, precisará de mais entradas sudoers.

    
por 29.10.2015 / 17:41
1

Você perguntou sobre a restrição da funcionalidade às conexões de server1 . Eu faria isso com ssh . O código para modificar usuários é para Debian / Ubuntu. Os princípios e a maioria dos outros códigos devem ser razoavelmente universais. Depois de fazer essa configuração, para executar o script em server2 de server1 , você emitirá este comando:

$ ssh -i ~/.ssh/script_identity.pub ruser@server2

O comando acima se conectará a server2 e executará seu script, não exigindo mais intervenção para ssh ou sudo authentication. O arquivo de chave pública ssh é o único acesso para executar o script remotamente em server2 , permitindo que você decida quais máquinas e / ou contas podem acessar o script em relação a ssh .

O código para realizar essas tarefas é exemplificado abaixo desta descrição.

Esta configuração requer uma conta dedicada em server2 . Existem muitas boas razões, uma das quais você já mencionou, a possibilidade de se bloquear de server2 , ou pior, inadvertidamente, modificar os arquivos errados em sua conta de trabalho.

Etapas para configurar o ssh para acesso remoto restrito

em server1

  1. Da conta em server1 onde você executará o script, crie uma nova chave ssh que será usada apenas para executar o script remoto.
  2. Modifique a nova chave pública ssh para restringir a execução de apenas um comando (consulte command= na sshd manpage).
  3. Faça um script de teste que imprima os IDs e a data do usuário.

Em server2 (tudo será feito remotamente de server1 )

  1. Crie uma nova conta em server2 .
  2. Copie o arquivo de identidade público modificado para .ssh/authorized_keys no diretório inicial do novo usuário em server2 .
  3. Copie o script de teste para o diretório inicial de novos usuários em server2 .
  4. Verifique todas as permissões e propriedade em todos os arquivos na conta do novo usuário.

Código

Depois de salvar o script a seguir como ruser.sh on server1 e, depois de entender o que ele fará, execute este comando para executar:

$ sh ./ruser.sh ruser server2

Salve este script como ruser.sh na sua conta de usuário em system1 :

#!/bin/sh -e

#
# ruser.sh -- setup user on remote host for secure remote script execution
#
# This is for first time setup!
# Always use a new user on remote host.
#

USAGE="ERROR: Usage: sh $0 remote-username remote-hostname"    
RUSER="${1:?$USAGE}"
RHOST="${2:?$USAGE}"
UNIQUE=$$

# build files that will be transferred to the remote host

# Make the new ssh key, and modify the public key so that
# it can only be used to execute "./rscript.sh"

ssh-keygen -N '' -f ~/.ssh/script_identity
sed -i '1 {
    s,command="./rscript.sh",,
    s,^,command="./rscript.sh" ,
}' ~/.ssh/script_identity.pub

# rscript.sh -- the only script that can be executed
# with the modified public key.

printf '%s' '(id;date) > rscript.out' > /tmp/rscript.sh.$$

# copy the new identity public key and rscript.sh to the remote host

scp ~/.ssh/script_identity.pub "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
scp /tmp/rscript.${UNIQUE} "${RHOST}":/tmp/script_identity.pub.${UNIQUE}

# setup remote user for script execution
# Create new user
# Move identity file and script to new user's home directory.
# Fix ownership and permissions

ssh -t ${RHOST} "sudo /bin/sh -cex '
        adduser --system --shell=/bin/sh ${RUSER};
        mkdir -m0700 ~${RUSER}/.ssh;

        mv /tmp/script_identity.pub.${UNIQUE} ~${RUSER}/.ssh/authorized_keys;
        mv /tmp/rscript.sh.${UNIQUE} ~${RUSER}/rscript.sh

        chmod -R 0600 ~${RUSER}/.ssh/;
        chmod    0700 ~${RUSER}/.ssh/;
        chmod 0700 ~${RUSER}/rscript.sh;
        chown -R ${RUSER}:nogroup ~${RUSER}/;
    '
"

# remove temp files

rm -rf /tmp/rscript.sh.${UNIQUE}

Teste a configuração acima em server1 executando:

$ ssh -i ~/.ssh/script_identity.pub ruser@server2

Em seguida, verifique o diretório inicial de ruser on server2 para ver se o arquivo rscript.out foi realmente criado, indicando que tudo está configurado corretamente.

Se sim, modifique o ruser@server2:rscript.sh para chamar seu /path/to/myscript . Antes de modificar o arquivo sudoers, emita o comando ssh novamente para executar o script remoto novamente para garantir que sua saída e saída de erro estejam funcionando da maneira desejada.

Agora configure o arquivo sudoers de server2 para permitir que esse novo usuário em server2 execute apenas um script como root sem uma senha.

ruser ALL = NOPASSWD: /path/to/myscript

Parabéns, agora você pode executar scripts com privilégios remotamente com segurança, sem ssh , sudo ou senhas do sistema.

    
por 29.10.2015 / 23:21

Tags