專案

一般

個人檔案

動作

LDAP 驗證

Redmine 原生支援使用一個或多個 LDAP 目錄進行 LDAP 驗證。

宣告 LDAP

前往「管理」並在選單中點選「LDAP 驗證」。

輸入以下資訊

  • 名稱:目錄的任意名稱
  • 主機:LDAP 主機名稱
  • :LDAP 埠(預設為 389)
  • LDAPS:如果您想要或需要使用 LDAPS 存取目錄,請勾選此選項
  • 帳戶:輸入具有 LDAP 讀取權限的使用者名稱,如果您的 LDAP 可以匿名讀取,請將此欄位留白(Active Directory 伺服器通常不允許匿名存取)
  • 密碼:帳戶密碼
  • Base DN:LDAP 目錄樹狀結構的最上層 DN
  • 登入屬性:輸入將用作 Redmine 使用者名稱的 LDAP 屬性名稱

如果 Redmine 使用者的帳戶設定為使用 LDAP 進行驗證,則他們現在應該可以使用其 LDAP 使用者名稱和密碼進行驗證。

若要測試這一點,請使用與其 LDAP 帳戶相符的登入名稱建立 Redmine 使用者(通常,Redmine 會透過查詢 LDAP 資料來建議您),在「驗證模式」下拉式清單中選取新建立的 LDAP(僅當宣告 LDAP 時,此欄位才會顯示在帳戶畫面中),並將其密碼留白。嘗試使用 LDAP 使用者名稱和密碼登入 Redmine。

動態建立使用者

透過勾選「動態建立使用者」,任何 LDAP 使用者在第一次登入 Redmine 時,系統都會自動建立其 Redmine 帳戶。
為此,您必須指定將用於建立其 Redmine 帳戶的 LDAP 屬性名稱(名字、姓氏、電子郵件)。

以下是以 Active Directory 為例的典型範例

Name     = My Directory
Host     = host.domain.org
Port     = 389
LDAPS    = no
Account  = MyDomain\UserName (or UserName@MyDomain depending on AD server)
Password = <password>
Base DN  = CN=users,DC=host,DC=domain,DC=org

On-the-fly user creation = yes
Attributes
  Login     = sAMAccountName
  Firstname = givenName
  Lastname  = sN
  Email     = mail

以下是另一個針對具有區間網的 Active Directory 範例

Name     = Just a description for the auth modes page
Host     = DepartmentName.OrganizationName.local
Port     = 389
LDAPS    = no
Account  = DepartmentName\UserName (or UserName@MyDomain depending on AD server or bind DN uid=Manager,cn=users,dc=MyDomain,dc=com)
Password = <password>
Base DN  = DC=DepartmentName,DC=OrganizationName,DC=local

On-the-fly user creation = yes
Attributes
  Login     = sAMAccountName
  Firstname = givenName
  Lastname  = sN
  Email     = mail

請注意,LDAP 屬性名稱有區分大小寫

動態綁定帳戶

上述設定需要在目錄伺服器上建立一個特殊帳戶,Redmine 使用該帳戶進行預先驗證。可以在帳戶欄位中使用關鍵字「**$login**」,然後將其替換為目前的登入名稱。在這種情況下,密碼可以留白,例如

Account: $login@COMPANY.DOMAIN.NAME
Account: company\$login

基礎 DN 變體

雖然上述基礎 DN 很可能是 Active Directory 的標準,但我雇主網站上的 Active Directory 並未使用 Users 容器存放標準使用者,因此這些說明讓我走上了一條漫長而痛苦的道路。如果使用那裡的設定登入失敗,我建議您也嘗試使用「DC=host,DC=domain,DC=org」。

基於群組的 LDAP 登入

如果您只想允許屬於特定 LDAP 群組的使用者登入,則應遵循以下說明。它們基於 OpenLDAP LDAP 伺服器和 redmine 2.3.0。

1. (OpenLDAP 伺服器) 啟用 memberof 覆蓋

1.1. 建立檔案

vim ~/memberof_add.ldif

使用以下內容

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: memberof

1.2. 建立檔案

