sudoers - permite que o usuário seja ssh como outro usuário e execute um comando específico

0

Estou escrevendo um script Bash para gerenciar várias instâncias do JBoss em vários servidores.

O script permite que os usuários verifiquem o status de cada instância, bem como parem / iniciem-nos. O script está situado em /opt e, em seguida, para a parte stop / start, ele passa argumentos para um script filho localizado em cada diretório /jboss/bin .

Os usuários que têm permissão para parar / parar já têm permissões para executar qualquer coisa, pois o usuário do aplicativo ( jbossuser ) e esse usuário têm chaves ssh configuradas para os outros servidores. Eu não tive problemas para fazer com que essa parte da funcionalidade funcionasse.

Eu gostaria de permitir que qualquer usuário (ou seja, aqueles que não têm permissões para executar como usuário do aplicativo) possam verificar o status de cada instância. Para isso eu tenho:

status() {
    pid=$(ssh -q -t jbossuser@${server} "ps -ef | grep "$instance" | grep -wv 'grep\|vi\|vim' | awk '{print \}'")
    if [ ${#pid} -gt 0 ]
    then
    echo "$name > ${yellow}ONLINE  ${default}PID: $pid"
    else
    echo "$name > ${red}OFFLINE${default}"
    fi  
}

Se o script não for executado com sudo -u jbossuser ./script.sh , o que os usuários padrão não podem fazer, ele solicitará a senha do jbossuser.

Eu sei que preciso adicionar algo ao arquivo sudoers para permitir que esses usuários executem esse comando específico, mas não tenho certeza do que preciso adicionar. Eu tenho até onde:

user ALL=(jbossuser) NOPASSWD: /usr/bin/ssh

Mas eu quero restringi-los a receber permissão apenas do ssh para um punhado de servidores, apenas como jbossuser e limitado ao comando ps -ef .

/ Editar:

Indo nas respostas / comentários, acho que preciso esclarecer melhor o que estou tentando fazer e qual é o problema.

Os administradores do sistema estariam executando o script com:

sudo -u jbossuser ./script.sh

Usuários padrão não têm permissão para usar o sudo, então seria apenas executá-lo com:

./script.sh

Aqueles que o executam como jbossuser não têm problemas ao selecionar opções que chamam a função status() mencionada anteriormente, porque ela usa chaves ssh configuradas para o jbossuser se conectar a outros servidores.

Esses dois não estão executando como jbossuser (os Usuários Padrão) são solicitados a fornecer sua senha e, em seguida, recebem um erro, pois não têm permissão para usar o ssh. Mesmo se eles pudessem usar o ssh, eles não teriam as chaves ssh para que jbossuser se conectassem aos outros servidores.

Gostaria de permitir que os usuários do Padrão só tivessem permissão para:

sudo -u jbossuser ssh -q -t jbossuser@[hostname] ps -ef | grep [process]

Em seguida, atualizo a função status() para incluir sudo -u jbossuser no início, para que funcione tanto para usuários padrão quanto para administradores.

    
por hshah 30.10.2018 / 01:33

1 resposta

1

Existem alguns problemas diferentes a serem resolvidos aqui:

  1. Como permitir o acesso a apenas determinados hosts?

    Isso pode ser feito dando ao usuário no host de origem uma chave privada SSH específica. Em seguida, você instala a chave pública correspondente somente nos hosts aos quais o usuário deve ter acesso. Certifique-se de que o usuário não saiba a senha da conta de destino ou que a autenticação de senha esteja desativada em sshd_config . O usuário deve apenas ser capaz de autenticar via chave ssh.

  2. Como restringir o usuário apenas a um comando específico?

    Isso pode ser resolvido de maneira semelhante ao número 1 acima - no arquivo ~/.ssh/authorized_keys do usuário no servidor de destino, ao adicionar a chave, você também pode especificar um comando que o usuário será forçado a executar. Eles não poderão executar qualquer coisa exceto este comando.

Um exemplo authorized_keys entry que suporta isso seria assim, usando o comando de exemplo que você forneceu:

command="ps -ef | grep \"$SSH_ORIGINAL_COMMAND\" | grep -wv 'grep\|vi\|vim' | awk '{print $2}'",no-pty,no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAkwY/8z8sADor5NmM0rZd3clWIcycSzP1gj1gjZCymuYxXRZX/YFnjphkuCWU7c4KK6AtS4Xv1OFjpqtZ6ucBEws+sJIS7hfdELWuTmmYeO3UKL1p9xt4lJRlv1F8WZkUpy5iUo6VqZbgwywzyiqZj5u100Rcbho4BDFjYbSWOw== jbossuser@source_host

NOTA: Tudo deve ser uma linha em authorized_keys !

O usuário pode passar o nome do processo para o qual está tentando fazer um pedido na linha de comando ao emitir o comando ssh. Aqui está um exemplo disso em uso - neste exemplo, vou buscar o processo "crond" na listagem ps :

jbossuser@source_host ~$ ssh -i .ssh/testkey jbossuser@target_host crond
1044
jbossuser@source_host ~$ 

Portanto, este comando retornou o PID do processo "crond", "1044".

  1. acesso sudo para os usuários no host de origem

    Você tem a sintaxe correta, mas o comando está errado - você não está dando acesso ao sudo para ssh , mas para o script que você quer que eles executem como o jbossuser.

Se usuários diferentes tiverem acesso a hosts diferentes, você poderá fornecer versões diferentes do script que apontam para uma chave privada SSH específica apenas para eles.

    
por 30.10.2018 / 03:51