亚马逊AWS官方博客

EMR与外部KDC集成进行身份认证

前言

安全始终是亚马逊云科技的头号工作,也是Aamzon EMR这项托管Hadoop服务的首要原则。很多客户越来越意识到安全的重要性,尤其数据安全的重要性,在客户进行全球化业务扩展的时候,面对各国家区域的合规要求,更多采用Kerberos在EMR上进行身份验证。但是很多hadoop用户第一次尝试集成EMR和Kerberos时,尤其面对安全审计部门要求而初次使用EMR与外部Kerberos进行集成时,往往由于对Kerberos本身不熟悉,对EMR不熟悉,导致配置错误而无法集成,本文提供了步骤指南,帮助用户在亚马逊云上从头构建的关键步骤包括,创建Kerberos并集成EMR和LDAP。

《Amazon EMR迁移指南》中更多的是对EMR上可配置Kerberos集成方式的选项及配置后各个组件与KDC的交互认证流程的说明,本博客是针对EMR与外部KDC(非EMR自带KDC或单向信任的KDC)集成业务场景的具体实现,这部分在AWS官方的文档里没有具体的说明,且自建外部KDC需要符合特定的条件及账号规范,否则其配置集成的EMR无法成功创建和启动

Kerberos简介

Amazon EMR 发行版 5.10.0 及更高版本支持 Kerberos。Kerberos 是 Amazon EMR 可支持的最安全的身份验证和授权机制。Kerberos 会要求用户提供自己的凭据,并从中央身份验证服务器获取证明用户身份的票证,随后该票证即可用于为集群中的资源分配访问。这是麻省理工学院 (MIT) 创建的一种网络身份验证协议。Kerberos 使用私有密钥加密来提供强大的身份验证,以便不会通过网络以未加密的格式发送密码或其他凭证。

在 Kerberos 中,需要进行身份验证的服务和用户称为委托人(principals.)。委托人存在于 Kerberos 领域(realm)中。在该领域中,被称为密钥分发中心 (KDC) 的 Kerberos服务器为委托人提供身份验证方法。KDC通过颁发用于身份验证的票证来执行此操作。KDC 维护一个包含其领域中的委托人、它们的密码及其他有关每个委托人的管理信息的数据库。KDC 还可以接受来自其他领域中的委托人的身份验证凭证,这称为跨领域信任。此外,EMR 集群可以使用外部 KDC 对委托人进行身份验证。

EMR与Kerberos集成方式

应用程序之间的身份验证推荐使用 Kerberos 方式。在使用 Kerberos 身份验证时,应用程序会向密钥分发中心(KDC)验证自身身份以及连接到自己的其他应用程序。为 EMR 集群使 用 Kerberos 时有三个选项:集群专用 KDC、跨领域信任以及外部 KDC。每种选项的差异请 参阅多种架构选择,本文将在EC2上创建一个外部麻省理工学院KDC(MIT KDC),同时创建一个EMR集群并使用MIT KDC服务器中定义和维护的委托人进行配置。

在EC2上搭建外部KDC

1:通过Amazon Linux 2 AMI 镜像,并按默认配置启动EC2,安装Kerberos安装包。注意该EC2所在子网可以与稍后创建的EMR集群网络互通。如果安装在私有子网,请确保有跳转机可以访问到该机器。

$ sudo yum install -y krb5-server krb5-libs krb5-auth-dialog

2:配置kdc.conf,将默认的EXAMPLE.COM更改为客户化域名(本文命名为EXTKDC.COM)。注意域名一定要大写

