Apache DolphinScheduler 需要的sudo,还可以这么玩,长见识了!
Apache DolphinScheduler(incubator)需要的sudo,还可以这么玩,长见识了!
在新一代大数据任务调度 - Apache DolphinScheduler(以下简称dolphin) 官网中部署安装需要对部署OS用户配置sudo且免密
echo 'dolphinscheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL' >> /etc/sudoers
看到这的时候,你是否也对此处产生一点疑问?dolphin部署OS用户需配置可免密操作所有用户的权限?dolphin部署OS用户需拥有和root一样的权限?dolphin部署OS用户使用root权限操作什么?...
DolphinScheduler简介
Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用,目前已累计有 400+ 公司在生产上使用。
特点
高可靠性
去中心化的多Master和多Worker, 自身支持HA功能, 采用任务队列来避免过载,不会造成机器卡死;
简单易用
DAG监控界面,所有流程定义都是可视化,通过拖拽任务定制DAG,通过API方式与第三方系统对接, 一键部署;
丰富的使用场景
支持暂停恢复操作. 支持多租户,更好的应对大数据的使用场景. 支持更多的任务类型,如 spark, hive, mr, python, sub_process, shell;
高扩展性
支持自定义任务类型,调度器使用分布式调度,调度能力随集群线性增长,Master和Worker支持动态上下线;
主要能力
Task以DAG形式关联,实时监控任务的状态;
支持Shell、MR、Spark、SQL、依赖等10多种任务类型;
工作流优先级、任务优先级,全局参数及局部自定义参数;
工作流可定时、依赖、手动、暂停/停止/恢复;
支持补数、多租户、日志在线查看及资源在线管理;
完善的系统服务监控,任务超时告警/失败;
去中心化设计确保系统的稳定、高可用;
支持每日十万数据量级任务稳定运行;
我非常看好dolphin,但在实施中遇到公司要求不允许开通root权限,那还怎么搞下去?
如果能想怎么玩就怎么玩的大佬请忽略此文章,跪求带带小弟,我会喊666~
问题场景
说一个我在公司遇到的场景,基础设施运营和应用组件归属不同团队,运营团队要求应用层不允许拥有root权限,但dolphin使用需要配置sudo且免密,从官网配置要求看,此时的dolphin部署OS用户是和root账号一样拥有整个系统的最高权限。在运营安全角度来看,很危险。但你还想要玩,运营给了两条路,1.向上级领导审批,特事特办;2.申请机器,独自运营;哪条路都不好走,只能另寻出路。
调度选的好,下班回家早;调度选的对,半夜安心睡;选择dolphin,干就完了。
dolphin引用sudo用途
sudo描述
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,sudo的权限控制可以在/etc/sudoers文件中查看到。
dolphin配置sudo且免密做什么?
官网解释:以 sudo -u {linux-user} 切换不同linux用户的方式来实现多租户运行作业,所以部署用户需要有 sudo 权限,而且是免密的。
源码分析
dolphin使用sudo工具干了哪些事情
一键部署/执行任务脚本类命令/kill命令
解决方案
自己冥思苦想几种方案,效果都不理想
1.将dolphin部署OS用户配置可以向大数据集群所有租户下提交作业,通过指定队列来区分。缺点:dolphin部署OS用户在大数据集群权限非常大,对不同租户下的作业都有操作权限。
2.修改dolphin源码,移除sudo命令,在每个OS用户下安装一个worker节点,通过worker分组来实现多租户提交作业。缺点:worker节点过多,占有大量系统资源。
这个问题跟sudo配置有关,还得从sudo方面下手,发现sudo在配置的时候可以指定只允许部分OS用户账号。这样dolphin部署OS用户账号只有指定部分OS用户账号的操作权限,完全满足dolphin 使用sudo -u {linux-user}命令来解决实现多租户运行作业问题,也满足dolphin部署OS用户的权限只有普通用户权限和可以操作指定OS用户权限。
开搞
sudo的权限控制在文件/etc/sudoers内配置
root ALL=(ALL:ALL) ALL%wheel ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
对/etc/sudoers文件进行编辑的代码公式可以概括为:
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
解释
'授权用户/组':
以%号开头的表示"将要授权的组";
不以%号开头的表示"将要授权的用户";
'主机':允许登录的主机,
ALL表示所有;
如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令.
'[(切换到哪些用户或组)]':
为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组);
为(),代表省略, 相当于(root:root),表示可以通过sudo提权到root;
'[是否需要输入密码验证] ':
为NOPASSWD: 代表执行sudo时可以不需要输入密码
'命令1,命令2,...':
多个命令使用逗号分隔,这些命令是授权给用户的操作; 命令都是使用绝对路径,避免目录下同名命令情况;
ALL表示允许所有操作
[ ]中的内容, 都能省略
按照上文修改如下
echo 'dolphinscheduler ALL=(userA,userB,userC) NOPASSWD: NOPASSWD: ALL' >> /etc/sudoers
其中userA,userB,userC代表是linux OS用户,用于多租户向大数据集群提交作业。
后面有新增租户,提交运营申请dolphin worker节点所在机器新增sudo配置权限控制,也实现了机器OS用户使用权限控制。
注:我是按用户userA,userB,userC去申请sudo控制权限,此处使用用户组去申请sudo控制权限是不是会更好,有待其他小伙伴去探索。
解决了sudo问题,dolphin完全可以使用普通OS用户普通权限运行。
你是否有更好的想法,欢迎留言讨论!
您知道么?
为什么要参与开源?
这里汇总了以下对个人来说比较重要的几点:
参与开源的方式?
参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括文档、翻译、答疑、测试、代码、会议分享等,此外也极其欢迎各种实践文章,DolphinScheduler开源社区非常期待您的参与。
贡献第一个PR(文档、代码) 我们也希望是简单的,用第 1 个 PR 来熟悉社区的流程和友好度,也判断一下这是不是我想参与贡献的社区呐
文档github地址:https://github.com/apache/incubator-dolphinscheduler-website
当然如果您酷爱coding,社区也是非常欢迎“show me the code"的。
戳原文,立刻奔向
DolphinScheduler 的 github 仓库一起玩耍,来个 star 先收藏也是好的