Geralmente, esse tipo de problema é tratado com dois binários autônomos: o daemon do serviço e a interface do usuário que se comunicam por meio de um UNIX soquete de domínio (ou um soquete de rede caso eles não estejam rodando na mesma máquina). Um bom exemplo seria o OpenSSH - verifique como ssh-agent
, ssh-add
e ssh
interagem para ter uma ideia de como isso pode ser feito. Substitua "soquete de domínio UNIX" por " D-Bus " se você quiser ficar na moda ou precisar de alguma funcionalidade extra que você teria que implementar.
Se a solicitação de ação vier do próprio daemon (o que, se eu entendi corretamente) é o seu caso particular, é um pouco mais complicado. A parte da interface do usuário deve ser gerada algumas vezes durante a sessão X, registre-se com o daemon e, quando o daemon decidir que precisa de alguma entrada, ele pede à parte da interface do usuário para fazer suas coisas. As duas últimas frases são onde o D-Bus pode ser útil.
Por outro lado, você deve considerar cuidadosamente se o daemon ativamente solicitando uma senha é o Right Way TM de fazer as coisas - daemons geralmente são serviços que atendem pedidos em vez de gerarem um. Talvez seja melhor deixar a interface do usuário ativamente enviar a senha, quando o usuário decidir que é hora de fazer isso. Não estou dizendo que essa é a única boa abordagem, apenas que ela deve ser considerada em primeiro lugar.
No que diz respeito à segurança, tudo depende de quão paranóico você quer chegar. Com o X, você pode pegar o teclado (consulte a página man XGrabKeyboard(3)
), que deve fornecer um nível razoável de segurança. Ou melhor: se você não usá-lo, você não terá controle sobre a senha. Novamente, o ssh é um bom exemplo: dê uma olhada no x11-ssh-askpass
helper. Sua página inicial parece não funcionar mais, mas você pode encontrar as fontes em muitos lugares, por exemplo, no openSUSE BuildService .
Você pode até mesmo usá-lo diretamente, já que tudo o que ele faz é pegar o teclado e enviar a senha digitada em sua saída padrão, então tudo que você precisa é gerar o auxiliar askpass e verificar seu stdout
. Se bem me lembro, readpass.c
no OpenSSH deve lhe dar uma idéia de como fazê-lo .
Embora tudo isso pareça um pouco complicado e longe de ser seguro, há várias coisas a serem consideradas:
-
vários projetos normalmente considerados razoavelmente seguros, como o OpenSSH e o GPG, usam essa abordagem.
-
A segurança é difícil. Desenhar as próprias soluções de segurança geralmente acaba com problemas (ou desastres) de uma forma ou de outra (também pode se tornar o empreendimento usual: "Eu tenho essa coisa legal" - "Uau, vamos fazer disso uma nova ferramenta da empresa "- 5 anos depois:" É completamente inextensível / quebrada / insegura / ... - como alguém poderia fazer disso uma solução para toda a empresa?! "Substitua a" solução para toda a empresa "por" nossos produto principal "para horas de riso). Veja também o link canonical Security SE Q & As: link e link .
-
O uso do teclado não diz nada sobre qualquer outro aplicativo que não espione os eventos do teclado em algum ponto mais profundo da pilha (por exemplo, na camada de aplicativo X). Mas, novamente, tal aplicativo provavelmente exigiria algum tipo de acesso root, portanto, se você tivesse algo parecido no sistema, poderia também colocar as senhas em um arquivo de texto simples chamado
passwords.txt
em seu diretório inicial).