配置Flink应用安全认证
场景说明
在安全集群环境下,各个组件之间的相互通信不能够简单地互通,而需要在通信之前进行相互认证,以确保通信的安全性。用户在提交Flink应用程序时,需要与Yarn、HDFS等之间进行通信。那么提交Flink的应用程序中需要设置安全认证,确保Flink程序能够正常运行。
当前Flink系统支持认证和加密传输,要使用认证和加密传输,用户需要安装Flink客户端并配置安全认证,本章节以“/opt/hadoopclient”为客户端安装目录为例,介绍安装客户端及配置安全认证。客户端安装目录请根据实际修改。
安装客户端及配置安全认证步骤
- 安装客户端。
以在集群内节点安装客户端为例:
- 登录Manager,在“集群”下拉列表中单击需要操作的集群名称,选择“更多 > 下载客户端”,弹出“下载集群客户端”信息提示框。
- 选择“完整客户端”,选择与待安装节点架构相匹配的平台类型,勾选“仅保存到如下路径”,单击“确定”开始生成客户端文件。
- 文件生成后默认保存在主管理节点“/tmp/FusionInsight-Client”。
- 客户端软件包名称格式为:“FusionInsight_Cluster_集群ID_Services_Client.tar”。本章节仅以集群ID为1进行介绍,请以实际集群ID为准。
- 以客户端安装用户登录将要安装客户端的服务器。
- 进入安装包所在目录,执行如下命令解压软件包。
tar -xvf FusionInsight_Cluster_1_Services_Client.tar
- 执行如下命令校验解压得到的文件,检查回显信息与sha256文件里面的内容是否一致,例如:
sha256sum -c FusionInsight_Cluster_1_Services_ClientConfig.tar.sha256
FusionInsight_Cluster_1_Services_ClientConfig.tar: OK
- 解压获取的安装文件。
- 进入安装包所在目录,执行如下命令安装客户端到指定目录(绝对路径),例如安装到“/opt/hadoopclient”目录。
cd /tmp/FusionInsight-Client/FusionInsight_Cluster_1_Services_ClientConfig
./install.sh /opt/hadoopclient
等待客户端安装完成(以下只显示部分屏显结果)。
The component client is installed successfully
- 以客户端安装用户,登录安装客户端的节点。
- 执行以下命令,切换到客户端安装目录。
cd /opt/hadoopclient
- 执行如下命令初始化环境变量。
source /opt/hadoopclient/bigdata_env
- 执行如下操作进行安全认证。
- 准备一个提交Flink作业的用户。
登录Manager,选择“系统 > 权限 > 角色”,单击“添加角色”,输入角色名称与描述。在“配置资源权限”的表格中选择“待操作集群的名称 > Flink”,勾选“FlinkServer管理操作权限”,单击“确定”,返回角色管理。
选择“系统 > 权限 > 用户”,单击“添加用户”,输入用户名、密码等,用户类型选择“人机”,用户组根据需求添加“hadoop”、“yarnviewgroup”和“hadooppmanager”,并添加“System_administrator”、“default”和创建的角色,单击“确定”完成Flink作业用户创建(首次创建的用户需使用该用户登录Manager修改密码)。
- 登录Manager,下载认证凭据。
登录集群的Manager界面,选择“系统 > 权限 > 用户”,在已增加用户所在行的“操作”列,选择“更多 > 下载认证凭据”。
图1 下载认证凭据
- 将下载的认证凭据压缩包解压缩,并将得到的文件复制到客户端节点中,例如客户端节点的“/opt/hadoopclient/Flink/flink/conf”目录下。如果是在集群外节点安装的客户端,需要将得到的文件复制到该节点的“/etc/”目录下。
- 将客户端安装节点的业务IP和Master节点IP添加到配置文件“/opt/hadoopclient/Flink/flink/conf/flink-conf.yaml”中的“jobmanager.web.access-control-allow-origin”和“jobmanager.web.allow-access-address”配置项中,IP地址之间使用英文逗号分隔。
jobmanager.web.access-control-allow-origin: xx.xx.xxx.xxx,xx.xx.xxx.xxx,xx.xx.xxx.xxx jobmanager.web.allow-access-address: xx.xx.xxx.xxx,xx.xx.xxx.xxx,xx.xx.xxx.xxx
- 配置安全认证,在“/opt/hadoopclient/Flink/flink/conf/flink-conf.yaml”配置文件中的对应配置添加keytab路径以及用户名。
security.kerberos.login.keytab: <user.keytab文件路径> security.kerberos.login.principal: <用户名>
例如:
security.kerberos.login.keytab: /opt/hadoopclient/Flink/flink/conf/user.keytab security.kerberos.login.principal: test
- 在Flink的客户端bin目录下,执行如下命令进行安全加固,并设置一个用于提交作业的密码。
cd /opt/hadoopclient/Flink/flink/bin
sh generate_keystore.sh
该脚本会自动替换“/opt/hadoopclient/Flink/flink/conf/flink-conf.yaml”中关于SSL的值。
执行认证和加密后会在Flink客户端的“conf”目录下生成“flink.keystore”和“flink.truststore”文件,并且在客户端配置文件“flink-conf.yaml”中将以下配置项进行了默认赋值:- 将配置项“security.ssl.keystore”设置为“flink.keystore”文件所在绝对路径。
- 将配置项“security.ssl.truststore”设置为“flink.truststore”文件所在的绝对路径。
- 将配置项“security.cookie”设置为“generate_keystore.sh”脚本自动生成的一串随机规则密码。
- 查看“flink-conf.yaml”中的参数“security.ssl.encrypt.enabled”值是否为“true”:
- security.ssl.encrypt.enabled: true
如果需要使用密文时,需将该值设置为“true”,且“generate_keystore.sh”脚本不会配置“security.ssl.key-password”、“security.ssl.keystore-password”和“security.ssl.truststore-password”的值,需要使用Manager明文加密API进行获取,执行curl -k -i -u username username:password -X POST -HContent-type:application/json -d '{"plainText":"password"}' 'https://x.x.x.x:28443/web/api/v2/tools/encrypt'
其中username、password分别为当前系统登录用户名和密码;"plainText"的password为调用“generate_keystore.sh”脚本时的密码;x.x.x.x为集群Manager的浮动IP。命令中如果携带认证密码信息可能存在安全风险,在执行命令前建议关闭系统的history命令记录功能,避免信息泄露。
- security.ssl.encrypt.enabled: false
“generate_keystore.sh”脚本将配置项“security.ssl.key-password”、“security.ssl.keystore-password”和“security.ssl.truststore-password”的值设置为调用“generate_keystore.sh”脚本时输入的密码。
- security.ssl.encrypt.enabled: true
- 配置客户端访问flink.keystore和flink.truststore文件的路径。
- 相对路径(推荐):
执行如下步骤配置flink.keystore和flink.truststore文件路径为相对路径,并确保Flink Client执行命令的目录可以直接访问该相对路径。
- 在“/opt/hadoopclient/Flink/flink/conf/”目录下新建目录,例如ssl。
cd /opt/hadoopclient/Flink/flink/conf/
mkdir ssl
- 移动flink.keystore和flink.truststore文件到“/opt/hadoopclient/Flink/flink/conf/ssl/”中。
mv flink.truststore ssl/
- 修改flink-conf.yaml文件中如下两个参数为相对路径。
security.ssl.keystore: ssl/flink.keystore security.ssl.truststore: ssl/flink.truststore
- 在“/opt/hadoopclient/Flink/flink/conf/”目录下新建目录,例如ssl。
- 绝对路径:
执行“generate_keystore.sh”脚本后,在flink-conf.yaml文件中将flink.keystore和flink.truststore文件路径自动配置为绝对路径“/opt/hadoopclient/Flink/flink/conf/”,此时需要将conf目录中的flink.keystore和flink.truststore文件分别放置在Flink Client以及Yarn各个节点的该绝对路径上。
- 相对路径(推荐):
- 准备一个提交Flink作业的用户。
- 运行作业(以WordCount作业为例)。
用户在Flink提交作业或者运行作业时,应具有如下权限:
- 如果启用Ranger鉴权,当前用户必须属于hadoop组或者已在Ranger中为该用户添加“/flink”的读写权限。
- 如果停用Ranger鉴权,当前用户必须属于hadoop组。
安全集群(开启Kerberos认证)根据flink.keystore和flink.truststore文件的路径分如下两种方式提交作业:- flink.keystore和flink.truststore文件路径为相对路径时:
- 在“ssl”的同级目录下执行如下命令启动session,并在session中提交作业。
其中“ssl”是相对路径,如“ssl”所在目录是“opt/hadoopclient/Flink/flink/conf/”,则在“opt/hadoopclient/Flink/flink/conf/”目录下执行命令。
cd /opt/hadoopclient/Flink/flink/conf
yarn-session.sh -t ssl/ -nm "session-name" -d
flink run /opt/hadoopclient/Flink/flink/examples/streaming/WordCount.jar
- 执行如下命令在Yarn上提交单个作业。
cd /opt/hadoopclient/Flink/flink/conf
flink run -m yarn-cluster -yt ssl/ /opt/hadoopclient/Flink/flink/examples/streaming/WordCount.jar
- 在“ssl”的同级目录下执行如下命令启动session,并在session中提交作业。
- flink.keystore和flink.truststore文件路径为绝对路径时: