¿Son buenas las credenciales de la aplicación de cifrado que utilizan el cifrado de certificados?

2

Estoy trabajando en una pequeña aplicación web. La aplicación web necesita acceso a una base de datos, por lo que la aplicación necesita acceso a un nombre de usuario y contraseña de la base de datos.

La aplicación se ejecuta en un entorno donde las máquinas virtuales van y vienen y no hay discos persistentes. La única configuración de entorno que podemos configurar que permanece en el tiempo son los certificados, todas las demás configuraciones deben almacenarse como parte de la aplicación (que cargamos al servicio de alojamiento en un archivo zip). Los certificados que cargamos a los proveedores de alojamiento se instalan automáticamente en el almacén de certificados de Windows por parte del proveedor de alojamiento.

El servidor de la base de datos que estamos utilizando no admite la autenticación mediante certificados, solo el nombre de usuario y las contraseñas, por lo que me pregunto si el siguiente esquema tendría sentido:

  1. Creamos un certificado X509 autofirmado con openssl o makecert.
  2. Subimos el certificado (con clave privada) al proveedor de alojamiento (lo hacemos una vez, o cuando queremos renovar el certificado).
  3. Encriptamos las contraseñas de la base de datos en la configuración de la aplicación usando la parte de clave pública de nuestro certificado (usando RSACryptoServiceProvider ).
  4. Subimos la contraseña cifrada en un archivo de configuración como parte de nuestro paquete postal de aplicaciones al proveedor
  5. En nuestro código de aplicación, antes de conectarnos al servidor de la base de datos, desciframos la contraseña de la base de datos usando el certificado (nuevamente, usando RSACryptoServiceProvider)

Con esto, obtenemos lo siguiente:

  1. Cualquier persona (yo o mis amigos) que trabaje con la aplicación puede establecer una nueva contraseña de base de datos, cifrarla y actualizar la configuración de la aplicación, sin acceso a la clave privada en el certificado.
  2. Solo las personas con la clave privada (que está instalada en los servidores y almacenada localmente por mí) pueden descifrar la contraseña de la base de datos.

Parece que esta sería una solución bastante buena, pero agradecería que alguien más pudiera detectar un defecto.

    
pregunta Nitramk 01.09.2015 - 08:34
fuente

2 respuestas

3

En la superficie, esto suena como una buena idea, si intentas proporcionar un búfer contra:

  • Compromiso de control de versiones (git / svn hosting)
  • Robo de una máquina física que contiene el código base / credenciales
  • El software malicioso en una de las máquinas de tus desarrolladores filtra las credenciales de alguna manera.
  • Cualquier otra forma en que un atacante robe los archivos que contienen credenciales

Solo recuerde que esto no protegerá su base de datos si su aplicación web está comprometida, ya que aún tendrá las credenciales no cifradas en la memoria en algún momento. Sin embargo, si estás tratando de proteger las credenciales para que no sean robadas de algún lugar que no sea la máquina en vivo, esto debería funcionar bien.

También, en mi opinión, el entorno que estás describiendo parece bastante no estándar, lo que me preocupa un poco. Usted confía en cualquier servicio que el proveedor de alojamiento esté exponiendo para acceder a las claves privadas de manera considerable.

    
respondido por el Nic Barker 01.09.2015 - 09:26
fuente
1

No me queda claro si está utilizando Azure VM o PaaS, pero es posible que desee considerar un flujo con tokens SAS.

En Azure usted tiene un mecanismo incorporado llamado firmas de acceso compartido SAS. Puede leer más sobre SAS aquí enlace

Tu flujo sería así

  1. Pase las credenciales y obtenga un token SAS cronometrado una vez
  2. Puede usar SAS con granularidad funcional, es decir, diferentes tokens para diferentes operaciones de datos. Esto le dará una gran solución utilizando la funcionalidad nativa de Azure

Si bien existe la vulnerabilidad de almacenar un nombre de usuario / contraseña en su código de backend, si un atacante compromete la máquina física / máquina virtual o explota su código y eleva los permisos, usar el esquema de clave pública / privada que usted describe no será una seguridad efectiva contramedidas y solo le costará mucho dolor y tiempo de prueba y depuración. Así que olvídalo. Codifique sus credenciales en el código y use SAS

En general, realizaría un análisis de amenazas en su aplicación antes de implementar contramedidas de seguridad y, además, como una mejor práctica, ¡nunca sobre criptografía DIY!

    
respondido por el Danny Lieberman 01.09.2015 - 12:01
fuente

Lea otras preguntas en las etiquetas