所有命令行中的 ${var} 代表用户需要填写的某个值。本配置的 域(Domain) 是 IN.NOPADDING.COM。系统版本 Centos 7.6。Cloudera Manager 5.13.0。
本次部署使用的是基于 dnsmasq 的 配置方式,而不使用 FreeIPA 自带的 BIND 9(named),同时 Cloudera Manager 管理节点和 kdc 以及 slapd 不在同一台主机上。
安装:
yum install ipa-server -y ipa-server-install --no-ntp --no-ssh --no-sshd -d
会产生如下 DNS 记录
_kerberos-master._tcp.in.nopadding.com. 86400 IN SRV 0 100 88 ux4.in.nopadding.com. _kerberos-master._udp.in.nopadding.com. 86400 IN SRV 0 100 88 ux4.in.nopadding.com. _kerberos._tcp.in.nopadding.com. 86400 IN SRV 0 100 88 ux4.in.nopadding.com. _kerberos._udp.in.nopadding.com. 86400 IN SRV 0 100 88 ux4.in.nopadding.com. _kerberos.in.nopadding.com. 86400 IN TXT "IN.NOPADDING.COM" _kpasswd._tcp.in.nopadding.com. 86400 IN SRV 0 100 464 ux4.in.nopadding.com. _kpasswd._udp.in.nopadding.com. 86400 IN SRV 0 100 464 ux4.in.nopadding.com. _ldap._tcp.in.nopadding.com. 86400 IN SRV 0 100 389 ux4.in.nopadding.com. ipa-ca.in.nopadding.com. 86400 IN A 192.168.1.24
将 DNS 记录按照 dnsmasq 格式写入配置
srv-host = _kerberos-master._tcp.in.nopadding.com,ux4.in.nopadding.com,88 srv-host = _kerberos-master._udp.in.nopadding.com,ux4.in.nopadding.com,88 srv-host = _kerberos._tcp.in.nopadding.com,ux4.in.nopadding.com,88 srv-host = _kerberos._udp.in.nopadding.com,ux4.in.nopadding.com,88 srv-host = _kpasswd._tcp.in.nopadding.com,ux4.in.nopadding.com,88 srv-host = _kpasswd._tcp.in.nopadding.com,ux4.in.nopadding.com,88 srv-host = _ldap._tcp.in.nopadding.com,ux4.in.nopadding.com,389 txt-record= _kerberos.in.nopadding.com,"IN.NOPADDING.COM"
A 记录添加到 hosts 文件中。
安装 ipa-client
yum install -y ipa-client ipa-client-install --domain=in.nopadding.com --realm=IN.NOPADDING.COM --principal=admin@IN.NOPADDING.COM --password=hadoop123 --mkhomedir --permit --no-ntp --no-ssh --no-sshd -d
如果安装时没有选择自动创建用户目录(mkhomedir),可以使用 authconfig 配置
在所有机器上执行:
authconfig --enablemkhomedir --update
即可。
另外,sssd 会缓存 ldap 用户,可以使用 sss_cache -E
清除。
用户默认的 shell 指向 /bin/sh , 修改为 /bin/bash :
su admin -c "ipa config-mod --defaultshell=/bin/bash"
kinit 生成 ticket cache:
KRB5_TRACE=/dev/stderr kinit admin
CM 配置的 kerberos 的过程中,包含两个阶段,第一个是通过 kdc 管理者的账户和密码,导入凭据。实际上是一个生成 keytab 的过程。
第二个阶段是使用第一个阶段生成的凭据,在 kdc 上注册服务要使用的凭据。
第一个阶段,我遇到的问题是通过 ktutil 无法生成 keytab。通过分析错误信息,确认是 kdc 生成 keytab 加入了 salt,而本地安装的版本:1.15.1 并不能生成这种带有随机盐值的 keytab。
于是分析 krb5kdc 如何配置 enctype 和 salt 的值。
在 krb5.conf 配置中可以看出,kdc 服务通过 ipa 的 ipadb.so 作为数据库端(kdb),具体实现在如下文件中 https://github.com/freeipa/freeipa/blob/release-4-6-5/daemons/ipa-kdb/ipa_kdb.c#L444 。
把相关函数指针,写入 kdb_vftabl 的结构体中,导出 kdb_function_table,此处查看 ipadb.so 的导出表也可以看到。结构体定义在 https://github.com/krb5/krb5/blob/krb5-1.15.1-final/src/include/kdb.h 。
通过这部分代码可以看出,krbDefaultEncSaltTypes 属性,影响生成 keytab 的加密方式。那么我尝试修改 ldap 中的这两个值。
ldapsearch -x -D "cn=directory manager" -w hadoop123 "objectClass=krbrealmcontainer" ldapmodify -x -D "cn=directory manager" -w hadoop123 -f modify.ldif
modify.ldif 内容:
dn: cn=IN.NOPADDING.COM,cn=kerberos,dc=in,dc=nopadding,dc=com changetype: modify delete: krbDefaultEncSaltTypes krbDefaultEncSaltTypes: aes256-cts:special - delete: krbDefaultEncSaltTypes krbDefaultEncSaltTypes: aes128-cts:special - add: krbDefaultEncSaltTypes krbDefaultEncSaltTypes: aes256-cts:normal - add: krbDefaultEncSaltTypes krbDefaultEncSaltTypes: aes128-cts:normal
默认的 salt 类型 special,我们修改了这个属性为 normal,那么如何验证是否加盐呢。
获得 keytab 的方式:
ipa-getkeytab -r -p admin@IN.NOPADDING.COM -k admin.keytab -D "cn=directory manager" -w hadoop123
通过 ktutil 生成 keytab 的脚本:
#!/bin/bash set -x KEYTAB=$1 printf "addent -password -p admin -k 1 -e aes256-cts\nhadoop123\naddent -password -p admin -k 1 -e aes128-cts\nhadoop123\nwrite_kt $KEYTAB\nquit" | ktutil
比较这两个 keytab 是否相同即可。
#!/bin/bash set -x KEYTAB=$1 printf "read_kt $KEYTAB\nlist -k -t -e\nquit" | ktutil
第二个问题,注册服务的 principal。这个是 CM 调用 /usr/share/cmf/bin/gen_credentials.sh,这个脚本可以配置,因为是使用 freeipa 管理,所以我们需要自己定义一个获取凭证的脚本。如下:
#!/usr/bin/env bash set -e set -x # Explicitly add RHEL5/6, SLES11/12 locations to path export PATH=/usr/kerberos/bin:/usr/kerberos/sbin:/usr/lib/mit/sbin:/usr/sbin:/usr/lib/mit/bin:/usr/bin:$PATH KEYTAB_OUT=$1 PRINC=$2 MAX_RENEW_LIFE=$3 IPASERVER=`ipa env server|sed 's/ server: //g'` kinit -kt /opt/cloudera/freeipa/admin.keytab admin if ipa service-find $PRINC; then echo Service principle $PRINC found else echo Service principle $PRINC not created, creating ipa service-add $PRINC --pac-type=NONE fi if ipa service-show $PRINC | grep 'Keytab' | grep 'False'; then echo Creating keytab for $PRINC for $KEYTAB_OUT ipa-getkeytab -s $IPASERVER -p $PRINC -k $KEYTAB_OUT else echo Retrieving keytab for $PRINC for $KEYTAB_OUT ipa-getkeytab -r -s $IPASERVER -p $PRINC -k $KEYTAB_OUT -D "cn=directory manager" -w hadoop123 fi chmod 600 $KEYTAB_OUT kdestroy
脚本有两个问题:一个是不能直接使用第一个步骤中生成的 admin 的 keytab,另外一个是需要显式的把 ldap 密码写入到脚本中,这种方式并不安全。
于是我直接修改 /usr/share/cmf/bin 下的安装脚本,使其 CM 能直接将 kinit 的参数传入,然后通过修改权限,让本机和本用户可以获取 service principal keytab 。
#!/usr/bin/env bash # Copyright (c) 2011 Cloudera, Inc. All rights reserved. set -e set -x # Explicitly add RHEL5/6, SLES11/12 locations to path export PATH=/usr/kerberos/bin:/usr/kerberos/sbin:/usr/lib/mit/sbin:/usr/sbin:/usr/lib/mit/bin:/usr/bin:$PATH CMF_USER=${CMF_PRINCIPAL%%\@*} CMF_REALM=${CMF_PRINCIPAL##*\@} KEYTAB_OUT=$1 PRINC=$2 MAX_RENEW_LIFE=$3 kinit -k -t $CMF_KEYTAB_FILE -p $CMF_PRINCIPAL IPASERVER=`ipa env server|sed 's/ server: //g'` IPACLIENT=`ipa env host|sed 's/ host: //g'` if ipa service-find $PRINC; then echo Service principle $PRINC found else echo Service principle $PRINC not created, creating ipa service-add $PRINC --pac-type=NONE fi ipa service-allow-create-keytab --users=$CMF_USER --hosts=$IPACLIENT $PRINC || true ipa service-allow-retrieve-keytab --users=$CMF_USER --hosts=$IPACLIENT $PRINC || true if ipa service-show $PRINC | grep 'Keytab' | grep 'False'; then echo Creating keytab for $PRINC for $KEYTAB_OUT ipa-getkeytab -s $IPASERVER -p $PRINC -k $KEYTAB_OUT else echo Retrieving keytab for $PRINC for $KEYTAB_OUT ipa-getkeytab -r -s $IPASERVER -p $PRINC -k $KEYTAB_OUT fi kdestroy chmod 600 $KEYTAB_OUT
ns‐slapd - The main Directory Server daemon
ns-slapd 的配置文件,在 /etc/dirsrv/slapd-IN-NOPADDING-COM/
下。
验证 ldap root 密码的命令。
ldapsearch -x -D "cn=directory manager" -w ${ldap_root_password} -s base -b "" "objectclass=*"
重置密码
ldappasswd -ZZ -D 'cn=Directory Manager' -W -S uid=admin,cn=users,cn=accounts,dc=in,dc=nopadding,dc=com -H ldap://ux4.in.nopadding.com
certmonger
公钥体系。
生成证书:
openssl pkcs12 -export -name hdfs -passout pass:hadoop123 -in hdfs.pem.5 -inkey hdfs.key.5 -out hdfs.p12 keytool -importkeystore -srckeystore hdfs.p12 -srcstoretype PKCS12 -srcstorepass hadoop123 -destkeystore hdfs.jks -deststorepass hadoop123 -alias hdfs keytool -importkeystore -srckeystore hdfs.jks -destkeystore hdfs.jks -deststoretype pkcs12 keytool -keystore hdfs.jks -import -file /etc/ipa/ca.crt -alias ipa-ca