O autor lista seu raciocínio, embora seja um pouco disjunto. Seu principal argumento é que é fácil fazer check-in acidentalmente em um arquivo de configuração, e que os arquivos de configuração têm formatos variados e podem estar espalhados pelo sistema (todos os três são argumentos medíocres para configurações relacionadas à segurança, como tokens de autenticação e credenciais).
Considerando minha própria experiência, você basicamente tem as três opções a seguir, com vantagens e desvantagens associadas:
Armazene os dados nos arquivos de configuração.
Ao adotar essa abordagem, você deve idealmente isolá-los do próprio repositório e certificar-se de que eles estejam fora da área em que o aplicativo armazena seu conteúdo.
Vantagens:
- Muito fácil de isolar e controlar o acesso, especialmente se você estiver usando coisas como o SELinux ou o AppArmor para melhorar a segurança geral do sistema.
- Geralmente fácil de alterar para usuários não técnicos (isso é uma vantagem para o software publicado, mas não necessariamente para software específico da sua organização).
- Fácil de gerenciar em grandes grupos de servidores. Existem todos os tipos de ferramentas para implementação de configuração lá fora.
- Razoavelmente fácil verificar qual é a configuração exata em uso.
- Para um aplicativo bem escrito, normalmente você pode alterar a configuração sem interromper o serviço, atualizando o arquivo de configuração e, em seguida, enviando um sinal específico para o aplicativo (geralmente SIGHUP).
Desvantagens:
- O planejamento adequado é necessário para manter os dados seguros.
- Você pode ter que aprender diferentes formatos (embora atualmente só tenha muito o que se preocupar e eles geralmente tenham uma sintaxe semelhante).
- Os locais de armazenamento exato podem ser codificados no aplicativo, o que torna a implantação potencialmente problemática.
- A análise dos arquivos de configuração pode ser problemática.
Armazene os dados em variáveis de ambiente.
Geralmente isso é feito pelo fornecimento de uma lista de variáveis de ambiente e valores do script de inicialização, mas em alguns casos, pode ser apenas declará-los na linha de comando antes do nome do programa.
Vantagens:
- Comparado à análise de um arquivo de configuração, extrair um valor de uma variável de ambiente é trivial em praticamente qualquer linguagem de programação.
- Você não precisa se preocupar tanto com a publicação acidental da configuração.
- Você ganha algum grau de segurança por obscuridade porque essa prática é incomum, e a maioria das pessoas que hackam seu aplicativo não pensa em analisar as variáveis de ambiente imediatamente.
- O acesso pode ser controlado pelo próprio aplicativo (quando ele gera processos filho, ele pode facilmente limpar o ambiente para remover informações confidenciais).
Desvantagens
- Na maioria dos sistemas UNIX, é razoavelmente fácil obter acesso às variáveis de ambiente de um processo. Alguns sistemas oferecem maneiras de atenuar isso (a opção
hidepid
mount para/proc
no LInux, por exemplo), mas eles não são ativados por padrão e não protegem contra ataques do usuário que possui o processo. - Não é comum ver as configurações exatas que alguma coisa está usando se você lida corretamente com o problema de segurança mencionado acima.
- Você precisa confiar no aplicativo para depurar o ambiente quando gerar processos filhos, caso contrário, vazará informações.
- Você não pode alterar facilmente a configuração sem uma reinicialização completa do aplicativo.
Use argumentos de linha de comando para passar os dados.
Sério, evite isso a todo custo, não é seguro e é um saco para manter.
Vantagens:
- Ainda mais simples de analisar que as variáveis de ambiente na maioria das linguagens.
- Processos filhos não herdam automaticamente os dados.
- Fornece uma maneira fácil de testar rapidamente configurações específicas ao desenvolver o aplicativo.
Desvantagens:
- Assim como as variáveis de ambiente, é fácil ler a linha de comando de outro processo na maioria dos sistemas.
- Extremamente tedioso para atualizar a configuração.
- Coloca um limite rígido em quanto tempo a configuração pode ser (às vezes até 1024 caracteres).