從薪火相傳的密鑰文件到“密碼即服務(wù)”

一個(gè)可運(yùn)行的軟件項(xiàng)目通常包括兩個(gè)要素:代碼和密鑰醒串。我們通常會使用無版本控制的FTP有版本控制的SVN、git等成熟的工具進(jìn)行代碼管理家厌;而在我參加的大大小小、許許多多的項(xiàng)目中椎工,密鑰管理似乎缺乏成熟或標(biāo)準(zhǔn)的實(shí)踐饭于。本文將歷數(shù)一下筆者在各個(gè)使用過的密鑰管理實(shí)踐并分析他們的優(yōu)缺點(diǎn)。最后給大家推薦一款密鑰管理工具:vault维蒙。

在軟件項(xiàng)目開發(fā)中掰吕,密鑰常常應(yīng)用于下面四個(gè)場景:

  • 本地開發(fā):通常包括開發(fā)環(huán)境的數(shù)據(jù)庫密碼、用于訪問第三方API的token颅痊、一些私有程序包倉庫的憑證等殖熟。
  • CICD流水線:比如Push Docker鏡像的Docker倉庫的訪問憑證、用于部署的云服務(wù)憑證(AWS Secret等)斑响、用于訪問K8S集群的token等
  • 運(yùn)行線上服務(wù):線上服務(wù)啟動(dòng)所需的數(shù)據(jù)庫密碼菱属、API Token等等,同時(shí)可能需要管理用于多套環(huán)境的不同密鑰舰罚。
  • 線上運(yùn)維:線上發(fā)生事故時(shí)纽门,需要在本地登入堡壘機(jī)(跳板機(jī))的SSH Key或集群的訪問憑證。

本地開發(fā):“薪火相傳”的密鑰文件

當(dāng)我們加入一個(gè)團(tuán)隊(duì)時(shí)营罢,通常會有一個(gè)Readme文檔告訴你項(xiàng)目代碼庫的下載鏈接赏陵。除此之外它會告訴你需要向團(tuán)隊(duì)“前輩”索要密鑰文件,不然你的代碼是不能在本地啟動(dòng)的饲漾。同時(shí)有人告訴你瘟滨,這個(gè)密鑰文件千萬不要加入到git倉庫中。

這種“薪火相傳”的密鑰管理方式能颁,是最原始也是最常見的方式。它常常會伴隨這樣幾個(gè)問題:

  • 密鑰更換或者引入新的密鑰后倒淫,團(tuán)隊(duì)其它成員因?yàn)闆]有得到最新的密鑰文件伙菊,導(dǎo)致服務(wù)在本地起不來。

比如你會聽到這樣的對話:

  • A: “我拉了一下最近的代碼,怎么就跑不起來了镜硕?”
  • 坐在旁邊的B突然想起了什么:“好吧运翼,我想起來了!我改了一下數(shù)據(jù)庫密碼兴枯,忘記告訴你了血淌,我把最新的密鑰發(fā)給你〔破剩”或者“我新加了一個(gè)功能因?yàn)槭褂肁PI-KEY要訪問消息隊(duì)列悠夯,我在自己本地的環(huán)境變量里面加上了這個(gè)KEY,忘記告訴你們了”
  • 隨后B把最新的密鑰文件傳給了A躺坟。幾天后沦补,同在項(xiàng)目的C也遇到了同樣的問題……
  • 誤提交到代碼倉庫問題:

相信已經(jīng)不止一次地聽人提醒:千萬不要將密鑰文件明文提交到git。但是密鑰泄露在代碼倉庫的問題依舊時(shí)有發(fā)生咪橙。

本地開發(fā):將密鑰加密后存放在Git倉庫

密鑰和代碼一樣夕膀,在團(tuán)隊(duì)項(xiàng)目中同樣需要進(jìn)行共享、同步美侦。密鑰放在git倉庫中本來是可以解決團(tuán)隊(duì)協(xié)作問題的产舞,只不是不能被明文存儲。那么菠剩,如果是將密鑰加密后再提交到git倉庫呢易猫?

git-crypt便是這樣一款可將git倉庫中的密鑰文件進(jìn)行透明加密和解密的工具。它可以將密鑰文件在push時(shí)加密赠叼,在pull下來后解密擦囊。更多介紹和使用說明可以參考:https://github.com/AGWA/git-crypt

借助git版本控制工具嘴办,它可以實(shí)現(xiàn):

  • 使用git進(jìn)行密碼共享
  • 密鑰的版本控制
  • 用戶權(quán)限管理

問題:

  • 密碼可能在多個(gè)服務(wù)中使用瞬场,怎么同步?

持續(xù)集成流水線中的密鑰管理

持續(xù)集成與持續(xù)部署(CI/CD)

在現(xiàn)在的Web項(xiàng)目的CI/CD流程中涧郊,通常會將項(xiàng)目代碼經(jīng)過構(gòu)建打包生成docker鏡像(制品)贯被;在部署階段,不同環(huán)境會采用相同的docker鏡像妆艘,但是會使用不同的環(huán)境變量(比如集群彤灶、域名、數(shù)據(jù)庫地址密碼等)傳入到docker的運(yùn)行時(shí)批旺,從而完成在不同環(huán)境的部署幌陕。

環(huán)境(變量)在不同的CI/CD中有不同形式,比如的Jenkins的Credential汽煮、GoCD的Environment搏熄、CircleCI的Context棚唆。

