Estou escrevendo um pequeno script Python que periodicamente extrairá informações de um serviço de terceiros usando uma combinação de nome de usuário e senha. Não preciso criar algo 100% à prova de balas (será que 100% existe?), Mas gostaria de envolver uma boa medida de segurança para que no mínimo demorasse muito para alguém quebrá-lo.
Este script não terá uma GUI e será executado periodicamente por cron
, portanto, inserir uma senha toda vez que for executado para descriptografar as coisas não funcionará realmente e terei que armazenar o nome de usuário e a senha em um arquivo criptografado ou criptografado em um banco de dados SQLite, o que seria preferível, pois estarei usando SQLite de qualquer maneira e talvez precise editar a senha em algum momento. Além disso, provavelmente irei embrulhar todo o programa em um EXE, já que é exclusivamente para Windows neste momento.
Como posso armazenar com segurança a combinação de nome de usuário e senha para ser usada periodicamente por meio de um cron
trabalho?
fonte
Respostas:
Eu recomendo uma estratégia semelhante ao ssh-agent . Se você não pode usar o ssh-agent diretamente, você pode implementar algo parecido, de forma que sua senha seja mantida apenas na RAM. O cron job pode ter configurado credenciais para obter a senha real do agente sempre que for executado, use-a uma vez e remova a referência imediatamente usando a
del
instrução.O administrador ainda precisa inserir a senha para iniciar o ssh-agent, no momento da inicialização ou o que for, mas este é um compromisso razoável que evita ter uma senha de texto simples armazenada em qualquer lugar do disco.
fonte
A biblioteca do chaveiro python se integra com o
CryptProtectData
API no Windows (junto com APIs relevantes no Mac e Linux) que criptografa os dados com as credenciais de logon do usuário.Uso simples:
Use se você quiser armazenar o nome de usuário no chaveiro:
Mais tarde, para obter suas informações do chaveiro
Os itens são criptografados com as credenciais do sistema operacional do usuário, portanto, outros aplicativos em execução na sua conta de usuário seriam capazes de acessar a senha.
Para ocultar um pouco essa vulnerabilidade, você pode criptografar / ofuscar a senha de alguma maneira antes de armazená-la no chaveiro. Claro, qualquer pessoa que visasse seu script seria apenas capaz de olhar a fonte e descobrir como descriptografar / desofuscar a senha, mas você pelo menos evitaria que algum aplicativo limpasse todas as senhas no cofre e obtivesse a sua também .
fonte
keyring
suporte para recuperação de nome de usuário e senha?get_password
para o nome de usuário. Embora, eu acho que você deve começar a resposta com o exemplo original simplificado dekeyring.set_password()
ekeyring.get_password()
keyring
não faz parte da biblioteca padrão do pythonDepois de examinar as respostas a essas perguntas e outras relacionadas, juntei alguns códigos usando alguns dos métodos sugeridos para criptografar e ocultar dados secretos. Este código é especificamente para quando o script precisa ser executado sem a intervenção do usuário (se o usuário o iniciar manualmente, é melhor que ele coloque a senha e apenas a mantenha na memória como a resposta a esta pergunta sugere). Este método não é superseguro; fundamentalmente, o script pode acessar as informações secretas para que qualquer pessoa que tenha acesso total ao sistema tenha o script e seus arquivos associados e possa acessá-los. O que isso faz id obscurece os dados da inspeção casual e deixa os próprios arquivos de dados seguros se forem examinados individualmente ou juntos sem o script.
Minha motivação para isso é um projeto que pesquisa algumas de minhas contas bancárias para monitorar transações - preciso que ele seja executado em segundo plano, sem que eu reinsira as senhas a cada minuto ou dois.
Basta colar este código no topo do seu script, alterar o saltSeed e usar store () retrieve () e require () no seu código conforme necessário:
A segurança desse método seria significativamente melhorada se as permissões do sistema operacional fossem definidas nos arquivos secretos para permitir apenas que o próprio script os lesse e se o próprio script fosse compilado e marcado como executável apenas (não legível). Parte disso poderia ser automatizado, mas não me incomodei. Provavelmente, seria necessário configurar um usuário para o script e executá-lo como esse usuário (e definir a propriedade dos arquivos do script para esse usuário).
Eu adoraria quaisquer sugestões, críticas ou outros pontos de vulnerabilidade que alguém possa pensar. Sou muito novo na escrita de código criptográfico, então o que fiz quase certamente poderia ser melhorado.
fonte
Existem algumas opções para armazenar senhas e outros segredos que um programa Python precisa usar, particularmente um programa que precisa ser executado em segundo plano, onde não pode simplesmente pedir ao usuário para digitar a senha.
Problemas a evitar:
Opção 1: SSH
Nem sempre isso é uma opção, mas provavelmente é a melhor. Sua chave privada nunca é transmitida pela rede, o SSH apenas executa cálculos matemáticos para provar que você tem a chave certa.
Para fazer funcionar, você precisa do seguinte:
Opção 2: Variáveis de Ambiente
Este é o mais simples, então pode ser um bom lugar para começar. É bem descrito no aplicativo Twelve Factor . A ideia básica é que seu código-fonte apenas extraia a senha ou outros segredos das variáveis de ambiente e, em seguida, configure essas variáveis de ambiente em cada sistema em que executa o programa. Também pode ser um toque agradável se você usar valores padrão que funcionarão para a maioria dos desenvolvedores. Você deve equilibrar isso contra tornar seu software "seguro por padrão".
Aqui está um exemplo que extrai o servidor, o nome de usuário e a senha das variáveis de ambiente.
Veja como definir variáveis de ambiente em seu sistema operacional e considere a possibilidade de executar o serviço em sua própria conta. Dessa forma, você não tem dados confidenciais em variáveis de ambiente ao executar programas em sua própria conta. Ao configurar essas variáveis de ambiente, tome cuidado extra para que outros usuários não possam lê-las. Verifique as permissões do arquivo, por exemplo. Claro que qualquer usuário com permissão de root será capaz de lê-los, mas isso não pode ser ajudado.
Opção 3: arquivos de configuração
Isso é muito semelhante às variáveis de ambiente, mas você lê os segredos de um arquivo de texto. Ainda acho as variáveis de ambiente mais flexíveis para coisas como ferramentas de implantação e servidores de integração contínua. Se você decidir usar um arquivo de configuração, Python suporta vários formatos na biblioteca padrão, como JSON , INI , netrc e XML . Você também pode encontrar pacotes externos como PyYAML e TOML . Pessoalmente, acho JSON e YAML os mais simples de usar, e YAML permite comentários.
Três coisas a serem consideradas com arquivos de configuração:
~/.my_app
, e uma opção de linha de comando para usar um local diferente.Opção 4: módulo Python
Alguns projetos simplesmente colocam seus segredos diretamente em um módulo Python.
Em seguida, importe esse módulo para obter os valores.
Um projeto que usa essa técnica é o Django . Obviamente, você não deve se comprometer
settings.py
com o controle de origem, embora possa querer enviar um arquivo chamadosettings_template.py
que os usuários possam copiar e modificar.Vejo alguns problemas com essa técnica:
.gitignore
reduz esse risco.Se seu projeto já usa essa técnica, é fácil fazer a transição para variáveis de ambiente. Basta mover todos os valores de configuração para variáveis de ambiente e alterar o módulo Python para ler essas variáveis de ambiente.
fonte
os.getenv()
. Como devemos fazer isso se o código está sendo compartilhado? Se o código for baixado por outro desenvolvedor, como ele deve se certificar de que as variáveis de ambiente já estão definidas para ele?os.getenv()
@a_sid, para que o código seja executado pelo menos para um usuário que não definiu as variáveis de ambiente. Se não houver um valor padrão bom, gere um erro claro quando obtiverNone
. Fora isso, coloque comentários claros no arquivo de configurações. Se eu não entendi algo, sugiro que você faça uma pergunta separada.Não faz muito sentido tentar criptografar a senha: a pessoa de quem você está tentando escondê-la tem o script Python, que terá o código para descriptografá-la. A maneira mais rápida de obter a senha será adicionar uma instrução de impressão ao script Python antes de usar a senha com o serviço de terceiros.
Portanto, armazene a senha como uma string no script e codifique-a em base64 de forma que apenas ler o arquivo não seja o suficiente, então, termine o dia.
fonte
Acho que o melhor que você pode fazer é proteger o arquivo de script e o sistema em que ele está sendo executado.
Basicamente, faça o seguinte:
fonte
os sistemas operacionais geralmente oferecem suporte para proteger os dados do usuário. no caso do Windows, parece que é http://msdn.microsoft.com/en-us/library/aa380261.aspx
você pode chamar apis win32 de python usando http://vermeulen.ca/python-win32api.html
tanto quanto eu entendo, isso irá armazenar os dados para que possam ser acessados apenas a partir da conta usada para armazená-los. se você deseja editar os dados, pode fazê-lo escrevendo um código para extrair, alterar e salvar o valor.
fonte
Usei a criptografia porque tive problemas para instalar (compilar) outras bibliotecas comumente mencionadas em meu sistema. (Win7 x64, Python 3.5)
Meu script está sendo executado em um sistema / sala fisicamente seguro. Eu criptografo credenciais com um "script de criptografia" em um arquivo de configuração. E então descriptografe quando eu precisar usá-los. O "script de criptografia" não está no sistema real, apenas o arquivo de configuração criptografado está. Alguém que analisa o código pode facilmente quebrar a criptografia analisando o código, mas você ainda pode compilá-lo em um EXE, se necessário.
fonte