GithubHelp home page GithubHelp logo

k8s-jumpserver's Introduction

开源K8S跳板机 - 轻松接入现有发布系统

架构

架构

关键组件

  • xtermjs+websocket实现web终端效果
  • asciinema存储格式与录像回放
test/index.html提供了xtermjs示例。
test/player.html提供了asciinema示例。

关键原理

  • xtermjs:
    • 上行数据:窗口resize,键盘input。
    • 下行数据:SSH服务端数据流。
  • asciinema:
    • 录像写入:将SSH下行单向流量写入文件(用户输入其实也是SSH服务端回显的)。

接口定义

/ssh?ssh_token=:长连接websocket
/records/play?filename=:下载录像

启动方法

go run app.go -jumpserver ./jumpserver.toml

对接到发布系统

根据架构图示意,大家需要自定义几个hook点。

bizes/platform/api.go:

type TokenAuthData struct {
	Namespace string `json:"namespace"`	// 登录POD的ns
	ClusterCfg string `json:"cluster_cfg"`	// 登录K8S集群的yaml
	PodName string `json:"pod_name"`		// 登录POD的name
	ContainerName string `json:"container_name"`		// 登录POD中的哪个container

	// 其他字段自行扩展
}

func ValidateSSHToken(ctx context.Context, sshToken string) (tokenAuthData *TokenAuthData, err error) {
	// TODO: 在这里调用自建发布系统,完成身份校验,返回TokenAuthData 。 (可以自行扩展TokenAuthData字段,后续可以记录到数据库)
	return
}

ssh_token由发布系统生成,用户携带ssh token前来登录,需要回调发布系统进行身份校验,关键信息索取。


bizes/k8s/stream.go:

func (handler *websocketProxy) onLogin() {
	// TODO:根据sessionID,tokenAuthData,recordFilename信息,生成一条ssh会话记录到数据库
}

func (handler *websocketProxy) onLogout() {
	// TODO:在这里更新ssh会话的登出时间字段
}

为了可以在发布系统中进行审计和录像回放,应将本次用户的ssh会话详细信息记入数据库,相关信息可以从handler对象中索取。

这里可以选择回调发布平台进入存储,或者直接存入数据库。

生产部署

通过systemd拉起:

[Unit]
# 服务描述
Description=jumpserver
# 要求必须执行网络
Requires=network-online.target
# 在网络启动之后启动
After=network-online.target

[Service]
# 简单服务
Type=simple
# 运行用户与用户组
User=root
Group=root
# 进程退出立即重启
Restart=always
# 进程工作目录
WorkingDirectory=/path/to/jumpserver
# 执行命令
ExecStart=/path/to/jumpserver/jumpserver -jumpserver /path/to/jumpserver/jumpserver/jumpserver.toml

[Install]
# 在系统启动后加载UNIT
WantedBy=multi-user.target

通过发布平台的nginx统一接入:

map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}
server {
        ....
        location /jumpserver/{
                proxy_pass http://jumpserver部署IP:7000/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
        }
}

此时URL将变为:

/jumpserver/ssh?ssh_token=:长连接websocket
/jumpserver/records/play?filename=:下载录像

k8s-jumpserver's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.