Openldap

通過 Kerberos SASL/GSSAPI 對 OpenLDAP 伺服器使用 SSSD 進行單點登錄

  • November 16, 2020

針對 Kerberos 的身份驗證和針對 LDAP 目錄的授權對我有用。現在我正在使用sssd在 Debian Buster 上尋找客戶端設置。

我開始使用nss-pam-ldapd 進行 LDAP 身份驗證,在 OpenLDAP 伺服器上使用SASL 代理授權,並使用ccreds記憶體 OpenLDAP 憑據。但是因為我一直使用systemd及其環境,傳統的設置不太適合它,我遇到一些問題OpenLDAP 伺服器

正因為如此,我查看了sssd,發現它可以一體完成,而且它基於systemd並且還使用dbus程序間通信。所以我決定改用它。但在 Debian 上,推薦的軟體包sssd會安裝所有可能的服務,例如用於活動目錄和其他我不需要的東西。我想讓我的客戶在沒有未使用的軟體的情況下盡可能精簡,所以我的問題是:

我必須安裝哪些 Debian 軟體包才能使用sssd對具有 Kerberos SASL/GSSAPI 的 OpenLDAP 伺服器進行單點登錄,以及如何配置它?

抽象的

經過一些嘗試和錯誤後,我發現我需要一個用於 gssapi 的包和四個用於 sssd 的包。我想集中通用配置,因此我使用本地私有 dns 伺服器進行名稱、伺服器名稱和服務名稱解析。所以首先我在客戶端上檢查這個。如果您在 DNS 伺服器上沒有它,您可以在每個客戶端上將其全部定義為本地。我已經評論過了。為了避免安裝不需要的附加軟體包,我總是為 Debian apt 使用選項 --no-install-recommends。 準備 Kerberos 客戶端

首先確保你有一個有效的 /etc/krb5.keytabsudo klist -ke。如果不可用,則創建一個:

rpi ~$ sudo kadmin -p user/admin
kadmin:  addprinc -policy host -randkey host/<hostname>.example.com
kadmin:  ktadd host/<hostname>.example.com
kadmin:  q

在安裝了 GNOME 或 Xfce 等圖形使用者界面後,我遇到了名稱解析問題。sssd無法example.com使用我的擴展 DNS 名稱解析來解析 DNS 域,因此它找不到 Kerberos 和 LDAP 伺服器,並且登錄失敗並顯示錯誤消息Authentication failure。這有時可能會起作用,因為記憶體的登錄數據但無效的 kerberos 票證數據1970-01-01顯示為klist. 根據Debian 主機名解析,您應該有這樣的條目/etc/hosts

127.0.1.1    <hostname>.example.com    <hostname>

如果您為名稱服務執行nscd記憶體,請解除安裝它。我們不能使用它,因為sssd也會這樣做。

~$ sudo systemctl disable --now nscd.service
~$ sudo apt purge nscd
~$ sudo apt-mark hold nscd

安裝針對 Kerberos 和測試進行身份驗證所需的 SASL/GSSAPI 模組和幫助程序:

~$ sudo apt --no-install-recommends install libsasl2-modules-gssapi-mit dnsutils ldap-utils

# check DNS resolution; must resolve full qualified dns names
~$ dig +noall +answer $(hostname -f)
~$ dig +noall +answer -x $(hostname -I)

# Check Kerberos server and LDAP server
~$ dig +noall +answer ldap-primary.example.com
~$ dig +noall +answer kdc-master.example.com

# Query for kerberos service (response: kdc10-1.example.com on port 88)
~$ dig +noall +answer SRV _kerberos._udp.example.com
_kerberos._udp.example.com 38400 IN SRV   0 0 88 kdc10-1.example.com.
# Query for ldap service (response: kdc10-1.example.com on port 389)
~$ dig +noall +answer SRV _ldap._tcp.example.com
_ldap._tcp.example.com. 38400 IN SRV   0 0 389 kdc10-1.example.com.

