¿Normas para cifrar contraseñas en archivos de configuración?

52

Mi lugar de trabajo tiene el estándar de que las contraseñas de texto simple no están permitidas en los archivos de configuración de la aplicación. Esto tiene bastante sentido en su cara, en caso de que alguien tenga acceso a los archivos de configuración, no tienen acceso automáticamente a todos los privilegios de esa aplicación. En algunos casos, es posible y obviamente preferible tener acceso asociado con el inicio de sesión o evitar tener una contraseña, como en la seguridad de Windows para la autenticación de SQL Server, o configurarlo en una ubicación de terceros, como la configuración JDBC en un entorno J2EE , Pero esto no siempre es posible.

  • Cuando debo tener una contraseña en un archivo de configuración, ¿qué nivel de cifrado debería tener?
  • ¿Cómo lidias con el hecho de que la clave de cifrado de la contraseña debe estar codificada o almacenada en otro archivo de configuración?
  • ¿Las claves de cifrado para la contraseña deben ser legibles por humanos?
pregunta C. Ross 16.05.2012 - 17:40
fuente

5 respuestas

24

Así que lo siguiente fue un poco demasiado largo para un comentario ...

Tal vez sea útil dar un paso atrás y comparar los beneficios de los controles preventivos y de detección. Los controles preventivos incluyen el cifrado, pero también puede codificar la contraseña para que sea menos evidente. Este enfoque está destinado a proteger la contraseña de una compartición accidental (una codificación b32 produciría caracteres menos significativos (b32 produce una cadena más larga que b64). Este enfoque solo aumenta la dificultad de memorizar la secuencia aleatoria de números, así como el método que debería Se puede utilizar para descodificar la cadena. La codificación Base32 / 64 es una forma sencilla de proteger contraseñas que no requieren la creación o el mantenimiento de lógica adicional.

Los otros enfoques de los controles preventivos probablemente usarán el cifrado. Hay muchas maneras diferentes de proteger la clave. Sin entrar en detalles o reiterar lo que D.W. Ya publicado, puede colocar controles de detección para mejorar la postura de seguridad. Por ejemplo, puede auditar el acceso a un archivo que contiene la clave. Puede correlacionar eventos (como el reinicio del servidor / servicio) con el acceso al archivo de claves. Cualquier otra solicitud de acceso (exitosa o no) al archivo clave podría indicar una actividad anormal.

Para llegar a sus preguntas, aquí está mi opinión:

si tiene que almacenar la contraseña en un archivo de configuración, recomendaría al menos codificar la contraseña cuando sea posible. Codificar la contraseña reduciría la posibilidad de que se filtre en el caso de que alguien se desplace por el archivo, por ejemplo, con un representante de soporte del proveedor mirando. Encriptar la contraseña es mucho más seguro, pero eso requiere una complejidad adicional.

Cómo lidiar con el hecho de que una clave tiene que ser codificada o almacenada en otro archivo. Bueno, separar la clave de cifrado en otro archivo aumenta la dificultad para que alguien vea la clave. Por ejemplo, puede usar el control de acceso para limitar el acceso al archivo de claves pero aún así mantener una ACL más abierta para el archivo de configuración. De manera similar, puede implementar una auditoría para acceder al archivo de claves, que puede usar para correlacionar con eventos que requieren el uso de claves. La codificación difícil de la clave puede estar bien si limita el acceso al binario. La codificación cuidadosa de la contraseña se puede detectar fácilmente ejecutando "cadenas" contra el binario. Puede codificar / cifrar la contraseña codificada (es decir, requerir una función separada (tal vez con auditoría) cuando decodificar la contraseña, pero eso aumenta la complejidad para el desarrollador y el administrador (es decir, cómo se puede cambiar la clave sin reconstruir / recompilar el binario). ?).

¿Las claves de cifrado para la contraseña deben ser legibles por humanos? Depende. Solo hay un número limitado de formas de proteger la clave. Una clave de cifrado generalmente se ve como una cadena alfanumérica a la que es difícil comprometerse con la memoria. Siempre puede codificar / cifrar la clave, pero tales métodos no disuaden a alguien que sea lo suficientemente inteligente como para tomar una captura de pantalla. Sin embargo, puede usar "claves" simples (más como contraseñas) como entrada a una función de expansión de clave. En esos casos, quizás las medidas adicionales, como la codificación, agreguen algún valor adicional en relación con el costo de la complejidad.

En todo caso, un buen enfoque es implementar varias capas de controles. Los controles preventivos son más difíciles, mientras que los controles de detección son generalmente más fáciles de implementar. La separación de archivos clave podría simplificar la arquitectura general y la implementación de los controles. Independientemente de si se utilizan controles preventivos o de detección, habilitar algunas funciones de auditoría es una necesidad junto con la revisión de los registros de auditoría. De esta forma, en caso de que ocurra lo improbable (acceso a la clave), puede tomar medidas correctivas.

    
respondido por el bangdang 17.05.2012 - 01:14
fuente
35

Si está ejecutando un servidor que necesita una contraseña para acceder a algún servicio remoto, entonces no hay una buena solución. El almacenamiento de la contraseña en un archivo de configuración almacenado en una ubicación adecuada probablemente está haciendo lo mejor de un conjunto de malas elecciones.

Las opciones son: hacer que un usuario ingrese la contraseña en el momento del inicio (esto es malo, porque si su servidor se reinicia, ahora no se puede acceder al servidor hasta que una persona pueda caminar físicamente hasta el servidor e ingresar la contraseña); codifique la contraseña en el código fuente del código del servidor (esto es mucho peor que ponerlo en un archivo de configuración); o almacene la contraseña en un archivo de configuración (la menos mala de todas las opciones). Lo principal a tener en cuenta con el archivo de configuración, es asegurarse de que esté almacenado fuera de la raíz de su web y que sus permisos de archivo estén correctamente bloqueados.

El cifrado de la contraseña que está almacenada en el archivo de configuración no ayuda, porque ahora, ¿dónde almacena la clave de descifrado? Acabas de cambiar el problema. "Es tortugas hasta el fondo" no es una respuesta aceptable.

En Windows, otra opción que podría considerar es almacenar la contraseña en DPAPI. Esto ayuda un poco para las aplicaciones de escritorio, pero no es muy útil para servidores desatendidos.

Para más información, lea las siguientes preguntas en este sitio: Almacene una contraseña para evitar la interacción del usuario , dónde almacenar una clave para el cifrado , ¿Cómo manejan los artefactos de código abierto los artefactos seguros? , ¿Cómo puedo descifrar los datos con Java sin tener que codificar la clave? , Contraseña en el archivo .php , ¿Dónde almaceno de forma segura la clave de un sistema donde la fuente está visible? .

P.S. En principio, podría usar un TPM para almacenar la contraseña, pero en la práctica, esto lo mete en problemas de vanguardia, por lo que probablemente no sea viable para la mayoría de las personas.

    
respondido por el D.W. 16.05.2012 - 18:52
fuente
4

Almacene la contraseña en una variable de entorno de usuario O / S (sin sesión) y ejecute el programa como ese usuario.

Ventajas:

  1. Nunca verificará accidentalmente la contraseña en el control de código fuente porque no hay ningún archivo que registrar.

  2. Si arruinas los permisos de archivo en tu archivo de configuración (lo que nunca sucede, ¿verdad?), tus contraseñas no están comprometidas

  3. El usuario o la raíz solo pueden leerlo (igual que un archivo de configuración, igual que una clave privada que protege un archivo cifrado)

  4. Si está cifrando el archivo, ¿cómo está protegiendo su clave?

  5. Sin embargo, limpie sus entornos antes de iniciar nuevos procesos, ya que pueden pasar a través de

Una ventaja para un HSM es que, si bien el usuario o la raíz pueden utilizar el HSM para descifrar un valor, nunca pueden obtener la clave en su interior.

    
respondido por el Neil McGuigan 19.11.2013 - 20:32
fuente
2

El almacenamiento local de contraseñas es un problema largo con el que estaba lidiando. ya que el cifrado no será a prueba de balas, pero puede ayudar, hay algunas otras opciones:

  1. almacene las contraseñas en la máquina local en un nuevo archivo (que también será mejor cifrar) y restringe el acceso al archivo
  2. almacene las contraseñas en otro servidor, que se autentificará a través de OAUTH u otro servicio de autenticación; consulte tahoe-lafs: enlace
  3. mediante el servicio local cifrado que almacena las contraseñas y accede a él mediante el certificado
  4. algunas organizaciones almacenan sus contraseñas como claves de registro o con DPAPI - enlace
  5. usando OTP usando el servicio de administración de cuentas
  6. utilizando un servidor proxy para acceder a datos confidenciales y restringir el acceso al proxy

.

y para sus preguntas:

  

Cuando debo tener una contraseña en un archivo de configuración, ¿qué nivel de cifrado debería llevar?

nunca debes tener contraseñas en tu código, pero es la forma más fácil y la más insegura.

  

¿Cómo lidias con el hecho de que la clave de cifrado de la contraseña debe estar codificada o almacenada en otro archivo de configuración?

usando restricciones de acceso y monitoreando el archivo

  

¿Las claves de cifrado para la contraseña deben ser legibles por humanos?   Si te refieres a contraseñas seguras y fáciles de leer, no hay ningún problema

    
respondido por el Sergey Malych 08.02.2014 - 16:41
fuente
0

Mis 2 centavos aquí es que, para una seguridad perfecta, querría que la aplicación pudiera hacer algo (leer una contraseña) que un atacante en la máquina física con los mismos privilegios no debería poder hacer, lo cual Parece una contradicción.

En el mejor de los casos, podría ofuscar la contraseña en la configuración ( Base64 , clave en algún lugar de la computadora, etc.)

    
respondido por el Nicolas C 21.02.2017 - 15:19
fuente

Lea otras preguntas en las etiquetas