Existe uma maneira segura de armazenar senhas usadas para ssh por um script?

16

Primeiramente, eu sei, devo usar a chave auth com SSH. Não precisa me explicar isso.

Problema aqui é que eu tenho um grande grupo de servidores, e eu preciso que um script seja capaz de conectar cada um deles.

Eu uso uma autenticação de chave sempre que posso, mas não é possível em todos os servidores (não tenho controle sobre isso). Então SSH com login, ou às vezes telnet.

Então, para alguns, eu apenas armazenei as senhas em um banco de dados, e meu script pode ser usado quando necessário. A questão é que não parece realmente seguro fazê-lo dessa maneira. Existe uma maneira de tornar isso um pouco mais seguro?

Como alguma forma específica de armazená-lo?

    
por wokati 09.02.2015 / 14:27

3 respostas

24

Se o seu script puder se conectar a qualquer um desses servidores, qualquer pessoa com acesso ao script (ou acesso privilegiado à máquina em que o script é executado) poderá se conectar a qualquer um desses servidores.

Se o script precisar ser executado de forma autônoma, todas as apostas serão desativadas. A resposta aqui é não, não há uma maneira absolutamente segura de armazenar senhas em tal ambiente . Não há absolutamente nenhuma maneira prática e segura de fazer qualquer coisa.

Em vez de tentar evitar o inevitável, você deve se concentrar na defesa em profundidade .

Fristly, é claro, você deve proteger as senhas adequadamente . Isso geralmente significa mantê-los em um arquivo separado do seu script e configurando permissões restritivas do sistema de arquivos . É tudo o que você pode fazer nessa frente, de uma perspectiva de segurança.

Outras medidas podem certamente adicionar obscuridade ao processo. Criptografar as senhas fará com que o invasor precise procurar a chave de descriptografia. Usar algum tipo de armazenamento protegido pelo sistema operacional geralmente protege contra outros usuários acessando sua chave (para que não ofereça vantagem sobre as permissões do sistema de arquivos, além de ser complexo para atacar - e usar). Estas medidas irão atrasar um ataque, mas certamente não o impedirão contra um atacante determinado.

Agora, vamos tratar as senhas como públicas por um momento. O que você pode fazer para mitigar os danos?

Uma solução antiga e testada é restringir o que essas credenciais podem fazer. Em um sistema UNIX, uma boa maneira de fazer isso é configurar um usuário separado para seu script e limitar os recursos desse usuário , tanto no acesso quanto nos servidores acessados. Você pode limitar as capacidades do usuário em o nível de SSH , no nível de shell ou possivelmente usando um Mecanismo de controle de acesso obrigatório como o SELinux .

Algo que você também pode querer considerar é mover a lógica do script para os servidores . Dessa forma, você obtém uma interface menor que é mais fácil de controlar e, especialmente, para ...

Monitorar . Sempre monitore o acesso aos servidores. Preferencialmente, autenticação de log e comandos executados em um anexo somente log . Não se esqueça de monitorar as alterações no arquivo de script usando auditd , por exemplo.

Naturalmente, muitos desses mecanismos não são úteis se você não tiver controle sobre os servidores, como sua pergunta parece implicar. Se for esse o caso, aconselho-o a entrar em contacto com as pessoas que administram os servidores e informá-los sobre o seu script e as potenciais armadilhas de segurança.

    
por 09.02.2015 / 16:44
14

A resposta curta é: Não.

A resposta longa é: não, não há um caminho completamente seguro. (Isso inclui variáveis de ambiente, que podem ser acessadas por outras pessoas no servidor.) O mais próximo que você pode obter é armazená-las em algum formato criptografado - keepass, um arquivo criptografado por GPG ou qualquer outra coisa nesse sentido. Mas em algum momento você precisa descriptografar a senha para que seu script possa usá-la e, nesse ponto, você estará vulnerável.

Em outras palavras, é preciso dar uma boa olhada na segurança em profundidade, tanto no servidor a partir do qual o script é executado, na rede e nos servidores de destino.

    
por 09.02.2015 / 15:12
0

Você poderia criptografar as senhas em seu banco de dados com uma segunda senha e armazenar essa senha em uma (3ª) máquina separada e ter um sistema no lugar onde o script que precisa passar senhas do banco de dados conecte essa 3ª máquina. a senha de descriptografia, descriptografa a senha no banco de dados com a senha que obteve da terceira máquina e faz seu trabalho.

É claro que isso não adiciona nenhuma segurança extra, um invasor com privilégios suficientes também pode solicitar a senha da terceira máquina.

Mas o ponto é que um terceiro pode controlar a terceira máquina, por ex. seu chefe ou oficial de segurança, ou a terceira parte no controle dos servidores que você não controla.

Dessa forma você pode dizer a eles, se eles tiverem algum problema, se você sair do seu trabalho e eles não confiarem no cara que está substituindo você, ou se quiserem que seus scripts parem de acessar suas máquinas, eles podem desconectar o plugue na terceira máquina, e seus scripts não terão mais acesso às senhas.

    
por 24.02.2015 / 11:39