Primero , como ya han dicho varias personas, es esencial mantener las credenciales separadas del guión. (Además de una mayor seguridad, también significa que puede reutilizar el mismo script para varios sistemas con credenciales diferentes).
En segundo lugar , debe considerar no solo la seguridad de las credenciales, sino también el impacto si esas credenciales se ven comprometidas. No debe tener una sola contraseña para todo el acceso a la base de datos, debe tener diferentes credenciales con diferentes niveles de acceso. Podría, por ejemplo, tener un usuario de base de datos que tenga la capacidad de realizar una búsqueda en la base de datos; ese usuario debería tener acceso de solo lectura. Otro usuario puede tener permiso para insertar nuevos registros, pero no para eliminarlos. Un tercero puede tener permiso para eliminar registros.
Además de restringir los permisos para cada cuenta, también debe tener restricciones sobre dónde se puede usar cada cuenta. Por ejemplo, no se debe permitir que la cuenta utilizada por su servidor web se conecte desde ninguna otra dirección IP que no sea la del servidor web. Una cuenta con permisos de raíz completos para la base de datos debe estar muy restringida en términos de dónde se puede conectar y nunca debe usarse de manera interactiva. También considere usar procedimientos almacenados en la base de datos para restringir exactamente lo que puede hacer cada cuenta.
Estas restricciones deben implementarse en el lado del servidor DB del sistema, de modo que incluso si el lado del cliente se ve comprometido, las restricciones no se pueden modificar. (Y, obviamente, el servidor de base de datos debe protegerse con firewalls, etc., además de la configuración de base de datos ...)
En el caso de una cuenta de base de datos que solo tiene acceso limitado de solo lectura, y solo desde una dirección IP en particular, es posible que no necesite más credenciales que eso, dependiendo de la sensibilidad de los datos y la seguridad del host del script se está ejecutando desde. Un ejemplo puede ser un formulario de búsqueda en su sitio web, que se puede ejecutar con un usuario al que solo se le permite usar un procedimiento almacenado que extrae solo la información que se presentará en la página web. En este caso, agregar una contraseña realmente no confiere ninguna seguridad adicional, ya que esa información ya debe ser pública, y el usuario no puede acceder a ningún otro dato que sea más confidencial.
También asegúrese de que la conexión a la base de datos se realice mediante TLS, o cualquier persona que escuche en la red puede obtener sus credenciales.
Tercero , considere qué tipo de credenciales usar. Las contraseñas son solo una forma, y no las más seguras. En su lugar, podría usar alguna forma de par de claves pública / privada, o AD / PAM o similares.
Cuarto , considere las condiciones bajo las cuales se ejecutará el script:
Si se ejecuta de forma interactiva, debe ingresar la contraseña, o la contraseña de la clave privada, o la clave privada, o iniciar sesión con un ticket Kerberos válido, cuando lo ejecute; en otras palabras, el script debe obtener su credenciales directamente de usted en el momento en que lo ejecuta, en lugar de leerlas de algún archivo.
Si se ejecuta desde un servidor web, considere configurar las credenciales en el momento en que inicie el servidor web. Un buen ejemplo aquí son los certificados SSL: tienen un certificado público y una clave privada, y la clave privada tiene una contraseña. Puede almacenar la clave privada en el servidor web, pero aún necesita ingresar la contraseña cuando inicie Apache. También podría tener las credenciales en algún tipo de hardware, como una tarjeta física o un HSM, que se pueden quitar o bloquear una vez que se inicia el servidor. (Por supuesto, la desventaja de este método es que el servidor no puede reiniciarse solo si algo sucede. Preferiría esto al riesgo de que mi sistema se vea comprometido, pero su kilometraje puede variar ...)
Si el script se ejecuta desde cron, esta es la parte difícil. No desea tener las credenciales en cualquier lugar de su sistema donde alguien pueda acceder a ellas, pero sí quiere tenerlas por ahí para que su script pueda acceder a ellas, ¿verdad? Bueno, no del todo bien. Considere exactamente lo que está haciendo el guión. ¿Qué permisos necesita en la base de datos? ¿Se puede restringir para que no importe si la persona equivocada se conecta con esos permisos? ¿Puede ejecutar el script directamente en el servidor de base de datos al que nadie más tiene acceso, en lugar de hacerlo desde el servidor que tiene otros usuarios? Si, por alguna razón que no se me ocurre, absolutamente debe tener el script ejecutándose en un servidor inseguro y debe ser capaz de hacer algo peligroso / destructivo ... ahora es un buen momento para repensar su arquitectura.
Quinto , si valora la seguridad de su base de datos, no debería ejecutar estos scripts en servidores a los que otras personas tienen acceso. Si alguien ha iniciado sesión en su sistema, tendrá la posibilidad de obtener sus credenciales. Por ejemplo, en el caso de un servidor web con un certificado SSL, existe al menos una posibilidad teórica de que alguien pueda obtener root y acceder al área de memoria del proceso httpd y extraer las credenciales. Ha habido al menos un exploit en los últimos tiempos en el que esto podría hacerse a través de SSL, sin siquiera requerir que el atacante inicie sesión.
También considere usar SELinux o apparmor o lo que esté disponible para su sistema para restringir qué usuarios pueden hacer qué. Permitirán que no permita que los usuarios intenten conectarse a la base de datos, incluso si logran obtener acceso a las credenciales.
Si todo esto le parece excesivo , y no puede permitirse el lujo o no tiene tiempo para hacerlo, entonces, en mi opinión (arrogante y elitista), no debería almacenar nada importante o sensible en su base de datos. Y si no está almacenando nada importante o sensible, entonces el lugar donde almacena sus credenciales tampoco es importante, en cuyo caso, ¿por qué usar una contraseña?
Por último , si no puede evitar almacenar algún tipo de credenciales, podría tener las credenciales de solo lectura y propiedad de root y root podría otorgar la propiedad de forma extremadamente temporal cuando un script lo solicite (porque su script no debe ser ejecutar como root a menos que sea absolutamente necesario, y conectarse a una base de datos no lo hace necesario). Pero todavía no es una buena idea.