在Dataphin中, 经常遇到需要连接外部服务来实现一些特定的功能, 如连接外部FTP检测FTP服务的连通性. 实现此类功能, 一般是使用shell或者Python代码任务. 由于外部服务大多都有访问鉴权, 就需要在shell/Python代码中向服务端发送账号密码(密钥). 本文将说明在shell/Python代码中如何安全的使用账号密码. 主要有两种方法:
- 离线代码模板+加密参数
- 账号密码类型全局变量
离线代码模板+加密参数
使用流程
- 点击导航菜单"计算模板", 点击新建"离线计算模板", 名称为 templ, 节点类型为 shell
- 输入模板代码, 代码中的 账号, 密码 使用变量代替 (使用 @@{变量名} 的方式自由定义模板参数变量). 打开"模板信息", 在"参数配置"中, 开启 账号, 密码 两个模板参数的加密选项.
- 点击工具栏"调试", 调试代码模板. 日志中如果有打印输出加密的参数变量, 将被替换为 "******". 调试后, 提交.
- 在"计算任务"中, 新建 shell 任务, 选择代码模板 templ, 即可新建一个 templ 模板的任务实例. 离线代码模板的任务实例是只读模式, 不可编辑修改代码, 可以重新设置模板参数值 (覆盖模板默认参数值).
安全性解析
使用离线代码模板, 账号密码的安全保障措施有:
- 模板参数加密后, 查看模板时, 账号密码展示为非明文样式. 关闭加密时, 参数值将清空, 而不是将参数值转为明文显示.
- 向运行日志打印加密参数时, 最终输出将做脱敏处理.
- 只有超级管理员可以创建和编辑离线代码模板, 普通开发者不可修改离线代码模板的代码, 杜绝以其他方式(如: 写入文件, 发送给外部网络)获取加密参数的取值.
- 模板任务实例为只读, 其他用户无法通过任务实例获取加密参数的取值.
适用场景
离线代码模板+加密参数 的适用场景如下:
- 多个任务, 处理逻辑类似, 可以通过设置参数, 传入不同的参数值来实现不同的目标.
- 处理逻辑包含连接外部服务, 需要通过账号密码来鉴权
比如, 检测一个ftp服务器上的多个文件是否已经准备好. 可以将检测的逻辑(包含通过账号密码连接ftp)放入离线代码模板, 将需要检测的目标文件名设置为模板参数(明文, 不加密). 为每一个需要检测的文件创建一个引用该模板任务实例, 设置文件名参数的取值为 真实文件名.
账号密码全局变量
使用流程
- 在"规划->公共定义->全局变量" 中, 点击"新建全局变量"
- 变量类型选择"账号密码"
- 默认开启 "权限管控", 开启后引用改变量之前, 需要提前申请权限
- 默认开启"代码审核", 引用改变量的代码, 每次提交时, 均需要指定的代码审核人来做审核, 审核通过后才能成功提交.
- 账号密码全局变量创建后, 查看其取值时, 取值展示为 "********"
- 引用账号密码全局变量, 在任务参数列表中, 参数值展示为 "******". 点击"运行", 系统不自动填充运行值, 防止用户编写代码获取变量取值.
- 提交时, 需要指定的审核人来审核代码内容, 确认代码中没有任何不安全的使用方式.
安全性解析
使用账号密码全局变量的安全保障措施有:
- 查看或编辑账号密码全局变量, 变量值展示为密文
- 引用账号密码全局变量需要申请使用权限, 可以预防不正当的使用.
- 引用了账号密码全局变量的代码, 每次提交都需要走一遍代码审核, 审核人会查看代码, 确认代码中是否有账号密码泄露风险.
适用场景
账号密码变量适用于以下场景
- 需要使用账号密码连接外部服务, 有多个任务, 但每一个的处理逻辑不尽相同, 需要集中维护账号密码.
总结
可以根据场景, 自由选择以上两种方式来解决账号密码的安全使用问题. Dataphin也会继续探索和提供更多的方式来解决此类问题.