Info |
---|
所有命令行中的 ${var} 代表用户需要填写的某个值。本配置的 域(Domain) 是 IN.NOPADDING.COM。系统版本 Centos 7.6。Cloudera Manager 5.13.0。 |
Table of Contents |
---|
DNS 服务
本次部署使用的是基于 dnsmasq 的 配置方式,而不使用 FreeIPA 自带的 BIND 9(named),同时 Cloudera Manager 管理节点和 kdc 以及 slapd 不在同一台主机上。
...
Code Block |
---|
yum install ipa-server -y ipa-server-install -p hadoop123 -a hadoop123 --no-ntp --no-ssh --no-sshd -d |
...
Code Block |
---|
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 服务
安装 ipa-client
Code Block |
---|
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 |
后边配置过 bind 9 之后,
Code Block |
---|
ipa-client-install --principal=admin --password=hadoop123 --mkhomedir --permit --force-ntpd --no-dns-sshfp -U -v |
配置 mkhomedir 需要依赖 oddjobd 和 dbus,这两个服务都可能会有启动的问题。
如果安装时没有选择自动创建用户目录(mkhomedir),可以使用 authconfig 配置
...
Code Block |
---|
KRB5_TRACE=/dev/stderr kinit admin |
IPA KDC 和 Cloudera Manager 整合的问题
CM 配置的 kerberos 的过程中,包含两个阶段,第一个是通过 kdc 管理者的账户和密码,导入凭据。实际上是一个生成 keytab 的过程。
...
Code Block |
---|
ipa-getkeytab -r -p admin@IN.NOPADDING.COMadmin -k admin.keytab -D "cn=directory manager" -w hadoop123 |
...
Code Block |
---|
#!/bin/bash set -x KEYTAB=$1 printf "read_kt $KEYTAB\nlist -k -t -e\nquit" | ktutil |
对于已经存在的用户,重新获取 keytab 才能改变 encsalttype。
Code Block |
---|
ipa-getkeytab -p admin -k admin.keytab -P -D "cn=directory manager" -w hadoop123 |
第二个问题,注册服务的 principal。这个是 CM 调用 /usr/share/cmf/bin/gen_credentials.sh,这个脚本可以配置,因为是使用 freeipa 管理,所以我们需要自己定义一个获取凭证的脚本。如下:
Code Block |
---|
#!/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 |
krb5kdc - Kerberos V5 KDC
...
脚本有两个问题:一个是不能直接使用第一个步骤中生成的 admin 的 keytab,另外一个是需要显式的把 ldap 密码写入到脚本中,这种方式并不安全。
于是我直接修改 /usr/share/cmf/bin 下的安装脚本,使其 CM 能直接将 kinit 的参数传入,然后通过修改权限,让本机和本用户可以获取 service principal keytab 。
Code Block |
---|
#!/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 |
另外,实际使用中,如果遇到版本较低的 ipa,可能找不到 server 变量,需要换一种方法获取:
Code Block |
---|
[root@node24 ~]# ipa ping
-------------------------------------------
IPA server version 4.2.0. API version 2.156
-------------------------------------------
[root@node24 ~]# ipa env server
[root@node24 ~]# ipa server-find | sed -n '4p' | sed 's/ Server name: //g'
node24.pub.cert.cn |
LDAP 服务
ns-slapd 的配置文件,在 /etc/dirsrv/slapd-IN-NOPADDING-COM/
下。
...
Code Block |
---|
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 |
named - Internet domain name server
pki-server
公钥体系,pki 是对于服务方,非对称密钥体系的公钥提供方的认证。
...
证书服务(TODO)
生成证书:
Code Block |
---|
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 |
使用中遇到的问题
kinit 显示 credentials have been revoked
密码策略上,最大的重试次数是 6 次,如果重试了 6 次,账户会锁住。建议讲这个数字设置的更长。
Code Block |
---|
ipa pwpolicy-mod --maxfail 0 |