Pasando secretos a un contenedor Docker

26

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?

PrestonM
fuente
Bóveda de Hashicorp
030

Respuestas:

23

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.

BoomShadow
fuente
2
Esto promueve los silos. DevOps está haciendo cosas juntos en lugar de tirar cosas sobre la pared.
030
2
El código debe estar separado de los componentes de la infraestructura. Las personas reales podrían codificar tanto la automatización de la infraestructura como la base del código de la aplicación, pero las tareas mismas deberían estar separadas. Veo que la última oración de mi respuesta original fue aislar a los desarrolladores, a la gente. Eso es un error Lo editaré para que quede más claro.
BoomShadow
77
Poner secretos en variables de entorno ofrece varias posibilidades para que se filtren. Algunos ejemplos: todos los que tengan acceso al demonio Docker en la máquina que ejecuta el contenedor pueden verlos usando los comandos inspecto exec. Las variables de entorno a menudo se stdoutvuelcan 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/…
Dirk
1
También estoy lidiando con esta pregunta. Lo que no entiendo es que, incluso si usa una bóveda de credenciales para proteger sus secretos, aún debe autenticarse para obtener acceso a esa bóveda, y eso presumiblemente requiere algún secreto. La misma preocupación se aplica al uso de un archivo KeyStore protegido por contraseña. ¿Siempre estamos atrapados con pasar al menos la "meta credencial" en el entorno?
Wheezil
1
@Wheezil una meta-credencial es más fácil de asegurar que muchas credenciales específicas. puede rotar con frecuencia y automáticamente la meta credencial. la meta credencial puede ir a una bóveda que se encuentra en un host seguro y puede tener elementos como la lista blanca de IP para que solo acepte conexiones de sus subredes de producción. también puede asegurarse de que la bóveda use cifrado en reposo y cifrado en vuelo y tsl mutuo y fijación de certificados y todas las otras mejores prácticas que hacen las cosas más seguras.
simbo1905
1

Hay otra opción que solo usa pipe:

docker run -d -i --name $n alpine sh -c 'read A; echo "[$A]"; exec some-server'
docker exec -i $n sh -c 'cat > /proc/1/fd/0' <<< _a_secret_

Primero, cree el demonio de Docker con -i, el comando read Ase 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.

James ZM Gao
fuente