前言
由於公司業務發展,內部搭建的公共系統越來越多,對每一位同學來說,需要記住多個系統的用戶名和密碼,對大齡同學極度不友好,同時,對IT同學來說,在新人入職階段,需要去不同的賬號平台里添加或注冊賬號,管理和使用代價有點高;
經過和周邊部門同學溝通下來,決定使用LDAP服務來管理這批平台,先簡單介紹下什么是LDAP。
LDAP
基礎定義
LDAP全稱叫做 Light Directory Access Portocol,直譯過來就是輕量目錄訪問協議,之所以叫做目錄,是因為它使用的數據庫 是一個為查詢、瀏覽和檢索而重度優化過的數據庫,並且成樹狀結構組織數據,就像我們大家Windows系統里的目錄一樣,一層一層往下拓展。
數據特性
目錄數據庫和關系數據庫不同,它具有優異的讀性能,但是寫性能差,並且不具有常規關系型數據庫的ACID特性,因此他天生就是用來做查詢的。
實現的功能
LDAP是跨平台的Internet協議,市面上大多數產品都加入了對LDAP的支持,因此對於這類系統來說,我們只需要簡單的通過插件形式的配置,就能夠實現LDAP服務與指定產品的認證交互,那么在筆者這里,能夠實現的就是“使用一個LDAP服務中的認證信息,去認證所有內網下的公共平台”,變相實現企業“一賬通”功能。
安裝
環境介紹和前期准備
因為筆者公司內網的開發環境為Ubuntu,因此主要的搭建環境細節如下:
root@saier-zj-online-game-192:~# ifconfig
eth0 Link encap:Ethernet HWaddr **:**:**:**
inet addr:192.168.0.83 Bcast:192.168.15.255 Mask:255.255.240.0
root@saier-zj-online-game-192:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
防火牆
由於業務安全基線要求比較低,當前這台測試機上,防火牆是關閉的,因此在實際測試過程中,並沒有額外的配置防火牆策略,但是網上其他博主有配置防火牆的操作,這里摘抄過來,僅供參考:
ufw allow proto tcp from any to 192.168.0.83 port 389
ufw allow proto tcp from any to 192.168.0.83 port 636
apt包源
這里我們采用apt-get的安裝方式,Ubuntu原生自帶的source就能夠下載安裝ldap了,並且暫時不建議使用國內的阿里或其他源,可能會下載到版本比較高的包並與本地的原有依賴包產生沖突;
安裝步驟
執行安裝指令:apt-get install -y slapd ldap-utils
配置
交互式配置
在執行上述安裝指令的過程中,你的終端會出現交互式配置界面,讓你定義一些初始化配置,下面我們一起康康每條都是啥意思~
1.定義administrator的管理密碼
2.二次確認,心細嗷
OK之后,你會發現安裝過程就退出了,我們去修改下配置文件的內容:
root@saier-zj-online-game-192:~# cd /etc/ldap/
root@saier-zj-online-game-192:/etc/ldap# cat ldap.conf
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE dc=ldap,dc=com
URI ldap://192.168.0.83
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
# TLS certificates (needed for GnuTLS)
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
實際上面的交互式配置並不是完整的ldap配置,因為系統默認為你選擇了一些配置,因此,如果我們不滿足於當前配置信息,我們可以執行指令:
dpkg-reconfigure slapd
交互界面如下:
1.是否需要創建初始配置和數據庫,我們需要,因此不能激活此項,選No
2.DNS域名,可以看到是跟base DN相對應的
注意
這里有一點需要說明下,筆者在其他的博客中看到,很多人需要在本地的hosts文件中解析ldap服務器的域名和對應的內網IP地址,筆者這里並沒有做該配置,我覺得他並不是必須的,之所以需要做自定義解析,是因為他們在后續的管理和集成中,會在需要配置ldap服務器的地方配置對應域名,而不是采用IP+端口的方式,因此我這里並沒有做自定義解析,也就是說,這里的DNS配置,我僅僅是保持跟DN一致,並沒有額外的作用。
同時,我這樣的配置也會有個麻煩之處,ldap的很多指令,默認是會去找這里DNS配置的域名上的服務的,但是我這里配置的域名,並不是真實ldap的域名,因此很多指令會報錯,但是可以解決,在命令行上加上ldap服務的Ip和端口即可,后面會有說明。
3.設置組織名稱
4.配置管理員密碼
5.確認管理員密碼
6.選擇數據庫類型,這里康到他其實推薦使用最新的MDB,那我們就用MDB,如果沒有MDB版本的同學,我們可以使用HDB
7.卸載ldap時候是否需要清空數據庫,這里我們選了No
8.這里我們推薦使用最新的數據庫,因此需要移走老的庫
9.是否允許LDAPv2協議,這里我們選No
關於為什么我們禁用LDAPv2協議,找了官網,說明如下:
LDAPv2 is historic (RFC3494). As most so-called LDAPv2 implementations (including slapd(8)) do not conform to the LDAPv2 technical specification, interoperability amongst implementations claiming LDAPv2 support is limited. As LDAPv2 differs significantly from LDAPv3, deploying both LDAPv2 and LDAPv3 simultaneously is quite problematic. LDAPv2 should be avoided. LDAPv2 is disabled by default.
以上9步選擇完之后,交互式界面的配置就結束了,我們可以使用ldap包里帶的指令來着看當前ldap服務中配置的分層信息:
root@saier-zj-online-game-192:/etc/ldap# ldapsearch -x -LLL
dn: dc=ldap,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: lrldap
dc: ldap
dn: cn=admin,dc=ldap,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
配置字段解析
咱們分別看下這些個字段是什么意思,第一次接觸的同學可能會有點暈~
唯一辨別名,類似於linux文件系統中的絕對路徑,每個目錄樹中,dn保持唯一
dn: dc=ldap,dc=com
對象集,我們可以看到,每一層可以賦予多個對象集屬性
objectClass: top
objectClass: dcObject
objectClass: organization
組織名,剛剛我們在交互式界面配置的
o: lrldap
域名部分
dc: ldap
這第二層,多了cn,cn是公共名稱,我們可以理解為是上面部分dn中包含的一個cn
dn: cn=admin,dc=ldap,dc=com
這層cn所具有的對象集
objectClass: simpleSecurityObject
從這里也能看到,上面的對象集是organization,這里是organizationalRole,組織內的角色,是不是能夠比較好的理解ldap的分層概念了~
objectClass: organizationalRole
cn上面說了,是公共名稱,可以理解為一個組,或一個目錄,里面還能包含一些東西
cn: admin
description: LDAP administrator
OK,上述指令能夠正常執行的話,說明咱們的ldap服務就成功搭建完成了,后面就是對於數據查詢和管理方面的問題了,搭建過程告一段落~
管理
獲取工具
看了網上很多人都是用phpldapadmin,我試了下不是特別想用,因為它本身也是個服務,需要依賴apache,同時還需要適配我們的ldap服務,做的改動會有點多,並且如果少安裝了某些php擴展,還可能導致你的管理界面進不去,當初就是花了很多時間去處理這個問題~~
這里我們推薦一款在Windows下運行的ldap管理工具,獲取地址:
LdapAdmin.exe
一起看下使用方法,打開管理用具可以看到如下界面:
點擊紅框按鈕,選擇新增ldap連接,連接的配置界面如下:
在Account欄里,它默認是使用匿名用戶連接的,這里我們需要取消勾選匿名賬號的標記,采用圖片中的username和password登錄,其中,password就是交互式界面中我們配置的管理員密碼~~
username就是我們的ldap管理員名稱,在上面 ldapsearch -x -LLL指令中可以拿到對應信息;
ok,點擊測試連接,成功之后,就能夠通過LdapAdmin來管理咱們的ldap服務了~~
管理工具展示的界面如下:
如圖我們也能看到,根(dc=ldap,dc=com)下有一個管理員分支(cn=admin)
至此,我們就能夠通過該工具來管理我們的ldap了。
數據控制
通過讀取文件的形式新增數據
ldap在命令行上支持通過指令來讀取文件內容,並將內容寫入到數據庫中;
文件的命名有要求,需要以“ldif”結尾,內容如下:
root@saier-zj-online-game-192:/etc/ldap# cat structure.ldif
dn: ou=people,dc=ldap,dc=com
objectClass: organizationalUnit
objectClass: top
ou: user
dn: ou=group,dc=ldap,dc=com
objectClass: organizationalUnit
objectClass: top
ou: group
執行指令:
root@saier-zj-online-game-192:/etc/ldap# ldapadd -x -D cn=admin,dc=ldap,dc=com -W -f structure.ldif -h 192.168.0.83 -p 389
Enter LDAP Password:
adding new entry "ou=people,dc=ldap,dc=com"
adding new entry "ou=group,dc=ldap,dc=com"
這里看到,我們在運行指令的時候,手動添加了”-h 192.168.0.83 -p 389“參數,還記得是為什么嘛 ^ ^
顯示添加新的entry成功,我們看下工具里的效果:
刷新之后,也成功顯示了~~
關於ldap指令相關的內容,可以參考:ldap指令
通過管理工具新增數據
通過管理工具,其實也就是用鼠標,我們看下該怎么添加這些信息,鼠標放到跟分支上>右擊>New==>Entry
點擊左上角的保存后,管理界面就能夠出現咱們新建的Entry了!
筆者公司的需求場景
前面跟大家敘述過,我這邊是需要通過ldap去統一管理內部的多個公共平台,因此,就需要ldap的數據庫里有全公司員工的賬號密碼信息,這邊創建的過程其實比較明了,其一是通過ldif文件的方式添加,其二是手動通過鼠標點擊的方式添加,筆者在添加過程中遇到的一些坑,這里給大家指出來~~
分組
由於公司內部有多個部門,同時也就對應ldap中的多個分組,這個分組,我們可以在“ou=group”目錄下創建;
鼠標放在ou=group分支>右擊>New==>Group of unique names
注意:最后一擊這里不能選擇單純的’Group‘組,否則創建出來的內容,無法被集成的平台拉取到,
筆者這里是手動創建的。
成員
成員的話,需要包括公司所有同學,200號人,原先打算通過配置文件添加,發現並不好用,最后....慢慢點叭--
成員的loginshell不是必填項,其他的幾個,大家自己看看,這里就不贅述了,沒有坑的地方;
注意:成員創建完之后,就可以雙擊分組,顯示欄里有個Add按鈕,可以把指定成員添加的對應組里~~
像confluence這類平台,是能夠直接識別到分組和分組里的成員,權限控制起來比較方便~~
到目前為止,Ubuntu環境系的ldap服務的搭建以及數據管理過程,就大致分享完了,后續還會有集成到各種平台(confluence,jenkins,nextcloud,svn)的文章提供大家參考,有遺漏或錯誤的地方,歡迎請指正。