写点什么

借助 Amazon EMR 与外部 KDC 进行身份认证,有效集成业务场景

  • 2021 年 12 月 23 日
  • 本文字数:3756 字

    阅读完需:约 12 分钟

借助Amazon EMR与外部KDC进行身份认证,有效集成业务场景


前言


安全始终是亚马逊云科技的头号工作,也是 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 wellincludedir /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.crtdefault_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
复制代码

*左右滑动查看更多


检查数据库是否创建成功。


ll /var/kerberos/krb5kdc
复制代码


5:为 database administrator 设置 ACL 权限。


$ sudo vi /var/kerberos/krb5kdc/kadm5.acl的内容编辑为
*/admin@EXTKDC.COM      *
复制代码

*左右滑动查看更多


以便允许所有远程 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 -yyum 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.ldifdn: dc=extkdc,dc=comobjectclass: dcObjectobjectclass: organizationo: testdc: testdn: cn=app,dc=extkdc,dc=comobjectclass: organizationalRolecn: app
复制代码


4:更改完毕重启 slapd 服务。


ps -aux | grep slapdkill -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


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



2. 通过高级配置创建 Amazon EMR 集群,本文选择 3.0 版本,其他配置保持默认。

3. 在硬件配置中的网络配置中,选择和外部 KDC 可以联通的子网,并确定 KDC server 所在 Amazon EC2 的安全组中允许该网络访问。

4. 在安全性页面中,除了设置 Amazon EC2 键对外,在安全设置中选项刚才设置的安全配置,输入域名并输入我们在外部 KDC 更改 kadmin 后的密码。其他默认选择,并进行集群创建。



总结


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


本篇作者


柏燕峥

亚马逊云科技解决方案架构师。

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


唐清原

亚马逊云科技数据分析解决方案架构师

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


用户头像

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论

发布
暂无评论
借助Amazon EMR与外部KDC进行身份认证,有效集成业务场景