security - politica - programa para guardar contraseñas gratis
GAE: ¿mejores prácticas para almacenar claves secretas? (4)
¿Existen formas no terribles de almacenar claves secretas para Google App Engine? ¿O, al menos, menos terrible que comprobarlos en el control de la fuente?
Mientras tanto, Google agregó un Servicio de administración de claves: https://cloud.google.com/kms/
Podría usarlo para encriptar sus secretos antes de almacenarlos en una base de datos, o almacenarlos en código fuente codificado. Solo las personas con acceso de "descifrado" a KMS y a sus secretos podrían usarlos.
El hecho es que las personas que pueden implementar código siempre podrán acceder a sus secretos (suponiendo que su aplicación GAE necesite ser capaz de usar los secretos), pero no hay forma de evitarlo por lo que puedo pensar.
No hay una solución fácil aquí. Comprobar las claves en el repositorio es malo, ya que verifica en detalles de configuración irrelevantes y porque potencialmente expone datos confidenciales. Por lo general, creo un modelo de configuración para esto, con exactamente una entidad, y establezco las opciones de configuración y las claves relevantes después de la primera implementación (o cada vez que cambian).
Alternativamente, puede verificar un archivo de configuración de muestra, luego excluirlo del control de versión y conservar las claves reales localmente. Sin embargo, esto requiere cierta forma de distribuir las claves, y hace que sea imposible para un desarrollador implementar a menos que tengan las claves de producción (y todo para implementar accidentalmente el archivo de configuración de muestra sobre el vivo).
Tres formas en que puedo pensar:
- Guárdelo en DataStore (puede ser codificado en base64 para tener un nivel más de indirección)
- Pasarlo como variables de entorno a través de parámetros de línea de comandos durante la implementación.
- Mantenga un archivo de configuración, git-ignórelo y léalo del servidor. Aquí este archivo puede ser un archivo .py si está utilizando una implementación de Python, por lo que no se puede leer ni almacenar archivos .json.
NOTA: Si está tomando la ruta del archivo conf, ¡no almacene este JSON en las carpetas públicas estáticas!
No es exactamente una respuesta:
- Si mantiene claves en el modelo, cualquiera que pueda implementar puede leer las claves del modelo e implementarlas nuevamente para cubrir sus pistas. Si bien Google te permite descargar código (a menos que deshabilites esta función), creo que solo conserva la última copia de cada versión numerada.
- Si mantiene las claves en un archivo de configuración no registrado e inhabilita la descarga de códigos, solo las personas con las claves pueden desplegar con éxito, pero nadie puede leer las claves sin tener que abrir una puerta trasera en la implementación (lo cual no es difícil).
Al final del día, cualquiera que pueda implementar puede acceder a las claves, por lo que la pregunta es si cree que el riesgo se minimiza almacenando claves en el almacén de datos (que puede realizar copias de seguridad, por ejemplo) o en las máquinas del implementador.
Una alternativa viable podría ser combinar los dos: almacene las claves API encriptadas en el almacén de datos y coloque la clave maestra en un archivo de configuración. Esto tiene algunas características potencialmente agradables:
- Los atacantes necesitan tanto acceso a una copia del almacén de datos como a una copia del archivo de configuración (y presumiblemente los desarrolladores no hacen copias de seguridad del almacén de datos en una computadora portátil y lo pierden en el tren).
- Al especificar dos claves en el archivo de configuración, puede hacer la transferencia de teclas (para que los atacantes necesiten un datastore / config de una antigüedad similar).
- Con la criptografía asimétrica, puede hacer posible que los desarrolladores agreguen una clave API al almacén de datos sin necesidad de leer los demás.
Por supuesto, luego está cargando criptografía en los servidores de Google, que pueden o no contar como criptografía "exportadora" con los problemas legales habituales (por ejemplo, ¿qué ocurre si Google configura un centro de datos de Asia y el Pacífico?).