12-openldap使用AD密碼

閱讀視圖

本文嚴重參考

Openldap 整合windows AD認證

本文其他參考

OpenLDAP使用AD密碼

Configuring OpenLDAP pass-through authentication to Active Directory

一、需求概述及解決方案

1. 需求概述

Openldap是開源的目錄服務實現,windows AD是微軟的目錄服務現實。現狀是有的場景(應用、客戶端)跟openldap結合比較容易,有的場景又是必須要用AD,所以幾乎不可能棄用其中的任意一種。但同時維護兩套系統意味着維護工作大量增加(不僅僅只是增加一倍,要考慮信息分別維護、同步etc等)、出錯機率增加。

其中的一種較成熟、使用比較多的解決方案是:openldap使用windows AD的認證,這樣只需要在AD上維護一套用戶密碼即可。

比較常用的場景,如圖

2. 流程圖

如上圖,相關組件分四大部分:

  1. LDAP client:這個是實際調用ldap服務的系統,也可以是類似ldapsearch之類的client程序;
  2. Openldap:開源服務端,實際進程爲slapd;
  3. Saslauthd:簡單認證服務層的守護進程,該進程要安裝在openldap服務器上;
  4. Active directory:即windows AD,這個不用解釋;

二、AD域設置

AD域設置設置很簡單,如下:

  1. 在AD域的Users目錄下新建一個用戶saslauthd
  2. 新建一個技術運營部,新建一個用戶user10
  3. 在Users新建一個用戶test1

三、Saslauthd安裝配置

1. 安裝Saslauthd

在openldap-server服務器上安裝Saslauthd

[root@0 ~]# yum install cyrus-sasl

[root@0 ~]# rpm -ql cyrus-sasl
/etc/sysconfig/saslauthd    # 配置文件
/run/saslauthd
/usr/lib/systemd/system/saslauthd.service   # 啓動腳本
/usr/sbin/pluginviewer
/usr/sbin/saslauthd   # 守護進程
/usr/sbin/testsaslauthd   # 測試程序
/usr/share/doc/cyrus-sasl-2.1.26
/usr/share/doc/cyrus-sasl-2.1.26/LDAP_SASLAUTHD
/usr/share/man/man8/pluginviewer.8.gz
/usr/share/man/man8/saslauthd.8.gz
/usr/share/man/man8/sasldblistusers2.8.gz
/usr/share/man/man8/saslpasswd2.8.gz
/usr/share/man/man8/testsaslauthd.8.gz

2.【可選】測試sasl本身

1. 創建1個帳號及密碼

[root@0 ~]# useradd test
[root@0 ~]# passwd test
Changing password for user test.
New password: 
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password: 
passwd: all authentication tokens updated successfully.

2. 配置saslauthd使用shadow認證並啓動saslauthd進程
[root@0 ~]# grep -Ev "^$|^#" /etc/sysconfig/saslauthd
SOCKETDIR=/run/saslauthd
MECH=shadow
FLAGS=
[root@0 ~]# systemctl restart saslauthd

3. 使用testsaslauthd進行驗證
[root@0 ~]# testsaslauthd -u test -p password
0: OK "Success."

這裏如密碼正確應該出現認證成功,密碼錯誤則失敗,到這裏可理解sasl本身OK的。後續配置還會用 testsaslauthd 程序測試、調試。驗證OK後可刪除用戶。

3. 配置sasl關聯到ad域

  1. 【可選】先用ldap客戶端測一下windowad域是否可用,用戶密碼是否正確。如果驗證失敗,就需要排查openldap的問題了。
[root@0 ~]# ldapsearch -x -H ldap://192.168.244.31 -D "CN=administrator,CN=Users,DC=windows,dc=com" -w Aa123456 -b "DC=windows,DC=COM"  | less  
# extended LDIF
#
# LDAPv3
# base <DC=windows,DC=COM> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# windows.com
dn: DC=windows,DC=com
objectClass: top
objectClass: domain
objectClass: domainDNS
distinguishedName: DC=windows,DC=com
...省略
  1. 配置sasl訪問ad
