您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

Docker容器明文密碼解決方案

大小:0.4 MB 人氣: 2017-10-13 需要積分:1
 Docker 帶著 “Dockerize Everything” 的口號(hào),以“軟件標(biāo)準(zhǔn)”的姿態(tài)展現(xiàn)于世人面前,不斷影響大家對(duì)于軟件的理解。然而現(xiàn)實(shí)是否就如想象中的那么飽滿,新的科技誕生之際,是摧枯拉朽之勢(shì),還是循序漸進(jìn),皆有個(gè)過(guò)程,面對(duì)異軍突起的 Docker,軟件傳統(tǒng)的精髓又是何去何從?這些無(wú)一不是值得深思的話題。
  在《存儲(chǔ)類 Docker 容器的明文密碼問(wèn)題》一文中,我們初步領(lǐng)略了存儲(chǔ)類軟件與 Docker 結(jié)合時(shí),存在的些許安全隱患,比如明文密碼問(wèn)題。
  過(guò)去數(shù)十年間,MySQL 數(shù)據(jù)庫(kù)的創(chuàng)建都在人機(jī)交互過(guò)程中完成,流程大致可以分為以下三個(gè)步驟:
  運(yùn)維人員創(chuàng)建機(jī)器,安裝并配置 MySQL 服務(wù)器;
  DBA 負(fù)責(zé)管理 MySQL 數(shù)據(jù)庫(kù),如 MySQL 數(shù)據(jù)庫(kù)的創(chuàng)建、刪除與權(quán)限更改等;
  開(kāi)發(fā)人員使用 DBA 交付的數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查等操作。
  MySQL 歷經(jīng)了許多年,形成了以上這種交付方式,在 Docker 誕生之前,沒(méi)有任何風(fēng)吹草動(dòng)。然而,在 Docker 誕生之后,MySQL 的 Docker 化路程似乎并不平坦。
  常言道,Docker 橫空出世,極大地推動(dòng)了DevOps的發(fā)展。雖然看似 MySQL 與 Docker 的結(jié)合并沒(méi)有對(duì)開(kāi)發(fā)造成直接的影響,但是 Docker 化的 MySQL 的確加速了運(yùn)維進(jìn)度,原本冗長(zhǎng)的人機(jī)交互,以及多方協(xié)調(diào),如今一條簡(jiǎn)易的docker run命令即可全部完成。無(wú)可否認(rèn),自動(dòng)化的程度有了質(zhì)的飛躍,然而當(dāng)我們審視自動(dòng)化流程時(shí),我們也可以從中找到一些隱患——MySQL容器的明文密碼問(wèn)題。
  MySQL 容器的明文密碼問(wèn)題,指的是:Docker 創(chuàng)建 MySQL 容器時(shí),通過(guò)環(huán)境變量的方式傳遞 MySQL 存儲(chǔ)引擎的密碼,縱使 MySQL 會(huì)對(duì)密碼進(jìn)行加密,然而環(huán)境變量的存在卻會(huì)泄漏密碼信息,因此存在安全隱患。
  明文密碼解決方案
  Docker 容器的明文密碼問(wèn)題,在于控制流程的過(guò)于自動(dòng)化,并且環(huán)境變量的方式又無(wú)可避免地使用明文記錄了密碼。在一個(gè)完整的 MySQL 容器創(chuàng)建過(guò)程中,環(huán)境變量和 MySQL 引擎密碼始終保持一致,假設(shè)我們可以做到用戶為 MySQL 設(shè)定的密碼最終可以落實(shí)到 MySQL 引擎處,而不存在于任何環(huán)境變量中,那就可以說(shuō)明明文密碼可以解決。換言之,用戶為 MySQL 容器設(shè)定的密碼時(shí),可以繞過(guò)環(huán)境變量。眾所周知,環(huán)境變量在 Docker 的世界中是配置環(huán)境最常用的方式,連完成容器間通信的docker link命令最終也是通過(guò)環(huán)境變量來(lái)完成。
  繞過(guò)環(huán)境變量又是從何說(shuō)起,首先讓我們分析下圖。
  Docker容器明文密碼解決方案
  上圖中,我們通過(guò) Docker Daemon 創(chuàng)建了兩個(gè) MySQL 容器,容器名分別為 MySQL1 和 MySQL2,并且兩個(gè)容器中的 MySQL 引擎的密碼分別為 mysql1 和 mysql2。創(chuàng)建容器時(shí)使用的命令分別為:
  docker run -d -e MYSQL_ROOT_PASSWORD=daocloud --name MySQL1 mysql docker run -d -e MYSQL_ROOT_PASSWORD=docker --name MySQL2 mysql
  假設(shè)一位用戶希望創(chuàng)建一個(gè)密碼不會(huì)泄漏的 MySQL 容器,密碼為 daocloud。為了彌合明文密碼問(wèn)題,繞過(guò)環(huán)境變量,我們可以按照以下三個(gè)步驟來(lái)完成。
  1.創(chuàng)建兩個(gè) MySQL 容器 MySQL1 與 MySQL2,MySQL 的 root 密碼分別為 daocloud 與 docker;
  2.待 MySQL1 啟動(dòng)完畢,使用docker stop命令停止 MySQL1 容器,并將 MySQL1 容器的 volume1 全部拷貝出來(lái),最終使用docker rm命令刪除 MySQL1 容器;
  3.待 MySQL2 啟動(dòng)完畢,使用docker stop命令停止 MySQL2 容器,并將 MySQL2 容器 volume2 內(nèi)的文件全部刪除,接著將 volume1 的內(nèi)容拷貝至 volume2 下,最終啟動(dòng) MySQL2。
  通過(guò)以上三個(gè)步驟,我們直接交付 MySQL2 容器,此時(shí) MySQL2 容器中 MySQL 的 root 密碼為 daocloud,即目標(biāo)達(dá)成。雖然 MySQL2 容器的環(huán)境變量 MYSQLROOTPASSWORD 依舊是 docker,但是 MySQL 引擎使用的密文密碼已經(jīng)轉(zhuǎn)變?yōu)?daocloud,交付完畢的 MySQL2 容器中不存在任何有關(guān)字符串 daocloud 的明文信息,同時(shí)無(wú)需再使用的 MySQL1 容器也被我們刪除。
  上述流程的執(zhí)行,可以很巧妙的通過(guò)替換volume的方式,完成密文的轉(zhuǎn)移,同時(shí)使得明文環(huán)境變量的失效。
  Docker層與應(yīng)用層
  通過(guò)實(shí)踐,可以驗(yàn)證解決方案的可行性。不過(guò)很多讀者看到這里,不禁會(huì)對(duì)上述方案產(chǎn)生一些質(zhì)疑,是否替換 volume 就是一個(gè)合理的解決方案。
  以下的觀點(diǎn),相信很多人會(huì)認(rèn)為同樣是合理的解決方案。
  明文密碼固然是一個(gè)大問(wèn)題,然而當(dāng) MySQL 容器創(chuàng)建完畢之后,用戶完全有權(quán)限通過(guò) mysql-client 等工具登陸 MySQL 引擎,實(shí)現(xiàn) MySQL 引擎 root 密碼的修改,最終的結(jié)果是:密碼修改同樣會(huì)作用到 volume 中的密文,使得充當(dāng)明文密碼的 Docker 容器環(huán)境變量失效。
  不可否認(rèn),上述觀點(diǎn)同樣具有可行性。仔細(xì)分析和對(duì)比兩種解決方案,可以看到兩者之間存在一些明顯的差異。
  最大的差異性,當(dāng)屬通用性。替換 volume的方式,雖然在容器創(chuàng)建流程中加入了部分額外的操作(比如創(chuàng)建兩個(gè)容器、啟動(dòng)容器、替換 volume等),但是在通用性方面,優(yōu)勢(shì)十分明顯。通用性的體現(xiàn)何在?本文舉例的是 MySQL 容器,其實(shí)其他存儲(chǔ)類 Docker 容器如 MongoDB、Redis 等,均可以采用這種方式。
  換言之,對(duì)于存儲(chǔ)類 Docker 容器而言,Docker Daemon 的管理員無(wú)需獲知容器內(nèi)部運(yùn)行的是何種服務(wù),機(jī)械化操作替換volume即可導(dǎo)致明文密碼失效。通過(guò) mysql-client 修改密碼的方式,只能由容器的用戶來(lái)完成,而現(xiàn)實(shí)情況中, Docker Daemon 管理員與容器用戶很有可能并非同一個(gè)人,尤其是在公有云服務(wù)上。因此,Docker Daemon 交付出的容器,必須由用戶進(jìn)行二次加工,才能真正滿足用戶需求,無(wú)疑在便捷性方面,無(wú)法盡如人意。
  更為細(xì)致的比較,我們就能發(fā)現(xiàn):其實(shí)兩者的實(shí)現(xiàn)的立足點(diǎn)不同。替換 volume則是從 Docker 層出發(fā);而修改密碼則是站在應(yīng)用層出發(fā)。
  何為Docker層?Docker 是一款軟件,Docker 的世界中 Docker 鏡像、Docker 容器等,對(duì)于容器的管理(比如啟動(dòng)停止、環(huán)境變量的設(shè)置等),筆者都認(rèn)為是 Docker 層的概念。
  何為應(yīng)用層?此處的應(yīng)用層,指的是與用戶鏡像內(nèi)或者容器內(nèi)與應(yīng)用直接相關(guān)的內(nèi)容。
  依然以 MySQL 為例,通過(guò) MySQL 鏡像啟動(dòng) MySQL 容器時(shí),會(huì)使用MYSQL_ROOT_PASSWORD這個(gè)環(huán)境變量。環(huán)境變量是一個(gè) Docker 層的概念,原因很簡(jiǎn)單,Docker Daemon 會(huì)機(jī)械化地將所有用戶設(shè)置的環(huán)境變量作用到容器進(jìn)程,而不會(huì)去關(guān)心具體哪個(gè)環(huán)境變量在容器中充當(dāng)什么樣的角色。同樣的道理,名為MYSQL_ROOT_PASSWORD的環(huán)境變量就是一個(gè)應(yīng)用層的概念,這個(gè)具體的環(huán)境變量,有可能會(huì)被容器內(nèi)部的應(yīng)用進(jìn)程來(lái)使用,最終影響容器內(nèi)部的應(yīng)用。
  同樣的道理,volume 是一個(gè) Docker 層的概念,volume 內(nèi)部的具體內(nèi)容則是應(yīng)用層的概念。因此,通過(guò) volume 來(lái)操作容器,屬于 Docker 層的操作,不會(huì)涉及任何應(yīng)用層的內(nèi)容。而通過(guò)事先獲知容器內(nèi)部應(yīng)用的詳細(xì)情況,再針對(duì)應(yīng)用進(jìn)程做出相應(yīng)的行為,則屬于應(yīng)用層的操作。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?