JumpServer 开源堡垒机部署(源码)


目录

    • 前言
    • 一、规划
      • 1.1 服务器
      • 1.2 组件版本
      • 1.3 随机 Key/Token
    • 二、架构
    • 三、部署
      • 3.1 MySQL
      • 3.2 Redis
      • 3.3 Core
      • 3.4 Lina
      • 3.5 Luna
      • 3.6 KoKo
      • 3.7 Lion
      • 3.8 Nginx
    • 四、验证
    • 五、FAQ
      • 5.1 Python 依赖报错
      • 5.2 数据库权限问题
      • 5.3 nodejs 版本问题
      • 5.4 Luna 构建问题
      • 5.5 go 编译问题
      • 5.6 组件下载问题
    • 总结

前言

JumpServer 是全球首款开源的堡垒机,使用 GNU GPL v2.0 开源协议,是符合 4A 规范的运维安全审计系统。JumpServer 使用 Python 开发,遵循 Web 2.0 规范,配备了业界领先的 Web Terminal 方案,交互界面美观、用户体验好。JumpServer 采纳分布式架构,支持多机房跨区域部署,支持横向扩展,无资产数量及并发限制。

特色优势:

  • 开源: 零门槛,线上快速获取和安装;
  • 分布式: 轻松支持大规模并发访问;
  • 无插件: 仅需浏览器,极致的 Web Terminal 使用体验;
  • 多云支持: 一套系统,同时管理不同云上面的资产;
  • 云端存储: 审计录像云端存储,永不丢失;
  • 多租户: 一套系统,多个子公司和部门同时使用;
  • 多应用支持: 数据库,Windows远程应用,Kubernetes。

一、规划

1.1 服务器

本次为简单的安装部署,为了快速部署,就用一台服务器进行演示即可。

OS kernel 备注
CentOS 7.6(106.52.187.250/172.16.0.16) 3.10 堡垒机(统一资源管理平台)

1.2 组件版本

本次安装版本,参照:https://docs.jumpserver.org/zh/master/dev/build/ 进行安装

组件 版本 备注
MySQL 5.7 数据存储 >=5.7
Redis 6.0 数据缓存 >=5.0
Core 2.14.2 JumpServer 的核心组件,由 Django 二次开发而来,内置了 Lion Celery Beat Flower Daphne 服务
Lina 2.14.2 JumpServer 的前端 UI 项目,主要使用 Vue,Element UI 完成
Luna 2.14.2 JumpServer 的前端 UI 项目,主要使用 Angular CLI 完成
KoKo 2.14.2 Koko 是 Go 版本的 coco,重构了 coco 的 SSH/SFTP 服务和 Web Terminal 服务
Lion 2.14.2 实现 RDP/VNC 协议跳板机功能
Nginx 1.18 代理(转发)
Nodejs 12.14.0 对于 Luna,其他版本可能会存在问题(在 install 时)。或者使用14.15.0版本
Go 1.15 KoKo 编译

1.3 随机 Key/Token

统一使用以下 Key、Token

- 随机生成 备注
Key c7Z4OrTAEtj1AEGrHSIYfoTSgP5OAKTmPa2DjOOUHEtsB6un 加密秘钥,生产环境中请修改为随机字符串
Token GkzXTzSCTTDYikXHgT6l1PeC 预共享Token,koko 和 lion 用来注册服务账号

可使用命令来随机生成:

cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 48    # 变更长度修改 -c 参数后的数值即可

二、架构

JumpServer 开源堡垒机部署(源码)_第1张图片

三、部署

  1. 大家可以采用源码部署方式进行部署,增加一下对 Linux 操作系统的熟练度。
  2. 当然也可以通过容器部署。

3.1 MySQL

1、执行安装脚本

bash ./mysql_5.7_install.sh

# 使用默认端口:3306
# 需要安装脚本的可私我

如何修改 mysql root 用户的初始密码?

方法1:
mysql> use mysql;
mysql> update user set password=password('新密码') where user='root' and host='localhost';
mysql> flush privileges;

方法2:
mysql> set password for 用户名@localhost = password('新密码');

方法3:
mysqladmin -u用户名 -p旧密码 password 新密码