vim ~/memberof_config.ldif

使用以下內容

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

1.3. 載入它們。這將取決於您的 OpenLDAP 設定,因此我們將提出一些可能性

sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_add.ldif
sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif

ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_add.ldif
ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_config.ldif

如果您使用動態執行時間組態引擎 (slapd-config),則不需要重新啟動。

1.4. (選用) 測試它

ldapsearch -D cn=admin,dc=example,dc=com -x -W -b 'dc=example,dc=com' -H 'ldap://127.0.0.1:389/' '(&(objectClass=posixAccount)(memberOf=cn=ldapredmine,ou=groups,dc=example,dc=com))'

2. (OpenLDAP 伺服器) 建立群組。在此範例中,使用者為「ldap_user_1」,群組為「ldapredmine」

dn: cn=ldapredmine,ou=groups,dc=example,dc=com
cn: ldapredmine
description: 允許登入 redmine 票務系統的員工
member: cn=ldap_user_1,ou=people,dc=example,dc=com
objectclass: groupOfNames
objectclass: top

調整「dn」和「cn」以適應您的 DIT 結構

3. (Redmine) 編輯 LDAP 驗證模式。在我的例子中,「ldap_user_1」是一個「posixAccount」物件類別

基礎 DN:dc=example,dc=com
篩選器:(&(objectClass=posixAccount)(memberOf=cn=ldapredmine,ou=groups,dc=example,dc=com))

疑難排解

如果您想使用動態使用者建立,請確保 Redmine 可以從您的 LDAP 中取得建立有效使用者所需的所有資訊。
例如,如果您的目錄中沒有有效的電子郵件地址,則動態使用者建立將無法運作(當您嘗試登入時,會收到「無效的使用者名稱/密碼」錯誤訊息)。
(這在較新的 Redmine 版本中不正確;使用者建立對話方塊會填入從 LDAP 伺服器找到的所有內容,並要求新使用者填寫其餘部分。)

此外,請確保您沒有任何自訂欄位標記為使用者帳戶的**必填**。這些自訂欄位會阻止動態建立使用者帳戶。

Redmine 日誌中不會報告登入系統中的錯誤,也沒有任何實際資訊,這使得疑難排解變得困難。但是,您可以使用 Redmine 主機和 LDAP 伺服器之間的 Wireshark 找到您需要的大部分資訊。請注意,這僅在您有權讀取這兩台主機之間的網路流量時才有效。

您也可以使用「ldapsearch」工具來測試您的設定是否正確。登入到託管您的 redmine 的 Linux 機器(並且可能安裝 ldaputils)並執行以下命令

ldapsearch -x -b  "dc=example,dc=com" -H ldap://hostname/ -D "DOMAIN\USER" -w mypassword [searchterm]

如果成功,您將獲得與您的搜尋查詢相符的 AD 內容清單。然後,您就會知道如何在 Redmine 的 LDAP 設定中填寫欄位。

帳戶 值格式

來源:trunk/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap.rb 中的這則註解所指出,綁定憑證的使用者名稱可能需要指定為 DN,而不是 UPN() 或 domain\user

  # As described under #bind, most LDAP servers require that you supply a complete DN
  # as a binding-credential, along with an authenticator such as a password.

因此,使用者名稱為 MyDomain\MyUserName 或 的使用者,在輸入 Redmine 登入名稱時可能只需要輸入 MyUserName。

LDAP 驗證速度緩慢

