Flink Kerberos 身份认证设置与配置:从安全模块原理到三种部署模式实战
Flink Kerberos 身份认证设置与配置从安全模块原理到三种部署模式实战【免费下载链接】flink项目地址: https://gitcode.com/gh_mirrors/fli/flinkKerberos 是 Flink 对接 Hadoop 生态HDFS、HBase、ZooKeeper与 Kafka 等外部系统的首选身份认证方案。本文以 Flink 官方中文文档为骨架结合本仓库源码flink-core与flink-runtime中的安全实现系统讲解 Kerberos 安全框架的目标、三大安全模块的工作原理、完整配置参数、以及 Standalone / 原生 Kubernetes / YARN 三种部署模式下的启用步骤。读完本文你将能够为生产环境的 Flink 集群正确配置 keytab 或 ticket cache 认证并理解 TGT 自动续期与 delegation token 的底层机制。Kerberos 安全框架的目标Flink Kerberos 安全基础设施有三个主要目标安全访问数据集群内作业通过 connector例如 Kafka安全地访问数据认证 ZooKeeper对配置了 SASL 的 ZooKeeper 进行身份认证认证 Hadoop 组件对 HDFS、HBase 等 Hadoop 组件进行身份认证。生产场景中的流式作业通常会运行数天、数周甚至数月需要在作业的整个生命周期内持续认证数据源。与 Hadoop delegation token 和 ticket 缓存项不同Kerberos keytab 不会在这个时间跨度内过期因此是长周期作业的首选凭据形式。当前实现支持使用以下几种凭据运行 Flink 集群JobManager / TaskManager / 作业keytab 文件首选凭据缓存credential cache例如由kinit创建的缓存文件Hadoop delegation token用户提供的 token 不会被续期且可能被 Flink 覆盖。需要注意同一集群的所有作业共享为该集群配置的凭据。如果某个作业需要使用不同的 keytab只需单独启动一个配置不同的 Flink 集群。多个 Flink 集群可以在 Kubernetes 或 YARN 环境中并行运行互不影响。Flink Security 如何工作从概念上讲Flink 程序可能使用自研或第三方 connectorKafka、HDFS、Cassandra、Flume、Kinesis 等这些 connector 需要任意的认证方式Kerberos、SSL/TLS、用户名/密码等。虽然满足所有 connector 的安全需求仍在推进中但Flink 已经为 Kerberos 身份认证提供了一流支持覆盖以下服务和 connectorKafka0.9HDFSHBaseZooKeeper注意每个服务或 connector 的 Kerberos 可以独立启用。例如你可以启用 Hadoop security 而不为 ZooKeeper 开启 Kerberos反之亦然。组件之间共享的只是 Kerberos 凭据的配置每个组件会显式地使用它。Flink 安全内部架构建立在**安全模块SecurityModule**之上——即org.apache.flink.runtime.security.modules.SecurityModule接口安全模块在 Flink 启动过程中被安装。从源码看模块由security.module.factory.classes配置项驱动其默认值为三个工厂类见 SecurityOptions.javasecurity.module.factory.classes: org.apache.flink.runtime.security.modules.HadoopModuleFactory, org.apache.flink.runtime.security.modules.JaasModuleFactory, org.apache.flink.runtime.security.modules.ZookeeperModuleFactory下面分别介绍每个安全模块。Hadoop Security 模块该模块使用 HadoopUserGroupInformationUGI类建立进程范围的登录用户上下文登录用户随后用于与 Hadoop 组件的所有交互包括 HDFS、HBase 和 YARN。如果启用了 Hadoop security在core-site.xml中设置hadoop.security.authenticationkerberos登录用户将拥有配置的 Kerberos 凭据否则登录用户仅继承启动集群的操作系统账户的用户身份。具体的登录过程遵循以下优先级参考 security-kerberos.md 英文版当hadoop.security.authentication为kerberos时若配置了security.kerberos.login.keytab和security.kerberos.login.principal执行keytab 登录若配置了security.kerberos.login.use-ticket-cache执行credential cache 登录其他所有情况使用启动进程的OS 账户身份。从源码实现看HadoopModule.java模块安装时会先通过KerberosLoginProvider判断是否能够登录并执行登录然后取UserGroupInformation.getLoginUser()作为登录用户如果登录用户来自 keytabloginUser.isFromKeytab()还会读取环境变量HADOOP_TOKEN_FILE_LOCATION指向的 token 存储文件并合并凭据。此外HadoopModule 会启动一个名为TGTRenewalExecutorService的定时任务来自动续期 TGT它按security.kerberos.relogin.period默认 1 分钟周期调度loginUser.checkTGTAndReloginFromKeytab()。该方法的注释解释了这样做的原因Hadoop 2.x 的 keytab 登录似乎是自动续期的但 Hadoop 3.x 中该行为是可配置的hadoop.kerberos.keytab.login.autorenewal.enabledFlink 通过自己的定时任务确保无论该配置如何用户始终保持登录状态。与模块配套的还有安全上下文SecurityContextHadoopSecurityContext.java 通过ugi.doAs(...)在已初始化的 UGI 与安全凭据下执行用户代码这正是作业以登录用户身份访问 Hadoop 组件的底层机制。JAAS Security 模块该模块为集群提供动态 JAAS 配置使配置的 Kerberos 凭据对 ZooKeeper、Kafka 以及其他依赖 JAAS 的组件可用。从源码看JaasModule.java模块安装时执行以下操作确保java.security.auth.login.config系统属性指向一个存在的 JAAS 配置文件如果用户未通过该属性提供静态配置则会在 Flink 临时目录io.tmp.dirs第一个目录生成默认的jaas-*.conf文件资源模板为flink-jaas.conf这是为了兼容 ZooKeeper 和 Kafka——它们会检查该系统属性及文件是否存在将既有配置包装为DynamicConfiguration动态配置为security.kerberos.login.contexts中列出的每个登录上下文注入 krb5 登录条目。登录条目由getAppConfigurationEntries构建当配置了 keytab 时生成 keytab 条目当useTicketCache()为 true 时生成 ticket cache 条目两者可同时存在。用户也可以使用 Java SE 文档中描述的机制提供静态 JAAS 配置文件通过-Djava.security.auth.login.config/path/to/jaas.conf指定。静态配置项会覆盖该模块提供的任何动态配置项。关于登录上下文login contextSecurityOptions.java 中的说明非常关键security.kerberos.login.contexts逗号分隔的登录上下文列表用于向这些上下文提供 Kerberos 凭据。例如设置为Client,KafkaClient表示同时将凭据用于 ZooKeeper 认证和 Kafka 认证。对应的解析逻辑在 SecurityConfiguration.java 中通过parseList完成配置文件中的逗号分隔值会被拆分为多个上下文名称。ZooKeeper Security 模块该模块配置某些进程范围内的 ZooKeeper 安全相关设置即ZooKeeper 服务名称service name默认为zookeeperJAAS 登录上下文名称login context name默认为Client。从源码看ZooKeeperModule.java模块通过设置以下 JVM 系统属性生效系统属性含义对应配置项zookeeper.sasl.client是否启用 ZK 客户端 SASLzookeeper.sasl.disable取反默认 false 即启用 SASLzookeeper.sasl.client.username期望的 ZooKeeper 服务名zookeeper.sasl.service-name默认zookeeperzookeeper.sasl.clientconfig使用的登录上下文名称zookeeper.sasl.login-context-name默认Client安装时模块会保存原有属性值卸载时uninstall会恢复现场保证模块的可逆性。Kerberos 相关配置参数总览所有安全相关配置项统一定义在 SecurityOptions.java 中以下是与 Kerberos 认证直接相关的核心参数配置项默认值说明security.kerberos.login.keytab无Kerberos keytab 文件的绝对路径包含用户凭据旧键名security.keytab已废弃security.kerberos.login.principal无与 keytab 关联的 Kerberos principal 名称旧键名security.principal已废弃security.kerberos.login.use-ticket-cachetrue是否从 Kerberos ticket cache 中读取凭据security.kerberos.login.contexts无逗号分隔的登录上下文列表例如Client,KafkaClientsecurity.kerberos.krb5-conf.path无krb5.conf 文件的本地路径配置后 Flink 会将其挂载到 Kubernetes/YARN 的 JobManager 与 TaskManager 容器中。注意KDC 必须能从容器内部访问security.kerberos.relogin.period1 minkeytab 自动登录的时间周期用于始终保持有效的 TGTsecurity.kerberos.access.hadoopFileSystems无分号分隔的 Kerberos 安全 Hadoop 文件系统列表例如hdfs://namenode2:9002;hdfs://namenode3:9003。JobManager 需要能访问这些文件系统以获取安全 tokensecurity.delegation.tokens.enabledtrue是否启动外部服务的 delegation token 系统旧键名security.kerberos.fetch.delegation-token已废弃security.delegation.tokens.renewal.retry.backoff1 hdelegation token 获取失败后的重试等待时间security.delegation.tokens.renewal.time-ratio0.75在 token 到期时间的该比例点重新获取新凭据zookeeper.sasl.disablefalse是否禁用 ZooKeeper 的 SASL 认证zookeeper.sasl.service-namezookeeperZooKeeper SASL 服务名zookeeper.sasl.login-context-nameClientZooKeeper SASL 登录上下文名部署模式下面针对每种部署模式给出启用安全集群的具体步骤。所有安全相关配置项均属于 Flink 配置文件中与外部系统认证Auth with external systems这一节完整参数说明可参考 Flink 配置文档。Standalone 模式在 standalone / cluster 模式下运行安全 Flink 集群的步骤在所有集群节点的 Flink 配置文件中添加安全相关配置选项确保 keytab 文件存在于每个集群节点上security.kerberos.login.keytab指定的路径正常部署 Flink 集群。Standalone 模式下 Flink 不会自动分发 keytab因此每个节点都必须能读到相同的 keytab 文件这是该模式与 Kubernetes/YARN 模式最大的区别。原生 Kubernetes 和 YARN 模式在原生 Kubernetes 或 YARN 模式下运行安全 Flink 集群的步骤在客户端的 Flink 配置文件中添加安全相关配置选项确保 keytab 文件存在于客户端上security.kerberos.login.keytab指定的路径正常部署 Flink 集群。在 YARN 和原生 Kubernetes 模式下keytab 文件会被自动从客户端拷贝到 Flink 容器中无需手工分发。要启用 Kerberos 认证还需要 Kerberos 配置文件krb5.conf。该文件可以从集群环境中获取也可以由 Flink 上传。选择后者时配置security.kerberos.krb5-conf.path指定 Kerberos 配置文件的本地路径Flink 会将该文件复制到相应容器或 pod 中。使用kinit仅限 YARN在 YARN 模式下可以不使用 keytab而只使用由kinit管理的 ticket 缓存来部署安全 Flink 集群。这种方式避免了生成 keytab 的复杂性也无需将 keytab 委托给集群管理器。使用 Flink CLI 可以获取 Hadoop delegation token用于 HDFS 和 HBase。主要缺点是集群必须是短暂的因为生成的 delegation token 会过期通常在一周内。使用kinit前需要了解几点关键事实凭据缓存的形态credential cache 可以有多种表现形式最常见的是FILE类型。确保执行 Kerberos 认证的所有集群节点上都能访问到该凭据缓存生成方式credential cache 主要通过执行kinit命令生成与 keytab 的本质区别keytab 可以被生成成永不过期而 credential cache 有到期时间保持缓存最新完全是用户的责任。使用kinit运行安全 Flink 集群的步骤在客户端的 Flink 配置文件中添加安全相关配置选项使用kinit命令登录可选确保执行 Kerberos 认证的所有集群节点上都有可用的凭据缓存正常部署 Flink 集群。完整配置示例以下是一个基于 keytab 的flink-conf.yaml安全配置示例可直接用于 YARN 或原生 Kubernetes 提交客户端# Kerberos 凭据 security.kerberos.login.keytab: /path/to/user.keytab security.kerberos.login.principal: userEXAMPLE.COM # 将凭据提供给 ZooKeeper 和 Kafka security.kerberos.login.contexts: Client,KafkaClient # 使用 keytab 登录关闭 ticket cache 优先项避免歧义 security.kerberos.login.use-ticket-cache: false # krb5.conf 由 Flink 上传到容器/pod security.kerberos.krb5-conf.path: /etc/krb5.conf # 需要访问的附加安全文件系统可选 # security.kerberos.access.hadoopFileSystems: hdfs://namenode2:9002;hdfs://namenode3:9003对应地core-site.xml中需设置hadoop.security.authenticationkerberosHBase 场景下还需在hbase-site.xml中设置hbase.security.authenticationkerberos。更多细节Ticket 更新TGT 续期使用 Kerberos 的每个组件都独立负责续期Kerberos ticket-granting-ticketTGTHadoop、ZooKeeper、Kafka在提供 keytab 时都会自动续期 TGTDelegation token 场景下YARN 本身负责续期 token续期至其最大生命周期credential cache 场景下保持 TGT 有效是用户的责任需周期性执行kinit刷新缓存。值得一提的是即便 Hadoop/ZooKeeper/Kafka 各自有自动续期机制Flink 的 HadoopModule.java 仍额外启动了一个 TGT 续期线程池周期调用checkTGTAndReloginFromKeytab()该方法是幂等的TGT 无需续期时为空操作以此兜底 Hadoop 3.x 中可配置的自动续期行为确保 keytab 登录用户的 TGT 始终有效。附Delegation Token委托令牌支持作为 Kerberos 认证的延伸Flink 1.17 起以实验特性加入了 delegation token 支持这是一个重量级话题详情见 Delegation token 文档。在与 Hadoop 系服务通信时Flink 可以获取 delegation token使非本地进程也能完成认证支持范围包括HDFS 及其他 Hadoop 文件系统HBase。使用 Hadoop 文件系统如 HDFS 或 WebHDFS时Flink 可以为以下目录获取相应 tokenHadoop 默认文件系统security.kerberos.access.hadoopFileSystems中配置的文件系统YARN staging 目录。如果应用 classpath 中存在 HBase且 HBase 配置开启了 Kerberos 认证hbase.security.authenticationkerberosFlink 会获取 HBase token。Flink 还支持通过 Java Services 机制java.util.ServiceLoader扩展自定义 delegation token provider实现org.apache.flink.runtime.security.token.DelegationTokenProvider接口并在 jar 的META-INF/services目录中列出实现类全名即可被 Flink 加载参考 flink-runtime 中的 token 包结构。对应的开关配置为security.delegation.token.serviceName.enabled默认true可通过 SecurityOptions.forProvider 按服务名精细控制。小结Flink 的 Kerberos 安全体系以SecurityModule为骨架在进程启动时依次安装 Hadoop、JAAS、ZooKeeper 三个模块分别负责 Hadoop UGI 登录上下文、动态 JAAS 凭据注入与 ZooKeeper SASL 进程参数。生产部署时优先选择 keytab 方案以获得长期有效的凭据与自动 TGT 续期YARN 短生命周期集群可退而使用kinit的 credential cache需要向非本地进程授权时再叠加 delegation token 能力。三种部署模式的差异仅在于凭据与 krb5.conf 的分发方式——Standalone 需手工分发Kubernetes/YARN 由 Flink 自动拷贝。【免费下载链接】flink项目地址: https://gitcode.com/gh_mirrors/fli/flink创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考