2、创建数据库

create database jumpserver default charset utf8 collate utf8_general_ci;

3、授权数据库用户权限

grant select,insert,update,delete on jumpserver.* to 'jumpserver'@'172.16.%' identified by "ZhuRS@123!";
flush privileges;

权限问题请看 FAQ 说明

3.2 Redis

执行安装脚本

bash ./redis_6.0_install.sh

# 使用默认端口:6379
# 需要安装脚本的可私我

3.3 Core

1、资源下载

mkdir /opt/jumpserver-v2.14.2
wget -O /opt/jumpserver-v2.14.2.tar.gz https://github.com/jumpserver/jumpserver/releases/download/v2.14.2/jumpserver-v2.14.2.tar.gz

2、解压

cd /opt
tar -xf jumpserver-v2.14.2.tar.gz -C /opt/jumpserver-v2.14.2 --strip-components 1

3、安装 Python36

yum install -y epel* openldap-devel gcc-c++ mysql-devel make sshpass
yum install -y python36 python36-devel

4、安装 Python 依赖

python3 -m venv /opt/py3
source /opt/py3/bin/activate  # 每次运行项目都需要先执行 source /opt/py3/bin/activate 载入此环境
cd /opt/jumpserver-v2.14.2
pip install --upgrade pip     # 升级一下pip版本,否则可能会报错
pip install -r requirements/requirements.txt   # 开始安装依赖

5、修改 jumpserver 配置文件

cd /opt/jumpserver-v2.14.2
cp config_example.yml config.yml
vim config.yml
grep -Ev "^$|^[#;]" config.yml

SECRET_KEY: c7Z4OrTAEtj1AEGrHSIYfoTSgP5OAKTmPa2DjOOUHEtsB6un
BOOTSTRAP_TOKEN: GkzXTzSCTTDYikXHgT6l1PeC
DEBUG: true
LOG_LEVEL: DEBUG
SESSION_EXPIRE_AT_BROWSER_CLOSE: true
DB_ENGINE: mysql
DB_HOST: 172.16.0.16
DB_PORT: 3306
DB_USER: jumpserver
DB_PASSWORD: ZhuRS@123!
DB_NAME: jumpserver
HTTP_BIND_HOST: 0.0.0.0
HTTP_LISTEN_PORT: 8080
WS_LISTEN_PORT: 8070
REDIS_HOST: 172.16.0.16
REDIS_PORT: 6379
REDIS_PASSWORD: kbZnQByQ8tyT9l1K9R3x

其实到这里已经可以看到 jumpserver 登录界面了

尝试访问:http://106.52.187.250:8080/

默认账户:admin

默认密码:admin

新密码:Scedu@123

JumpServer 开源堡垒机部署(源码)_第2张图片

只不过是进不去 Web UI 界面的,因为我们还没配置 nginx

在这里插入图片描述

3.4 Lina

1、下载资源

mkdir /opt/lina-v2.14.2
wget -O /opt/lina-v2.14.2.tar.gz https://github.com/jumpserver/lina/releases/download/v2.14.2/lina-v2.14.2.tar.gz

2、解压

cd /opt
tar -xf lina-v2.14.2.tar.gz -C /opt/lina-v2.14.2 --strip-components 1

3、安装 nodejs

cd /opt
wget https://nodejs.org/dist/v14.18.0/node-v14.18.0-linux-x64.tar.xz
tar xf node-v14.18.0-linux-x64.tar.xz -C /usr/local/
cd /usr/local/ && mv node-v14.18.0-linux-x64/ nodejs

vim /etc/profile.d/node.sh
export NODE_HOME=/usr/local/nodejs
export PATH=$NODE_HOME/bin:$PATH

source /etc/profile.d/node.sh

ln -s /usr/local/nodejs/bin/npm  /usr/local/bin/npm
ln -s /usr/local/nodejs/bin/node  /usr/local/bin/node

4、安装依赖

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass
npm config set registry https://registry.npm.taobao.org
npm install -g yarn
yarn config set registry https://registry.npm.taobao.org
npm install -g yarn
yarn install

5、修改配置文件

vim .env.development

