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

16

Então, primeiro, eu sei, devo usar a autenticação de chave com SSH. Não há necessidade de me explicar isso.

O problema aqui é que eu tenho um (grande) grupo de servidores e preciso que um script seja capaz de conectar cada um deles.

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 vai levá-las quando necessário. O problema é que não parece realmente seguro fazê-lo dessa maneira. Existe uma maneira de torná-lo um pouco mais seguro?

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

wokati
fonte
11
Variáveis ​​Env. Duplicar do SO: stackoverflow.com/a/4410137/2579527
Travis Stoll
4
As variáveis ​​de ambiente @TravisStoll não são seguras.
Jenny D
Receio que, para sua instalação, o armazenamento das senhas em um banco de dados seja o mais seguro possível. Você pode transformá-lo em um banco de dados criptografado, como um arquivo keepass (acho que há pelo menos um módulo perl para acessar o keepass dbs), mas ainda assim você teria que armazenar a senha no banco de dados em algum lugar, se não quiser entrar sempre que você invocar seu script. Talvez seja um pouco melhor que você insira a senha mestra apenas toda vez que invocar seu script.
Isaac
11
Mesmo se você usar chaves de autenticação SSH em vez de senhas, isso não é garantia de segurança - qualquer pessoa que possa roubar seu banco de dados de senhas poderá roubar sua chave privada. Você pode criptografar sua chave privada, assim como você pode criptografar seu banco de dados de senhas, mas, como o script precisa desbloquear a chave (ou banco de dados de senhas), ele ainda está vulnerável a um invasor. O uso de senhas em vez de chaves aumenta um pouco sua vulnerabilidade, pois abre mais caminhos para roubar a senha, mas mesmo o uso de chaves em vez de senhas não é uma segurança perfeita.
9119 Johnny
11
"às vezes telnet" parece implicar que a senha às vezes será transferida de forma clara através do fio ...?
Hagen von Eitzen

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 na qual o script é executado) poderá se conectar a qualquer um desses servidores.

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

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

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

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


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 o seu script e limitar os recursos desse usuário , nos servidores de acesso e nos acessados. Você pode limitar os recursos do usuário no nível SSH , no nível do 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 ...

Monitor . Sempre monitore o acesso aos servidores. De preferência, autenticação e comandos de log executados em um log somente anexado . Não se esqueça de monitorar as alterações no arquivo de script usando auditd, por exemplo.


Obviamente, muitos desses mecanismos não serão úteis se você não tiver controle sobre os servidores, como parece sugerir sua pergunta. Se for esse o caso, recomendo que você entre em contato com as pessoas que administram os servidores e informe-os sobre seu script e as possíveis armadilhas de segurança.

goncalopp
fonte
14

A resposta curta é não.

A resposta longa é: Não, não existe 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 chegar é 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, é necessário examinar profundamente a segurança detalhada, tanto no servidor em que o script é executado, na rede e nos servidores de destino.

Jenny D
fonte
11
Não tenho tanta certeza de que este seja um NÃO definitivo. A sessão dele é segura; o sistema de arquivos pode ser seguro, com as permissões apropriadas definidas; portanto, se ele consegue obter coisas do sistema de arquivos (uma senha armazenada) e canalizá-las através de stdin para o comando ssh, ele deve estar bem, não deveria? Por favor, veja os links que dei em outro comentário acima. O que você acha?
pgr
Se ele os passar pelo stdin, haverá uma vulnerabilidade. Com suas sugestões, será mais seguro, mas não será completamente. Especialmente porque algumas das sessões são feitas via telnet.
21915 Jenny D
0

Você pode criptografar as senhas no seu banco de dados com uma segunda senha e armazená-la em uma máquina separada (terceira) e ter um sistema no local em que o script que precisa das senhas da base de dados conecte primeiro essa terceira máquina para obter a senha de descriptografia , descriptografa a senha no banco de dados com a senha que obteve da 3ª máquina e faz seu trabalho.

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

Mas o ponto é que uma terceira parte pode controlar a terceira máquina, por exemplo, 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 um problema, se você sair do seu emprego e eles não confiarem no cara que está substituindo você, ou eles apenas querem que seus scripts parem de acessar suas máquinas, eles podem desligar o terceiro máquina e seus scripts não terão mais acesso às senhas.

Jens Timmerman
fonte