Primeiro , como várias pessoas já disseram, é essencial manter as credenciais separadas do script. (Além do aumento da segurança, também significa que você pode reutilizar o mesmo script para vários sistemas com credenciais diferentes.)
Segundo , você deve considerar não apenas a segurança das credenciais, mas também o impacto se / quando essas credenciais forem comprometidas. Você não deve ter apenas uma senha para todo o acesso ao banco de dados, deve ter credenciais diferentes com diferentes níveis de acesso. Você pode, por exemplo, ter um usuário de banco de dados com capacidade de realizar uma pesquisa no banco de dados - esse usuário deve ter acesso somente leitura. Outro usuário pode ter permissão para inserir novos registros, mas não para excluí-los. Um terceiro pode ter permissão para excluir registros.
Além de restringir as permissões para cada conta, você também deve ter restrições sobre onde cada conta pode ser usada. Por exemplo, a conta usada pelo servidor da web não deve ter permissão para conectar-se a partir de nenhum outro endereço IP que não seja o do servidor da web. Uma conta com permissões de root completas para o banco de dados deve ser muito restrita, em termos de onde pode se conectar e nunca deve ser usada além de interativamente. Considere também o uso de procedimentos armazenados no banco de dados para restringir exatamente o que pode ser feito por cada conta.
Essas restrições precisam ser implementadas no lado do servidor DB do sistema, para que, mesmo que o lado do cliente esteja comprometido, as restrições não possam ser alteradas. (E, obviamente, o servidor do banco de dados precisa ser protegido com firewalls etc., além da configuração do banco de dados ...)
No caso de uma conta de banco de dados que tenha acesso limitado somente leitura limitado e apenas de um endereço IP específico, talvez você não precise de mais credenciais além disso, dependendo da sensibilidade dos dados e da segurança do host do script está sendo executado. Um exemplo pode ser um formulário de pesquisa em seu site, que pode ser executado com um usuário que só pode usar um procedimento armazenado que extrai apenas as informações que serão apresentadas na página da web. Nesse caso, adicionar uma senha realmente não confere nenhuma segurança extra, pois essas informações já devem ser públicas e o usuário não pode acessar outros dados que seriam mais sensíveis.
Verifique também se a conexão com o banco de dados é feita usando TLS, ou qualquer pessoa que esteja ouvindo na rede pode obter suas credenciais.
Terceiro , considere que tipo de credencial usar. As senhas são apenas uma forma e não as mais seguras. Você poderia usar alguma forma de par de chaves pública / privada, ou AD / PAM ou algo semelhante.
Quarto , considere as condições sob as quais o script será executado:
Se for executado interativamente, você deverá digitar a senha ou a senha da chave privada ou da chave privada ou efetuar login com um tíquete Kerberos válido ao executá-lo - em outras palavras, o script deve ter sua senha credenciais diretamente de você no momento em que você a executa, em vez de lê-las em algum arquivo.
Se for executado a partir de um servidor da web, considere configurar as credenciais no momento em que você iniciar o servidor da web. Um bom exemplo aqui são os certificados SSL - eles têm um certificado público e uma chave privada, e a chave privada tem uma senha. Você pode armazenar a chave privada no servidor da web, mas ainda precisa inserir a senha quando iniciar o Apache. Você também pode ter as credenciais em algum tipo de hardware, como um cartão físico ou um HSM, que podem ser removidos ou bloqueados quando o servidor é iniciado. (Obviamente, a desvantagem desse método é que o servidor não pode reiniciar por conta própria se algo acontecer. Eu preferiria isso ao risco de comprometer meu sistema, mas sua milhagem pode variar ...)
Se o script estiver sendo executado no cron, essa é a parte mais difícil. Você não quer ter as credenciais espalhadas por qualquer lugar do sistema onde alguém possa acessá-las - mas você deseja tê-las por aí para que seu script possa acessá-las, certo? Bem, não está bem. Considere exatamente o que o script está fazendo. De que permissões ele precisa no banco de dados? Pode ser restrito para que não importe se a pessoa errada se conectar com essas permissões? Em vez disso, você pode executar o script diretamente no servidor do banco de dados ao qual mais ninguém tem acesso, e não no servidor que possui outros usuários? Se, por algum motivo em que não consigo pensar, você absolutamente deve ter o script em execução em um servidor inseguro e deve ser capaz de fazer algo perigoso / destrutivo ... agora é um bom momento para repensar sua arquitetura.
Quinto , se você valoriza a segurança do seu banco de dados, não deve executar esses scripts em servidores aos quais outras pessoas tenham acesso. Se alguém estiver conectado ao seu sistema, ele poderá acessar suas credenciais. Por exemplo, no caso de um servidor da web com um certificado SSL, há pelo menos uma possibilidade teórica de alguém conseguir obter root e acessar a área de memória do processo httpd e extrair as credenciais. Nos últimos tempos, houve pelo menos uma exploração em que isso poderia ser feito por SSL, sem exigir que o invasor estivesse conectado.
Considere também usar o SELinux ou o apparmor ou o que estiver disponível para o seu sistema para restringir quais usuários podem fazer o que. Eles permitirão que você não permita que os usuários tentem se conectar ao banco de dados, mesmo que eles consigam obter acesso às credenciais.
Se tudo isso parece um exagero para você , e você não pode pagar ou não tem tempo para fazê-lo - então, na minha opinião (arrogante e elitista), você não deve armazenar nada importante ou sensível em seu banco de dados. E se você não está armazenando nada importante ou sensível, o local onde você armazena suas credenciais também não é importante; nesse caso, por que usar uma senha?
Por fim , se você absolutamente não puder evitar o armazenamento de algum tipo de credencial, poderá ter as credenciais somente leitura e pertencer a raiz e raiz poderá conceder propriedade em uma base extremamente temporária quando solicitado a fazê-lo por um script (porque seu script não deve ser execute como root, a menos que seja absolutamente necessário, e a conexão com um banco de dados não o torna necessário). Mas ainda não é uma boa ideia.