LDAP 服務搭建和後期管理

来源:https://www.cnblogs.com/somata/archive/2019/08/05/11301366.html
-Advertisement-
Play Games

LDAP 服務 本文主要在debian配置,如果需要在CentOS上部署,需要修改大部分的路勁,這裡需要自行修改。 服務按照個人理解,也可使理解為一個資料庫,但是這個資料庫的讀寫性能不像 一樣擁有良好的讀寫性能,而 更偏向於讀取,而弱於寫入。並且 的數據類型屬於面向對象的數據類型,這和 的數據類型不 ...


LDAP 服務

本文首發:https://www.cnblogs.com/somata/p/LDAPServerConfigAndPostManagement.html

本文主要在debian配置,如果需要在CentOS上部署,需要修改大部分的路勁,這裡需要自行修改。

LDAP 服務按照個人理解,也可使理解為一個資料庫,但是這個資料庫的讀寫性能不像 MySQL 一樣擁有良好的讀寫性能,而 LDAP 更偏向於讀取,而弱於寫入。並且 LDAP 的數據類型屬於面向對象的數據類型,這和 MySQL 的數據類型不同,並且使用樹狀結構記錄數據,這些都與普通的資料庫(關係型資料庫),有著極大的差別。而這一切的一切都代表著 LDAP 這個服務並不是用做一個普通的資料庫(關係型資料庫)用的,而是用於類似於賬戶存儲等這種少存入、多讀取、需要包含對象類型和對象相關屬性的場合。

LDAP工作機制

就跟上面說的一樣,LDAP是樹狀結構的資料庫,所以說如果想要找到其中一個節點,就得通過逐層查詢,並且必須保證每一個節點的路徑唯一,那麼這個節點的路徑就稱之為dn,dn 的編寫路徑必須是由下而上編寫的,例如:

cn=scott,ou=marketing,ou=people,dc=mydomain,dc=org

關鍵字 英文全稱 含義
dc Domain Component 功能變數名稱的部分,其格式是將完整的功能變數名稱分成幾部分,如功能變數名稱為 example.com 那麼就是: dc=example,dc=com
uid User Id 用戶 ID,如 “tom”
ou Organization Unit 組織單位,類似於 Linux 文件系統中的子目錄,它是一個容器對象,組織單位可以包含其他各種對象(包括其他組織單元),如 “market”
cn Common Name 公共名稱,如 “Thomas Johansson”
sn Surname 姓,如 “Johansson”
c Country 國家,如 “CN” 或“US”等。
o Organization 組織名,如 “Example, Inc.”
dn Distinguished Name 惟一辨別名,類似於 Linux 文件系統中的絕對路徑,每個對象都有一個惟一的名稱,如 “uid= tom,ou=market,dc=example,dc=com”,在一個目錄樹中 DN 總是惟一的
rdn Relative dn 相對辨別名,類似於文件系統中的相對路徑,它是與目錄樹結構無關的部分,如 “uid=tom” 或“cn= Thomas Johansson”

以上這些類別沒有指定特定的用法,這些完全由應用程式自行決定。

LDAP 安裝

debian:

apt install slapd ldap-utils        # slapd 為服務端, ldap-utils 為客戶端程式

CentOS:

yum install openldap-servers openldap-clients   # 上同

LDAP 伺服器配置初始化

做這一步的目的是為了完全自定義初始化資料庫,拋棄由軟體包構成的資料庫。
當然你也可以跳過這個步驟,直接開始下一步,這樣也是無所謂的。

你也可以你使用 debian 提供的便捷方式來完成伺服器配置: dpkg-reconfig slapd

首先先來解釋一些為什麼要按照如下(完全屬於個人理解):
新版的 OpenLdap 已經棄用了 slapd.conf 配置文件,改而使用 slapd.d 目錄下的樹狀目錄文件來配置伺服器的相關配置。但是 slapd.d 是由服務進程維護的,並且使用CRC來校驗文本是否改動,我們無法輕易修改,slapd安裝包給我們提供了一個命令 slapadd 用於創建配置文件,所以才用了下麵的方法來初始化資料庫。後期使用 ldapmodifyldapadd 來完成伺服器配置。