ENV = 'development'

# base api
VUE_APP_BASE_API = ''
VUE_APP_PUBLIC_PATH = '/ui/'
VUE_CLI_BABEL_TRANSPILE_MODULES = true

# External auth
VUE_APP_LOGIN_PATH = '/core/auth/login/'
VUE_APP_LOGOUT_PATH = '/core/auth/logout/'

# Dev server for core proxy
VUE_APP_CORE_HOST = 'http://172.16.0.16:8080'  # 修改成 Core 的 url 地址
VUE_APP_CORE_WS = 'ws://172.16.0.16:8070'
VUE_APP_ENV = 'development'

6、运行 Lina

cd /opt/lina-v2.14.2
yarn serve

7、构建 Lina

cd /opt/lina-v2.14.2
yarn build:prod

# 构建完成后在当前目录生成 lina 构建包,可移植至 nginx

3.5 Luna

1、下载资源

mkdir /opt/luna-v2.14.2
wget -O /opt/luna-v2.14.2.tar.gz https://github.com/jumpserver/luna/releases/download/v2.14.2/luna-v2.14.2.tar.gz

2、解压

cd /opt
tar -xf luna-v2.14.2.tar.gz -C /opt/luna-v2.14.2 --strip-components 1

3、安装 nodejs

  1. 上面已经安装
  2. 不过对于 Luna 来说 nodejs 10.24.1 版本较低,其他高版本在 npm install 时又会卡住不动,尝试了几个版本,最终 12.14.0、14.15.0 可用,其他版本大家也可以尝试一下。
  3. FAQ 有说明

4、安装依赖

npm install
npm install --dev
npm rebuild node-sass

5、修改配置文件

vim proxy.conf.json

{
  "/koko": {
    "target": "http://172.16.0.16:5000",  # KoKo 地址
    "secure": false,
    "ws": true
  },
  "/media/": {
    "target": "http://172.16.0.16:8080",  # Core 地址
    "secure": false,
    "changeOrigin": true
  },
  "/api/": {
    "target": "http://172.16.0.16:8080",  # Core 地址
    "secure": false,                    # https ssl 需要开启
    "changeOrigin": true
  },
  "/core": {
    "target": "http://172.16.0.16:8080",  # Core 地址
    "secure": false,
    "changeOrigin": true
  },
  "/static": {
    "target": "http://172.16.0.16:8080",  # Core 地址
    "secure": false,
    "changeOrigin": true
  },
  "/lion": {
    "target": "http://172.16.0.16:9529",  # Lion 地址
    "secure": false,
    "pathRewrite": {
      "^/lion/monitor": "/monitor"
    },
    "ws": true,
    "changeOrigin": true
  },
  "/omnidb": {
    "target": "http://172.16.0.16:8082",
    "secure": false,
    "ws": true,
    "changeOrigin": true
  }
}

6、安装 ng

npm install -g @angular/cli

7、运行 Luna

ng serve
  1. 这里可能会提示你的 nodejs 版本过低,会给出对应的 node 版本,根据对应的版本再次安装 node,最后再重新启动即可。
  2. 或者可能报 Error from chokidar… 错误
  3. FAQ 有说明

8、构建 Luna

ng build

# 构建完成后在当前目录生成 dist 构建包,可移植至 nginx

3.6 KoKo

1、下载资源

mkdir /opt/koko-v2.14.2
wget -O /opt/koko-v2.14.2.tar.gz https://github.com/jumpserver/koko/archive/refs/tags/v2.14.2.tar.gz

2、解压

cd /opt
tar -xf koko-v2.14.2.tar.gz -C /opt/koko-v2.14.2 --strip-components 1

3、安装 go

wget https://golang.google.cn/dl/go1.15.linux-amd64.tar.gz
tar -xf go1.15.linux-amd64.tar.gz -C /usr/local/
chown -R root:root /usr/local/go
export PATH=/usr/local/go/bin:$PATH
echo 'export PATH=/usr/local/go/bin:$PATH' >> ~/.bashrc

4、编译

cd /opt/koko-v2.14.2
make

# 会在当前目录生成 build 目录

5、修改配置文件

