CentOS7 下 OpenLDAP Server 安裝和配置及使用 phpLDAPadmin 和

LDAP 表明輕量級目錄訪問協議Lightweight Directory Access Protocol,幷包含在一系列協議之中,這些協議容許一個客戶端經過網絡去獲取集中存儲的信息(例如所登陸的 shell 的路徑,家目錄的絕對路徑,或者其餘典型的系統用戶信息),而這些信息能夠從不一樣的地方訪問到或被不少終端用戶獲取到(另外一個例子是含有某個公司全部僱員的家庭地址和電話號碼的目錄)。php

對於那些被賦予了權限可使用這些信息的人來講,將這些信息進行集中管理意味着能夠更容易地維護和獲取。java

下面是對上面示意圖的一個詳細解釋。git

在一個 LDAP 目錄中,一個條目entry表明一個獨立單元或信息,被所謂的區別名DN,Distinguished Name 惟一識別。
一個屬性attribute是一些與某個條目相關的信息(例如地址,有效的聯繫電話號碼和郵箱地址)。
每一個屬性被分配有一個或多個值value,這些值被包含在一個以空格爲分隔符的列表中。每一個條目中那個惟一的值被稱爲一個相對區別名RDN,Relative Distinguished Name。
接下來,就讓咱們進入到有關服務器和客戶端安裝的內容。shell

本文主要介紹在 CentOS7 下 OpenLDAP Server 安裝及配置方法,以及如何使用 phpLDAPadmin 和 Java LDAP 訪問 LDAP Server。 vim

本人也是剛剛學習 LDAP,所以本文主要面向 LDAP 的初學者。高手請繞行! api

學習前提: bash

  1. 瞭解 Linux 經常使用命令及編輯工具的使用方法。
  2. 瞭解 LDAP 的概念及基礎知識點(百度便可)。

系統環境:
CentOS Linux release 7.2.1511 (Core) 64位
Linux version 3.10.0-327.el7.x86_64
gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) 服務器

軟件環境:
openldap-clients-2.4.40-13
openldap-devel-2.4.40-13
openldap-2.4.40-13
openldap-servers-2.4.40-13
phpLDAPadmin 1.2.3(須要 LAMP 環境,該部份內容請自行百度,不須要安裝 MySQL) 網絡

請以 root 帳號登陸並執行如下全部命令。 app

OpenLDAP Server 安裝及配置
Step 1:安裝必要包
首先使用以下命令查看是否已經安裝 OpenLDAP:

# rpm -qa | grep openldap``
openldap-2.4.40-13.el7.x86_64
openldap-servers-2.4.40-13.el7.x86_64
openldap-clients-2.4.40-13.el7.x86_64

若已經安裝過,能夠忽略此步驟,不然請繼續執行以下命令(能夠根據須要選擇是否安裝遷移工具 migrationtools):

# yum install -y openldap openldap-clients openldap-servers migrationtools
#cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
#chown ldap. /var/lib/ldap/DB_CONFIG
#systemctl start slapd
#systemctl enable slapd

在服務器和客戶端上,爲了確保 SELinux 不會妨礙擋道,長久地開啓下列的布爾值:

#setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0
其中 allow_ypbind 爲基於 LDAP 的認證所須要,而 authlogin_nsswitch_use_ldap則可能會被某些應用所須要。

查看端口使用狀況:

# netstat -tlnp | grep slapd
tcp 0 0 0.0.0.0:389 0.0.0.0: LISTEN 227/slapd
tcp6 0 0 :::389 :::
LISTEN 227/slapd
默認狀況下, slapd 用戶會佔用 389 端口。
Step 2:設置 OpenLDAP 的管理員密碼
首先要生成經處理後的明文密碼:

# slappasswd
New password:
Re-enter new password:
{SSHA}hnm8WDAp0mn2HgN26h6ZdbzFVtFATQhG
其中 {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx 就是加密處理後的明文密碼,以後會用到這個密碼。
以後再新建以下文件:

#touch chrootpw.ldif
#echo "dn: olcDatabase={0}config,cn=config" >> chrootpw.ldif
#echo "changetype: modify" >> chrootpw.ldif
#echo "add: olcRootPW" >> chrootpw.ldif
#echo "olcRootPW: {SSHA}hnm8WDAp0mn2HgN26h6ZdbzFVtFATQhG" >> chrootpw.ldif
最後導入該文件:

# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
Step 3:導入基本 Schema(能夠有選擇的導入)

#cd /etc/openldap/schema/
#for def in ls /etc/openldap/schema/*.ldif ; do ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/$def; done

ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f core.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f ppolicy.ldif
Step 4:設置本身的 Domain Name

#vim chdomain.ldif
文件內容以下,*注意,要使用你本身的域名替換掉文件中全部的 "dc=,dc=*",而且使用剛剛生成的密碼,替換文中的 "olcRootPW" 部分:

注意文中dn:上的「#空白行」,須改成空白行,不然導入文件會報錯:

# replace to your own domain name for "dc=,dc=" section
# specify the password generated above for "olcRootPW" section
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=Manager,dc=ho1ho,dc=com" read by
none
#空白行
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=ho1ho,dc=com
#空白行
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=ho1ho,dc=com
#空白行
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}ZhmO2UeH4tsyy5ly0fTwdkO10WJ69V6U
#空白行
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=ho1ho,dc=com" write by anonymous auth by self write by none
olcAccess: {1}to dn.base="" by
read
olcAccess: {2}to by dn="cn=Manager,dc=ho1ho,dc=com" write by read
以後再導入該文件:

# ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"
而後再新建以下文件,是添加一些條目到咱們的 LDAP 目錄的:

#vim basedomain.ldif
文件內容以下,注意,要使用你本身的域名替換掉文件中全部的 "dc=*,dc=*":

# replace to your own domain name for "dc=***,dc=***" section
dn: dc=ho1ho,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: Server World
dc: ho1ho

dn: cn=Manager,dc=ho1ho,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=People,dc=ho1ho,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=ho1ho,dc=com
objectClass: organizationalUnit
ou: Group
最後導入該文件:

# ldapadd -x -D cn=Manager,dc=ho1ho,dc=com -W -f basedomain.ldif
Enter LDAP Password:
adding new entry "dc=ho1ho,dc=com"

adding new entry "cn=Manager,dc=ho1ho,dc=com"

adding new entry "ou=People,dc=ho1ho,dc=com"

adding new entry "ou=Group,dc=ho1ho,dc=com"
Step 5:容許防火牆訪問 LDAP 服務。開啓 389/TCP 端口(根據你本身的防火牆進行設置):
若使用的是 firewall,修改方法以下:

# firewall-cmd --add-service=ldap --permanent
success
# firewall-cmd --reload
success
若使用的是 iptables,修改方法以下:

#vim /etc/sysconfig/iptables
追加以下內容:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 389 -j ACCEPT
一樣的,修改 ipv6 的防火牆文件,並追加相同的內容:

#vim /etc/sysconfig/ip6tables
追加以下內容:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 389 -j ACCEPT
最後重啓防火牆:

systemctl restart iptables
systemctl restart ip6tables

向 OpenLDAP Server 中添加用戶
[1] 添加用戶
首先要生成經處理後的明文密碼:

# slappasswd
New password:
Re-enter new password:
{SSHA}8TEZlcfO0LLcnby7zDGYkNdd2fiysP4X
以後再新建以下文件:

#vim ldapuser.ldif
文件內容以下,注意,要使用你本身的域名替換掉文件中全部的 "dc=*,dc=*",而且使用剛剛生成的密碼,替換文中的 "userPassword" 部分:

# create new
# replace to your own domain name for "dc=***,dc=***" section
dn: uid=cent,ou=People,dc=ho1ho,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Cent
sn: Linux
userPassword: {SSHA}8TEZlcfO0LLcnby7zDGYkNdd2fiysP4X
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/cent

dn: cn=cent,ou=Group,dc=ho1ho,dc=com
objectClass: posixGroup
cn: Cent
gidNumber: 1000
memberUid: cent
最後導入該文件:

# ldapadd -x -D cn=Manager,dc=ho1ho,dc=com -W -f ldapuser.ldif
Enter LDAP Password:
adding new entry "uid=cent,ou=People,dc=ho1ho,dc=com"

adding new entry "cn=cent,ou=Group,dc=ho1ho,dc=com"
~~[2] 將 Linux 中已有的用戶及用戶組(也就是 passwd/group 文件)導入到 LDAP 中 ~~
新建以下腳本文件

