快速搭建 LDAP 服務(wù)器與Hive集成
1 前言
LDAP (Lightweight Directory Access Protocol) 是輕型目錄訪問協(xié)議,以目錄形式存儲信息(基于目錄的數(shù)據(jù)庫),具有良好的讀性能。
本文的目的是幫助你快速搭建 LDAP 服務(wù)器。
本文所使用的服務(wù)器是 centos7
2 關(guān)閉防火墻
首先使用systemctl status firewalld確認(rèn)防火墻是否打開,如過打開,則關(guān)閉:
systemctl stop firewalld
systemctl disable firewalld
3 安裝 OpenLDAP 組件
yum install -y openldap openldap-servers openldap-clients openldap-devel compat-openldap migrationtools
4 修改LDAP配置
這里就是重點中的重點了,從openldap2.4.23版本開始,所有配置都保存在/etc/openldap/slapd.d目錄下的cn=config文件夾內(nèi),不再使用slapd.conf作為配置文件。配置文件的后綴為 ldif,且每個配置文件都是通過命令自動生成的,任意打開一個配置文件,在開頭都會有一行注釋,說明此為自動生成的文件,請勿編輯,使用ldapmodify命令進行修改
安裝openldap后,會有三個命令用于修改配置文件,分別為ldapadd, ldapmodify, ldapdelete,顧名思義就是添加,修改和刪除。而需要修改或增加配置時,則需要先寫一個ldif后綴的配置文件,然后通過命令將寫的配置更新到slapd.d目錄下的配置文件中去。
總而言之:/etc/openldap/slapd.d 下的文件不能手動添加、修改和刪除。
4.1 生成管理員密碼
$ slappasswd -s 123456
{SSHA}ifcLacR1RubRTM5P7Ox+UlMMV+7GQFAy
4.2 復(fù)制配置模板
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
4.3 生成數(shù)據(jù)庫文件
使用如下命令生成數(shù)據(jù)庫文件,不必?fù)?dān)心報錯信息。
$ slaptest
5fcef848 hdb_db_open: database "dc=my-domain,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
5fcef848 backend_startup_one (type=hdb, suffix="dc=my-domain,dc=com"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)
4.4 修改 LDAP 數(shù)據(jù)庫所屬用戶與組
OpenLDAP有一個主要用戶,它被稱為“rootdn(Root Distinguished Name)”,這個用戶已經(jīng)在應(yīng)用中被寫死,不可更改。
chown ldap:ldap /var/lib/ldap/*
4.5 SElinux配置
$ setsebool -P httpd_can_connect_ldap on
$ getsebool httpd_can_connect_ldap
httpd_can_connect_ldap --> on
或者使用命令getenforce查看結(jié)果是否為Disabled,若不是,則關(guān)閉 Selinux:
- 臨時的生效:執(zhí)行
setenforce 0; - 永久生效:修改配置文件
/etc/sysconfig/selinux,把SELINUX=disabled,然后重啟 。
4.6 啟動 LDAP 進程 slapd
OpenLDAP 軟件安裝完成后,要使用它,需要啟動 slapd 進程來調(diào)用程序:
$ systemctl start slapd
$ systemctl enable slapd
4.7 新增修改密碼文件
ldif為后綴,文件名隨意,不要在/etc/openldap/slapd.d/目錄下創(chuàng)建類似文件
生成的文件為需要通過命令去動態(tài)修改ldap現(xiàn)有配置,如下,在家目錄下,創(chuàng)建文件
$ mkdir ~/ldap
$ cd ldap
$ vim changepwd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}ifcLacR1RubRTM5P7Ox+UlMMV+7GQFAy
注意:olcRootPW的值來自于章節(jié)“4.1 生成管理員密碼”
文件內(nèi)容說明:
- 第一行執(zhí)行配置文件,這里就表示指定為 cn=config/olcDatabase={0}config 文件。你到/etc/openldap/slapd.d/目錄下就能找到此文件
- 第二行 changetype 指定類型為修改
- 第三行 add 表示添加 olcRootPW 配置項
- 第四行指定 olcRootPW 配置項的值
在執(zhí)行下面的命令前,你可以先查看原本的/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif文件,里面是沒有olcRootPW這個項的,執(zhí)行命令后,你再看就會新增了olcRootPW項,而且內(nèi)容是我們文件中指定的值加密后的字符串
4.8 執(zhí)行命令修改ldap配置
ldapadd -Y EXTERNAL -H ldapi:/// -f ~/ldap/changepwd.ldif
查看olcDatabase={0}config內(nèi)容,新增了一個olcRootPW項。
olcRootPW:: e1NTSEF9d1JMbnEzWDhGTWVQekZkZFp6S3JQTU5mMmVHWEhTTTU=
上面就是一個完整的修改配置的過程,再次重申不要直接修改/etc/openldap/slapd.d/目錄下的配置。
4.9 LDAP中導(dǎo)入基本的 Schema
需要向 LDAP 中導(dǎo)入一些基本的 Schema。這些 Schema 文件位于 /etc/openldap/schema/ 目錄中,schema控制著條目擁有哪些對象類和屬性,可以自行選擇需要的進行導(dǎo)入, 依次執(zhí)行下面的命令,導(dǎo)入基礎(chǔ)的一些配置,這里將所有的都導(dǎo)入一下,其中core.ldif是默認(rèn)已經(jīng)加載了的,不用導(dǎo)入。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
4.10 修改域名
新增changedomain.ldif, 這里我自定義的域名為fengxc.com,管理員用戶賬號為admin。
如果要修改,則修改文件中相應(yīng)的dc=fengxc,dc=com為自己的域名
$ vim /etc/openldap/changedomain.ldif
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=admin,dc=fengxc,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=fengxc,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=fengxc,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}fLe3LLnKYQYG+DQzViYr1Hyb04+7Pt6u
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=fengxc,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=fengxc,dc=com" write by * read
執(zhí)行命令,修改配置。
$ ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/ldap/changedomain.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"
4.11 啟用memberof功能
新增add-memberof.ldif, 開啟memberof支持并新增用戶支持memberof配置
$ vim ~/ldap/add-memberof.ldif
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
新增refint1.ldif文件
$ vim ~/ldap/refint1.ldif
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
新增refint2.ldif文件
$ vim ~/ldap/refint2.ldif
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
依次執(zhí)行下面命令,加載配置,順序不能錯
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ~/ldap/add-memberof.ldif
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f ~/ldap/refint1.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ~/ldap/refint2.ldif
4.12 創(chuàng)建組織角色
到此,配置修改完了,在上述基礎(chǔ)上,創(chuàng)建一個叫做 “fengxc company” 的組織,并在其下創(chuàng)建一個 “admin” 的組織角色(該組織角色內(nèi)的用戶具有管理整個 LDAP 的權(quán)限)和 “People” 和 “Group” 兩個組織單元:
vim ~/ldap/base.ldif
dn: dc=fengxc,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: fengxc Company
dc: fengxc
dn: cn=admin,dc=fengxc,dc=com
objectClass: organizationalRole
cn: admin
dn: ou=People,dc=fengxc,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=fengxc,dc=com
objectClass: organizationalRole
cn: Group
說明:
執(zhí)行命令,添加配置, 這里要注意修改域名為自己配置的域名,然后需要輸入上面我們生成的密碼
ldapadd -x -D cn=admin,dc=fengxc,dc=com -W -f ~/ldap/base.ldif
通過以上的所有步驟,我們就設(shè)置好了一個 LDAP 目錄樹:其中基準(zhǔn) “dc=fengxc,dc=com” 是該樹的根節(jié)點,其下有一個管理域 “cn=admin,dc=fengxc,dc=com” 和兩個組織單元 “ou=People,dc=fengxc,dc=com” 及 “ou=Group,dc=fengxc,dc=com”。
5 安裝啟動phpldapadmin
yum remove php*
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install php70w
yum install php70w-fpm
yum install php70w-ldap
yum install phpldapadmin
yum install nginx
5.1 修改配置用DN登錄ldap
vim /etc/phpldapadmin/config.php
# 398行,默認(rèn)是使用uid進行登錄,我這里改為cn,也就是用戶名
$servers->setValue('login','attr','cn');
# 460行,關(guān)閉匿名登錄,否則任何人都可以直接匿名登錄查看所有人的信息
$servers->setValue('login','anon_bind',false);
5.2 Nginx配置添加對phpldapadmin的反向代理
location /htdocs {
alias /usr/share/phpldapadmin/htdocs;
index index.php;
location ~ \.php$ {
alias /usr/share/phpldapadmin;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
5.3 啟動 php-fpm
systemctl start php-fpm
systemctl enable php-fpm
5.4 啟動nginx
systemctl start nginx
systemctl enable nginx
5.5 登錄 phpLDAPadmin


6 使用migrationtools 創(chuàng)建用戶
詳見章節(jié)2.3
很好,到這一步你已經(jīng)成功一半了,再接再厲!
回歸正文,本章重點是如何創(chuàng)建LDAP用戶。
migrationtools 這個工具我們之前已經(jīng)安裝好了。如果沒有安裝可以通過yum安裝。
6.1 修改migrate_common.ph文件
# vim /usr/share/migrationtools/migrate_common.ph
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "fengxc.com";
# Default base
$DEFAULT_BASE = "dc=fengxc,dc=com";
6.2 利用pl腳本將/etc/passwd 和/etc/group生成LDAP能讀懂的文件格式
使用一個linux普通用戶來測試。
$ useradd test
$ cat /etc/passwd | grep test > /tmp/passwd
$ cat /etcgroup | grep test > /tmp/group
$ /usr/share/migrationtools/migrate_base.pl > /tmp/base.ldif
$ /usr/share/migrationtools/migrate_passwd.pl /tmp/passwd > /tmp/passwd.ldif
$ /usr/share/migrationtools/migrate_group.pl /tmp/group > /tmp/group.ldif
6.3 將文件導(dǎo)入LDAP
$ ldapadd -x -D "cn=admin,dc=fengxc,dc=com" -W -f /tmp/base.ldif
$ ldapadd -x -D "cn=admin,dc=fengxc,dc=com" -W -f /tmp/passwd.ldif
$ ldapadd -x -D "cn=admin,dc=fengxc,dc=com" -W -f /tmp/group.ldif
6.4 設(shè)置密碼
登錄phpLDAPadmin,定位到test賬號,如下圖中的 uid=test。

點擊“賦值”

輸入密碼,點擊“Check password”可以驗證輸入密碼。

7 Hive配置LDAP
在 hive-site.xml 中配置添加以下配置
<!-- hive server2 LDAP認(rèn)證模式 配置 -->
<property>
<name>hive.server2.authentication</name>
<value>LDAP</value>
<description>客戶端身份認(rèn)證方式</description>
</property>
<property>
<name>hive.server2.authentication.ldap.url</name>
<value>ldap://centos3</value>
<description>LDAP Url</description>
</property>
<property>
<name>hive.server2.authentication.ldap.baseDN</name>
<value>ou=People,dc=fengxc,dc=com</value>
<description>LDAP搜索的baseDN</description>
</property>
8 驗證
8.1 啟動HiveServer2
$ $HIVE_HOME/bin/hiveserver2
8.2 啟動 LDAP
$ systemctl start slapd
8.1 使用Beeline驗證
用于驗證連接的用戶名和密碼來源于章節(jié)6
8.1.1 輸入正確的用戶名和密碼

輸入正確的用戶名和密碼連接成功。
8.1.1 輸入錯誤的用戶名和密碼

輸入錯誤的用戶名和密碼連接失敗。
8.2 使用SpringBoot驗證
8.2.1 Maven 依賴
測試Java程序能否連接上hive,下面3個依賴是關(guān)鍵。
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<!-- hive-jdbc -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.3.7</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
8.2.2 application.yml中配置錯誤的密碼
在配置文件中,下面的這些配置是spring boot 應(yīng)用連上hive的關(guān)鍵配置,故意輸入錯誤的密碼。
spring:
datasource:
url: jdbc:hive2://localhost:10000/airline
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.apache.hive.jdbc.HiveDriver
username: test
password: 654321
驗證結(jié)果如下圖所示:

程序啟動失敗,錯誤提示為“create connection SQLException, url: jdbc:hive2://localhost:10000/airline, errorCode 0, state 08S01”
8.2.3 application.yml中配置正確的密碼
在配置文件中,下面的這些配置是spring boot 應(yīng)用連上hive的關(guān)鍵配置,輸入正確的密碼。
spring:
datasource:
url: jdbc:hive2://localhost:10000/airline
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.apache.hive.jdbc.HiveDriver
username: test
password: 123456
驗證結(jié)果如下圖所示:

程序正常運行。
至此,本文結(jié)束。