cd /opt/koko-2.14.2/build/          # 进入编译后的文件夹
tar xzf koko---linux-amd64.tar.gz   # 解压编译后的文件
cd /opt/koko-2.14.2/build/koko---linux-amd64
mv config_example.yml config.yml
vim config.yml
grep -Ev "^$|^[#;]" config.yml

CORE_HOST: http://172.16.0.16:8080           # Core的URL
BOOTSTRAP_TOKEN: GkzXTzSCTTDYikXHgT6l1PeC    # Core的token
BIND_HOST: 0.0.0.0
SSHD_PORT: 2222
HTTPD_PORT: 5000
LOG_LEVEL: DEBUG

6、启动 KoKo

cd /opt/koko-2.14.2/build/koko---linux-amd64
./koko

3.7 Lion

1、部署 Guacd

  • 下载资源

    mkdir /opt/guacamole-v2.14.2 && cd /opt/guacamole-v2.14.2
    wget http://download.jumpserver.org/public/guacamole-server-1.3.0.tar.gz
    tar -xzf guacamole-server-1.3.0.tar.gz
    
  • 安装 Guacd 依赖

    yum -y localinstall --nogpgcheck https://mirrors.aliyun.com/rpmfusion/free/el/rpmfusion-free-release-7.noarch.rpm
    
    yum install -y cairo-devel libjpeg-turbo-devel libpng-devel libtool uuid-devel
    
    yum install -y ffmpeg-devel freerdp-devel pango-devel libssh2-devel libtelnet-devel libvncserver-devel libwebsockets-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel
    
  • 构建 Guacd

    cd guacamole-server-1.3.0/
    ./configure --with-init-dir=/etc/init.d
    make
    make install
    ldconfig
    

    如果希望使用 systemd 管理, 可以使用 ./configure --with-systemd-dir=/etc/systemd/system/

2、部署 Lion

  • 下载资源

    cd /opt && wget https://github.com/jumpserver/lion-release/releases/download/v2.14.2/lion-v2.14.2-linux-amd64.tar.gz
    tar -xf lion-v2.14.2-linux-amd64.tar.gz
    
  • 修改配置文件

    cd lion-v2.14.2-linux-amd64 && cp config_example.yml config.yml
    vim config.yml
    
    grep -Ev "^$|^[#;]" config.yml
    
    CORE_HOST: http://172.16.0.16:8080
    BOOTSTRAP_TOKEN: GkzXTzSCTTDYikXHgT6l1PeC
    BIND_HOST: 0.0.0.0
    HTTPD_PORT: 8081
    LOG_LEVEL: DEBUG
    

3、启动 Guacd

/etc/init.d/guacd start

4、启动 Lion

cd /opt/lion-v2.14.2-linux-amd64
./lion

3.8 Nginx