如果將所有的部署與運(yùn)行時(shí)所需要的密鑰數(shù)據(jù)都保存到pipeline上,會導(dǎo)致下面的問題

  • 過多的密碼字段心例,將密碼作為環(huán)境變量一個(gè)個(gè)傳遞到服務(wù)十分復(fù)雜
  • pipeline存環(huán)境變量一般加密后難以解密宵凌,如果你設(shè)置完自己都忘記了,那這個(gè)環(huán)境就徹底忘了

解決的辦法一般是在pipeline上保存盡量少的密鑰字段止后,我們通過一次認(rèn)證就可以具備獲取所有密鑰數(shù)據(jù)的權(quán)限瞎惫。

密碼即服務(wù):Hashicorp Vault

在云和基礎(chǔ)設(shè)施自動(dòng)化時(shí)代,我們應(yīng)該知道一家名為Hashcorp的公司译株,其代表作有知名的terraform瓜喇、consul、packer古戴、vagrant欠橘。vault也是這家公司的產(chǎn)品之一,它通過API將密碼以服務(wù)的方式暴露出去现恼。它可以提供:

  • 中心化的密碼服務(wù)
  • 更安全的加密存儲
  • 密碼的服務(wù)化
  • 豐富的第三方集成:實(shí)現(xiàn)認(rèn)證的擴(kuò)展肃续、多平臺密鑰管理
Vault架構(gòu)

服務(wù)化后的vault可以做到

  • 與Github身份認(rèn)證集成,比如你可以做到只允許在特定git organization下的用戶才能獲取密鑰
  • 簽發(fā)臨時(shí)的SSH證書:比如你只允許一個(gè)30分鐘內(nèi)有效的SSH KEY來登錄堡壘機(jī)
  • 生成臨時(shí)的AWS KEY:比如你只能用一個(gè)30分鐘內(nèi)有效的AWS憑證
  • 定期更換數(shù)據(jù)庫密碼叉袍,因?yàn)閿?shù)據(jù)庫長期不更換會加大泄露的風(fēng)險(xiǎn)
  • OTP:基于時(shí)間的臨時(shí)密碼
  • 密碼權(quán)限策略:只允許特定的微服務(wù)讀取或者寫入指定的密鑰
  • 密碼的revoke(同事下項(xiàng)目了怎么辦始锚?)

項(xiàng)目實(shí)踐

  • 不在本地持久化存儲密鑰,每次獲取密鑰應(yīng)該通過腳本實(shí)時(shí)獲取并保存在console的會話級的環(huán)境變量里喳逛。
  • 密鑰是有時(shí)效瞧捌,定期輪換
  • 密鑰獲取者是有身份的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市润文,隨后出現(xiàn)的幾起案子姐呐,更是在濱河造成了極大的恐慌,老刑警劉巖典蝌,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曙砂,死亡現(xiàn)場離奇詭異,居然都是意外死亡骏掀,警方通過查閱死者的電腦和手機(jī)鸠澈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來截驮,“玉大人笑陈,你說我怎么就攤上這事】” “怎么了涵妥?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坡锡。 經(jīng)常有香客問我妹笆,道長块请,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任拳缠,我火速辦了婚禮,結(jié)果婚禮上贸弥,老公的妹妹穿的比我還像新娘窟坐。我一直安慰自己,他們只是感情好绵疲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布哲鸳。 她就那樣靜靜地躺著,像睡著了一般盔憨。 火紅的嫁衣襯著肌膚如雪徙菠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天郁岩,我揣著相機(jī)與錄音婿奔,去河邊找鬼。 笑死问慎,一個(gè)胖子當(dāng)著我的面吹牛萍摊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播如叼,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼冰木,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笼恰?” 一聲冷哼從身側(cè)響起踊沸,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎社证,沒想到半個(gè)月后逼龟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猴仑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年审轮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽俗。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疾渣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出崖飘,到底是詐尸還是另有隱情榴捡,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布朱浴,位于F島的核電站吊圾,受9級特大地震影響达椰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜项乒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一啰劲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檀何,春花似錦蝇裤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至垛孔,卻和暖如春藕甩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背周荐。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工狭莱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羡藐。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓贩毕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仆嗦。 傳聞我的和親對象是個(gè)殘疾皇子辉阶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Vault是用來安全的獲取秘密信息的工具,它可以保存密碼瘩扼、API密鑰谆甜、證書等信息。Vault提供了一個(gè)統(tǒng)一的接口來...
    陌辭寒閱讀 7,016評論 1 3
  • 1.概述 在本文中集绰,我們將探索Hashicorp的Vault —— 一種用于在現(xiàn)代應(yīng)用程序體系結(jié)構(gòu)中安全地管理機(jī)密...
    RaiseHead閱讀 9,469評論 0 15
  • 前言 Git使用教程 Git是什么 Git是一個(gè)開源的分布式版本控制系統(tǒng)规辱,用于敏捷高效地處理任何或小或大的項(xiàng)目。 ...
    90后的思維閱讀 901評論 0 0
  • 三天的培訓(xùn)栽燕,我活下來了罕袋,而且還活得很好。 不敢說我在這三天中發(fā)生了怎樣翻天覆地的變化碍岔,畢竟僅靠三天就想改變一切是不...
    Super_Luna閱讀 139評論 0 1
  • 視頻資訊君浴讯,短視頻最新資訊動(dòng)態(tài)報(bào)道、不定期分享短視頻實(shí)用干貨蔼啦; 萌新問題指南針榆纽,立足打倒一切難題 如何讓視頻成為爆...
    視頻資訊君閱讀 442評論 0 0