Las variables de entorno (establecidas con -e
) en los contenedores de Docker están disponibles para cada contenedor vinculado.
Considere un caso de uso típico, una base de datos. La imagen de MySQL oficial da este comando de ejemplo:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
Acabo de poner mi contraseña como texto sin formato dentro de una variable de entorno. Para estar seguro, necesita docker inspect
para verlo, y si puede hacerlo, eso significa que tiene acceso de root al sistema operativo host, que es el juego final de todos modos ... Así que sigamos adelante.
Ahora quiero configurar un wiki también. Vamos a usar esta imagen de MediaWiki . También necesitamos vincular la base de datos:
docker run --name some-mediawiki --link some-mysql:mysql -d synctree/mediawiki
¡Vaya! Cuando vinculé some-mysql
, las variables de entorno se propagaron y ahora some-mediawiki
también puede ver MYSQL_ROOT_PASSWORD
. Esto significa que si alguien comprometiera la wiki, también podría encontrar la contraseña de root y luego ingresar a la base de datos a través del enlace.
Los desarrolladores de Docker han discutido sobre esto, y la conclusión es que las variables de entorno nunca fueron diseñadas para compartir secretos de manera segura, y es un error usarlas de esta manera. Sin embargo, todo el tiempo veo imágenes que pasan la contraseña como una variable de entorno, incluso muchas imágenes de bases de datos oficiales hacen esto. ¿Por qué?