vim /etc/nginx/conf.d/jumpserver.conf
server {
  listen 80;
  # server_name _;

  client_max_body_size 5000m;

  # Luna 配置
  location /luna/ {
    proxy_pass http://172.16.0.16:4200;
  }

  # Core data 静态资源
  location /media/replay/ {
    add_header Content-Encoding gzip;
    root /opt/jumpserver-v2.14.2/data/;
  }

  location /media/ {
    root /opt/jumpserver-v2.14.2/data/;
  }

  location /static/ {
    root /opt/jumpserver-v2.14.2/data/;
  }

  # KoKo Lion 配置
  location /koko/ {
    proxy_pass       http://172.16.0.16:5000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  # lion 配置
  location /lion/ {
    proxy_pass http://172.16.0.16:8081;
    proxy_buffering off;
    proxy_request_buffering off;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_ignore_client_abort on;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;
    send_timeout 6000;
  }

  # Core 配置
  location /ws/ {
    proxy_pass http://172.16.0.16:8070;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  location /api/ {
    proxy_pass http://172.16.0.16:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  location /core/ {
    proxy_pass http://172.16.0.16:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  # 前端 Lina
  location /ui/ {
    proxy_pass http://172.16.0.16:9528;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  location / {
    rewrite ^/(.*)$ /ui/$1 last;
  }
}

四、验证

访问:http://106.52.187.250/

JumpServer 开源堡垒机部署(源码)_第3张图片

当然你也可以把构建后的 Lina、Luna 移至 nginx,效果一样。

Linux 服务器上访问:

ssh [email protected] -p2222
[email protected]'s password:

# admin:jumpserver登录用户(其实就是登录查看该用户的资源)
# 172.16.0.16:jumpserver的IP地址
#.....password:jumpserver的admin登录用户的登录密码

JumpServer 开源堡垒机部署(源码)_第4张图片

五、FAQ

5.1 Python 依赖报错

1、报错类型

JumpServer 开源堡垒机部署(源码)_第5张图片

JumpServer 开源堡垒机部署(源码)_第6张图片

2、报错原因

缺少相关的依赖

3、解决方案

# 图一:
yum install mysql-devel
# 图二:
yum install -y epel* openldap-devel gcc-c++ make sshpass

5.2 数据库权限问题

1、报错类型

启动 Core 时报错

./jms start

JumpServer 开源堡垒机部署(源码)_第7张图片

2、报错原因

jumpserver 数据库缺少 REFERENCES 权限问题

3、解决方案

mysql> grant REFERENCES on jumpserver.* to 'jumpserver'@'172.16.%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

添加权限后仍然报同样错误,肯定是数据库权限的问题,还没找出对于 jumpserver 需要什么权限,有知道的朋友可评论区留言。因此这里我果断给 jumpserver 数据库全权限。

mysql> grant all on jumpserver.* to 'jumpserver'@'172.16.%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

再次执行 ./jms start

这次就可以了,果然绿色是最好的颜色。

JumpServer 开源堡垒机部署(源码)_第8张图片

5.3 nodejs 版本问题

JumpServer 开源堡垒机部署(源码)_第9张图片

5.4 Luna 构建问题

1、启动 Luna 报错

运行 ng serve 时报 Error from chokidar…

JumpServer 开源堡垒机部署(源码)_第10张图片

解决:调大 fs.inotify.max_user_watches

其他参数说明:

fs.inotify.max_queued_events:表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。

fs.inotify.max_user_instances:表示每一个real user ID可创建的inotify instatnces的数量上限,默认128.

fs.inotify.max_user_watches:表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量)

注:

max_queued_events 是 inotify 管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。如果你在日志中看到 Event Queue Overflow,说明 max_queued_events 太小需要调整参数后再次使用。

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

再次启动 Luna

这次就不会报错了,之前是因为 fs.inotify.max_user_watches 默认128,启动时超过了该数值,导致报错。

JumpServer 开源堡垒机部署(源码)_第11张图片

2、Luna 构建报错

JumpServer 开源堡垒机部署(源码)_第12张图片

很明显是缺少模块,安装模块即可

npm install crypto-js

# 再次构建即可

5.5 go 编译问题

1、make 编译时报错

JumpServer 开源堡垒机部署(源码)_第13张图片

2、解决方案

timeout 超时,说明又被 qiang 了,配置一下代理,再次 make 即可。

go env -w GOPROXY=https://goproxy.cn
make

5.6 组件下载问题

在每个组件下载过程中,要保证下载后文件的一致性,如下载文件的大小,否则解压就会有问题,因为下载过程中 Resolve 的是国外网站。

tar -xf koko-v2.14.2.tar.gz -C /opt/koko-v2.14.2 --strip-components 1

tar: This does not look like a tar archive

gzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now

# 上面的错误就是典型的文件下载不完整
# 可使用一些国内镜像进行下载

总结

来梳理一下 JumpServer 的组件关系:

  • Core:JumpServer 的核心组件,可理解为 JumpServer;
  • Lina: JumpServer 的前端 UI 项目,需部署该项目,才能正常访问;
  • Luna:JumpServer 的前端 UI 项目,不作渲染,仅提供 API 接口;
  • KoKo:提供 SSH/SFTP 服务和 Web Terminal(终端)服务;
  • Lion: 用来实现 RDP/VNC 协议跳板机功能。

JumpServer 项目源码:https://github.com/jumpserver/

<点击跳转至开头>

你可能感兴趣的:(Python,云计算,linux,运维,python,django)