Hadoop配置LDAP集成Kerberos

释放双眼,带上耳机,听听看~!

本文主要记录 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

 是使用一个匿名的绑定

2.7 LDAP 的使用

导入系统用户

给TA打赏
共{{data.count}}人
人已打赏
安全运维

MongoDB数据建模小案例:朋友圈评论内容管理

2021-12-11 11:36:11

安全运维

Ubuntu上NFS的安装配置

2021-12-19 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索