前言
安全始终是亚马逊云科技的头号工作,也是Amazon EMR这项托管Hadoop服务的首要原则。很多客户越来越意识到安全的重要性,尤其数据安全的重要性,在客户进行全球化业务扩展的时候,面对各国家区域的合规要求,更多采用Kerberos在EMR上进行身份验证。但是很多hadoop用户第一次尝试集成Amazon EMR和Kerberos时,尤其面对安全审计部门要求而初次使用Amazon EMR与外部Kerberos进行集成时,往往由于对Kerberos本身不熟悉,对Amazon EMR不熟悉,导致配置错误而无法集成,本文提供了步骤指南,帮助用户在亚马逊云上从头构建的关键步骤包括,创建Kerberos并集成Amazon EMR和LDAP。
在《Amazon EMR迁移指南》中更多的是对Amazon EMR上可配置Kerberos集成方式的选项及配置后各个组件与KDC的交互认证流程的说明,本博客是针对Amazon EMR与外部KDC(非Amazon EMR自带KDC或单向信任的KDC)集成业务场景的具体实现,这部分在亚马逊云科技官方的文档里没有具体的说明,且自建外部KDC需要符合特定的条件及账号规范,否则其配置集成的Amazon EMR无法成功创建和启动。
Kerberos简介
Amazon EMR发行版 5.10.0 及更高版本支持Kerberos。Kerberos是Amazon EMR可支持的最安全的身份验证和授权机制。Kerberos会要求用户提供自己的凭据,并从中央身份验证服务器获取证明用户身份的票证,随后该票证即可用于为集群中的资源分配访问。这是麻省理工学院 (MIT) 创建的一种网络身份验证协议。Kerberos使用私有密钥加密来提供强大的身份验证,以便不会通过网络以未加密的格式发送密码或其他凭证。
在Kerberos中,需要进行身份验证的服务和用户称为委托人(principals.)。委托人存在于 Kerberos领域(realm)中。在该领域中,被称为密钥分发中心 (KDC) 的Kerberos服务器为委托人提供身份验证方法。KDC通过颁发用于身份验证的票证来执行此操作。KDC维护一个包含其领域中的委托人、它们的密码及其他有关每个委托人的管理信息的数据库。KDC还可以接受来自其他领域中的委托人的身份验证凭证,这称为跨领域信任。此外,Amazon EMR集群可以使用外部KDC对委托人进行身份验证。
Amazon EMR与Kerberos集成方式
应用程序之间的身份验证推荐使用Kerberos方式。在使用Kerberos身份验证时,应用程序会向密钥分发中心(KDC)验证自身身份以及连接到自己的其他应用程序。为Amazon EMR集群使用Kerberos时有三个选项:集群专用KDC、跨领域信任以及外部KDC。每种选项的差异请参阅多种架构选择,本文将在Amazon EC2上创建一个外部麻省理工学院KDC(MIT KDC),同时创建一个Amazon EMR集群并使用MIT KDC服务器中定义和维护的委托人进行配置。
在Amazon EC2上搭建外部KDC
在Amazon EC2上搭建外部KDC
1:通过Amazon Linux 2 AMI镜像,并按默认配置启动Amazon EC2,安装Kerberos安装包。注意该Amazon EC2所在子网可以与稍后创建的Amazon 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 =
admin_server =
}
[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
*左右滑动查看更多
4:创建/初始化Kerberos database。
$ sudo /usr/sbin/kdb5_util create -s -r EXTKDC.COM4
*左右滑动查看更多
检查数据库是否创建成功。
ll /var/kerberos/krb5kdc
5:为database administrator设置ACL权限。
$ sudo vi /var/kerberos/krb5kdc/kadm5.acl的内容编辑为
*/[email protected] *
*左右滑动查看更多
以便允许所有远程kadmin/admin的管理员操作,否则Amazon EMR puppy安装Kerberos client的时候无法create各个组件的principal。
6:添加database administrator。
$ sudo /usr/sbin/kadmin.local -q "addprinc admin/admin"
$ sudo Kadmin.local
>listprincs
*左右滑动查看更多
检查是否委托人创建成功。
7:修改kadmin密码,该修改后的密码将用于Amazon EMR集群集成时使用。
>cpw kadmin/admin
退出。
注意该步骤中创建的admin账密需要与Amazon 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_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
- 在Amazon EMR服务的安全配置中心中创建名为extkdctest的安全配置,并设置外部kdc的地址。
- 通过高级配置创建Amazon EMR集群,本文选择3.0版本,其他配置保持默认。
- 在硬件配置中的网络配置中,选择和外部KDC可以联通的子网,并确定KDC server所在Amazon EC2的安全组中允许该网络访问。
- 在安全性页面中,除了设置Amazon EC2键对外,在安全设置中选项刚才设置的安全配置,输入域名并输入我们在外部KDC更改kadmin后的密码。其他默认选择,并进行集群创建。
总结
本文介绍了Amazon EMR集成外部KDC的原理以及说明了如何一步步操作集成外部KDC,包括在操作过程中的注意事项,对于第一次创建Amazon EMR并集成外部KDC的用户,可以清晰的了解集成过程,并快速实现原型搭建。
本篇作者
柏燕峥
亚马逊云科技解决方案架构师。
十余年企业软件架构和咨询经验,专注企业私有云、混合云、云管理平台、云安全、DevOps。著有大学教材中的大数据与人工智能技术丛书中的《云计算导论》。
唐清原
亚马逊云科技数据分析解决方案架构师
负责Amazon Data Analytic服务方案架构设计以及性能优化,迁移,治理等Deep Dive支持。10+数据领域研发及架构设计经验,历任Oracle 高级咨询顾问,咪咕文化数据集市高级架构师,澳新银行数据分析领域架构师职务。在大数据,数据湖,智能湖仓,及相关推荐系统/MLOps平台等项目有丰富实战经验。