Debian

如何在 Debian 上使用 OpenLDAP 伺服器設置 SASL 代理授權

  • November 28, 2019

對於 Kerberos 身份驗證以及客戶端設備上的 SASL/GSSAPI 授權,我需要在具有 Debian/Raspbian Buster 的 Raspberry Pi 上執行的 OpenLDAP 伺服器上進行代理授權。我嘗試按照 OpenLDAP Software 2.4 Administrator’s Guide 中有關SASL 代理授權的說明進行操作,但無法使其正常工作。身份驗證失敗或未找到代理使用者且授權失敗。使用原始使用者進行身份驗證沒有問題:

ldap-server ~$ kinit ingo
Password for ingo@HOME.HOEFT-ONLINE.DE:
ldap-server ~$ ldapwhoami
SASL/GSSAPI authentication started
SASL username: ingo@HOME.HOEFT-ONLINE.DE
SASL SSF: 256
SASL data security layer installed.
dn:uid=ingo,ou=people,ou=home,dc=hoeft-online,dc=de

但是在設置代理授權時,我對源規則和目標規則以及放置屬性的位置authzTo以及authzFrom啟用proxyAuth的位置感到困惑。

有人可以舉一個簡短的例子,如何使用 SASL/GSSAPI 身份驗證在 LDAP 伺服器上定義代理授權?

我無法在網上找到關於此的範例,我花了幾天時間才了解廣泛的細節。這是我將它組合在一起的方法,以便其他人現在可以找到一個範例。

對於需要 Kerberos 身份驗證的 SASL/GSSAPI 的正確代理授權,我們必須指定用作代理使用者的 Kerberos 主體。然後對於 ldap 伺服器上的 SASL 身份驗證,我們需要從 SASL auth dn 到 ldap 帳戶的常用使用者映射。現在我們可以設置代理授權了。

創建 Kerberos 主體

我創建anyuser以將其身份驗證用作任何使用者的代理。我需要它在客戶端設備上進行 GSSAPI 身份驗證。

~$ kadmin -p somebody/admin addprinc -policy user anyuser

身份驗證映射

這是 OpenLDAP Software 2.4 Administrator’s Guide about Mapping Authentication Identities中描述的常用專有名稱 (dn) 映射。

~$ cat > /tmp/in.ldif <<EOF
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp:
 {0}uid=([^,]*),cn=gssapi,cn=auth
 uid=\$1,ou=people,ou=home,dc=hoeft-online,dc=de
-
add: olcAuthzRegexp
olcAuthzRegexp:
 {1}uid=([^,]*),cn=home.hoeft-online.de,cn=gssapi,cn=auth
 uid=\$1,ou=people,ou=home,dc=hoeft-online,dc=de
EOF

~$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/in.ldif

使用以下命令測試映射:

~$ kinit ingo
~$ ldapwhoami -Y GSSAPI -v
ldap_initialize( <DEFAULT> )
SASL/GSSAPI authentication started
SASL username: ingo@HOME.HOEFT-ONLINE.DE
SASL SSF: 256
SASL data security layer installed.
dn:uid=ingo,ou=people,ou=home,dc=hoeft-online,dc=de
Result: Success (0)

設置SASL 代理授權

預設情況下禁用代理授權。所以首先我們必須在 ldap 伺服器上啟用它。我只想使用authzTo屬性。對於可能的設置,請man slapd-config查看olcAuthzPolicy.

~$ cat > /tmp/in.ldif <<EOF
dn: cn=config
changetype: modify
add: olcAuthzPolicy
olcAuthzPolicy: to
EOF

~$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/in.ldif
# For this modify is a restart needed
~$ sudo systemctl restart slapd.service

現在我創建一個用作代理的**anyuser posix 帳戶。**要設置authzTo屬性,請查看Mapping Authentication Identities

~$ cat > /tmp/in.ldif <<EOF
dn: cn=anyuser,ou=group,ou=home,dc=hoeft-online,dc=de
objectClass: top
objectClass: posixGroup
cn: anyuser
gidNumber: 1001

dn: uid=anyuser,ou=people,ou=home,dc=hoeft-online,dc=de
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
uid: anyuser
uidNumber: 1001
gidNumber: 1001
cn: any
sn: user
loginShell: /usr/sbin/nologin
homeDirectory: /nonexistent
authzTo: dn.regex:^uid=[^,]*,ou=people,ou=home,dc=hoeft-online,dc=de$
EOF

~$ sudo slapadd -l /tmp/in.ldif

現在您可以使用以下命令測試代理授權:

~$ kinit -p ingo
~$ ldapwhoami -Y GSSAPI -D "uid=anyuser,ou=people,ou=home,dc=hoeft-online,dc=de"
SASL/GSSAPI authentication started
SASL username: ingo@HOME.HOEFT-ONLINE.DE
SASL SSF: 256
SASL data security layer installed.
dn:uid=ingo,ou=people,ou=home,dc=hoeft-online,dc=de

另請注意代理授權規則

源規則非常強大。如果普通使用者有權在他們自己的條目中寫入 authzTo 屬性,那麼他們可以編寫允許他們像其他任何人一樣授權的規則。因此,在使用源規則時,authzTo 屬性應使用僅允許特權使用者設置其值的 ACL 進行保護。

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