1. 修改/etc/sysconfig/saslauthd, 如下
[root@0 ~]# grep -Ev "^$|^#" /etc/sysconfig/saslauthd
SOCKETDIR=/run/saslauthd
MECH=shadow
FLAGS="-O /etc/saslauthd2ad.conf"

[root@0 ~]# cat /etc/saslauthd2ad.conf    # 該文件需要新建立
ldap_servers: ldap://192.168.244.31
ldap_search_base: DC=windows,DC=com
ldap_timeout: 10
ldap_filter: sAMAccountName=%U
ldap_bind_dn: CN=saslauthd,CN=Users,DC=windows,DC=com   # 第二步驟建立的用戶
ldap_password: Aa123456
ldap_deref: never
ldap_restart: yes
ldap_scope: sub
ldap_use_sasl: no
ldap_start_tls: no
ldap_version: 3
ldap_auth_method: bind

3. 重啓saslauthd服務

該文件的主要參數:

ldap_servers: LDAP URI, windowsAD地址

ldap_bind_dn: DN for connection ,一個windows AD用戶的DN,實際不需要admin的

ldap_password: Password for connection,密碼

ldap_search_base: Search base

ldap_filter: Search filter ,%U 表示user, %u 表示user@domain

測試testsaslauthd -u administrator -p 密碼 ,這裏就是使用AD域的用戶-密碼認證了,並不只是寫到配置文件裏面的administrator,而是所有AD用戶都已經可以用testsaslauthd程序測試驗證。可進一步AD裏面加用戶、或改密碼測試。需注意AD修改密碼,老密碼依然可用5分鐘。如驗證不通過檢查 sasl的配置。重啓sasl即可清楚密碼緩存。

四、openldap-server配置

1. 檢查Openldap

如果是編譯的必須要有編譯參數 ./configure --enable-spasswd;如沒有需要重新編譯,否則不支持之後形如 userPassword: {SASL}user@domain的語法配置。

本文采用yum安裝,默認是支持的。

2. 配置openldap使用Saslauthd

在openldap的配置文件/etc/openldap/slapd.conf加入如下兩行
sasl-host localhost
sasl-secprops none
這兩行配置是告訴openldap使用本機的sasl

再修改/新建sasl的配置文件
[root@0 ~]# cat /etc/sasl2/slapd.conf    
mech_list: plain
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux

這個配置文件相當於sasl的前端,意思是來自於slapd的請求,讓saslauthd接手處理。注意這兩個配置文件文件名是相同的,但卻是不同軟件包的配置文件。如果slapd是用非root的OS用戶啓動的,那還要將用戶加到組裏。(本次實驗是用root啓動saslauthd)
usermod -a -G sasl ldap

3. openldap新建測試用戶

cat << EOF | ldapadd -x -D "cn=Manager,dc=windows,dc=com" -W 
dn: uid=user10,ou=people,dc=windows,dc=com
uid: user10
cn: user10
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 30010
gidNumber: 30005
homeDirectory: /home/user10
userPassword: {SASL}user10

如上userPassword配置, openldap就會將用戶user10轉發給sasl程序認證, 而sasl又會進一步轉發給windows AD。也可同樣原理參照, 新建test1用戶

測試如下
[root@0 ~]# testsaslauthd -u user10 -p Acc123456
0: OK "Success."
[root@0 ~]# ldapsearch -w Acc123456 -H ldap://xyz.com -D "uid=user10,ou=people,dc=xyz,dc=com" -b "uid=user10,ou=people,dc=xyz,dc=com" 
# extended LDIF
#
# LDAPv3
# base <uid=user10,ou=people,dc=xyz,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# user10, people, xyz.com
dn: uid=user10,ou=people,dc=xyz,dc=com
uid: user10
cn: user10
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 30010
gidNumber: 30005
homeDirectory: /home/user10
userPassword:: e1NBU0x9dXNlcjEw

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

五、配置TLS加密

本人並沒有配置, 所以忽略。

解決方案有這麼幾種:

Ø外層網絡層加密,比如×××隧道

Ø使用windows安全認證如NTLM 、Kerberos