# Check if the sssd.service can access the LDAP-server. It uses this principal
~$ sudo kinit -k host/<hostname>.example.com
~$ sudo ldapsearch -Y GSSAPI -LLL -H ldap://ldap-primary.example.com -b "ou=home,dc=example,dc=com" "(cn=ingo)" uid cn
SASL/GSSAPI authentication started
SASL username: host/<hostname>.example.com@EXAMPLE.COM
SASL SSF: 256
SASL data security layer installed.
dn: cn=ingo,ou=group,ou=home,dc=example,dc=com
cn: ingo

dn: uid=ingo,ou=people,ou=home,dc=example,dc=com
uid: ingo
cn: Ingo

安裝sssd


我們只需要四個包就可以為 ldap、krb5、name service 和 pam 提供所有需要的服務:

~$ sudo apt --no-install-recommends install sssd-ldap sssd-krb5 libnss-sss libpam-sss

唯一剩下的就是配置/etc/sssd/sssd.conf. 我用這個:

~$ sudo cat /etc/sssd/sssd.conf
[sssd]
# debug log files in /var/log/sssd/
#debug_level = 7
config_file_version = 2
domains = HOME
# don't set services on Debian Bullseye. It's managed there
# by sssd-nss.socket and sssd-pam-priv.socket
services = nss, pam

[nss]
#debug_level = 7

[pam]
#debug_level = 7

[domain/HOME]
#debug_level = 7
# Set enumerate only for debugging, never for production!
#enumerate = TRUE

id_provider = ldap
# If you haven't a SRV record in DNS for the server then set it here
#ldap_uri = ldap://ldap-primary.example.com
# SRV record for backup server isn't supported. We have to set it always.
ldap_backup_uri = ldap://ldap-secondary.example.com
ldap_search_base = ou=home,dc=example,dc=com
ldap_sasl_mech = gssapi

auth_provider = krb5
chpass_provider = krb5
# Maybe I want to use the .k5login file in the home directory of the user
access_provider = krb5

# If you haven't a SRV record in DNS for the server then set it here
#krb5_server = kdc-master.example.com
# SRV record for backup server isn't supported. We have to set it always.
krb5_backup_server = kdc-replica.example.com
# If the authid isn't the first entry in /etc/krb5.keytab then set it here
#ldap_sasl_authid = host/<hostname>.example.com@EXAMPLE.COM
# krb5_realm must always be set here. There is no look at `/etc/krb5.conf`
krb5_realm = EXAMPLE.COM
#krb5_renewable_lifetime = 3d
krb5_renew_interval = 1h

# I don't use this
sudo_provider = none
autofs_provider = none

cache_credentials = TRUE

不要忘記保護 sssd.conf,否則 sssd 將無法啟動:

~$ sudo chmod 600 /etc/sssd/sssd.conf
~$ sudo systemctl restart sssd.service

檢查作業系統是否從 ldap 目錄中獲取帳戶資訊。確保查詢到的使用者帳號只在 ldap 目錄中,不在本地文件中。查詢的來源由使用者 ID 後面的字元指示。

:x:   from local files (/etc/passwd and /etc/group)
:*:   from the ldap directory

確保你得到**:*:**.

~$ getent passwd ingo
ingo:*:1000:1000:Ingo:/home/ingo:/bin/bash
~$ getent group ingo
ingo:*:1000:

為登錄設置 pam 身份驗證:

~$ sudo pam-auth-update
[*] Unix authentication
[*] SSS authentication
[*] Register user sessions in the systemd control group hierarchy
[*] Create home directory on login

並使用新使用者檢查登錄:

~$ ~$ su -l ingo
Password:
Creating directory '/home/ingo'.
ingo:~$ klist
ingo:~$ logout
~$

要測試 sssd.conf 中的設置,您必須知道 sssd 正在記憶體許多數據,因此更改不會立即生效。這非常令人困惑。所以我在/var/lib/sss/db/修改 sssd.conf 後刪除了帶有記憶體資訊的文件。我用這個單線作為根:

~# systemctl stop sssd.service && rm /var/lib/sss/db/* && systemctl start sssd.service

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