如果 LDAP 驗證速度緩慢,而且您有 AD 叢集,請嘗試在主機欄位中指定其中一台 AD 實體伺服器 (https://redmine.dev.org.tw/boards/2/topics/3056)。這可能會有幫助。

OpenDS

如果您使用的是 OpenDS 伺服器,則在使用指定的登入屬性搜尋使用者的初始查詢中傳送請求控制項「分頁結果」時,可能會發生問題。根據預設,匿名使用者不允許使用此請求控制項 1.2.840.113556.1.4.319,因此即使在進行綁定之前,也會阻止 Redmine 在目錄中找到使用者。

新增如下所示的全球 ACI

./dsconfig -h SERVER_IP -p 4444 -D cn="Directory Manager" -w PASSWORD -n set-access-control-handler-prop --trustAll 
--add global-aci:\(targetcontrol=\"1.2.840.113556.1.4.319\"\)\ \(version\ 3.0\;\ acl\ 
\"Anonymous\ control\ access\ to\ 1.2.840.113556.1.4.319\"\;\ allow\ \(read\)\ userdn=\"ldap:///anyone\"\;\)
注意:在一行中輸入命令,並完全按照指示使用跳脫字元(「acl」後面的 \ 應該是要輸入空格的「\ 」)。

解決方案:

Zentyal 3.2、Redmine 2.3.x

我已成功在 Ubuntu 12.04 LTS 伺服器上更新並(重新)設定 Zentyal 3.2。

因為在更新到 Zentyal 3.2 和 Redmine 2.3 之後,這件事真的讓我很困擾,所以我長話短說,想和大家分享這個簡單的解決方案

使用 Zentyal 的唯讀憑證

> Basedomain (Base DN):  dc=your_domain,dc=your_tld
  Rootdomain (Root DN):  cn=zentyal,dc=your_domain,dc=your_tld
  Password:              <admin_secret_pass>
> Read-only root DN:     cn=zentyalro,dc=your_domain,dc=your_tld
> Read-only password:    <ro_secret_pass>
  Default Users DN:      ou=Users,dc=your_domain,dc=your_tld
  Default Groups DN:     ou=Groups,dc=your_domain,dc=your_tld

在 Redmine 中(使用上述憑證,但不含 <>),並注意已變更的 LDAP 埠 390(請閱讀上述文章)

Name     = Just a description for the auth modes page
> Host     = <IP of the host>
> Port     = <390>
  LDAPS    = no
> Account  = <Read-only root DN>
> Password = <ro_secret_pass>
> Base DN  = <Basedomain (Base DN)>

On-the-fly user creation = yes
Attributes
>  Login     = uid
   Firstname = givenName
>  Lastname  = sN
  Email     = mail

Zentyal 4.x、Redmine 3.3.x

使用埠 389 和 sAMAccountName,而不是 uid

Zentyal 5.0、Redmine 3.2

  Name     = Just a description for the auth modes page
  Host     = <IP of the host>
  Port     = <389>
  LDAPS    = no (yes/checked is ok too with Port set to 636)
  Account  = username@domain.tld
  Password = <username_pass>
  Base DN  = < Default Users DN > (cn=Users,dc=domain,dc=tld)   

On-the-fly user creation = yes
Attributes
   Login     = sAMAccountName
   Firstname = givenName
   Lastname  = sN
   Email     = mail

OpenLDAP、Redmine 3.4.2.stable

  Name     = Some random description
  Host     = <IP of the host>
  Port     = <389>
  LDAPS    = no
  Account  = < Admins DN > (cn=admin,dc=domain,dc=tld)
  Password = < Admins Pass >
  Base DN  = < Default Users DN > (cn=People,dc=domain,dc=tld)   

On-the-fly user creation = yes
Attributes
   Login     = uid
   Firstname = givenName
   Lastname  = sn
   Email     = mail

管理員帳戶可以是任何具有全域讀取權限的其他 LDAP 帳戶。「網域」和「tld」部分必須與 LDAP 設定相符,其他部分也是如此。登入屬性用於登入。其餘部分必須根據 LDAP 設定。

FreeIPA 4.6.8、Redmine 3.2.6

  Name     = Service Description or server name etc.
  Host     = <IP/domain of the host>
  Port     = <389>
  LDAPS    = no ("yes" not tested)
  Account  = uid=<bind username>,cn=users,cn=accounts,dc=<domain>,dc=<tld>
  Password = <bind password>
  Base DN   = cn=accounts,dc=<domain>,dc=<tld>

Attributes
   Login     = uid
   Firstname = givenName
   Lastname  = sn
   Email     = mail

「網域」和「tld」部分必須與 LDAP 設定相符,其他部分也是如此。uid 屬性用於登入。

Chris Clemson超過 3 年前 更新 · 28 個版本