博客 / 詳情

返回

基於羣組實現從 Azure AD 到極狐GitLab 的單點登錄

本文來自
劉康 極狐(GitLab) 高級網站可靠性工程師

許多組織都有一套統一身份認證平台,通常基於組織架構或團隊分工,以羣組的方式將用户組織起來,比如 LDAP、Azure Active Directory(Azure AD)、Google Workspace、OneLogin、Authing 等,這種認證服務也被稱為 Identity Provider(以下簡稱 IdP)。

基於 IdP,組織成員可以通過單點登錄的方式,基於所分配的權限訪問組織內的各個服務或系統,比如郵箱、OA、員工自助系統等。

極狐GitLab 同樣支持接入各個組織自己的 IdP。

在極狐GitLab 中,企業或團隊等組織通常是基於羣組進行管理的。通過在 IdP 與極狐GitLab 羣組建立關聯,即可實現從 IdP 到極狐GitLab 的單點登錄。其中,SAML 是一種廣泛支持的,用於建立單點登錄的協議。

本文將詳細介紹如何基於“羣組 SAML SSO” 配置從 Azure AD 到極狐GitLab 的單點登錄。當然,對於其它的 IdP,也是類似的過程。

注:極狐GitLab 專業版和旗艦版支持該功能。

配置單點登錄

作為 IdP,Azure AD 向其他系統的單點登錄,通過企業應用程序(Enterprise Application)進行管理。

在 Azure AD 中創建企業應用

以具有 Azure AD 權限的賬號登錄 Azure,創建企業應用程序。

  1. 進入 “Azure Active Directory”;
  2. 左側導航欄點擊 “Enterprise applications”(企業應用程序);
  3. 點擊 “+ New application”(+ 新建應用程序)按鈕;
  4. 點擊 “+ Create your own application”(+ 創建你自己的應用程序),選擇 “Integrate any other application you don't find in the gallery (Non-gallery)”(集成未在庫中找到的任何其他應用程序(非庫));
  5. 為應用起一個容易識別的名字,比如 “jihulab.com” 或 “jihulab.com/mygroup1”,點擊 “Create”(創建)按鈕進行創建。

然後進入該企業應用程序,點擊 “Single sign-on”(單一登錄),選擇 “SAML”。

SAML基礎配置

在極狐GitLab,進入需要配置 SAML 的羣組,點擊 “Setting”(設置) → “SAML SSO”(SAML SSO(單點登錄))。

注:

  1. 本文的例子是為 azure-saml-test 羣組配置單點登錄。
    引用
  2. 本文截圖是在 staging 環境截取的,因此其中的鏈接是 staging.jihulab.com。

請按下圖示意互相填寫信息(左側為 Azure 單點登錄配置頁面,右側為極狐GitLab SAML SSO 配置頁面):

注:在極狐GitLab SAML SSO 配置頁面,“配置”(Configuration)部分,如果勾選“對該羣組的 Web 活動強制執行僅 SSO 身份驗證”(Enforce SSO-only authentication for web activity for this group),則該羣組內將僅支持單點登錄的身份,而無法通過常規的登錄方式登錄進來。

配置 Azure “Attributes & Claims”

兩個系統在進行認證授權時,需要確定好用户屬性的映射關係。比如 SAML 認證需要一個具有唯一性的字段來進行用户的關聯,我們通常將 Azure 用户的 objectid 作為這個字段進行映射(user.userprincipalname 具有唯一性,也可以採用)。

在 Azure 的 “Attributes & Claims”(屬性與聲明)部分,點擊 “Edit”(編輯)對默認的映射關係進行調整:

其中,

  1. 對於 “Unique User Identifier”(唯一用户標識符),“Name identifier format”(名稱標識符格式)選擇 “Persistent”(永久),“Source attribute”(源屬性)選擇 user.objectid
  2. 其它只是涉及 claim 名稱的調整。

至此,有關單點登錄的部分就初步配置完成了。

配置用户同步

用户同步(User provision)是 SCIM 功能之一,可以將所在企業應用程序下的用户,自動創建到極狐GitLab,並且當用户發生增、改、刪等變化時,會自動同步到極狐GitLab。

在極狐GitLab 創建 SCIM Token

該 Token 被 Azure 用來在極狐GitLab 對用户進行創建、更新等操作。

在極狐GitLab SAML SSO 設置頁面靠下的位置,點擊 “Generate a SCIM token”(生成 SCIM 令牌)按鈕。

生成的令牌如下:

配置 Azure Provisioning

在 “Enterprise application”(企業應用程序)左側導航欄中點擊 “Provisioning”(預配),初次配置需要點擊 “Get started”(開始)。

“Provisioning Mode”(預配模式)選擇 “Automatic”(自動),然後填入剛剛生成的 URL 和 Token。測試成功後點擊 “Save”(保存)。

此時下方會出現 “Mapping”(映射)菜單,展開並將 “Provision Azure Active Directory Groups” 設置為 Enabled=No(已啓用=否),目前極狐GitLab 不支持。

