Ldap

為 SSH 和 Samba 身份驗證設置可組合 POSIX 組的最簡單方法是什麼?

  • May 5, 2021

背景

我將我認為是相當普通的基礎設施塊放在一起,但遇到了很多問題,我不禁想知道是否有更簡單的方法。


我需要能夠執行以下操作:

  • 使用委派身份驗證和基於組的權限將文件從 Linux 伺服器安全地共享給 OSX、Linux 和 Windows 電腦上的數百名使用者。
  • 允許基於組的 SSH 訪問數十個 Linux 伺服器,具有委派的身份驗證和基於組的權限。
  • 能夠創建由其他組和使用者組成的組,最好是任意深度。
  • 能夠允許基本任務的自助服務(密碼更改和恢復,個人資訊的有限編輯等)
  • 能夠以最少的配置遷移現有伺服器(執行各種 Linux 風格) - 因此盡可能堅持“標準”配置,尤其是客戶端。

我希望能夠選擇執行以下操作:

  • 除基於密碼的身份驗證外,還支持公鑰身份驗證

對我來說,上述所有聽起來都像是 LDAP + Samba 是唯一可行的方法,尤其是因為之前的實現使用了 FreeIPA/Samba。團隊決定使用 OpenLDAP 和 LDAP Account Manager 來提供身份驗證和目錄服務,但實施過程卻是一場噩夢。


OpenLDAP 設置

我的目錄樹具有以下結構:

- dc=example,dc=com
  - ou=groups
    - cn=groupA
    - ...
  - ou=policies
    - cn=passwordDefault
    - ...
  - ou=services
    - cn=service1
    - ...
  - ou=users (
    - uid=user1
    - ...

使用者有以下類別:

  • inetOrgPerson(結構)
  • posixAccount
  • 影子賬戶
  • sambaSamAccount
  • ppolicyUser
  • 密碼自複位
  • ldapPublicKey
  • 一般資訊

使用者工作得很好。大多數 Linux 機器都使用sshd -> libpam-ldap -> libnss-ldapd -> nscd -> nslcdand coreutils -> libnss-ldapd -> nscd -> nslcd,因此getent passwd根本id [username]不需要任何特殊配置即可工作。

服務有以下類:

  • applicationProcess(結構)
  • 簡單安全對象

服務只是內部服務(如 Gitlab)的簡單 DN/pw 實體,可以直接聯繫 LDAP,這樣我們就可以關閉匿名綁定而不切斷它們。他們也工作得很好。(注意 - 一些服務實際上需要作為 POSIX 帳戶存在,因此為簡單起見將它們配置為使用者)

策略是諸如密碼策略之類的實體,它們不在此問題的範圍內。

一直是真正的問題,因此我將在下一節中詳細討論它們。


團體的問題

無論我做什麼,我似乎都無法創建可組合的 POSIX 兼容組。在這種情況下,我使用“可組合”來表示以下內容。假設配置了這些組 - GroupA(User1、User2、User3)、GroupB(User4、User5)和 GroupC(User1、User5)。可組合組將允許創建動態 GroupD (GroupA, GroupC),有效成員資格為 (User1, User2, User3, User5)。 理想情況下,GroupD 也可以定義為 (GroupA, GroupC, User6)。此外,理想情況下,您可以繼續嵌套多於一層的組。

OpenLDAP 和 LAM 有一些工具似乎適用於這類事情,但我一直遇到模式問題、設計問題、實現問題或三者的某種組合。

  • dynlist - 這個 OpenLDAP 覆蓋允許您基於 LDAP 過濾器即時填充屬性列表。您甚至可以擁有由使用者和其他組組成的混合組!不幸的是,覆蓋僅在直接查看它所附加的實體時觸發。這意味著getent group [group](直接查看一個或多個組)有效,但groups [user](搜尋使用者在組中的存在)無效。nss這使得如果不將您自己的映射層或其他 LDAP 使用者寫入,就不可能基於動態組進行 SSH 。此外,可能出於類似原因,您無法從其他 dynlist 組創建 dynlist 組。
  • memberof - 此 OpenLDAP 覆蓋將自動更新memberOf使用者的屬性,以對應使用者在組中的添加和刪除。然而,它似乎需要使用基於 RFC2307 的類以外的組類posixGroup,因為它memberof需要基於 DN 的成員資格,而不是基於 uid 的成員資格。它實際上也無助於管理組本身。
  • 自動組 - 此OpenLDAP覆蓋將自動從可配置屬性中添加或刪除使用者 DN,對應於使用者在可配置 LDAP 過濾器結果中的存在或不存在。這個覆蓋似乎需要memberof安裝,因為autogroup除非我包含olcAGmemberOfAd配置屬性,否則安裝會失敗。它似乎也需要基於 DN 的成員資格,所以memberof它需要一個基於 RFC2307 以外的類posixGroup

我最初嘗試使用 class 實現靜態組posixGroup (structural),並使用附加labeledURIObject類來附加dynlist過濾器的動態組。這基本上奏效了,但我遇到了dynlist上面列出的缺點。

然後我嘗試改用autogroup覆蓋,但遇到了似乎需要基於 DN 的成員資格的問題。在這一點上,我覺得我必須嘗試擺脫posixGroup結構類,因為似乎沒有任何東西支持它。LAM似乎更喜歡使用 和 的組合groupOfNames,因為它包含一個功能,當屬性與屬性都存在於同一對像上時RFC2307bis-posixGroup,它會自動同步屬性。所以我修改了OpenLDAP 附帶的模式,使其成為輔助而不是結構,並使用(結構)和修改的類創建組。破解 OpenLDAP 的member``memberUid``posixAccount``groupOfNames``posixAccount``objectClass使用 RFC2307bis-esque 類來欺騙它的模式感覺就像 Not The Right Thing To Do™,但 OpenLDAP/LAM 似乎接受了它。這樣做也使我能夠memberof成功安裝,這很好。

autogroup,但是,只有一半有效。雖然它會將使用者添加到動態組(使用 可見groups [user]),但在將使用者從基本組中刪除時不會將其刪除。 groupOfNames還要求其members欄位始終至少有一個使用者在其中,這對於與autogroup. 您必須使用初始設置它,但是一旦鎖定屬性member就無法刪除虛擬成員。autogroup``member


配置

cn=模組{0},cn=配置

dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_mdb
olcModuleLoad: {1}ppolicy
olcModuleLoad: {2}autogroup
olcModuleLoad: {3}memberof

olcOverlay={1}memberof,olcDatabase={1}mdb,cn=config

dn: olcOverlay={1}memberof
objectClass: top
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: {1}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

olcOverlay{2}autogroup,olcDatabase={1}mdb,cn=config

olcOverlay: {2}autogroup
structuralObjectClass: olcAutomaticGroups
olcAGattrSet: {0}labeledURIObject labeledURI member
olcAGmemberOfAd: memberOf

問題

最具體到最少:

  1. 為什麼autogroup能夠將使用者添加到動態組,但不能刪除它們?
  2. 有沒有更簡單的方法來實現這個案例?
  3. 我是否使用了錯誤的工具來完成這項工作?使用不同的 LDAP 實現、一些簡單的客戶端配置或完全非 LDAP 的東西,這個案例會更容易嗎?

事實證明,這裡最好的方法是讓 LDAP 客戶端完成繁重的工作:

我將組設置為在結構上groupOfNamesRFC2307bis-posixGroup附加組成。由於我的環境不RFC2307bis-posixGroup直接支持,我將一個 LDIF 放在一起,以使 OpenLDAP 刪除其現有定義posixGroup並用一個輔助副本替換它:

不要按原樣修改您的配置! 如果您選擇走這條路,請找到您伺服器的posixGroup配置,並將其與STRUCTURAL更改為AUXILIARY.

dn: cn={2}nis,cn=schema,cn=config
changetype: modify
delete: olcObjectClasses
olcObjectClasses: {2}( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top STRUCTURAL MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) )
-
add: olcObjectClasses
olcObjectClasses: {2}( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top AUXILIARY MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) )

