Q:

Armazenar senha em banco de dados

Tenho uma aplicação que precisa armazenar senhas e obtê-las novamente, isto é não é apenas para verificação de login pois as senhas armazenadas serão utilizadas para fornecer acesso ao um outro sistema (não há access token para esse sistema).
Uma função hash é claramente inapropriada para isso e o banco de dados utilizado (MongoDB) não fornece suporte para criptografar/descriptografar os documentos no banco.
É uma boa alternativa utilizar de chaves simétricas para fazer essa criptografia? No caso, só teria disponibilidade de um único servidor e como poderia guardar a chave de forma segura nesse mesmo servidor? Devo expor no ambiente de produção o algoritmo (código fonte) que executa essa criptografia/descriptografia ou é mais seguro apenas gerar o "binário" e enviar as entradas?  

A:

O normal nesses casos é que a configuração secreta seja um token - que será usado como senha simétrica para o DB - que vai estar disponível num arquivo ou numa variável de ambiente no servidor.
É claro que esse token nunca deve fazer parte de um arquivo versionado - pelo menos não junto com o código fonte.
Se você olhar todos os sistemas de automação de deploy existentes - Chef, Salt, Puppet e mesmo o Docker - todos eles tem uma forma de você passar via linha de comando configurações que vão estar disponíveis nos sistemas deployed mas não fazem parte do repositório - essas informaçõws podem ser variáveis de ambiente, ou outra coisa.
No seu caso, parece se tratar de um deploy pequeno, que não será automatizado - o melhor a fazer é logar no servidor e gerar o token manualmente em um arquivo que não será versionado - crie um pequeno script para isso. Quem tiver acesso ao seu servidor vai ter acesso a esse token -  permissões normais de arquivo de Unix  podem dar alguma proteção a mais se o servidor for compartilhado - mas as práticas são em favor de usar VPS e assumir que quem tem acesso ao servidor pode ver esses tokens (e você isola o servidor com login somente por IP's restritos, chave privada, etc).
Acima está o que é legal saber e independe do sistema ser em Python ou não. Agora algo específico sobre Python: um pacote que eu gosto de usar que dá uma boa flexibilidade para configurações desse tipo, permitindo facilidade nos ambientes de desenvolvimento e segurança no ambiente deployed é o prettyconf (O autor é o Osvaldo Santana que já foi presidente da associação Pythonbrasil). É um pacote simples, mas que permite que o seu sistema em tempo de execução tente recuperar um valor a partir de uma variável de ambiente - e, se ela não estiver disponível,
pega por padrão de um arquivo de configuração)

