一,简介

LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol

  • LDAP的结构用树来表示,而不是用表格。正因为这样,就不能用SQL语句了
  • LDAP可以很快地得到查询结果,不过在写方面,就慢得多
  • LDAP提供了静态数据的快速查询方式
  • Client/server模型,Server 用于存储数据,Client提供操作目录信息树的工具
  • 这些工具可以将数据库的内容以文本格式(LDAP 数据交换格式,LDIF)呈现在您的面前
  • LDAP是一种开放Internet标准,LDAP协议是跨平台的Interent协议

常用名词:

    openLDAP 常用名词解释

 

   o– organization(组织-公司)

   ou – organization unit(组织单元/部门)

   c - countryName(国家)

   dc - domainComponent(域名组件)

   sn – suer name(真实名称)

   cn - common name(常用名称)

dn - distinguished name(专有名称)

工作原理:

OpenLDAP服务分为客户端和服务端两个部分,服务端的配置过程这里不再赘述。当服务端配置结束后,在服务端的ldap数据库中,应存放着用户的信息,客户端通过安装nss-pam-ldapd(一个瘦身版本的 PAM 模块和一个瘦身版本的

NSS 模块集合),以及配置/etc/pam.d下的system-auth文件和password-auth两个文件来完成客户端的配置。

nss-pam-ldapd,是pam模块和nss模块的集合,主要作用是使存在于服务端ldap数据库中的用户,进行ssh登陆客户端时,可以通过pam方式进行验证,而这种情况下此用户是不存在于客户端的服务器上的。

openldap-clients,就是OpenLDAP的客户端软件包,此软件包安装后,不需要像服务端一样运行起来,他的作用主要是集成了类似ldapsearch,ldapadd之类的命令,可以用户验证服务端或者对服务端数据库中的用户信息进行查询,

添加等。

openldap,主要包含了OpenLDAP所必须的库文件,当通过pam验证时,这些库文件是必须有的。

1. 环境说明

  • 操作系统:CentOs 7
  • Hadoop版本:CDH5.12.2
  • JDK版本:1.8.0_101
  • OpenLDAP 版本:2.4.44
  • Kerberos 版本:1.15.1-19.el7
  • 运行用户:root

duan139 server端

duan140 client 端

 

2. 安装

  2.1 server端

  2.1.1 yum安装

 

yum install -y openldap openldap-clients openldap-servers migrationtools    

 

2.1.2 生成密码

slappasswd -s duan

{SSHA}OvciPz+FWXBLNL0zxjP6RTS6K/UE1Dwb

 

2.1.3配置文件修改

vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif

修改内容

olcSuffix: dc=hadoop,dc=com

olcRootDN: cn=Manager,dc=hadoop,dc=com

 

添加内容

olcRootPW: {SSHA}OvciPz+FWXBLNL0zxjP6RTS6K/UE1Dwb   #顶格写,:后有空格

 

2.1.4 修改验证

vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif

修改内容

olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern

 al,cn=auth" read by dn.base="cn=Manager,dc=hadoop,dc=com" read by * none

 

2.1.5  配置DB数据库

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

chown ldap:ldap -R /var/lib/ldap

chmod 700 -R /var/lib/ldap

 

2.1.6  验证

slaptest -u

看见:config file testing succeeded  #验证成功,否则失败

 

2.1.7 授权,若不授权启动时或报错,权限不足

chown ldap:ldap -R /var/run/openldap

chown -R ldap:ldap /etc/openldap/

 

2.1.8 启动

systemctl start slapd

systemctl enable slapd

 

2.1.9 cd /etc/openldap/schema/

 

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

# ldapadd -Y EXTERNAL -H ldapi:///

 

2.1.10 执行ldapsearch -x检查是否有如下输出

ldapsearch -x -b '' -s base'(objectclass=*)'

 

# extended LDIF

#

# LDAPv3

# base <> with scope baseObject

# filter: (objectclass=*)

# requesting: ALL

#

#

dn:

objectClass: top

objectClass: OpenLDAProotDSE

# search result

search: 2

result: 0 Success

如显示上面信息,表示服务已经启动成功。

 

2.1.11  创建管理员账号

编辑ldif文件: vi base.ldif

dn: dc=hadoop,dc=com

o: hadoop com

dc: hadoop

objectClass: top

objectClass: dcObject

objectclass: organization

 

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

cn: root

objectClass: organizationalRole

description: Directory Manager

 

dn: ou=People,dc=hadoop,dc=com

ou: People

objectClass: top

objectClass: organizationalUnit

 