這裏是子羣組層次結構的自動創建和同步,極狐GitLab 不支持。但是用户所屬羣組的信息可以同步,比如用户從羣組 A 調整到 B,這種情況是可以同步的。
引用

接着,配置用户創建和同步時的屬性映射關係。點擊 “Provision Azure Active Directory Users” 進入,做如下映射關係的調整:

這裏定義了當 Azure 推送用户屬性到極狐GitLab,並在極狐GitLab 創建用户時,Azure AD 用户的哪些字段對應到極狐GitLab 用户的哪些字段。

1. 請確定配置有映射關係的用户屬性是有值的,否則會導致創建用户失敗,尤其是極狐GitLab 需要的字段,包括:

  • externalId,前文配置單點登錄時的 “Unique User Identifier”(唯一用户標識符);
  • userName,對應極狐GitLab 的用户賬號,不可為空;
  • emails[type eq "work"].value,極狐GitLab 將其用作用户郵箱,不可為空。注意,user.mail 有時是空的,如果 Azure 用户的郵箱是維護在其他字段(如 userPrincipalName),此處可以把 mail 替換為相應字段。
  1. 映射關係的調整要和 SAML SSO 的 Attribute Mapping 一致。比如 externalId,如果前面配置的是 user.objectid,這裏也要保持一致。這個字段的特殊之處在於,它是用來進行匹配的、具有唯一性的用户標識符,因此 ”Match objects using this attribute“(使用此屬性匹配對象)是開啓的,並且匹配優先級是最高的。如下圖:

對於“必需”字段,可以在 “advanced options”(顯示高級選項)下的 “Edit customappsso attributes list”(編輯 customappsso 的屬性列表)中配置,將其 “Required?” 勾上。

Azure 手動用户預配

此時,我們就可以手動推送一個 Azure 用户到極狐GitLab 並嘗試進行單點登錄,以確認單點登錄和用户預配的配置是否正確。

只有將 Azure AD 所管理的用户或組加入到配置 SAML SSO 的企業應用程序後,才可以進行單點登錄。

在 Azure 的企業應用程序的左側導航欄中點擊 “Users and groups”(用户和組),然後點擊 “+ Add user/group”(+ 添加用户/組),根據需要選擇組或用户。

所選擇的用户和組所包含的用户就可以進行用户預配和單點登錄了。

點擊 “Provisioning”(預配)下的 “Provision on demand”(按需預配),選擇需要推送的用户,點擊 “Provision”(配置)按鈕;然後確認用户創建(或更新)的結果是否正確,各個字段的值是否正確:

這時在極狐GitLab 的 SAML SSO 配置頁面應該就可以看到用户已經被創建,並且分配到羣組下。

在羣組的成員列表中也可以看到該用户,並且通過 SAML 標籤標識了該用户是通過 SAML 方式創建的。

這時,被推送的用户的郵箱會收到歡迎郵件和確認郵件,請點擊確認郵件中的鏈接完成郵箱的驗證。

測試單點登錄

然後,我們可以測試一下剛剛手動推送過來的用户,是否可以正常實現單點登錄。