首先停止資料庫服務:

systemctl stop slapd

然後編輯文件:

# 首先備份文件,以免無法複原
mkdir /root/back
tar -Jcvf /root/back/slapd.config-`date  '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/ldap/slapd.d/
tar -Jcvf /root/back/slapd.data-`date  '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /var/lib/ldap /var/lib/slapd
# 然後再刪除配置文件
rm -rf /etc/ldap/slapd.d/*
rm -rf /var/lib/slapd/*
rm -rf /var/lib/ldap/*
# 複製配置文件到臨時目錄
cp /usr/share/slapd/slapd.init.ldif /tmp
cd /tmp

這裡我創建一個sed的規則表,方便使用,以下請自行選擇。

# file: rules

##################################
#    本文請自行選擇複製到到文件內     #
##################################
#自定義基本功能變數名稱(必選):
    s/@SUFFIX@/$(basename)/g
#自定義管理員用戶密碼(必須):
    s/@PASSWORD@/$(password)/g
#自定義管理員用戶名稱(可選):
    s/cn=admin/cn=$(username)/g

#資料庫類型(3選1,必選):
#   mdb
        s/@BACKEND@/mdb/g
        s/@BACKENDOBJECTCLASS@/olcMdbConfig/g
        s/@BACKENDOPTIONS@/olcDbMaxSize: 1073741824/g
#   hdb
        s/@BACKEND@/hdb/g
        s/@BACKENDOBJECTCLASS@/olcHdbConfig/g
        s/@BACKENDOPTIONS@/olcDbConfig: set_cachesize 0 2097152 0\nolcDbConfig: set_lk_max_objects 1500\nolcDbConfig: set_lk_max_locks 1500\nolcDbConfig: set_lk_max_lockers 1500/g
#   bdb
        s/@BACKEND@/bdb/g
        s/@BACKENDOBJECTCLASS@/olcBdbConfig/g
        s/@BACKENDOPTIONS@/olcDbConfig: set_cachesize 0 2097152 0\nolcDbConfig: set_lk_max_objects 1500\nolcDbConfig: set_lk_max_locks 1500\nolcDbConfig: set_lk_max_lockers 1500/g

這裡我選擇hdb資料庫,樣例如下:

# file:rule

s/@SUFFIX@/dc=black,dc=com/g
s/@PASSWORD@/{SSHA}RadcVPriXsR6gCwhwPKsCLkhnHy3r1ZS/g
s/cn=admin/cn=root/g
s/@BACKEND@/hdb/g
s/@BACKENDOBJECTCLASS@/olcHdbConfig/g
s/@BACKENDOPTIONS@/olcDbConfig: set_cachesize 0 2097152 0\nolcDbConfig: set_lk_max_objects 1500\nolcDbConfig: set_lk_max_locks 1500\nolcDbConfig: set_lk_max_lockers 1500/g

其中密碼是這樣生成的:

slappasswd -s 147258369

{SSHA}RadcVPriXsR6gCwhwPKsCLkhnHy3r1ZS

再然後通過命令修改配置文件,並且生成配置文件和資料庫:

sed -i -f rule /tmp/slapd.init.ldif
slapadd -F "/etc/ldap/slapd.d/" -b "cn=config" -l slapd.init.ldif

_#################### 100.00% eta none elapsed none fast!
Closing DB...

我們再查看一下這些文件的:

ll /etc/ldap/slapd.d/*

-rw------- 1 root root 478 Jul 10 09:06 /etc/ldap/slapd.d/cn=config.ldif
/etc/ldap/slapd.d/cn=config:
total 28
-rw------- 1 root root 452 Jul 10 09:06 cn=module{0}.ldif
drwxr-x--- 2 root root 4096 Jul 10 09:06 cn=schema
-rw------- 1 root root 394 Jul 10 09:06 cn=schema.ldif
-rw------- 1 root root 412 Jul 10 09:06 olcBackend={0}hdb.ldif
-rw------- 1 root root 542 Jul 10 09:06 olcDatabase={0}config.ldif
-rw------- 1 root root 657 Jul 10 09:06 olcDatabase={-1}frontend.ldif
-rw------- 1 root root 1084 Jul 10 09:06 olcDatabase={1}hdb.ldif

哦,我們這裡看到了好像文件許可權不對啊,所以我們也改改文件屬主。

chown -R openldap:openldap slapd.d
chown -R openldap:openldap /var/lib/slapd/*
chown -R openldap:openldap /var/lib/ldap/*

那麼這裡就可以正常啟動伺服器了:

systemctl start slapd

LDAP 資料庫創建

這裡我們還需要註意雖然前面創建的伺服器配置里有DN信息,但是真正的資料庫完全沒有創建,這裡我們必須手動創建這些資料庫。當然你可以使用命令 slapcat 或者 ldapsearch 命令來查詢是否有數據存在。

首先創建一個文件,用於記錄需要存入的數據,ldap資料庫沒有互動式界面,每一次操作都必須一條命令,其實這也側面證明瞭LDAP是是個偏讀取的面向對象型的服務,而不是一個綜合型的資料庫服務。

# file:base.ldif

# 根節點                   複製時,註意把這這個註釋刪了!!!!
dn: dc=black,dc=com
dc: black
objectClass: top
objectClass: domain
# 管理員用戶root
dn: cn=root,dc=black,dc=com
objectClass: organizationalRole
cn: root
description: LDAP Manager

然後我們再通過命令,將 base.ldif 這的信息導入至資料庫

ldapadd -x -D "cn=root,dc=black,dc=com" -w 147258369 -f  base.ldif

adding new entry "dc=black,dc=com"
adding new entry "cn=root,dc=black,dc=com"

這裡需要解釋一項這裡命令的基本用法:

  • -x: 表示使用基本擁擠認證
  • -D "cn=root,dc=black,dc=com" -w 147258369: 指定用戶和密碼
  • -f: 指定文件

那麼這裡再驗證一下資料庫是否創建成功:

ldapsearch  -x -D "cn=root,dc=black,dc=com" -w 147258369 -b "dc=black,dc=com"

# extended LDIF
#
# LDAPv3
# base <dc=black,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# black.com
dn: dc=black,dc=com
dc: black
objectClass: top
objectClass: domain
# root, black.com
dn: cn=root,dc=black,dc=com
objectClass: organizationalRole
cn: root
description: LDAP Manager
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2

再解釋一個參數:

  • -b: 指定需要搜索的base目錄

LDAP 後期管理

資料庫管理

這裡的資料庫管理也可是使用一些 LDAP 軟體來完成(部署 LDAP 應用),不過還以要寫寫命令行,因為命令行的靈活性高,而且便於理解,這些都是應用程式無法比擬的。

ldapadd 條目添加

還是和上面資料庫創建一樣的,需要先創建一個文件用於存放數據。

# file: group.ldif

# 組織單元
dn: ou=User,dc=black,dc=com
objectClass: organizationalUnit
ou: User
# 用戶1
dn: uid=User1,ou=User,dc=black,dc=com
objectClass: account
objectClass: simpleSecurityObject
uid: User1
userPassword: {SSHA}5WjJz9QfntUjurHirfv9C4832x1xh9Kt
# 用戶2
dn: uid=User2,ou=User,dc=black,dc=com
objectClass: account
objectClass: simpleSecurityObject
uid: User2
userPassword: {SSHA}9biML+BP/W8w3mRkVack7CyB1hfDi8cD

然後我們再通過命令將文件添加到資料庫:

ldapadd  -x -D "cn=root,dc=black,dc=com" -w 147258369 -f group.ldif

adding new entry "ou=User,dc=black,dc=com"
adding new entry "uid=User1,ou=User,dc=black,dc=com"
adding new entry "uid=User2,ou=User,dc=black,dc=com"

ldapadd 可以從文件中讀取數據,同時也可從標準輸入輸出讀取數據:

cat << EOF | ldapadd  -x -D "cn=root,dc=black,dc=com" -w 147258369
dn: uid=User3,ou=User,dc=black,dc=com
objectClass: account
objectClass: simpleSecurityObject
uid: User3
userPassword: {SSHA}iES3qeH0nYUcwGtSQm1hIBCEsV+gBF3P
EOF

adding new entry "uid=User3,ou=User,dc=black,dc=com"

這樣就可以臨時添加數據了,同時這樣也可使用bash腳本完成批量用戶添加,這裡我就不演示了。

ldapmodify 條目更改

還是一樣的將數據寫入文件,不過這裡需要註意,因為是更改條目,所以需要編寫指明更改模式,和更改目標。

# file: change.ldif

dn: uid=User3,ou=User,dc=black,dc=com
changetype: modify
replace: userPassword
userPassword: {SSHA}9TM5y06bvepK6k8i+Jfkc/9C6GkVsobm

然後使用命令即可。

ldapmodify -x -D "cn=root,dc=black,dc=com" -w 147258369 -f change.ldif

modifying entry "uid=User3,ou=User,dc=black,dc=com"

那麼再來驗證一下:

ldapwhoami -x -D "uid=User3,ou=User,dc=black,dc=com" -w 147

dn:uid=User3,ou=User,dc=black,dc=com

如果返回如上,那麼修改成功。

ldapdelete 條目刪除

刪除條目不需要寫清除如何如何,只需要指定條目路徑即可,也就是dn.

ldapdelete -x -D "cn=root,dc=black,dc=com" -w 147258369 "uid=User3,ou=User,dc=black,dc=com"

這個命令沒有返回信息,那麼表明執行成功。我們再次使用命令驗證:

ldapwhoami -x -D "uid=User3,ou=User,dc=black,dc=com" -w 123456

ldap_bind: Invalid credentials (49)

這就返回憑據無效則表明條目刪除成功。

ldapsearch 條目搜尋

這個就不多說了,直接上命令:

ldapsearch  -x -b "dc=black,dc=com" -D "cn=root,dc=black,dc=com" -w 147258369 "(&(objectclass=account)(uid=User1))"                # 這裡最後一段是filter,用於過濾查詢結果

# extended LDIF
#
# LDAPv3
# base <dc=black,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# User1, User, black.com
dn: uid=User1,ou=User,dc=black,dc=com
objectClass: account
objectClass: simpleSecurityObject
userPassword:: e1NTSEF9OWJpTUwrQlAvVzh3M21Sa1ZhY2s3Q3lCMWhmRGk4Y0Q=
uid: User1
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5

-b:指定基本路徑,會查找該路徑下的所有節點

ldapwhomai 用戶查詢

前面也用過了,直接上命令:

ldapwhoami -x -D "cn=root,dc=black,dc=com" -w 147258369

dn:cn=root,dc=black,dc=com

返回值如上則表示正常

伺服器配置

這裡伺服器的後續配置,不能再動 slapd.d 目錄下的文件了,必須通過 ldap 提供的 API 介面完成伺服器配置,這點是非常重要的。所以我們還需要通過客戶端命令 ldapmodify 命令來進行服務配置,比如所修改管理員密碼:

這裡的dn節點與資料庫節點不同,你可以看到這些條目對應的就是 slapd.d 目錄下的文件了,當然是去去除了尾碼名(ldif)的節點。

# file: config.ldif

dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}5WjJz9QfntUjurHirfv9C4832x1xh9Kt

然後通過命令完成修改:

 ldapmodify -Y EXTERNAL -H ldapi:/// -f config.ldif

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}hdb,cn=config"

註:如果節點不存在,但是你還是想要創建也是可是的,你需要將dn節點指定到你需要創建的文件路徑,然後使用命令ldapadd 添加即可。

LDAP 備份和還原

這裡我使用了 slapd 提供的命令完成了該操作,主要就是方便而且全面,也不想去瞭解別的方法,都沒這個實在。

伺服器備份

slapcat -n 0 -l slapcat.bak.0.ldif          # 0 表示備份伺服器配置
slapcat -n 1 -l slapcat.bak.1.ldif          # 1 表示備份資料庫

無返回信息則表示執行成功。

伺服器還原

關閉伺服器:

systemctl stop slapd

刪除原始文件:

# 首先備份文件,以免無法複原
mkdir /root/back
tar -Jcvf /root/back/slapd.config-`date  '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/ldap/slapd.d/
tar -Jcvf /root/back/slapd.data-`date  '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /var/lib/ldap /var/lib/slapd
# 然後再刪除配置文件
rm -rf /etc/ldap/slapd.d/*
rm -rf /var/lib/slapd/*
rm -rf /var/lib/ldap/*

還原資料庫:

slapadd -l slapcat.bak.0.ldif -F /etc/ldap/slapd.d/ -b "cn=config"      # 還原伺服器配置
slapadd -l slapcat.bak.1.ldif -F /etc/ldap/slapd.d/                                     # 還原資料庫

_#################### 100.00% eta none elapsed none fast!
Closing DB...

_#################### 100.00% eta none elapsed none fast!
Closing DB...

這樣就搞定了。
但是還是需要註意許可權:

chown -R openldap:openldap /etc/ldap/slapd.d/*
chown -R openldap:openldap /var/lib/slapd/*
chown -R openldap:openldap /var/lib/ldap/*

啟動伺服器:

systemctl start slapd

部署 LDAP 應用

這裡直接使用 phpldapadmin了, 我也不想再多弄了,怎麼簡單,怎麼來了。

apt install phpldapadmin

然後配置一下 phpladpadmin的文件即可:

# file: /etc/phpldap/config.php

……
$servers->setValue('server','base',array('dc=black,dc=com'));               # 在300行,更改伺服器
……
……
$servers->setValue('login','bind_id','cn=root,dc=black,dc=com');        # 在326行,更改登入的預設字元串
……

然後登入即可:
image.png
界面如下:
image.png

本文經「原本」原創認證,作者乾坤盤,訪問yuanben.io查詢【2P9ZA60S】獲取授權信息。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 以 Hortonworks Data Platform (HDP) 平臺為例 ,hadoop大數據平臺的安全機制包括以下兩個方面: 身份認證 即核實一個使用者的真實身份,一個使用者來使用大數據引擎平臺,這個使用者需要表明自己是誰,即提供自己的身份證明,大數據平臺需要檢驗這個證明,確定這個證明是 ...
  • title: redis login limitation <! more 利用 redis 實現登陸次數限制, 註解 + aop, 核心代碼很簡單. 基本思路 比如希望達到的要求是這樣: 在 1min 內登陸異常次數達到5次, 鎖定該用戶 1h 那麼登陸請求的參數中, 會有一個參數唯一標識一個 u ...
  • Hadoop Shuffer     Hadoop 的shuffer主要分為兩個階段:Map、Reduce。 Map Shuffer:     這個階段發生在map階段之後,數據寫入記憶體之前,在數據寫入記憶體的過程就已經開 ...
  • mysql中的範式 範式 範式:Normal Format,是一種離散數學中的知識,是為瞭解決數據的存儲與優化的問題:保存數據的存儲之後,凡是能夠通過關係尋找出來的數據,堅決不再重覆存儲,終極目標是為了減少數據的冗餘。範式:是一種分層結構的規範,分為六層,每一層都比上一層更加嚴格,若要滿足下一層範式 ...
  • 講乾貨,不啰嗦,本教程主要基於Mysql資料庫,講解sql的基本使用。 資料庫主要包括增、刪、改、查等基本操作,以下為設計到的常用的sql語句: 一、查 1.select 語法查詢 SELECT column_name,column_name FROM table_name 其中column_nam ...
  • 10分鐘搞懂:億級用戶的分散式數據存儲解決方案https://www.cnblogs.com/lagou/p/11011682.html ...
  • 1.啟動hadoop之前,ssh免密登錄slave主機正常,使用命令start-all.sh啟動hadoop時,需要輸入slave主機的密碼,說明ssh文件許可權有問題,需要執行以下操作: 1)進入.ssh目錄下查看是否有公鑰私鑰文件authorized_keys、id_rsa、id_rsa.pub ...
  • 我們在建表的時候通常會在最後聲明引擎類型,這次我們就來看看存儲引擎都有哪些: 舉個例子: 銀行轉賬: 張三想給李四轉500元錢: 張三-500 李四+500 這兩步必須都完成,轉賬才完成 像這種,2步或N步必須都完成,從邏輯上講,是一個‘原子操作’,即要麼成功,要麼都不成功 那麼如何保障這種特性? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...