dn: ou=Group,dc=hadoop,dc=com

ou: Group

objectClass: top

objectClass: organizationalUnit

 

 

导入数据库

ldapadd -x -D "cn=Manager,dc=hadoop,dc=com" -W -f base.ldif   密码是 duan

验证

ldapsearch -x -b 'dc= hadoop,dc=com' '(objectClass=*)'

 

# extended LDIF

#

# LDAPv3

# base <dc= hadoop,dc=com> with scope subtree

# filter: (objectClass=*)

# requesting: ALL

#

 

# hadoop.com

dn: dc=hadoop,dc=com

o: hadoop com

dc: hadoop

objectClass: top

objectClass: dcObject

objectClass: organization

 

# root, hadoop.com

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

cn: root

objectClass: organizationalRole

description: Directory Manager

 

# People, hadoop.com

dn: ou=People,dc=hadoop,dc=com

ou: People

objectClass: top

objectClass: organizationalUnit

 

# Group, hadoop.com

dn: ou=Group,dc=hadoop,dc=com

ou: Group

objectClass: top

objectClass: organizationalUnit

 

# search result

search: 2

result: 0 Success

 

# numResponses: 5

# numEntries: 4

 

2.1.12  通过migrationtools 实现OpenLDAP 用户及用户组的添加  

参考:

 (1)修改配置文件

vi /usr/share/migrationtools/migrate_common.ph

# Default DNS domain

$DEFAULT_MAIL_DOMAIN = "hadoop.com";

 

# Default base

$DEFAULT_BASE = "dc=hadoop,dc=com";

 

(2) 生成基础的数据导入数据库文件

/usr/share/migrationtools/migrate_base.pl > base.ldif

并把base.ldif里将不要的条目删除,然后通过ldapadd导入LDAP

ldapadd -x -D "cn=Manager,dc=hadoop,dc=com" -W -f base.ldif   密码是 duan

验证

ldapsearch -x -b 'dc= hadoop,dc=com' '(objectClass=*)'

(3)将系统用户生成ldif文件

cat /etc/passwd |grep duan > duan.txt

cat /etc/group |grep duan > duangroup.txt

/usr/share/migrationtools/migrate_passwd.pl duan.txt duan.ldif

/usr/share/migrationtools/migrate_group.pl duangroup.txt duangroup.ldif 

ldapadd -x -D "cn=Manager,dc=hadoop,dc=com" -W -f duan.ldif

adding new entry "uid=duan,ou=People,dc=hadoop,dc=com"

ldap_add: Invalid syntax (21)

    additional info: objectClass: value #0 invalid per syntax

 

 这通常的原因是导入的ldif 中存在不合法的Class,与Schema 中定义不符。例如:objectclass:organizationalRole 写成 objectclass:organizational 等等。

解决方法是,修改Schema文件,或使用正确的Class定义。操作:2.1.9 步骤,出现ldap_add: Other (e.g., implementation specific) error (80)

    additional info: olcAttributeTypes: Duplicate attributeType: "2.5.4.2" 忽略即可。

 (4) 验证

ldapsearch -LLL -x -D 'cn=Manager,dc=hadoop,dc=com' -W -b 'dc=hadoop,dc=com' 'uid=duan'

2.2 client 客户端安装 http://blog.51cto.com/11093860/2161809

2.2.1 yum安装

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

 

2.2.2配置openLDAP-client

vi   /etc/openldap/ldap.conf

 

TLS_CACERTDIR /etc/openldap/cacerts

 

SASL_NOCANON    on

URI ldap://192.168.116.139/

BASE dc=hadoop,dc=com

 

2.2.3 authconfig-tui # 将下图中红框中的选中,然后next,按照提示操作完成即可。

 

2.2.4 分别查看以下文件的内容,是否已经自动更改成如下所示,若没有,请手动更改,手动更改后,请勿再执行authconfig-tui命令,否则会将手动更改的内容覆盖掉!

(1)vi /etc/nsswitch.conf

passwd: files ldap

shadow: files ldap

group: files ldap

automount: files sss ldap

(2) vi /etc/pam.d/system-auth (关注红色字体就好)

auth        required      pam_env.so

auth        required      pam_faildelay.so delay=2000000

auth        sufficient    pam_unix.so nullok try_first_pass

auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success

auth        sufficient    pam_ldap.so use_first_pass

auth        required      pam_deny.so

 

account     required      pam_unix.so broken_shadow

account     sufficient    pam_localuser.so

account     sufficient    pam_succeed_if.so uid < 1000 quiet

