美文网首页大数据运维及安全@IT·互联网
Step by Step 实现基于 Cloudera 5.8.2

Step by Step 实现基于 Cloudera 5.8.2

作者: 大数据之心 | 来源:发表于2017-02-19 01:10 被阅读1039次

    和前述一样,我们还是在 CentOS 7.2 + JDK 1.8.0_73 环境下进行部署。如果你还没有完成 Kerberos 部署,请参看这一篇:实现基于Cloudera的企业级安全大数据平台-Kerberos的整合。通过 Cloudera Manager 可以极其简单的部署 Impala,HUE,在这里不进行复述。(当然,你也需要部署它们依赖的 HDFS, Hive, Oozie, YARN 等服务)

    角色分布

    OpenLDAP Server: 192.168.1.1

    Kerberos KDC Server: 192.168.1.1

    hive server2: 192.168.1.3

    LDAP 的部署

    假设我们的服务端为 192.168.1.1,以 admin 用户登录进行操作:

    sudo yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
    sudo yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -y
    

    创建 ldap 用户,请牢记密码,后面会作为 LDAP 数据库超级管理员:

    sudo useradd ldap
    

    更新数据库配置:

    sudo rm -rf /var/lib/ldap/*
    sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
    sudo chown -R ldap.ldap /var/lib/ldap
    

    配置数据存储位置即目录:/etc/openldap/slapd.d (尽量不要直接编辑该目录的文件,建议使用ldapadd, ldapdelete, ldapmodify等命令来修改),默认配置文件保存在 /etc/openldap/slapd.d,将其备份:

    sudo cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
    

    添加一些基本配置,并引入 kerberos 和 openldap 的 schema:

    KERBEROS_LDAP_VERSION=1.13.2
    sudo cp /usr/share/doc/krb5-server-ldap-${KERBEROS_LDAP_VERSION}/kerberos.schema /etc/openldap/schema/
    sudo touch /etc/openldap/slapd.conf
    

    编辑配置文件/etc/openldap/slapd.conf如下:

    include /etc/openldap/schema/corba.schema
    include /etc/openldap/schema/core.schema
    include /etc/openldap/schema/cosine.schema
    include /etc/openldap/schema/duaconf.schema
    include /etc/openldap/schema/dyngroup.schema
    include /etc/openldap/schema/inetorgperson.schema
    include /etc/openldap/schema/java.schema
    include /etc/openldap/schema/misc.schema
    include /etc/openldap/schema/nis.schema
    include /etc/openldap/schema/openldap.schema
    include /etc/openldap/schema/ppolicy.schema
    include /etc/openldap/schema/collective.schema
    include /etc/openldap/schema/kerberos.schema
    pidfile /var/run/openldap/slapd.pid
    argsfile /var/run/openldap/slapd.args
    

    更新slapd.d

    sudo slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
    sudo chown -R ldap:ldap /etc/openldap/slapd.d
    sudo chmod -R 700 /etc/openldap/slapd.d
    

    CentOS 7.2 如果遇到 duplicated 相关的错误,需要删除重复的 ldif (视情况,没有遇到千万不要随意删除):

    sudo rm -f  /etc/openldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif
    

    启动服务记入开机启动项:

    # 启动服务命令
    sudo /bin/systemctl start slapd
    # 加入开机启动项
    sudo /bin/systemctl enable slapd
    

    查看状态,验证服务端口:

    sudo ps aux | grep slapd | grep -v grep
    sudo netstat -tunlp | grep :389
    

    LDAP 集成 Kerberos

    因为 192.168.1.1 本身就是 Kerberos KDC Server,所以无需部署客户端。

    设置 ldap 用户通过 kerberos 验证启动服务。为了使 Kerberos 能够绑定到 OpenLDAP 服务器,需要创建一个管理员用户和一个 principal,并生成 keytab 文件。设置该文件的权限为 LDAP 服务运行用户可读(一般为ldap),操作在 OpenLDAP Server 上执行,如果遇到 kadmin: Client not found in Kerberos database while initializing kadmin interface,尝试kdestroy后执行:

    kdestroy
    kinit cdh-master/admin
    kadmin
    kadmin > addprinc -randkey ldap/ldap_admin
    kadmin > ktadd -k /tmp/ldap_ldap_admin.keytab ldap
    sudo mv /tmp/ldap_ldap_admin.keytab /etc/openldap/
    sudo chown ldap:ldap /etc/openldap/ldap_ldap_admin.keytab
    sudo chmod 400 /etc/openldap/ldap_ldap_admin.keytab
    

    使用 ldap 用户获取 ticket:

    kinit -k -t /etc/openldap/ldap_ldap_admin.keytab ldap/ldap_admin
    

    确保 LDAP 开机启动时使用上一步中创建的 keytab 文件,在/etc/sysconfig/ldap增加KRB5_KTNAME环境变量:

    export KRB5_KTNAME=/etc/openldap/ldap_ldap_admin.keytab
    

    重启 slapd 服务:

    sudo systemctl restart slapd
    

    LDAP初始化

    初始化 LDAP 数据库,进入到/etc/openldap/slapd.d目录,查看cn=config/olcDatabase={2}hdb.ldif

    可以看到一些默认的配置,例如:

    olcRootDN: cn=Manager,dc=my-domain,dc=com 
    olcRootPW: secret 
    olcSuffix: dc=my-domain,dc=com
    

    建立/tmp/initial文件,内容如下:

    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcSuffix
    olcSuffix: dc=domain,dc=com
     
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcRootDN
    olcRootDN: uid=ldap,ou=people,dc=domain,dc=com
     
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcRootPW
    olcRootPW: domain
     
    dn: cn=config
    changetype: modify
    replace: olcAuthzRegexp
    olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=domain,dc=com
     
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcAccess
    olcAccess: {0}to dn.base="" by * read
    olcAccess: {1}to * by dn="uid=ldap,ou=people,dc=domain,dc=com" write by * read
    

    使用ldapmodify进行数据库初始化:

    sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/initial.ldif
    

    这时候数据库没有数据,我们可以手动编写 ldif 文件来导入一些用户和组,或者使用 migrationtools 工具来生成 ldif 模板,创建/tmp/setup.ldif文件如下:

    dn: dc=domain,dc=com
    objectClass: top
    objectClass: dcObject
    objectClass: organization
    o: domain com
    dc: domain
     
    dn: ou=people,dc=domain,dc=com
    objectclass: organizationalUnit
    ou: people
    description: Users
     
    dn: ou=group,dc=domain,dc=com
    objectClass: organizationalUnit
    ou: group
     
    dn: uid=ldap,ou=people,dc=domain,dc=com
    objectClass: inetOrgPerson
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: LDAP admin account
    uid: ldap
    sn: ldap
    uidNumber: 55 # 这里的 uid 需要和 Unix 账户的 uid 配置,可以通过 id ldap 命令进行查看
    gidNumber: 55 # 这里的 gid 需要和 Unix 账户的 gid 配置,可以通过 id ldap 命令进行查看
    homeDirectory: /home/ldap
    loginShell: /bin/bash
    

    使用ldapadd命令进行导入:

    sudo ldapadd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -f /tmp/setup.ldif -h 192.168.1.1
    

    Impala 集成 LDAP

    通过 Cloudera Manager 进行启动。Impala 中可以同时使用 Kerberos + LDAP 的认证方式,所以在已经启用 Kerberos 的情况下启用 LDAP 可以正常工作。在 Impala 配置页中,进行如下属性的修改,并重启 Impala 服务:

    Enable LDAP Authentication = true
    Enable LDAP TLS = true
    LDAP BaseDN = ou=people,dc=domain,dc=com
    LDAP URI = ldap://192.168.1.1
    

    我们通过 migrationtools 工具把系统中的 impala 账户信息导入到 OpenLDAP(Cloudera Manager 在创建 Impala 服务的过程中会自动在 Unix 中创建 Impala帐户)。

    安装migrationtools工具:

    sudo yum install migrationtools -y
    

    利用迁移工具生成模板,先修改默认的配置:

    sudo vim /usr/share/migrationtools/migrate_common.ph
    #71行默认的dns域名
    DEFAULT_MAIL_DOMAIN = "doamin.com";
    #74行默认的base
    DEFAULT_BASE = "dc=domain,dc=com";
    

    生成模板文件(导入Linux用户之后,必要时,应使用LDAP的密码修改命令,进行密码的修改,因为 Clouder Manager 对 impala 用户的初始密码我们不知道):

    sudo /usr/share/migrationtools/migrate_passwd.pl /etc/passwd /opt/password.ldif
    

    编辑/opt/password.ldif,我们只需要 impala 账户的信息,执行导入命令:

    sudo ldapadd -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -f /opt/password.ldif -h 192.168.1.1
    sudo kinit ldap -k -t /etc/openldap/ldap_ldap_admin.keytab    
    # 进行搜索验证是否已经导入
    sudo ldapsearch -x -D "uid=ldap,ou=people,dc=domain,dc=com" -W -b 'dc=domain,dc=com' -h 192.168.1.1 | grep impala
    # 修改用户密码,改为自己知道的
    ldappasswd -x -D 'uid=ldap,ou=people,dc=domain,dc=com' -W "uid=impala,ou=people,dc=domain,dc=com" -S -h 192.168.1.1
    

    使用 Impala-shell 测试 LDAP 账号,首先需要得到 Kerberos 授权,假设你已经在 Kerberos 中创建了 impala/impala_admin 这个 principal。不知道如何创建? 请参考 实现基于Cloudera的企业级安全大数据平台-如何访问Kerberos Enabled服务CLI 访问 HDFS的教程。

    kinit impala/impala_admin
    impala-shell -l -u impala --auth_creds_ok_in_clear -i {IMPALAD_HOSTNAME} # IMPALAD_HOSTNAME 为你的随意一台 ImpalaD 服务器
    

    这种模式链接会报:LDAP credentials may not be sent over insecure connections. Enable SSL or set,说明连接没有加密,后续需要进行 TLS 加密部署,这里不复述。

    使用 beeline 测试 LDAP 账号,其中IMPALA_PASSWORD为之前修改的 impala 用户密码:

    HIVESERVER2_HOSTNAME=192.168.1.3
    beeline -u "jdbc:hive2://${HIVESERVER2_HOSTNAME}:10000/default;principal=hive/${HIVESERVER2_HOSTNAME}@DOMAIN.COM;" -n impala -p ${IMPALA_PASSWORD}
    

    HUE 集成 LDAP

    HUE 可以通过 LDAP 来进行用户管理,原理如下图所示:


    hue_ldap_conn.png

    在和 LDAP 打通之前,我们需要保证 HUE 的超级管理员必须可以访问 Enable LDAP 之后的 HUE,我们需要做如下准备工作:

    • 保证所有 HUE 服务节点都有 admin 账户,即 Unix 账户体系中存在 admin 账户;
    • 保证 LDAP 中也有 admin 相关DN;(可以参考前面的 migrationtools 方式导入 admin 账户)
    • 在 HUE 中新建 admin 组,修改 HUE 的 admin 账户为 admin 组;
    • 在 kerberos 中生成 admin/admin 这个 principal;

    以上都完成后才可以在 Cloudera Manager 中修改配置,其中BIND_PASSWORD为 **LDAP 的部署 **这一节中创建的 ldap 用户的密码:

    Authentication Backend = desktop.auth.backend.LdapBackend
    create_users_on_login =  true
    search_bind_authentication = false
    ldap_url = ldap://192.168.1.1
    ldap_username_pattern = uid=<username>,ou=people,dc=domain,dc=com
    base_dn = dc=domain,dc=com
    user_name_attr = uid
    bind_dn = uid=ldap,ou=people,dc=domain,dc=com
    bind_password = ${BIND_PASSWORD}
    

    配置完成之后重启Hue服务即可完成,之后可以通过管理员账号在Hue的用户管理中导入/同步LDAP账号和组。

    小结

    基本的配置完成,我们使用默认的直接绑定方式(search_bind_authentication = false,我们禁用了搜索绑定),可以粗糙的通过 sync / add 方式从 LDAP 中添加组,然后添加用户至 HUE,且必须保证用户名和组名一致。这是因为我们定义的 LDAP 账户是没有组的概念的,没有用户和组的映射关系。但是,真实的企业应用过程中,一个组下面往往包含多个用户,而我们的配置只是根据 uid 去匹配 ou=people 节点下的用户,目前的配置满足不了这样的情况,对权限的控制比较困难。同时,我们也无法一次性导入一个组下面的所有用户。那么怎么解决这些问题呢?在阐述如何整合 Sentry 之后,接下来的一篇中笔者会进行高级配置相关的阐述。

    遇到的问题

    Q: Beeline 访问 Impala 报错:peer indicated failure gss initiate failed (state=08s01 code=0)

    A: HiveServer2 只能起一个。

    Q: 在使用 admin 用户登录时报错:Caught LDAPError while authenticating admin: INVALID_DN_SYNTAX({'info': 'invalid DN', 'desc': 'Invalid DN syntax'},)

    A: 搜索模板配置错误, ldap_username_pattern应为uid=<username>,ou=people,dc=domain,dc=com

    Q: 使用非 admin 账户登录 HUE,查看日志总是报 Kerberos 授权失败。

    A: 应该是没有完成账号同步所致,需要在 Linux 中存在该用户/组,然后 kerberos 生成对应 principal,最后再导入 ldap,并且同步给 HUE。

    Q: 在 HUE 的 FileBrowser 中,文件浏览无法成功:Cannot access: /user/admin. Note: you are a Hue admin but not a HDFS superuser, "hdfs" or part of HDFS supergroup, "supergroup".

    A: 需要在 HUE 打通 LDAP 后,使用 hdfs 用户,当然也是需要按照操作 把 Unix 中的 hdfs 账户导入到 LDAP 中,再通过同步的方式导入到 HUE 中。

    Q: 使用 distinguished 方式 add/sync 用户时,报AttributeError: 'NoneType' object has no attribute 'upper'

    A: 没有配置 base_dn:dc=domain,dc=com

    Q: 使用 migrationtools 批量导入 LDAP 账号密码失败,报:Error in config validation by liboozie … UnsupportedOperationException

    A: BUG[HUE-3528]:https://github.com/cloudera/hue/commit/18a114fb3aff5399ba509e130d1159375700306b,按照介绍,修改脚本后报错消失。

    Q: Can not access /user/hdfs,因为 ticket expired 导致认证401。

    A: 查看日志发现是因为 ticket 过期,去对应机器 kinit 发现无法更新,报:Ticket expired while renewing credentials;发现最初安装的时候生成 krbtgt ticket 时候,max_renew_life 设置为了 4w,意即4秒(而非4星期),所以一直过期,只有重新安装整个 Cloudera 后才可以解决,因为 Cloudera 未提供 Disable Kerberos 的功能。

    相关文章

      网友评论

        本文标题:Step by Step 实现基于 Cloudera 5.8.2

        本文链接:https://www.haomeiwen.com/subject/diwdwttx.html