Le variabili di ambiente (impostate con -e
) nei contenitori Docker sono disponibili per ogni contenitore collegato.
Considera un tipico caso d'uso, un database. L' immagine MySQL ufficiale fornisce questo comando di esempio:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
Ho appena inserito la mia password come testo normale in una variabile di ambiente. Per essere sicuro, devi docker inspect
per vederlo, e se puoi farlo, significa che hai accesso root al sistema operativo host, che è comunque il gioco ... Quindi andiamo avanti.
Ora voglio anche creare un wiki. Usiamo questa immagine MediaWiki . Dobbiamo anche collegare il database:
docker run --name some-mediawiki --link some-mysql:mysql -d synctree/mediawiki
Oops! Quando ho collegato some-mysql
, le variabili di ambiente si sono propagate e ora some-mediawiki
può vedere anche MYSQL_ROOT_PASSWORD
! Ciò significa che se qualcuno dovesse compromettere il wiki, potrebbe potenzialmente anche trovare la password di root, e poi entrare nel database con esso attraverso il link.
C'è stata qualche discussione da parte degli sviluppatori di Docker su questo, e la conclusione è che le variabili d'ambiente non sono mai state pensate per condividere segreti in ogni caso, ed è un errore usarle in questo modo. Eppure tutto il tempo che vedo le immagini che passano la password come una variabile di ambiente, anche molte immagini di database ufficiali fanno questo. Perché?