Ø啓用SSL/TLS鑲套協議

本文采用TLS方案

D.Windowsad啓用TLS

Windows AD啓用TLS支持需要先安裝證書服務,即 AD CS,建議在功能裏面安裝相關管理工具。安裝完成後執行 certutil -dcinfo verify ,再用ldp.exe程序本地驗證。


通過後在用ldapsearch遠程驗證。這個有幾個注意點,過程如下:

4.導出windows證書,並配置給ldapsearch

windows的證書導出如圖:

講導出的文件傳到ldapsearch所在服務器

修改配置文件(ldap客戶端配置文件和openldap客戶端配置文件是不同的)

/usr/local/openldap2.4/etc/openldap/ldap.conf

加入 TLS_CACERT /etc/openldap/certs/ca2.crt

5.可能需要修改/etc/hosts

192.168.0.101 WIN-QLMQQENMPLO.test.com

因爲會驗證主機名是否與證書裏的字段匹配,所以不能用ip地址訪問

測試命令:

ldapsearch -x -H ldaps://WIN-QLMQQENMPLO.test.com -D "CN=blake,CN=Users,DC=test,DC=com" -w 密碼 -b "CN=administrator,CN=Users,DC=test,DC=com"

注意連接協議是ldaps,默認636端口,不再是ldap

這裏OK了再繼續。否則後面也容易出問題

E.Sasl配置TLS

修改配置文件/etc/saslauthd2ad.conf

[root@localhost log]# cat /etc/saslauthd2ad.conf

ldap_servers: ldaps://WIN-QLMQQENMPLO.test.com/

ldap_search_base: CN=Users,DC=test,DC=com

ldap_filter: sAMAccountName=%U

ldap_bind_dn: CN=administrator,CN=Users,DC=test,DC=com

ldap_password: 密碼

ldap_tls_cacert_file: /etc/openldap/certs/ca-test.cer

這裏和前面的配置有2點不同,一是協議變爲ldaps,而是最後一行指定了證書。就是前面從windows導出的證書。這裏的邏輯是:自簽名的ssl/tls證書,ldaps要求把自簽名用到的ca證書配置給客戶端。Ldapsearch程序修改ldap.conf文件,sasl則修改本文件。

使用testsaslauthd -u administrator -p 密碼 命令驗證

F.Openldap配置TLS

Openldap服務端也可以配置TLS,配置文件是slapd.conf

比如 /usr/local/openldap2.4/etc/openldap/slapd.conf

增加3行

TLSCACertificateFile /etc/openldap/certs/ca.crt

TLSCertificateFile /etc/openldap/certs/ldap.crt

TLSCertificateKeyFile /etc/openldap/certs/ldap.key.pem

這裏第一行是自簽名用到的ca證書(可以不是本機,可以用前面的windows服務器來簽證書),第二行是本機服務器證書,第三行是本機服務器證書密鑰。證書的概念這裏不詳細講解。

之後,用命令開啓TLSslapd -4 -h "ldap:/// ldaps:///"

特別注意,這裏要驗證openldapTLS的話又比較麻煩

可以先openssl s_client -connect localhost:636看一下證書對不對

然後配置ldapsearch 1.合併證書,即ldap.conf 配置文件裏面,TLS_CACERT 參數指定的文件,直接用cat命令講兩個ca證書合併(一個是前面windows的,一個是簽發給openldap的) 2.修改/etc/hosts 192.168.0.107 ldap

測試驗證命令:ldapsearch -w 密碼 -H ldaps://ldap -D "cn=blake,ou=users,dc=saybot,dc=com" -b "cn=blake,ou

=users,dc=saybot,dc=com"

G.概念總結

TLS的配置整體比較麻煩,把握以下概念:

ØLdap協議是389端口,明文;TLS加密後協議是ldaps ,636端口

ØWindowsad開啓ldaps(TLS)安裝活動目錄證書(AD CS)服務

Ø證書有2種,1是服務器證書,2是簽發服務器證書的ca證書

Ø自簽名的情況下,客戶端需要額外配置ca證書(第二種)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章