• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Funny-JMS: [WIP] A distributed and safer Jump-Server based on Raft

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

Funny-JMS

开源软件地址:

https://gitee.com/kt10/funny-jms

开源软件介绍:

Funny-JMS

欢迎关注本人新项目 "TTstack".

Ultimate jms(jump server) written in C and raft.

亮点

  • 业务流程:

    • 以DevGroup(开发组)为基本单位进行授权管理,免去了繁杂的单台申请流程;
    • 使用投票制管理DevGroup成员变动,即:加入或删除成员时,只需要半数以上成员投票通过,而不必每次通过超管审批授权,实现了DevGroup团队内部的“灵活自管理”;
  • 可用性:

    • 中枢系统采用基于raft算法开发的分布式架构,避免了单点故障,提供高可用服务;
  • 性能:

    • 分布式多节点,可承载更多的客户端连接,提供更强、更流畅的服务能力;
    • zj服务端采用单进程直接跳转模式,较之现存的跳板机,每个连接节省一个进程的开销;
    • 已获授权的DevGroup及主机信息,缓存于客户端本地,而非每次无谓的访问服务端,客户端体验得到提升;
  • 功能:

    • zj服务端采用的单进程直接跳转模式,是原子性的,由此杜绝了过往常见的多进程不协调导致的花屏、终端尺寸失灵、僵死进程残留等影响体验及性能的问题;
    • 客户端与最终服务器之间,可进行方便的双向文件传输;
    • 支持高效的批量管理功能(类似于ansible功能);
  • 安全性:

    • 传统的跳板机必须允许用户在服务端停留,以选择要登陆的主机,且此服务器通常拥有最高权限连通大量的最终服务器,由此埋下了巨大的安全隐患,一旦此中心服务器被攻破,即意味着大量最终服务器的完全沦陷;
    • zj服务端采用的单进程直接跳转模式,提供了更强的安全保障,因为提供跳转连接功能的节点,本身无须拥有连接任何最终服务器的权限,而且由于客户端是在本地选择待连接的目标机,因此跳转节点完全不需要提供客户端中途停留的机会;
  • 开发稳健性:

    • 测试代码量 > N * 正文代码量;
    • 极少的依赖,极简的代码(Less code, More security!)。

宏观架构图

  • register 服务于所有从前端页面上发起的请求
  • raft 服务于所有 SSH 终端的登陆请求

前端模块设计示例

TODO

  • 完善审计功能

API wiki

字段定义:

方向名称类型备注
req-->paramsany
<--respresultany仅在成功时存在
<--resperrorany仅在出错时存在
<-->unamestringuser name
<-->gnamestringgroup name
<-->hnamestringhost name
<-->ridintrpc ID
<-->uidintuser ID
<-->xuidintuser(initiator) ID
<-->gidintgroup ID
<-->hidinthost ID
<-->vidstringvendor ID
<-->aidstringasset ID
<-->tidinttransaction ID
<-->ttypestring"user-add"/"user-del"/"host-add"/"host-del"
<-->pidintpage ID
<-->psizintpage siz(how many items per page)

{1.1} 创建用户

http://[ADDR]/v1/user/create
系统协同接口,与其它系统同步账号数据:批量添加用户元信息

req-->[    {"params": {"uname": "张三"}, "rid": 1},    {"params": {"uname": "李四"}, "rid": 2},    {"params": {"uname": "王五"}, "rid": 3}]<--resp[    {"result": {"uid": 1}, "rid": 1},    {"result": {"uid": 2}, "rid": 2},    {"error": {"code": 1000, "message": "user exists", "data": {"uid": 9}}, "rid": 3}]

{1.2} 删除用户

http://[ADDR]/v1/user/destroy
系统协同接口,与其它系统同步账号数据:批量清理用户元信息、开发组关联、公钥等

req-->[    {"params": {"uid": 1}, "rid": 1},    {"params": {"uid": 2}, "rid": 2},    {"params": {"uid": 9}, "rid": 3}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2},    {"result": "", "rid": 3}]

{1.3} 更新(添加或替换)用户公钥

http://[ADDR]/v1/user/pubkey/update
用户 SSH 连接凭证,会覆盖已有信息

