Tengo una imagen base docker que se utiliza para ejecutar el software de análisis de imágenes. Para cada contenedor creado a partir de la imagen, hay un conjunto de ajustes de configuración, algunos de los cuales son secretos (claves de cifrado, información del cliente, etc.) que el software utiliza para analizar y distribuir las imágenes procesadas. ¿Cómo puedo pasar estos secretos de forma segura a un contenedor?
docker
secret-management
PrestonM
fuente
fuente
Respuestas:
Tiene 3 métodos para obtener secretos para una aplicación dentro de un contenedor acoplable. Los primeros 2 involucran la configuración del acoplador. El último es hacer que sus aplicaciones busquen directamente secretos de una tienda secreta.
1 - Variables de entorno
Según la guía "The 12 Factor App" , los secretos son meramente config, y siempre deben establecerse en el entorno. Puede configurar sus secretos como variables de entorno durante la ejecución de la ventana acoplable, y su aplicación accede a ellos desde allí.
2 - Volúmenes montados
Puede tener todos sus secretos dentro de un archivo de configuración / secretos particular, luego montarlo en su instancia como un volumen montado .
3 - Recuperar de la tienda secreta
Como se menciona en @ 030, puede usar Hashicorp Vault (o "Amazon Secrets Manager", o cualquier servicio como ese).
Su aplicación o una aplicación de sidecar pueden obtener los secretos que necesita directamente, sin tener que lidiar con ninguna configuración en el contenedor Docker. Este método le permitiría usar secretos creados dinámicamente (una característica muy atractiva de tales sistemas) y sin tener que preocuparse de que los secretos se puedan ver desde el sistema de archivos o de inspeccionar las variables env del contenedor docker.
Opinión personal
Creo que las variables env son el camino a seguir. Es más fácil de administrar, y aún puede extraerlo de una tienda secreta como Hashicorp Vault, si tiene su sistema de compilación CI extraiga los secretos durante la compilación y configúrelos cuando implemente. Obtiene lo mejor de ambos mundos y el beneficio adicional de que sus desarrolladores no necesitan escribir código de aplicación para obtener secretos.
Los desarrolladores deben centrarse en la funcionalidad de su código y no en las tareas administrativas, como buscar contraseñas.El código de su aplicación debe centrarse en la funcionalidad de su propia aplicación y no en tareas de backend como recuperar contraseñas. Al igual que los estados de la aplicación 12 Factor.
Editar: se modificó la última oración para eliminar la implicación del desarrollador frente al silo de SysAdmin. Las tareas en sí mismas deben estar separadas de la perspectiva del código, pero DevOps trata de las mismas personas teniendo en cuenta a ambos y no debe limitarse.
Opinión personal (actualización)
Según el excelente comentario de @Dirk ( Pasando secretos a un contenedor Docker ), hay un argumento muy fuerte para priorizar una tienda secreta sobre ENV vars, debido a que no quieren filtrarlos.
fuente
inspect
oexec
. Las variables de entorno a menudo sestdout
vuelcan ao en archivos de registro cuando se ejecutan en algún modo de depuración. Todos los procesos secundarios generados pueden leerlos y exponerlos que pueden estar fuera de su control. Más información, por ejemplo, aquí: diogomonica.com/2017/03/27/…Hay otra opción que solo usa pipe:
Primero, cree el demonio de Docker con
-i
, el comandoread A
se bloqueará esperando la entrada de/proc/1/fd/0
; Luego ejecute el segundo comando acoplable, lea el secreto de stdin y redirija al último proceso de bloqueo.fuente