shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Shell usando ssh com chave privada embebida no script


From: Fabiano Soares Honorato
Subject: Re: [shell-script] Shell usando ssh com chave privada embebida no script
Date: Tue, 4 Nov 2014 12:05:01 -0200

Olha, eu não sou muito experiente com shell script, mas tenho uma sugestão que TALVEZ possa ajudar.

Você disse que não pode deixar a chave no ambiente, que precisa colocar ela no código do script, que tal você fazer algo como:

deleta_chave (){
sleep 3
rm -rf chave.pem
}

echo "Conteúdo-da-chave" > chave.pem

deleta_chave &

ssh -i chave.pem

Assim você gera a chave em um arquivo que só vai ficar alguns segundos no ambiente. Eu não testei, mas acho que funcionaria, não sei se resolve o seu problema, mas espero ter ajudado!


Em 4 de novembro de 2014 11:50, Felipe Diefenbach address@hidden [shell-script] <address@hidden> escreveu:
 


---------- Mensagem encaminhada ----------
De: Felipe Diefenbach DBSeller <address@hidden>
Data: 4 de novembro de 2014 11:34
Assunto: Re: [shell-script] Shell usando ssh com chave privada embebida no script
Para: address@hidden


Boa tarde.

Infelizmente os usuários tem acesso de root nas máquinas e em algum momento acabariam por poderem ler as chaves no disco usando esta sugestão.
O problema maior é que o ssh tem uma tremenda limitação nesse ponto. De receber exclusivamente a chave por um arquivo.
O exemplo não surtiu efeito o ssh continua a reclamar que o descritor de arquivo não está mais acessível ou não tem permissão.
Creio que a única maneira seja alterando o código c do ssh para implementar a funcionalidade.
Eu não consegui encontrar alternativas a outros clientes ssh que suporte tal possibilidade. Procurei alternativas como o paramiko (python), ou o ssh2lib (php), mas sem sucesso. Também prourei alternativas para encriptar a chave mas as ferramentas que encontrei no shell, todas decriptam o arquivo e geram um novo arquivo decriptado que poderia ser lido também. não encontrei alternativas que fação como poderia eu dizer: Um stream do arquivo para o ssh decriptando ele on-the-fly sem escrever um novo arquivo decriptado no disco.
Se alguém conhece alguma maneira de criar um cliente ssh com alguma outra linguagem ou alguma alternativa ao cliente padrão sugestões sempre são bem vindas.

Obrigado pelo auxilio.


On 10/30/2014 04:56 PM, Fernando Mercês address@hidden [shell-script] wrote:
 
Opa, não seria algo como:

---
chave='kkkkkkkkkkkk"
ssi -i <(echo -e "$chave") ...
---

Outra sugestão, meio boba mas, se você criar o arquivo num diretório que só você tenha permissão e depois excluir, o que acha?

---
chave="aksadkjadjlkasdjlkasdjkalsjkd"
keyfile=/so/eu/posso/ler/minha.key

echo "$chave" > $keyfile
ssh -i $keyfile ...
shred -u $keyfile
---

Outra opção, se você for root, é criar um arquivo virtual no /dev, mas nunca fiz. Não sei se dá certo.

Abraços.



Att,

Fernando Mercês
Linux Registered User #432779
www.mentebinaria.com.br
------------------------------------
"Ninguém pode ser escravo de sua identidade; quando surge uma possibilidade de mudança é preciso mudar". (Elliot Gould)

2014-10-30 11:47 GMT-02:00 felipe diefenbach address@hidden [shell-script] <address@hidden>:
 
Bom dia,
Com a dica tentei das seguintes maneiras, seguem os debugs também.

ssh -v -i <(cat /dev/stdin <<EOF
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
EOF) -T -p22 -l someuser 111.222.333.444 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
+ ssh -v -i /dev/fd/63 -T -p22 -l someuser 111.222.333.444 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
++ /dev/stdin
lixonew: line 2: /dev/stdin: Permission denied
OpenSSH_6.2p2, OpenSSL 1.0.1e-fips 11 Feb 2013
Warning: Identity file /dev/fd/63 not accessible: No such file or directory.
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 50: Applying options for *
debug1: Connecting to somehost.somedomain.tdl [111.222.3333.444] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/id_rsa type -1
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9p1 Debian-5ubuntu1.4
debug1: match: OpenSSH_5.9p1 Debian-5ubuntu1.4 pat OpenSSH_5*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Warning: Permanently added 'somehost.somedomain.tdl111.222.3333.444' (ECDSA) to the list of known hosts.
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /root/.ssh/id_rsa
debug1: Trying private key: /root/.ssh/id_dsa
debug1: Trying private key: /root/.ssh/id_ecdsa
debug1: No more authentication methods to try.
Permission denied (publickey).