$ sudo cat /var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88[realms]
 EXTKDC.COM = {
 #master_key_type = aes256-cts
 acl_file = /var/kerberos/krb5kdc/kadm5.acl
 dict_file = /usr/share/dict/words
 admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
 supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

3:修改krb5.conf,如以下配置,将default_realm以及[realms]中的默认注释去掉,同时修改为自己的KDC域名,并在[realms]中指定KDC服务器私有IP地址

$ sudo vi /etc/krb5.conf

# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
default_realm = EXTKDC.COM
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 EXTKDC.COM = {
  kdc = <KDC ip addr>
  admin_server = <KDC ip addr>
 }

[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM

4:创建/初始化Kerberos database

$ sudo /usr/sbin/kdb5_util create -s -r EXTKDC.COM4:创建/初始化Kerberos database

检查数据库是否创建成功

ll /var/kerberos/krb5kdc

5:为database administrator设置ACL权限

$ sudo vi /var/kerberos/krb5kdc/kadm5.acl的内容编辑为

*/admin@EXTKDC.COM      *

以便允许所有远程kadmin/admin的管理员操作,否则EMR puppy安装Kerberos client的时候无法create各个组件的principal

6:添加database administrator

$ sudo /usr/sbin/kadmin.local -q "addprinc admin/admin"

$ sudo Kadmin.local

>listprincs

检查是否委托人创建成功

7:修改kadmin密码,该修改后的密码将用于EMR集群集成时使用

>cpw kadmin/admin

退出

注意该步骤中创建的admin账密需要与EMR安全策略中配置的admin密码一致

8:启动Kerberos daemons

systemctl start krb5kdc

systemctl start kadmin

【optional步骤】:LDAP集成

企业客户通常会将系统账号统一存储在LDAP中,该步骤为自建LDAP与Kerberos集成的方案

1:安装open LDAP

yum install libdb-cxx libdb-cxx-devel gcc-plugin-devel -y
yum install libtool-ltdl-devel -y

2:加载并启动LDAP服务

/usr/local/sbin/slapadd -n 0 -F /usr/local/etc/openldap -l /usr/local/etc/openldap/slapd.ldif

/usr/local/libexec/slapd -F /usr/local/etc/openldap

3:创建RootDN及BaseDN对象(该对象为Kerberos连接LDAP的根dn)

vi /usr/local/etc/openldap/rootdn.ldif
dn: dc=extkdc,dc=com
objectclass: dcObject
objectclass: organization
o: test
dc: test
dn: cn=app,dc=extkdc,dc=com
objectclass: organizationalRole
cn: app

4:更改完毕重启slapd服务

ps -aux | grep slapd
kill -9 $PID

5:加载ldap schema,以便与Kerberos集成
/usr/local/libexec/slapd -F /usr/local/etc/openldap

ldapadd -x -D “cn=config” -w 123456 -f /root/ldap/cn=kerberos.ldif

6:更新Kerberos的server端配置,增加database_module及ldapconf的相关配置

EXTKDC.COM = {
……
database_module = openldap_ldapconf
}
[dbdefaults]
   ldap_kerberos_container_dn = cn=test,dc=extkdc,dc=com

[dbmodules]
   openldap_ldapconf = {
       db_library = kldap
       ldap_servers = <ldap server的private IP>
       ldap_kerberos_container_dn =   cn=test,dc=extkdc,dc=com
       ldap_kdc_dn =                cn=app,dc=extkdc,dc=com
       ldap_kadmind_dn =            cn=app,dc=extkdc,dc=com
       ldap_service_password_file = /etc/krb5.ldap
       ldap_conns_per_server = 5
}

创建EMR并集成外部KDC

  • 在EMR服务的安全配置中心中创建名为extkdctest的安全配置,并设置外部kdc的地址

  • 通过高级配置创建EMR集群,本文选择3.0版本,其他配置保持默认
  • 在硬件配置中的网络配置中,选择和外部KDC可以联通的子网,并确定KDC server所在EC2的安全组中允许该网络访问
  • 在安全性页面中,除了设置EC2键对外,在安全设置中选项刚才设置的安全配置,输入域名并输入我们在外部KDC更改kadmin后的密码。其他默认选择,并进行集群创建

总结

本文介绍了EMR集成外部KDC的原理以及说明了如何一步步操作集成外部KDC,包括在操作过程中的注意事项,对于第一次创建EMR并集成外部KDC的用户,可以清晰的了解集成过程,并快速实现原型搭建。

本篇作者

柏燕峥

AWS 解决方案架构师。十余年企业软件架构和咨询经验,专注企业私有云、混合云、云管理平台、云安全、DevOps。著有大学教材中的大数据与人工智能技术丛书中的《云计算导论》

唐清原

AWS数据分析解决方案架构师,负责AWS Data Analytic服务方案架构设计以及性能优化,迁移,治理等Deep Dive支持。10+数据领域研发及架构设计经验,历任Oracle 高级咨询顾问,咪咕文化数据集市高级架构师,澳新银行数据分析领域架构师职务。在大数据,数据湖,智能湖仓,及相关推荐系统/MLOps平台等项目有丰富实战经验