vim ldapuser.sh
文件內容以下,注意,要使用你本身的域名替換掉 SUFFIX 變量:

#!/bin/bash
# extract local users and groups who have 1000-9999 digit UID
replace "SUFFIX=***" to your own domain name
this is an example

SUFFIX='dc=ho1ho,dc=com'
LDIF='ldapuser.ldif'

echo -n > $LDIF
GROUP_IDS=()
grep "x:[1-9][0-9][0-9][0-9]:" /etc/passwd | (while read TARGET_USER
do
USER_ID="$(echo "$TARGET_USER" | cut -d':' -f1)"

USER_NAME="$(echo "$TARGET_USER" | cut -d':' -f5 | cut -d' ' -f1,2)"
[ ! "$USER_NAME" ] && USER_NAME="$USER_ID"

LDAP_SN="$(echo "$USER_NAME" | cut -d' ' -f2)"
[ ! "$LDAP_SN" ] && LDAP_SN="$USER_NAME"

LASTCHANGE_FLAG="$(grep "${USER_ID}:" /etc/shadow | cut -d':' -f3)"
[ ! "$LASTCHANGE_FLAG" ] && LASTCHANGE_FLAG="0"

SHADOW_FLAG="$(grep "${USER_ID}:" /etc/shadow | cut -d':' -f9)"
[ ! "$SHADOW_FLAG" ] && SHADOW_FLAG="0"

GROUP_ID="$(echo "$TARGET_USER" | cut -d':' -f4)"
[ ! "$(echo "${GROUP_IDS[@]}" | grep "$GROUP_ID")" ] && GROUP_IDS=("${GROUP_IDS[@]}" "$GROUP_ID")

echo "dn: uid=$USER_ID,ou=People,$SUFFIX" >> $LDIF
echo "objectClass: inetOrgPerson" >> $LDIF
echo "objectClass: posixAccount" >> $LDIF
echo "objectClass: shadowAccount" >> $LDIF
echo "sn: $LDAP_SN" >> $LDIF
echo "givenName: $(echo "$USER_NAME" | awk '{print $1}')" >> $LDIF
echo "cn: $USER_NAME" >> $LDIF
echo "displayName: $USER_NAME" >> $LDIF
echo "uidNumber: $(echo "$TARGET_USER" | cut -d':' -f3)" >> $LDIF
echo "gidNumber: $(echo "$TARGET_USER" | cut -d':' -f4)" >> $LDIF
echo "userPassword: {crypt}$(grep "${USER_ID}:" /etc/shadow | cut -d':' -f2)" >> $LDIF
echo "gecos: $USER_NAME" >> $LDIF
echo "loginShell: $(echo "$TARGET_USER" | cut -d':' -f7)" >> $LDIF
echo "homeDirectory: $(echo "$TARGET_USER" | cut -d':' -f6)" >> $LDIF
echo "shadowExpire: $(passwd -S "$USER_ID" | awk '{print $7}')" >> $LDIF
echo "shadowFlag: $SHADOW_FLAG" >> $LDIF
echo "shadowWarning: $(passwd -S "$USER_ID" | awk '{print $6}')" >> $LDIF
echo "shadowMin: $(passwd -S "$USER_ID" | awk '{print $4}')" >> $LDIF
echo "shadowMax: $(passwd -S "$USER_ID" | awk '{print $5}')" >> $LDIF
echo "shadowLastChange: $LASTCHANGE_FLAG" >> $LDIF
echo >> $LDIF
done

for TARGET_GROUP_ID in "${GROUP_IDS[@]}"
do
LDAP_CN="$(grep ":${TARGET_GROUP_ID}:" /etc/group | cut -d':' -f1)"

echo "dn: cn=$LDAP_CN,ou=Group,$SUFFIX" >> $LDIF
echo "objectClass: posixGroup" >> $LDIF
echo "cn: $LDAP_CN" >> $LDIF
echo "gidNumber: $TARGET_GROUP_ID" >> $LDIF

for MEMBER_UID in $(grep ":${TARGET_GROUP_ID}:" /etc/passwd | cut -d':' -f1,3)
do
UID_NUM=$(echo "$MEMBER_UID" | cut -d':' -f2)
[ $UID_NUM -ge 1000 -a $UID_NUM -le 9999 ] && echo "memberUid: $(echo "$MEMBER_UID" | cut -d':' -f1)" >> $LDIF
done
echo >> $LDIF
done
)
以後,執行該腳本,會生成 ldapuser.ldif 文件:

sh ldapuser.sh
最後導入該文件:

# ldapadd -x -D cn=Manager,dc=ho1ho,dc=com -W -f ldapuser.ldif
Enter LDAP Password:
adding new entry "uid=ldapuser1,ou=People,dc=ho1ho,dc=com"

adding new entry "uid=ldapuser2,ou=People,dc=ho1ho,dc=com"

adding new entry "cn=ldapuser1,ou=Group,dc=ho1ho,dc=com"

adding new entry "cn=ldapuser2,ou=Group,dc=ho1ho,dc=com"
~~
刪除 LDAP 用戶或組
刪除用戶:

ldapdelete -x -W -D 'cn=Manager,dc=ho1ho,dc=com' "uid=ldapuser1,ou=People,dc=ho1ho,dc=com"
刪除組:

ldapdelete -x -W -D 'cn=Manager,dc=ho1ho,dc=com' "cn=ldapuser1,ou=Group,dc=ho1ho,dc=com"

配置 LDAP 客戶端,實現網絡用戶信息共享
環境說明:
客戶端(192.168.21.177)
LDAP Server(192.168.21.178)

應用場景
客戶端須要共享 LDAP Server上的用戶,但願之後任何一臺機器(例如,192.168.21.189),使用 LDAP Server 上的用戶,就能夠直接登陸客戶端。

在客戶端機器上執行以下命令
首先安裝必要包:

yum install -y openldap-clients nss-pam-ldapd authconfig authconfig-gtk

以後執行以下命令(注意,請使用本身的值替換 --ldapserver 和 --ldapbasedn 參數):

authconfig --enableldap \
--enableldapauth \
--ldapserver=192.168.21.178 \
--ldapbasedn="dc=ho1ho,dc=com" \
--enablemkhomedir \
--update
而後退出客戶端控制檯。以後就能夠在任何一臺機器上,使用 LDAP 用戶登陸客戶端了。例如,在本身的機器(192.168.21.189),使用 cent 用戶(cent 爲 LDAP 用戶),登陸客戶端:

ssh cent@192.168.21.177
cent@192.168.21.177's password:
Creating directory '/home/cent'.
請關閉 SELinux,不然可能沒法自動建立用戶目錄,也就是用戶的 home 目錄。

查詢 LDAP 用戶信息

$ ldapsearch -x -b "dc=ho1ho,dc=com" -H ldap://172.17.0.6
# extended LDIF
#
# LDAPv3
# base <dc=ho1ho,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# ho1ho.com
dn: dc=ho1ho,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
......
......

安裝 phpLDAPadmin
安裝 phpLDAPadmin 須要 LAMP 環境,安裝方法請自行百度。(不須要安裝 MySQL)
爲了方便安裝 phpLDAPadmin,請將 YUM 源修改爲 aliyun 源,方法自行百度

yum install -y phpldapadmin
修改配置:

vim /etc/phpldapadmin/config.php
修改內容,解除 397 行的註釋,註釋到 398 行。修改後的結果以下:

$servers->setValue('login','attr','dn');
// $servers->setValue('login','attr','uid');

vim /etc/httpd/conf.d/phpldapadmin.conf
修改內容以下:

Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs
<Directory /usr/share/phpldapadmin/htdocs>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
\ # 追加內容,設置容許訪問 phpLDAPadmin 的 IP 段
Require ip 192.168.21.0/8
從新啓動 Apache

systemctl restart httpd
訪問地址:http://[your ip]/ldapadmin 或 http://[your ip]/phpldapadmin
點擊查看原始大小圖片注意,登陸時輸入的是 DN,例如:cn=Manager,dc=ho1ho,dc=com
登陸後頁面以下:
點擊查看原始大小圖片
使用 Java LDAP 庫訪問 LDAP Server
Java LDAP 庫 Maven 地址以下:

<!-- https://mvnrepository.com/artifact/com.novell.ldap/jldap -->
<dependency>
<groupId>com.novell.ldap</groupId>
<artifactId>jldap</artifactId>
<version>4.3</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
完整工程詳見附件(javaldap.zip)。

轉載請註明出處: http://yhz61010.iteye.com/blog/2352672

相關文章
相關標籤/搜索