Esse foi o outro teste.

#!/bin/bash
ssh -v -i < /dev/stdin -T -p22 -l someuser 111.222.333.444 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no <<EOF
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
EOF
+ ssh -v -i -T -p22 -l someuser somehost.somedomain.tdl -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
OpenSSH_6.2p2, OpenSSL 1.0.1e-fips 11 Feb 2013
Warning: Identity file -T not accessible: No such file or directory.
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 50: Applying options for *
Pseudo-terminal will not be allocated because stdin is not a terminal.
debug1: Connecting to somehost.somedomain.tdl [111.222.333.444] port 22.
debug1: Connection established.
debug1: identity file /home/someuser/.ssh/id_rsa type -1
debug1: identity file /home/someuser/.ssh/id_rsa-cert type -1
debug1: identity file /home/someuser/.ssh/id_dsa type 2
debug1: identity file /home/someuser/.ssh/id_dsa-cert type -1
debug1: identity file /home/someuser/.ssh/id_ecdsa type -1
debug1: identity file /home/someuser/.ssh/id_ecdsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9p1 Debian-5ubuntu1.4
debug1: match: OpenSSH_5.9p1 Debian-5ubuntu1.4 pat OpenSSH_5*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Warning: Permanently added 'somehost.somedomain.tdl,111.222.333..444
' (ECDSA) to the list of known hosts.
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering DSA public key: /home/someuser/.ssh/id_dsa
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/someuser/.ssh/id_rsa
debug1: Trying private key: /home/someuser/.ssh/id_ecdsa
debug1: No more authentication methods to try.
Permission denied (publickey).


Em Quarta-feira, 29 de Outubro de 2014 17:48, "Fredi Rolf Bieging address@hidden [shell-script]" <address@hidden> escreveu:


 
Tenta assim:

ssh -i <(comando_que_escreve_a_chave_no_stdout)

2014-10-29 17:15 GMT-02:00 felipe diefenbach address@hidden [shell-script] <address@hidden>:
 
Boa tarde lista.

Estou tentando fazer uma ferramenta para automatizar a conexão através do ssh.
Já estou usando chaves pub/priv corretamente.
Porém me deparei com um problema.

Ao criar o shell script de conexão preciso usar o comando ssh que usa a opção -i para receber um arquivo de chave (like ec2 aws).
Infelizmente o comando só suporta no parâmetro -i como entrada um arquivo. E eu não poderia disponibilizar em disco o arquivo de chave privada descriptografado.
A ideia inicial era criar um shell e compilá-lo, já com a chave embebida dentro do script, mas devido a estas limitações do comando ssh parece que terei que tomar outros caminhos.

Vasculhando na internet no site do ssh existe uma discussão a respeito do assunto, onde um camarada havia feito uma modificação no código c do ssh para aceitar como opção a chave privada através de uma variável ao invés de um arquivo. De qualquer forma não consegui encontrar os patchs para fazer o mesmo.

Cheguei o mais próximo dos resultados que busco com o seguinte código:

#!/bin/bash
ssh -i /dev/stdin -n -T -p 22 -l someuser 111.222.333.444 <<EOF
-----BEGIN RSA PRIVATE KEY-----
......
-----END RSA PRIVATE KEY-----
EOF


Mas o problema com este código é que ele faz a conexão e em seguida desconecta, como se eu estivesse concatenando um comando ao fim do comando ssh.

Tentei algumas outras formas de criptografia com o ccrypt e o gpg. Porem todos gerão um arquivo novo com a chave descriptografada. Permitindo que em algum momento qualquer um possa ler a chave privada.

Não tenho muita habilidade em lidar com o stdin e o stdout, por isso estou solicitando ajuda a lista. Talvez exista uma maneira de manter a conexão após efetuar o comando.








Atenciosamente.
-- 
Felipe Diefenbach
Sysadmin / Infraestrutura
address@hidden
DBSeller Informática Ltda. - www.dbseller.com.br
(51) 30765101




--

Atenciosamente,
------------------------------
---------------------------------------
Fabiano Honorato
Infraestrutura e Sustentação
+55 21 3523-3955

---------------------------------------------------------------------
CALANDRA SOLUÇÕES
Transformando Informações em Resultados
---------------------------------------------------------------------

reply via email to

[Prev in Thread] Current Thread [Next in Thread]