然後伺服器可以假裝支持 RFC2307bis-posixGroup 規範。從那裡,我能夠添加 memberOf 並完成 OpenLDAP 配置。

關鍵是現代版本的 NSLCD 和 SSSD 都包含允許遞歸組搜尋的標誌。顯然,此功能稱為“嵌套”分組,這在 LDAP 目錄結構的上下文中有點令人困惑,LDAP 目錄結構也允許組相互嵌套。這些功能與 LDAP 結構無關,但是,它們是關於能夠遵循對groupOfNames其他groupOfNames.

nslcd : nss_nested_groups是|否

如果設置了這個選項,一個組的成員屬性可能指向另一個組。嵌套組的成員也會在更高級別的組中返回,並且在為特定使用者查找組時返回父組。預設設置是不對嵌套組執行額外搜尋。

sssdldap_group_nesting_level(整數)

如果 ldap_schema 設置為支持嵌套組的模式格式(例如 RFC2307bis),則此選項控制將遵循多少級嵌套 SSSD。此選項對 RFC2307 架構沒有影響。預設值:2

有一些注意事項 - Red Hat 更喜歡您使用 SSSD,因此 Red Hat 儲存庫中的 nslcd 版本不足以支持該功能。但是這種方法應該適合大多數案例。最終,使用 sssd 或 nslcd 在所有伺服器上重新配置標誌比嘗試讓 OpenLDAP 自行進行“嵌套”分組要容易得多*。*

我現在可以在 LDAP 樹中引用其他組中的組, getent group現在將列出每個組以及在組中直接引用或在引用組中遞歸引用的所有使用者的扁平列表。

引用自:https://serverfault.com/questions/1055986