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
- Da conta em
server1
onde você executará o script, crie uma nova chave ssh que será usada apenas para executar o script remoto.
- Modifique a nova chave pública ssh para restringir a execução de apenas um comando (consulte
command=
na sshd
manpage).
- Faça um script de teste que imprima os IDs e a data do usuário.
Em server2
(tudo será feito remotamente de server1
)
- Crie uma nova conta em
server2
.
- Copie o arquivo de identidade público modificado para
.ssh/authorized_keys
no diretório inicial do novo usuário em server2
.
- Copie o script de teste para o diretório inicial de novos usuários em
server2
.
- 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.