sql server - usuario - ¿La mejor manera de almacenar una contraseña de base de datos en un script/archivo de configuración de inicio?
reporting services sin credenciales (7)
¿Texto sin formato? Si están en su servidor, espero que el servidor sea lo suficientemente seguro como para no permitir el acceso no autorizado. Si las personas pueden acceder a sus archivos de configuración en el servidor, algo ha ido mal mucho antes.
Por lo tanto, nuestras aplicaciones de servidor web deben conectarse a la base de datos, y algunas otras aplicaciones tienen scripts de inicio que se ejecutan en el momento del inicio.
¿Cuál es la mejor manera de almacenar el nombre / contraseña para estas aplicaciones, en términos de
- seguridad, por ejemplo, tal vez no queremos que los administradores de sistemas conozcan la contraseña de la base de datos
- mantenimiento, por ejemplo, facilitando el cambio de la configuración cuando cambia la contraseña, etc.
¡tanto Windows como soluciones de Linux apreciadas!
Estoy de acuerdo con lomaxx: si alguien ya está en el servidor o tiene un amplio rango de acceso a él (como un administrador de sistemas), el juego ya casi ha terminado. Entonces, la idea sería usar un servidor en el que confíe que sea seguro en la medida en que lo desee. Específicamente:
- Debes confiar en los administradores de sistemas
- Debes confiar en cualquier otra persona que esté ejecutando código en el mismo servidor (esta es la razón por la cual el alojamiento compartido es un gran no-no para mí)
Más allá de eso, las variables de entorno parecen ser una opción popular para almacenar estos tipos de credenciales, porque esto significa que el acceso a la fuente solamente (por ejemplo, al comprometer el cuadro dev) no lo revela directamente y también puede estar muy bien localizado para cada servidor (desarrollador, prueba, etc.).
La mejor manera de proteger su contraseña es dejar de usar una. Utilice una conexión de confianza: Cómo: Conectarse a SQL Server mediante la autenticación de Windows en ASP.NET 2.0 . Entonces no tiene nada que ocultar: publique su web.config y fuente en el mundo, todavía no pueden acceder a su base de datos.
Si eso no funciona para usted, use el sistema de encriptación de configuración incorporado en ASP.NET .
PostgreSQL ofrece una buena solución para este tipo de situación en su documentación. Esencialmente, utiliza ssh para unir un puerto de su máquina al puerto del servidor PostgreSQL en la máquina remota. Esto tiene tres etapas de autenticación:
- Restrinja el acceso al puerto local, como permitir que un usuario en particular se conecte a él.
- Configure una conexión sin contraseña para el host de PostgreSQL con ssh como usuario particular.
- Permita que el usuario ssh se conecte para tener acceso local a PostgreSQL sin una contraseña.
Esto reduce la seguridad de si sus cuentas de usuario están protegidas y su configuración ssh es sólida, y no necesita una contraseña almacenada en ningún lugar.
Editar : debo agregar que esto funcionará con cualquier base de datos que escuche un puerto TCP / IP. Simplemente sucede que se describe en PostgreSQL. Y querrá que iptables (o el equivalente de Linux) haga las restricciones de puerto. Mira esto
Puede hornear una clave de cifrado simétrica en su binario y hacer que ese binario lea un nombre de usuario / contraseña cifrado de un archivo en el disco cuando se inicia.
Sin embargo, esto no es mucho más que ofuscación, ya que es probable que su código esté almacenado en algún repositorio de origen en alguna parte.
Sugeriría que sería mejor controlar el acceso a sus servidores tanto físicamente como a través de la red usando un firewall y una burbuja de red privada, y almacenar las contraseñas sin cifrar (o codificadas en base 64) en el disco con los permisos bloqueados al usuario de ejecución para su aplicación web.
También puede bloquear el servidor de la base de datos para que solo acepte las conexiones de las máquinas de aplicaciones web por IP.
En última instancia, su problema es que la clave (su par de nombre de usuario / contraseña de DB) debe estar disponible para su uso programático y desatendido por sus aplicaciones web.
aclaración: en términos de seguridad, mantenimiento (por ejemplo, si el inicio de sesión necesita cambiar, ¿puedo encontrarlo más tarde, etc.)
@lomax: quizás no quiera que todos los que tengan acceso al servidor físico (por ejemplo, los administradores de sistemas) vean la contraseña.
¡Gracias!
En la mayoría de los casos, creo que es suficiente para ocultar la contraseña en un archivo de texto sin formato (por ejemplo, con base64). No puede proteger completamente una contraseña almacenada contra un administrador de sistema determinado con acceso de administrador, por lo que no es necesario intentarlo. La ofuscación simple, sin embargo, protege contra revelar accidentalmente la contraseña a un surfista de hombro.
Una alternativa más compleja es configurar un servidor de contraseñas seguras dedicado que:
- proporciona un servicio de descifrado de contraseñas
- en realidad almacena las contraseñas para el uso de otros servidores menos seguros
Dependiendo de los protocolos de red utilizados, esto puede no proteger contra un administrador de red deshonesto con tcpdump. Y probablemente tampoco protegerá contra un administrador de sistemas determinado con un depurador. En ese momento, tal vez sea hora de mirar algo así como las entradas de Kerberos.