本文主要记录 cdh hadoop 集群集成 ldap 的过程,这里 ldap 安装的是
OpenLDAP
。LDAP 用来做账号管理,Kerberos作为认证。授权一般来说是由应用来决定的,通过在 LDAP 数据库中配置一些属性可以让应用程序来进行授权判断。
关于 Kerberos 的安装和 HDFS 配置 kerberos 认证,请参考
HDFS配置kerberos认证。
1. 环境说明
系统环境:
- 操作系统:CentOs 6.6
- Hadoop版本:CDH5.4
- JDK版本:1.7.0_71
- OpenLDAP 版本:2.4.39
- Kerberos 版本:1.10.3
- 运行用户:root
集群各节点角色规划为:
1
2
3
4
5 1192.168.56.121 cdh1 NameNode、ResourceManager、HBase、Hive metastore、Impala Catalog、Impala statestore、Sentry
2192.168.56.122 cdh2 DataNode、NodeManager、HBase、Hiveserver2、Impala Server
3192.168.56.123 cdh3 DataNode、HBase、NodeManager、Hiveserver2、Impala Server
4
5
cdh1作为master节点,其他节点作为slave节点,我们在cdh1节点安装kerberos Server,在其他节点安装kerberos client。
2. 安装服务端
2.1 安装
同安装 kerberos 一样,这里使用 cdh1 作为服务端安装 openldap。
1
2
3
4 1$ yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
2$ yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -y
3
4
查看安装的版本:
1
2
3
4
5
6
7 1$ rpm -qa openldap
2openldap-2.4.39-8.el6.x86_64
3
4$ rpm -qa krb5-server-ldap
5krb5-server-ldap-1.10.3-33.el6.x86_64
6
7
2.2 OpenSSL
如果,你不配置ssl,这部分内容可以略过,实际安装过程中,我也没有详细去操作这部分内容。
OpenLDAP 默认使用 Mozilla NSS,安装后已经生成了一份证书,可使用
certutil -d /etc/openldap/certs/ -L -n 'OpenLDAP Server'
命令查看。使用如下命令生成RFC格式CA证书并分发到客户机待用。
1
2
3
4
5
6
7 1$ certutil -d /etc/openldap/certs/ -L -a -n 'OpenLDAP Server' -f /etc/openldap/certs/password > /etc/openldap/ldapCA.rfc
2
3# 拷贝到其他节点
4$ scp /etc/openldap/ldapCA.rfc cdh2:/tmp
5$ scp /etc/openldap/ldapCA.rfc cdh3:/tmp
6
7
附,生成自签名证书的命令供参考:
1
2
3 1$ certutil -d /etc/openldap/certs -S -n 'test cert' -x -t 'u,u,u' -s 'C=XX, ST=Default Province, L=Default City, O=Default Company Ltd, OU=Default Unit, CN=cdh1' -k rsa -v 120 -f /etc/openldap/certs/password
2
3
修改
/etc/sysconfig/ldap,开启 ldaps:
1
2
3
4
5 1# Run slapd with -h "... ldaps:/// ..."
2# yes/no, default: no
3SLAPD_LDAPS=yes
4
5
2.3 LDAP 服务端配置
更新配置库:
1
2
3
4
5 1rm -rf /var/lib/ldap/*
2cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
3chown -R ldap.ldap /var/lib/ldap
4
5
在2.4以前的版本中,OpenLDAP 使用 slapd.conf 配置文件来进行服务器的配置,而2.4开始则使用
slapd.d
目录保存细分后的各种配置,这一点需要注意,其数据存储位置即目录
/etc/openldap/slapd.d
。尽管该系统的数据文件是透明格式的,还是建议使用 ldapadd, ldapdelete, ldapmodify 等命令来修改而不是直接编辑。
默认配置文件保存在 /etc/openldap/slapd.d,将其备份:
1
2
3 1cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
2
3
添加一些基本配置,并引入 kerberos 和 openldap 的 schema:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 1$ cp /usr/share/doc/krb5-server-ldap-1.10.3/kerberos.schema /etc/openldap/schema/
2
3$ touch /etc/openldap/slapd.conf
4
5$ echo "include /etc/openldap/schema/corba.schema
6include /etc/openldap/schema/core.schema
7include /etc/openldap/schema/cosine.schema
8include /etc/openldap/schema/duaconf.schema
9include /etc/openldap/schema/dyngroup.schema
10include /etc/openldap/schema/inetorgperson.schema
11include /etc/openldap/schema/java.schema
12include /etc/openldap/schema/misc.schema
13include /etc/openldap/schema/nis.schema
14include /etc/openldap/schema/openldap.schema
15include /etc/openldap/schema/ppolicy.schema
16include /etc/openldap/schema/collective.schema
17include /etc/openldap/schema/kerberos.schema" > /etc/openldap/slapd.conf
18$ echo -e "pidfile /var/run/openldap/slapd.pid\nargsfile /var/run/openldap/slapd.args" >> /etc/openldap/slapd.conf
19
20#更新slapd.d
21$ slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
22
23$ chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d
24
25
2.4 启动服务
启动 LDAP 服务:
1
2
3
4
5
6 1chkconfig --add slapd
2chkconfig --level 345 slapd on
3
4/etc/init.d/slapd start
5
6
查看状态,验证服务端口:
1
2
3
4
5
6
7
8 1$ ps aux | grep slapd | grep -v grep
2 ldap 9225 0.0 0.2 581188 44576 ? Ssl 15:13 0:00 /usr/sbin/slapd -h ldap:/// -u ldap
3
4$ netstat -tunlp | grep :389
5 tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 8510/slapd
6 tcp 0 0 :::389 :::* LISTEN 8510/slapd
7
8
如果启动失败,则运行下面命令来启动 slapd 服务并查看日志:
1
2
3 1$ slapd -h ldap://127.0.0.1 -d 481
2
3
待查明原因之后,停止该进程使用正常方式启动 slapd 服务。
2.5 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):
1
2
3
4
5
6
7 1$ kadmin.local -q "addprinc ldapadmin@JAVACHEN.COM"
2$ kadmin.local -q "addprinc -randkey ldap/cdh1@JAVACHEN.COM"
3$ kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/cdh1@JAVACHEN.COM"
4
5$ chown ldap:ldap /etc/openldap/ldap.keytab && chmod 640 /etc/openldap/ldap.keytab
6
7
ktadd 后面的-k
指定把 key 存放在一个本地文件中。
使用 ldapadmin 用户测试:
1
2
3 1kinit ldapadmin
2
3
系统会提示输入密码,如果一切正常,那么会安静的返回。实际上,你已经通过了kerberos的身份验证,且获得了一个Service TGT(Ticket-Granting Ticket). Service TGT的意义是, 在一段时间内,你都可以用此TGT去请求某些service,比如ldap service,而不需要再次通过kerberos的认证。
确保 LDAP 启动时使用上一步中创建的keytab文件,在
/etc/sysconfig/ldap
增加
KRB5_KTNAME
配置:
1
2
3 1export KRB5_KTNAME=/etc/openldap/ldap.keytab
2
3
然后,重启 slapd 服务。
2.6 创建数据库
进入到 /etc/openldap/slapd.d 目录,查看
etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif
可以看到一些默认的配置,例如:
1
2
3
4
5 1olcRootDN: cn=Manager,dc=my-domain,dc=com
2olcRootPW: secret
3olcSuffix: dc=my-domain,dc=com
4
5
接下来更新这三个配置,建立 modify.ldif 文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 1dn: olcDatabase={2}bdb,cn=config
2changetype: modify
3replace: olcSuffix
4olcSuffix: dc=javachen,dc=com
5
6dn: olcDatabase={2}bdb,cn=config
7changetype: modify
8replace: olcRootDN
9# Temporary lines to allow initial setup
10olcRootDN: uid=ldapadmin,ou=people,dc=javachen,dc=com
11
12dn: olcDatabase={2}bdb,cn=config
13changetype: modify
14add: olcRootPW
15olcRootPW: secret
16
17dn: cn=config
18changetype: modify
19add: olcAuthzRegexp
20olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=javachen,dc=com
21
22dn: olcDatabase={2}bdb,cn=config
23changetype: modify
24add: olcAccess
25# Everyone can read everything
26olcAccess: {0}to dn.base="" by * read
27# The ldapadm dn has full write access
28olcAccess: {1}to * by dn="uid=ldapadmin,ou=people,dc=javachen,dc=com" write by * read
29
30
说明:
- 上面的密码使用的是明文密码 secret ,你也可以使用
slappasswd -s secret
生成的字符串作为密码。
- 上面的权限中指明了只有用户
uid=ldapadmin,ou=people,dc=javachen,dc=com
有写权限。
使用下面命令导入更新配置:
1
2
3 1$ ldapmodify -Y EXTERNAL -H ldapi:/// -f modify.ldif
2
3
这时候数据库没有数据,需要添加数据,你可以手动编写 ldif 文件来导入一些用户和组,或者使用 migrationtools 工具来生成 ldif 模板。创建 setup.ldif 文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 1dn: dc=javachen,dc=com
2objectClass: top
3objectClass: dcObject
4objectclass: organization
5o: javachen com
6dc: javachen
7
8dn: ou=people,dc=javachen,dc=com
9objectclass: organizationalUnit
10ou: people
11description: Users
12
13dn: ou=group,dc=javachen,dc=com
14objectClass: organizationalUnit
15ou: group
16
17dn: uid=ldapadmin,ou=people,dc=javachen,dc=com
18objectClass: inetOrgPerson
19objectClass: posixAccount
20objectClass: shadowAccount
21cn: LDAP admin account
22uid: ldapadmin
23sn: ldapadmin
24uidNumber: 1001
25gidNumber: 100
26homeDirectory: /home/ldap
27loginShell: /bin/bash
28
29
使用下面命令导入数据,密码是前面设置的 secret 。
1
2
3 1$ ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f setup.ldif
2
3
参数说明:
- -w
指定密码
- -x
是使用一个匿名的绑定