ldap認證 ldap認證服務器原理以及搭建
LDAP的英文全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP。它是基于X.500標準的,但是簡單多了并且可以根據需要定制。與X.500不同,LDAP支持TCP/IP,這對訪問Internet是必須的。LDAP的核心規范在RFC中都有定義,所有與LDAP相關的RFC都可以在LDAPman RFC網頁中找到。現在LDAP技術不僅發展得很快而且也是激動人心的。在企業范圍內實現LDAP可以讓運行在幾乎所有計算機平臺上的所有的應用程序從 LDAP目錄中獲取信息。LDAP目錄中可以存儲各種類型的數據:電子郵件地址、郵件路由信息、人力資源數據、公用密匙、聯系人列表,等等。通過把 LDAP目錄作為系統集成中的一個重要環節,可以簡化員工在企業內部查詢信息的步驟,甚至連主要的數據源都可以放在任何地方。
LDAP服務器的主要思想是將一個用戶的所有信息(聯系人詳細信息、登錄、密碼、權限)放在一個位置,這樣網絡管理員就更容易維護它。例如,您可以:1。使用相同的登錄名/密碼登錄到局域網和本地計算機上的。2。給一組用戶提供特定的權限。例如,有些可以訪問內部網的特定頁面,也可以訪問共享驅動器上的特定目錄。三.以Outlook為例,獲取公司中所有人的聯系方式。
1.LDAP目錄服務可以有效地解決眾多網絡服務的用戶賬戶問題。
2.LDAP目錄服務規定了統一的身份信息數據庫、身份認證機制和接口,實現了資源和信息的統一管理,保證了數據的一致性和完整性。
3.LDAP目錄服務是以樹狀的層次結構來描述數據信息的,此種模型適應了眾多行業應用的業務組織結構。[1]
跨平臺
可以在任何計算機平臺上,用很容易獲得的而且數目不斷增加的LDAP的客戶端程序訪問LDAP目錄。而且也很容易定制應用程序為它加上LDAP的支持。
LDAP協議是跨平臺的和標準的協議,因此應用程序就不用為LDAP目錄放在什么樣的服務器上操心了。實際上,LDAP得到了業界的廣泛認可,因為它是Internet的標準。產商都很愿意在產品中加入對LDAP的支持,因為他們根本不用考慮另一端(客戶端或服務端)是怎么樣的。LDAP服務器可以是任何一個開發源代碼或商用的LDAP目錄服務器(或者還可能是具有LDAP界面的關系型數據庫),因為可以用同樣的協議、客戶端連接軟件包和查詢命令與LDAP服務器進行交互。與LDAP不同的是,如果軟件產商想在軟件產品中集成對DBMS的支持,那么通常都要對每一個數據庫服務器單獨定制。
企業內部需要認證的服務很多,員工需要記住很多的密碼, 即使對這些服務進行相同的密碼設置,也存在很大的安全隱患。筆者目前工作的企業就是如此,每一個新員工的到來管理員都要初始化很多密碼,而這些密碼都被設置成了“888888”等弱密碼,由于各種軟件的認證機制之間沒有使用一個統一的標準,員工無法一次性修改所有服務的密碼,這導致很多即使是入職很久的員工都還在使用這個“眾所周知”的密碼。
另外—個比較嚴重的問題出現在公司增加內部服務的時候,例如領導要在公司內部提供郵件服務或把現有的Proftpd 換成更高效的Vsftpd,管理員需要重新為所有的員工初始化新的賬戶信息,對于一個有上千員工的企業來說這將是一個“災難”。
如果可以為各種軟件提供一個標準的認證機制,所有軟件就可以不再用獨有的用戶管理方法, 而是通過這種統一的認證機制進行用戶認證,這樣就解決了目前很多企業遇到的問題。LDAP正是這樣一種標準的協議,LDAP的歷史可以追溯到1988年,之后誕生的很多軟件基本上都支持這個協議。近年隨著企業對LDAP需求的不斷增加,絕大多數有認證機制的軟件都會首先提供對LDAP的支持。本文將介紹通過LDAP統一身份認證的方法,以簡化這種復雜的管理過程。
LDAP概述
LDAP是Light weight Directory Access Protocol(輕量級目錄訪問協議)的縮寫,其前身是更為古老的DAP協議。它是基于X.500標準的,但是很簡單,并且可以根據需要定制。與X.500不同,LDAP支持TCP/IP,這對訪問Internet是必需的。LDAP的核心規范在RFC中都有定義, 大體上講LDAP協議定義了和后臺數據庫通信的方法及客戶端軟件和LDAP協議之間的通信標準,如圖1所示(更詳細的說明可以參見相關的RFC文檔)。
在圖1中,LDAP Client指各種需要身份認證的軟件,例如Apache、Proftpd和Samba等。LDAP Sever指的是實現LDAP協議的軟件,例如OpenLDAP等。Datastorage指的是OpenLDAP的數據存儲,如關系型數據庫(MySQL)或查詢效率更高的嵌入式數據庫(BerkeleyDB),甚至是平面文本數據庫(—個txt的文本文件)。可見,OpenLDAP軟件只是LDAP協議的一種實現形式,并不包括后臺數據庫存儲。但在很多時候管理員經常將LDAP Server和DataStorage放在同一臺服務器,這樣就產生了人們通常所說的“LDAP數據庫”。雖然后臺數據庫(backend)可以是多種多樣,但LDAP協議還規定了數據的存儲方式。LDAP數據庫是樹狀結構的,與DNS類似,如圖2所示。
?
圖2 跨國公司員工信息的樹狀邏輯結構
在圖中,以這種方式存儲數據最大的一個好處就是查詢速度快,LDAP數據庫專門對讀操作進行了優化, OpenLDAP配合Berkeley DB可使其讀操作的效率得到很大提高。LDAP數據庫的樹狀結構的另一個好處是便于分布式的管理,有關這方面的內容將在后面有所介紹。
實現思路
統一身份認證主要是改變原有的認證策略,使需要認證的軟件都通過LDAP進行認證,如圖3所示。在統一身份認證之后,用戶的所有信息都存儲在LDAP Server中。終端用戶在需要使用公司內部服務的時候,都需要通過LDAP服務器的認證。每個員工只需要記住一個密碼,在需要修改用戶信息的時候可以通過管理員提供的Web界面直接修改LDAP Server中的信息。
經過2天的摸索,基本把ldap理明白了。下面是ldap在centos7上的安裝步驟,包括與samba和NFS使用ldap認證的配置。中間遇到許多坑,會在其他文章里介紹。
為什么要用ldap呢?
ldap主要用作統一認證服務器,samba和nfs提供文件共享的服務。比如要使用samba做文件共享,在windows中訪問共享文件是需要輸入用戶名密碼,驗證通過后才可以讀或者寫文件。在未配置ldap服務器以前,samba用戶信息在本地保存,也就是說如果有多個samba服務器則需要在多臺機器上重復建立認證賬戶信息,管理不方便。建立ldap后就可以將需要認證的用戶全部放到ldap服務器上,這樣就可以避免重復建立samba的認證賬戶,方便統一管理賬戶信息。
不管有沒有配置ldap,samba的用戶認證都有自己獨立的一套密碼與系統用戶和ldap用戶分開管理,提高安全性,在ldap中samba密碼是用戶類的一個屬性。本人曾經嘗試使用ldap用戶密碼或者系統密碼認證samba,包括使用插件或者PAM認證,但是均為成功,目前只發現可以雙向同步samba和系統用戶密碼的配置或者插件(samba-tools)。
ftp服務器用過的肯定不少,雖然可能有很多公司已經摒棄不用,網上也有很多其他方案可以替代,但是還是有些特別的用途,還是有一定的用武之地的。在部署了ldap之后,我們當然想盡可能多的將生產范圍內的其他系統或應用的認證都對接到ldap上來,所以這一次來使用ldap認證登錄vsftp。
1、準備工作
1
2
3
4
5
6
7
8
9
|
#停止iptables,并查看iptables狀態 /etc/init .d /iptables ?stop iptables?-L?-n #禁用SELinux,并查看SELinux狀態 setenforce?0 getenforce #編輯/etc/hosts,添加openldap?server的記錄 echo ?"192.168.49.138???ldapsrv01.contoso.com" ?>> /etc/hosts #添加成功后,最好ping一下,看是否能解析正常 |
2、安裝相關的軟件包
1
2
|
yum?-y? install ?vsftpd? ftp yum?-y? install ?nss-pam-ldapd?pam_ldap |
3、配置/etc/pam_ldap.conf
[root@server136 ~]# cp /etc/pam_ldap.conf?/etc/pam_ldap.conf.bak$(date +%F)
[root@server136 ~]# egrep -v "#|^$" /etc/pam_ldap.conf
host 127.0.0.1
base dc=example,dc=com
[root@server136 ~]# sed -i '/^host/s/host/#host/' /etc/pam_ldap.conf
[root@server136 ~]# sed -i '/^base/s/base/#base/' /etc/pam_ldap.conf
[root@server136 ~]# egrep -v "#|^$" /etc/pam_ldap.conf
[root@server136 ~]# echo "host ?192.168.49.138" >>/etc/pam_ldap.conf
[root@server136 ~]# echo "base ?dc=contoso,dc=com" >>/etc/pam_ldap.conf
[root@server136 ~]# echo "binddn ?cn=admin,dc=contoso,dc=com" >>/etc/pam_ldap.conf
[root@server136 ~]# echo "bindpw ?123456" /etc/pam_ldap.conf
[root@server136 ~]# egrep -v "#|^$" /etc/pam_ldap.conf
host ?192.168.49.138
base ?dc=contoso,dc=com
binddn ?cn=admin,dc=contoso,dc=com
bindpw ?123456
4、配置/etc/vsftpd/vsftpd.conf
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak$(date +%F)
vi /etc/vsftpd/vsftpd.conf
[root@server136 ~]# diff /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak2016-09-12
12c12
< anonymous_enable=NO
---
> anonymous_enable=YES
28d27
< anon_upload_enable=YES
33d31
< anon_mkdir_write_enable=YES
103,104d100
< chroot_local_user=YES
< #
124,126d119
< guest_enable=YES
< guest_username=ftp
< local_root=/opt/data
5、配置/etc/pam.d/vsftpd
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak$(date +%F)
[root@server136 ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session ? ?optional ? ? pam_keyinit.so ? ?force revoke
session ? ?optional ? ? pam_ldap.so
auth ? ? ? sufficient ? pam_ldap.so
auth ? ? ? required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth ? ? ? required pam_shells.so
auth ? ? ? include password-auth
account ? ?sufficient ? pam_ldap.so
account ? ?include password-auth
session ? ?required ? ? pam_loginuid.so
session ? ?include password-auth
password ? required ? ? pam_ldap.so
6、創建ftp根目錄并啟動vsftpd服務
1
2
3
4
|
mkdir ?-p? /opt/data chown ?-R? ftp : ftp ?/opt/data chkconfig?vsftpd?on /etc/init .d /vsftpd ?start |
7、使用ftp客戶端測試
[root@server136 ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (127.0.0.1:root): charleslv
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
#ldap用戶登錄成功
[root@server136 ~]# useradd user1
[root@server136 ~]# echo "111111" |passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@server136 ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
#本地用戶登錄成功
你基于 SQL 數據庫也要重新發明一套從 SQL 映射出樹形結構并進行查詢的方式
你基于 Web 也好 HTTP 也好還是需要重新定義一套 API 去查詢樹形的層級數據
LDAP 是一個被廣泛支持的、用于存儲和查詢樹形結構的協議,它的價值就是「廣泛接受的標準」
在一個沒有閉源商業系統必須通過 LDAP (以及 Kerberos、Radius 等等等等)整合的理想環境里你當然可以全部走 web 協議,比如全套 Google Apps + OAuth 認證連接 GitHub 的 web IDE 什么的——樓上某位要是活在這樣的環境請允許我羨慕一下。
但是,考慮到這套服務的通用性,易用性,balabala,還是會考慮LDAP。
(簡單粗暴的)分析:
如果使用數據庫,你準備讓使用服務的人如何接入?1給他開數據庫的訪問權限?那你是不是還得提供準確的sql查詢腳本?2在數據庫之上,提供一套web服務?那接入方要嚴格按照你的api對接咯。這樣接入方更換認證服務的時候,很可能是不統一的api,想想都麻煩。
認證服務是LDAP的話,接入方的平臺確認了之后,接入調用的api就是確定的,只要更換服務的地址,目錄的信息就可以了,是不是簡單很多。
0 Comments.