req-->[    {"params": {"xuid": 1, "pubkey": "..."}, "rid": 1},    {"params": {"xuid": 2, "pubkey": "..."}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{1.4} 查看用户已加入的开发组列表及下属主机列表

http://[ADDR]/v1/user/groups_and_hosts

req-->{"params": {"xuid": 1}, "rid": 1}<--resp{    "result": [        {            "gid": 1,            "gname": "dev-01",            "hosts": [                {"addr": "4.4.4.4", "hname": "dns"},                {"addr": "6.6.6.6", "hname": "dns"}            ]        },        {            "gid": 2,            "gname": "dev-02",            "hosts": [                {"addr": "8.8.8.8", "hname": "dns"}            ]        }    ],    "rid": 1}

{1.5} 申请加入开发组

http://[ADDR]/v1/user/group/join
半数以上成员投票赞成且无否决票,或超管审批;空开发组直接通过,无需审批

req-->[    {"params": {"xuid": 1, "gid": 1}, "rid": 1},    {"params": {"xuid": 2, "gid": 1}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{1.6} 退出开发组

http://[ADDR]/v1/user/group/quit
即时生效;用户对主机的引用计数为0时,该主机上的用户公钥将被清除;成员数为0的开发组,将被自动删除

req-->[    {"params": {"xuid": 1, "gid": 1}, "rid": 1},    {"params": {"xuid": 1, "gid": 2}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{2.1} 新建开发组

http://[ADDR]/v1/group/create
不允许与现有开发组重名

req-->[    {"params": {"xuid": 1, "gname": "dev-01"}, "rid": 1},    {"params": {"xuid": 1, "gname": "dev-02"}, "rid": 2}]<--resp[    {"result": {"gid": 1}, "rid": 1},    {"error": {"code": 2000, "message": "group exists", "data": {"gid": 9}}, "rid": 2}]

{2.2} 删除开发组成员

http://[ADDR]/v1/group/member/del
半数以上成员投票赞成且无否决票,或超管审批;用户对主机的引用计数为0时,该主机上的用户公钥将被清除

req-->[    {"params": {"xuid": 1, "gid": 1, "uid": 1}, "rid": 1},    {"params": {"xuid": 1, "gid": 1, "uid": 2}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{2.4} 添加主机到指定开发组

http://[ADDR]/v1/group/host/add
所有拥有此台主机的开发组(批量操作会自动分割为多个单台主机的投票请求)的半数以上成员投票且无否决票,或超管审批

req-->[    {"params": {"xuid": 1, "gid": 1, "hid": 1}, "rid": 1},    {"params": {"xuid": 1, "gid": 1, "hid": 2}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{2.5} 从指定开发组中删除主机

http://[ADDR]/v1/group/host/del
所有拥有此台主机的开发组(批量操作会自动分割为多个单台主机的投票请求)的半数以上成员投票赞成且无否决票,或超管审批

req-->[    {"params": {"xuid": 1, "gid": 1, "hid": 1}, "rid": 1},    {"params": {"xuid": 1, "gid": 1, "hid": 2}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{2.6} 查看所有开发组列表

http://[ADDR]/v1/group/all
从中选择待加入的开发组

req-->{"params": {"pid": 1, "psiz": 20}, "rid": 1}<--resp{    "result": {        "totalcnt": 100,        "data": [            {"gid": 1, "gname": "dev-01"},            {"gid": 2, "gname": "dev-02"}        ]    },    "rid": 1}

{2.7} 查看指定开发组的元信息

http://[ADDR]/v1/group/info
成员列表、主机列表等

req-->{"params": {"gid": 1}, "rid": 1}<--resp{    "result": {        "people": [            {"uid": 1, "uname": "张三"},            {"uid": 2, "uname": "李四"}        ],        "hosts": [            {"hid": 1, "addr": "8.8.8.8", "nettype": "classic", "hname": "dns"},            {"hid": 2, "addr": "6.6.6.6", "nettype": "idc", "hname": "dns"}        ]    },    "rid": 1}

{3.1} 查看所有主机列表

http://[ADDR]/v1/host/all
资产所属平台、资产ID、主机ID、主机名称、网络地址、网络类型、开发组列表等

req-->{"params": {"pid": 1, "psiz": 20}, "rid": 1}<--resp{    "result": {        "totalcnt": 100,        "data": [            {                "vid": "aliyun",                "aid": "ecs-123",                "hid": 1,                "hname": "dns",                "addr": "8.8.8.8",                "nettype": "idc",                "gids": [                    {"gid": 1, "gname", "dev-01"},                    {"gid": 2, "gname": "dev-02"}                ]            },            {                "vid": "huawei",                "aid": "xxx-123",                "hid": 2,                "hname": "dns",                "addr": "6.6.6.6",                "nettype": "classic",                "gids": [                    {"gid": 2, "gname": "dev-02"}                ]            }        ]    },    "rid": 1}

{4.1} 查看所有待处理的投票事务列表及详情

http://[ADDR]/v1/trans/active
事务ID、事务类别、关联组的名称、发起时间、发起人、操作目标、额外信息

req-->{"params": {"xuid": 1, "pid": 1, "psiz": 20}, "rid": 1}<--resp{    "result": {        "totalcnt": 100,        "data": [            {                "tid": 1,                "ttype": "user-add",                "gname": "dev-01",                "timestamp": 1530000000,                "initiator": "张三",                "target": "张三",                "info": "新同事"            },            {                "tid": 2,                "ttype": "user-del",                "gname": "dev-01",                "timestamp": 1540000000,                "initiator": "李四",                "target": "张三",                "info": "张三已离职"            },            {                "tid": 3,                "ttype": "host-add",                "gname": "dev-01",                "timestamp": 1550000000,                "initiator": "李四",                "target": "8.8.8.8",                "info": ""            },            {                "tid": 4,                "ttype": "host-del",                "gname": "dev-01",                "timestamp": 1560000000,                "initiator": "李四",                "target": "8.8.8.8",                "info": ""            }        ]    },    "rid": 1}

{4.2} 投票赞成

http://[ADDR]/v1/trans/agree
不可撤销

req-->[    {"params": {"xuid": 1, "tid": 1}, "rid": 1},    {"params": {"xuid": 1, "tid": 2}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{4.3} 投票否决

http://[ADDR]/v1/trans/reject
不可撤销

req-->[    {"params": {"xuid": 1, "tid": 1}, "rid": 1},    {"params": {"xuid": 1, "tid": 2}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

{4.4} 忽略事务

http://[ADDR]/v1/trans/ignore
不可撤销

req-->[    {"params": {"xuid": 1, "tid": 1}, "rid": 1},    {"params": {"xuid": 1, "tid": 2}, "rid": 2}]<--resp[    {"result": "", "rid": 1},    {"result": "", "rid": 2}]

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
jfinal-activemq: jfinal的activemq插件发布时间:2022-03-25
下一篇:
distributed-lock-project: 基于zookeeper实现的分布式锁发布时间:2022-03-25
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap