dex:CoreOS的開源身份認(rèn)證服務(wù)解決方案
近日,CoreOS發(fā)布了一個(gè)新的開源項(xiàng)目dex,一個(gè)基于OpenID Connect的身份服務(wù)組件。 CoreOS已經(jīng)將它用于生產(chǎn)環(huán)境:自家的tectonic.com上。用戶認(rèn)證和授權(quán)是應(yīng)用安全的一個(gè)重要部分,用戶身份管理本身也是一個(gè)特別專業(yè)和復(fù)雜的問題,尤其對(duì)于企業(yè)應(yīng)用而言, 安全的進(jìn)行認(rèn)證和授權(quán)是必選項(xiàng),dex無疑是解決這一問題的一大利器。
今天我們興奮的發(fā)布CoreOS家族一個(gè)新的開源項(xiàng)目 dex:一個(gè)基于多種標(biāo)準(zhǔn)的身份服務(wù)提供者和認(rèn)證解決方案。
幾乎每一個(gè)項(xiàng)目都需要某種認(rèn)證和用戶管理。應(yīng)用也需要一種方式能讓用戶從多種平臺(tái)安全地登錄, 例如web、移動(dòng)端、命令行工具(CLI),以及自動(dòng)化系統(tǒng)等。開發(fā)者通常使用一個(gè)依賴于平臺(tái)的解決方案, 或者當(dāng)常常發(fā)現(xiàn)已有的解決方案無法的解決他們的需求后就自己從頭寫一個(gè)解決方案。
然而, 大多數(shù)開發(fā)者并不負(fù)責(zé)安全的業(yè)務(wù)。讓他們自己寫認(rèn)證軟件不僅會(huì)讓他們從核心產(chǎn)品的開發(fā)工作中分心,同時(shí)也顯然會(huì)帶來軟件安全方面的危險(xiǎn)。正確的處理安全方面的工作是很有難度的, 我們最近看到很多引人注目的安全事故,在沒有被其他工程師或者安全專家做恰當(dāng)審計(jì)的情況下任意而為只會(huì)帶來更多的風(fēng)險(xiǎn)。
正是基于這些原因, 我們決定開源dex,這樣我們已經(jīng)完成的讓dex成為一個(gè)安全健壯的平臺(tái)的工作會(huì)讓其他人也能受益。開放給社區(qū)之后,dex反過來也會(huì)從更多的合作者中受益。沒有人再需要自己寫一遍“忘記密碼?”的流程,或者“以X,Y或者Z來登錄”的功能了。
項(xiàng)目起名為『dex』是因?yàn)樗且粋€(gè)中心化的用戶索引, 軟件里面其他組件可以基于dex做認(rèn)證。
核心設(shè)計(jì)元素
Dex如此獨(dú)特是它包含了以下這些元素, 這些元素從最開始就驅(qū)動(dòng)著設(shè)計(jì)和實(shí)現(xiàn):
安全
安全是首要的工作:dex的設(shè)計(jì)采用了安全和加密的最佳實(shí)踐來最小化攻擊者獲得系統(tǒng)訪問權(quán)限的風(fēng)險(xiǎn)。 更進(jìn)一步, dex的架構(gòu)劃分也可以減輕任何單個(gè)攻擊可能帶來的損害。例如,dex缺省使用軟token生命周期,并自動(dòng)輪換它的簽名秘鑰。由于秘鑰本身是加密的,攻擊者需要在短時(shí)間內(nèi)同時(shí)侵入數(shù)據(jù)庫和一個(gè)dex worker才能得到一個(gè)tocken。
標(biāo)準(zhǔn)
Dex是OpenID Connect(OIDC)核心標(biāo)準(zhǔn)的實(shí)現(xiàn)。OIDC(不要與OpenID混淆)是由業(yè)界領(lǐng)袖和安全專家基于web安全領(lǐng)域的多年經(jīng)驗(yàn)合作創(chuàng)建的。它是OAuth 2之上的一層,提供了一個(gè)安全并且易于實(shí)現(xiàn)的認(rèn)證協(xié)議。今天OIDC 已經(jīng)作為一個(gè)單點(diǎn)登錄的解決方案使用在眾多互聯(lián)網(wǎng)巨頭里,例如Google、Facebook、Amazon等。
語言與平臺(tái)無關(guān)性
因?yàn)閐ex實(shí)現(xiàn)了OpenID Connect(OIDC) 核心標(biāo)準(zhǔn),所以將dex集成入你的應(yīng)用中十分簡(jiǎn)單。僅需要一步:加入你所用的編程語言的OIDC客戶端庫。我們用Go寫了一個(gè) go-oidc,其他的幾乎每種語言都有(請(qǐng)審查對(duì)應(yīng)的客戶端庫以保證有適當(dāng)?shù)暮灻?yàn)證和協(xié)議符合度)。
聯(lián)合身份
dex有自己的用戶的概念, 但也允許通過不同的方式做認(rèn)證, 稱之為連接器connector。 現(xiàn)在, dex自帶了兩種類型的連接器: 本地local連接器和OIDC 連接器。 當(dāng)使用local連接器做認(rèn)證時(shí), 用戶使用email和密碼通過dex本身提供的定制化UI來登錄; 當(dāng)使用OIDC連接器時(shí), 用戶可以通過登錄第三方的OIDC身份服務(wù)提供方來認(rèn)證, 例如Google或者Salesforce。
因?yàn)閐ex本身就是一個(gè)OIDC身份服務(wù)提供者, 它甚至可以做到將多個(gè)dex實(shí)例串聯(lián)到一起,每個(gè)實(shí)例依次將認(rèn)證工作委派給下一個(gè)。
現(xiàn)在用戶必須在連接器中做選擇,但是在未來我們計(jì)劃允許身份的鏈接linking, 這樣每個(gè)單獨(dú)的用戶都可以以不同的方式登錄。 可擴(kuò)展的連接器架構(gòu)將會(huì)允許與多種身份服務(wù)做集成,例如GitHub, LDAP, SAML系統(tǒng)等。
案例學(xué)習(xí): Tectonic.com
在CoreOS我們正使用dex的一種方式是做Tectonic客戶的注冊(cè)和認(rèn)證。當(dāng)一個(gè)用戶首次決定成為Tectonic客戶并按下Join的按鈕時(shí), 他們會(huì)被帶到https://auth.tectoinc.com, 也就是OpenID Connect術(shù)語中的Issuer URL。 他們可以使用自己的Google身份或者輸入用戶名密碼來注冊(cè)。然后他們會(huì)被重定向回Tectonic.com網(wǎng)站來完成注冊(cè)。
下面的圖描述了整個(gè)部署:
圖:dex架構(gòu)圖解
在我們的防火墻之后,我們有如下幾個(gè)組件:
- 一個(gè)postgres數(shù)據(jù)庫用作dex的后端存儲(chǔ)
- 一個(gè)單獨(dú)的dex-overlord, 負(fù)責(zé)輪換秘鑰和其他的管理任務(wù)
- 多個(gè)dex-worker, 提供前端給終端用戶做認(rèn)證
- 產(chǎn)品站點(diǎn),Tectonic.com
在OIDC中的依賴方(Relying Party, RP)-此案例中, 即我們的產(chǎn)品站點(diǎn)-為了一個(gè)ID token, 與身份提供者(identity provider, IdP),也就是dex, 交換一個(gè)Authorization Token(從終端用戶那得到, 這里是Tectnoic的用戶)。 注意雖然這里我們把我們的應(yīng)用和dex都一起放在同一個(gè)防火墻后面, 但這并不是必須的。 他們互相之間是通過跨公網(wǎng)的一個(gè)TLS連接來溝通;如果你有多個(gè)不同的應(yīng)用跑在不同的環(huán)境并都需要認(rèn)證時(shí)這是相當(dāng)有用的。
當(dāng)用戶選擇使用Google賬號(hào)做認(rèn)證時(shí),dex就臨時(shí)變成RP,Google就變成了IdP來認(rèn)證和識(shí)別用戶。 一但dex完成了這個(gè)工作(通過上面提到的token交換協(xié)議), dex就回來成為IdP并完成與Tectonic.com的token交換。
整個(gè)過程中token都是加密簽名過的,客戶端會(huì)檢查簽名。 簽名的秘鑰會(huì)持續(xù)的被IdP來輪換并被RP來同步。
dex未來的計(jì)劃
dex現(xiàn)在已經(jīng)可以使用, 但是還有許多工作要做。 除了GitHub上的issues, dex路線圖中還包括:
- 授權(quán) - 除了讓dex處理認(rèn)證之外,我們也想要讓它成為一個(gè)通用的授權(quán)服務(wù)器。
- 用戶管理 - 我們正處理初始開發(fā)階段:開發(fā)API讓管理員來管理用戶, 但是很快它會(huì)更加完整并且也會(huì)帶UI。
- 多個(gè)遠(yuǎn)程的身份 - 如上所述,用戶將會(huì)可以使用多種認(rèn)證方法做認(rèn)證
- 更多的連接器類型 - 例如,LDAP、GitHub等。
dex仍然相當(dāng)年輕, 接下來有很多工作要做。 如果你也對(duì)它感興趣, 我們歡迎你的幫助!
原文鏈接:http://dockone.io/article/643