account     [default=bad success=ok user_unknown=ignore] pam_ldap.so

account     required      pam_permit.so

 

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok

password    sufficient    pam_ldap.so use_authtok

password    required      pam_deny.so

 

session     optional      pam_keyinit.so revoke

session     required      pam_limits.so

-session     optional      pam_systemd.so

session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session     required      pam_unix.so

session     optional      pam_ldap.so

#%PAM-1.0

# This file is auto-generated.

# User changes will be destroyed the next time authconfig is run.

auth        required      pam_env.so

auth        required      pam_faildelay.so delay=2000000

auth        sufficient    pam_unix.so nullok try_first_pass

auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success

auth        sufficient    pam_ldap.so use_first_pass

auth        required      pam_deny.so

 

account     required      pam_unix.so broken_shadow

account     sufficient    pam_localuser.so

account     sufficient    pam_succeed_if.so uid < 1000 quiet

account     [default=bad success=ok user_unknown=ignore] pam_ldap.so

account     required      pam_permit.so

 

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok

password    sufficient    pam_ldap.so use_authtok

 

 

password    required      pam_deny.so

 

session     optional      pam_keyinit.so revoke

session     required      pam_limits.so

-session     optional      pam_systemd.so

session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session     required      pam_unix.so

session     optional      pam_ldap.so

USELDAP=yes

USELDAPAUTH=yes

UsePAM yes

2.2.5 启动服务

systemctl restart nslcd

systemctl restart sshd

2.2.6 测试

在服务端创建一个test,客户端没有改用户。在客户端 查询:

id test

uid=1001(test) gid=1001 组=1001

 

2.2.6 nslcd 服务(确认)

cp /etc/nslcd.conf /etc/nslcd.conf.old

cat >> /etc/nslcd.conf <<EOF

uri ldap://hadoop.com

base dc=hadoop,dc=com

EOF

LDAP 和 Kerberos

在Kerberos安全机制里,一个principal就是realm里的一个对象,一个principal总是和一个密钥(secret key)成对出现的。

这个principal的对应物可以是service,可以是host,也可以是user,对于Kerberos来说,都没有区别。

Kdc(Key distribute center)知道所有principal的secret key,但每个principal对应的对象只知道自己的那个secret key。这也是 “共享密钥” 的由来。

为了使 Kerberos 能够绑定到 OpenLDAP 服务器,请创建一个管理员用户和一个 principal,并生成 keytab 文件,设置该文件的权限为 LDAP 服务运行用户可读( LDAP 服务运行用户一般为 ldap):

$ kadmin.local -q "addprinc ldapadmin" 密码是duan

$ kadmin.local -q "addprinc -randkey ldap/duan139"

$ kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/duan139"

 

$ chown ldap:ldap /etc/openldap/ldap.keytab && chmod 640 /etc/openldap/ldap.keytab

确保 LDAP 启动时使用上一步中创建的keytab文件,在 /etc/sysconfig/sldap增加 KRB5_KTNAME 配置:

KRB5_KTNAME=/etc/openldap/ldap.keytab

备注:OPENldap使用的端口号: 明文:389 ,密文:636(需启动TLS/SASL),可以在 /etc/sysconfig/sldap中修改为端口号为4567.如下:

SLAPD_URLS=”ldapi://0.0.0.0:4567/ ldap://0.0.0.0:4567/”

firewall-cmd --zone=public --add-port=389/tcp --permanent 重启防火墙。

然后,重启 slapd 服务。

systemctl restart slapd

          4. LDAP集成impala

         4.1 打开cloudera manager--> impala --> 配置,修改以下选项:

(1)enable_ldap_auth 启用LDAP身份验证

(2)LDAP URL 填入:ldap://duan139

(3)LDAP BaseDN:ou=People,dc=hadoop,dc=com

(4)Impala 命令行参数高级配置代码段(安全阀),填入 --ldap_passwords_in_clear_ok

说明:如果没有开启 ssl,则添加 -ldap_passwords_in_clear_ok=true,同样如果开启了 ssl,则 ldap_uri 值为 ldaps://XXXX

        4.2 验证impala客户端

LDAP:

impala-shell -l -u duan --auth_creds_ok_in_clear (密码duan)

beeline -u "jdbc:hive2://duan140:21050/default;user=duan;password=duan" -n duan -p duan --verbose=true

kerberos:

kinit -kt /tmp/keytab/duan.keytab duan

impala-shell -i duan140 -d default -k

beeline -u "jdbc:hive2://duan140:21050/default;principal=impala/duan140@HADOOP.COM;AuthMeth=1"