單點登錄有多種方法,比如:

  1. 通過 SAML SSO 配置頁面中的 “GitLab single sign-on URL”(GitLab單點登錄網址)登錄,通常是類似
    https://jihulab.com/groups//-/saml/sso?token=xxxxxxxx這樣的地址;
  2. 如果在SAML SSO 配置頁面,“配置”(Configuration)部分,勾選“對該羣組的 Web 活動強制執行僅 SSO 身份驗證”(Enforce SSO-only authentication for web activity for this group),則訪問該羣組地址的時候(https://jihulab.com/)就會自動跳轉到 Azure 的登錄頁面。

正常情況下,在 Azure 登錄頁面中完成登錄,或在 Azure 已經登錄的狀態下,會跳轉到極狐GitLab 相關頁面。第一次登錄,需要完成郵箱和手機號驗證,然後就可以進入羣組頁面:

Azure 自動用户同步

經過測試,單點登錄和用户同步都配置正確,就可以開啓 Azure 的自動用户同步了。

在 Azure “Provisioning”(預配)界面中,點擊 “Started provisioning”(開始預配),開啓自動的用户同步,被添加到當前企業應用程序中的用户和組(組中的用户)都會被自動同步到極狐GitLab 中,並且隨着 Azure 中用户信息的調整自動更新。

如圖,在日誌中可以查看用户的創建或更新情況。

請注意,對於所選擇的組下的子組中的用户,並不會被創建。 比如有這樣的用户和組結構 group_a/group_aa/user_aa0,如果在企業應用程序中選擇了 group_a 但沒有選擇 group_aa,則用户 user_aa0 並不會被創建和同步。

配置羣組同步

有些用户希望能夠將 Azure 側的組和用户的組織架構,完整同步到極狐GitLab,這一功能可以部分實現:

  • Azure 中的組並不會被自動同步到極狐GitLab 中,需要預先在極狐GitLab 中創建;
  • Azure 和極狐GitLab 的組的對應關係需要手動維護;
  • 用户對組的隸屬關係可以自動更新到極狐GitLab。

假設 Azure AD 中的組織架構是這樣的:

Azure AD
├── group_a
│   ├── group_aa
│   │   └── user_aa0
│   ├── user_a0
│   └── user_a1
└── group_b    
     └── user_b0

極狐GitLab 也有對應的子組關係:

則需要依次配置所有組的關聯關係。

配置 SAML 羣組鏈接

首先在 Azure AD “Groups”(組)下找到各個組的 “Object Id”(對象 ID):

然後依次進入極狐GitLab 對應的子組下的 “Settings → SAML Group Links”(設置 → SAML 羣組鏈接),配置關聯關係和訪問級別:

Azure 配置 Group Claim

兩個系統的 groups 關聯關係建立了,則用户進行 SSO 登錄時,如果攜帶 group ID 信息,就會被極狐GitLab 按照預設的訪問級別分配到對應的子組中。

因此需要配置 SAML SSO 的 “Attribute & Claims” 信息:

請注意,這裏是選擇 “+ Add a group claim”(+ 添加組聲明)按鈕,claim name 需要自定義為 Groups。

這樣,當用户通過 Azure SAML SSO 登錄到極狐GitLab 時,就可以擁有正確的子組權限了。如果 Azure AD 中該用户被遷移到另一個組中,當該用户再次登錄時,極狐GitLab 會根據 SAML 響應中攜帶的 Groups 信息,為該用户賦予正確的子組權限,當然,前提是相關的子組與 Azure 的對應的組建立好鏈接

可能遇到的問題

單點登錄後又跳轉到極狐GitLab 登錄頁,提示需要關聯

如下圖所示:

用户通過 SSO 到達 Jihulab.com 後,又跳轉到登錄頁,上方提示如下:

  • English: Sign in to GitLab to connect your organization's account
  • 中文:登錄 GitLab 以連接您組織的賬户

原因在於,根據 SAML 登錄所給出的用户信息(上面的用户屬性映射信息,尤其是 Unique User Identifier),並未在 Jihulab.com 找到對應的用户,因此提示用户登錄一下極狐GitLab(通常用於客户已經有 SaaS 賬號,否則不建議客户這樣操作),系統會將 SAML 賬號與此時登錄的賬號進行關聯,這個 SAML 用户以後再通過 SSO 就可以正常登錄到極狐GitLab 了。

可能的原因

  • Azure 單點登錄中配置的 “Unique User Identifier”(唯一用户標識)和 Azure Provisioning(預配)的映射關係不一致。
  • 比如一個用的是 user.objectid,而另一個用的是 user.userPrincipalName
  • Azure 用户的對應郵箱已經在極狐GitLab 中存在,從而 Provisioning 沒有成功,但極狐GitLab 發現該郵箱已存在,因此提示可能已經有賬號請用户進行關聯。

建議處理方式:

  • 對於已經有 SaaS 賬號的情況,比如有從 Gitlab.com 遷移到極狐GitLab 的客户,之前在 Gitlab.com 已經建立了 Azure AD 的 SSO 登錄,也已經有了用户,需要請用户進行一次關聯登錄操作,操作時確保 Azure AD 和 SaaS 的賬號是對應的。
  • 對於確實沒有 SaaS 賬號的情況,需要先在 Azure 操作 User Provisioning,將用户創建過來。
有時候極狐GitLab 這邊的羣組是客户方 IT 工程師通過在極狐GitLab 註冊的用户創建的,那麼可以引導該工程師進行賬號的關聯操作,客户方其他用户還是通過用户推送的方式創建。

登錄不成功,跳轉到登錄頁,未提示要關聯

請聯繫技術支持,請技術人員確認原因。

用户也可以藉助 SAML 瀏覽器插件(如 SAML,WS-Federation and OAuth tracer)分析 SAML Response 中的 “Claims” 部分是否缺失部分信息(如 email),並查看 Azure 中的 Attribute & Claims 映射是否正確。

用户登錄後立即從羣組中消失

典型表現:

  • 該用户登錄後不是直接重定向到配置的羣組下,而是出現類似新用户註冊後第一次登錄的頁面,比如提問是什麼角色,想要用極狐GitLab 做什麼之類;
  • 羣組管理員查看發現該用户不在成員列表中了,查看 “Security & Compliance → Audit events”(安全 → 審計事件)發現該用户被從羣組移除了,移除時間就發生在登錄後的一兩秒內;
  • 請極狐GitLab 技術支持查看發現該用户還在,只是不在應該在的那個羣組下了。

可能的原因是配置了 Azure SAML 單點登錄的 group claim,但是沒有正確配置極狐GitLab 的 “SAML 羣組鏈接”。

參考

1. SAML SSO 單點登錄

2. Azure AD SAML 單點登錄配置示例

3. SAML Group Sync

user avatar xingxingshangdelizhi 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.