1. Jumpserver系统架构简述

时间:2024-01-31 16:31:29

Jumpserver系统架构简述

Jumpserver堡垒机平台架构简述

Jumpserver堡垒机平台基本架构如下图:

这里可以看出,运维及开发人员仅仅需要通过和堡垒机系统进行交互,通过堡垒机系统即可访问服务器。与传统运维相比,堡垒机系统仅仅在人和机器之间加了一层类似于代理的服务,平台对于运维及开发人员相当于透明的,但可以将所有的操作数
据流都通过堡垒机系统进行授权及审计。其中coco支持设置SSH用户黑名单和白名单功能,黑名单优先级更高。若把某SSH用户加入到黑名单意味着阻止该用户登录,若把某SSH用户加入到白名单意味着允许该用户登录。若某SSH用户既在黑名单,也在白名单,由于黑名单优先级更高,意味着阻止该SSH用户登录。若某SSH用户即没在黑名单,也没在白名单,意味着该SSH用户无法登录。

横向扩展

Jumpserver堡垒机的架构设计中,是支持横向扩展的,理论上在物理设备允许的条件下是无限扩展的,横向扩展我们并不收取额外费用。

混合云部署

由于Jumpserver堡垒机是一款软件堡垒机解决方案,故此在设计上支持混合云架构的部署,具体实施方案依客户需求而定。

高可用方案

Jumpserver堡垒机提供几类高可用的方案,具体可以在实施上根据客户的需求进行设计部署。

支持OpenID

登录支持OpenID,实现单点登录。对接CMP keyclock,登录时跳转的OpenID登陆页面,成功后跳转到Jumpserver,成功统一了认证。
Docker版本: 在 config_docker.py 中添加以下配置信息。
开源版本:在 config_example.py 中有OpenID的配置信息demo。

仪表盘

在Jumpserver的仪表盘,管理员可以清楚的看到资源数、用户数、登陆情况、资源使用情况等,界面友好且直观,并且支持中英文切换。 
 

Jumpserver-2.5.3 分布式部署

本文档不应该直接使用在生产环境

说明

本文档需要非常专业的能力来解决一些集群问题,如集群崩溃 集群分离 集群扩展 lvs 负载均衡策略 故障排查 以及 集群组件存活检测机制等。在这些问题上你可能无法获得 JumpServer 额外的技术支持。

环境说明

  • 系统: CentOS 7
  • NFS IP: 192.168.100.99
  • mysql IP: 192.168.100.10
  • Redis ip: 192.168.100.20
  • Core IP: 192.168.100.30 192.168.100.31
  • koko IP: 192.168.100.40 192.168.100.41
  • Guacamole IP: 192.168.100.50 192.168.100.51
  • Tengine IP: 192.168.100.100
  • Tengine 作为Nginx的替代品,作用于反向代理。
  • Coco(koko):Coco为 SSH Server 和 Web Terminal Server。用户可以通过使用自己的账户登录 SSH 或者 Web Terminal直接访问被授权的资产。不需要知道服务器的账户和密码,现在 Coco 已经被 koko 取代。
  • Luna:luna 为 Web Terminal Server 前端页面,用户使用 Web Terminal 方式登录时所需要的插件。
  • Guacamole:Guacamole 为 Windows 组件,用户可以通过 Web Terminal 来连接 Windows 资产(暂时只能通过 Web Terminal来访问)
  • Core:现指 Jumpserver 管理后台,是核心组件, 使用 Django Class Based View 风格开发,支持 Restful API。

安全说明

  • ssh、telnet 协议资产的防火墙设置允许 koko 与 core 访问
  • rdp、vnc 协议资产的防火墙设置允许 guacamole 与 core 访问

其他

  • 最终用户都是通过 Tengine 反向代理访问(也可以使用nginx)
  • 负载均衡模式, 七层使用 session_sticky, 四层用 least_conn
  • jumpserver/data 目录需要同步
  • koko 需要使用同一个 redis

生产集群部署建议

  • 你也可以使用如 NetScaler 类似的硬件或者软件来进行负载均衡策略,请处理好 session 问题。
  • 在生产环境中,你应该替换 nfs 为更强大的分布式文件系统,如: Ceph
  • 如果你的设备很多使用人数也很多,你应该部署分布式关系型数据库
  • 你应该部署多个独立的 Redis 负载均衡进行容错(当前版本的 JumpServer 还不支持 Redis Cluster)
  • Tengine RPM 使用 wojiushixiaobai 维护的一个 rpm 包,在生产环境中你应该自行编译

生产安全建议

Jumpserver 对外需要开放 80 和 2222 端口,如果你配置了 ssl 还需要开放 443 端口, 8080 端口开放给 koko 和 guacamole 组件访问

  • JumpServer 所在服务器操作系统应该升级到最新
  • JumpServer 依赖的软件升级到最新版本
  • 服务器、数据库、redis 等依赖组件请勿使用弱口令密码
  • 不推荐关闭 firewalld 和 selinux
  • 只开放必要的端口,必要的话请通过 vpn 或者 sslvpn 访问 JumpServer
  • 如果必须开放到外网使用,你应该部署 web 应用防火墙做安全过滤
  • 请部署 ssl 证书通过 https 协议来访问 JumpServer
  • JumpServer 不要使用弱口令密码,应立即改掉默认的 admin 密码
  • 推荐开启 MFA 功能,避免因密码泄露导致的安全问题

NFS 部署

环境

  • 系统: CentOS 7
  • IP: 192.168.100.99
+----------+------------+-----------------+------------------------+
| Protocol | ServerName |        IP       |         Used By        |
+==========+============+=================+========================+
|    TCP   |     NFS    |  192.168.100.99 |       Core, Tengine    |
+----------+------------+-----------------+------------------------+

安装步骤

安装 epel 库

yum upgrade -y  
yum -y install epel-release

配置防火墙

firewall-cmd --add-service=nfs --permanent --zone=public
firewall-cmd --add-service=mountd --permanent --zone=public
firewall-cmd --add-service=rpc-bind --permanent --zone=public
firewall-cmd --reload

生产环境应该使用更严格的方式

安装 nfs-server

yum -y install nfs-utils rpcbind
systemctl enable rpcbind nfs-server nfs-lock nfs-idmap
systemctl start rpcbind nfs-server nfs-lock nfs-idmap

创建 NFS 共享目录

mkdir /data

此共享目录存放 JumpServer 的录像及任务结果

设置 NFS 访问权限

vi /etc/exports
/data 192.168.100.*(rw,sync,no_root_squash)

/data 是刚才创建的将被共享的目录, 192.168.100._ 表示整个 192.168.100._ 的资产都有括号里面的权限
也可以写具体的授权对象 /data 192.168.100.30(rw,sync,no_root_squash) 192.168.100.31(rw,sync,no_root_squash)

使 exports 生效

exportfs -a

mysql 部署

环境

  • 系统: CentOS 7
  • 服务: MySQL Server
+----------+------------+-----------------+---------------+------------------------+
| Protocol | ServerName |        IP       |      Port     |         Used By        |
+==========+============+=================+===============+========================+
|    TCP   |    MySQL   | 192.168.100.10  |      3306     |           Core         |
+----------+------------+-----------------+---------------+------------------------+

安装步骤

安装 epel 库

yum upgrade -y
yum -y install epel-release wget

配置防火墙

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.0/24" port protocol="tcp" port="3306" accept"
firewall-cmd --reload

生产环境请勿授权整个网段, 请根据实际情况修改

安装 mysql

yum -y localinstall http://mirrors.ustc.edu.cn/mysql-repo/mysql57-community-release-el7.rpm
yum -y install mysql-community-server
sed -i "s@--initialize @--initialize-insecure @g" /usr/bin/mysqld_pre_systemd

启动 mysql

systemctl enable mysqld
systemctl start mysqld

创建数据库及授权

mysql -uroot
create database jumpserver default charset \'utf8\' collate \'utf8_bin\';
set global validate_password_policy=LOW;
grant all on jumpserver.* to \'jumpserver\'@\'192.168.100.%\' identified by \'weakPassword\';
flush privileges;

数据库密码应该采用更安全的密码

Redis 部署

环境

  • 系统: CentOS 7
  • IP: 192.168.100.20
+----------+------------+-----------------+---------------+------------------------+
| Protocol | ServerName |        IP       |      Port     |         Used By        |
+==========+============+=================+===============+========================+
|    TCP   |    Redis   | 192.168.100.20  |      6379     |           Core         |
+----------+------------+-----------------+---------------+------------------------+

注意: Redis 的数据库 3,4,5 被 Core 使用, 6 被 Koko 使用

安装步骤

安装 epel 库

yum upgrade -y
yum -y install epel-release wget

配置防火墙

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.0/24" port protocol="tcp" port="6379" accept"
firewall-cmd --reload

生产环境应该最小化授权

安装 redis

yum install -y install epel-release
yum install -y redis

修改配置文件

vi /etc/redis.conf
...
# bind 127.0.0.1  # 注释这行, 新增如下内容
bind 0.0.0.0
requirepass weakPassword  # redis 连接密码
maxmemory-policy allkeys-lru  # 清理策略, 优先移除最近未使用的key
...

启动 redis

systemctl start redis
systemctl enable redis

Core 部署

环境

  • 系统: CentOS 7
  • IP: 192.168.100.30
+----------+------------+-----------------+---------------+-------------------------+
| Protocol | ServerName |        IP       |      Port     |         Used By         |
+==========+============+=================+===============+=========================+
|    TCP   |    Core    | 192.168.100.30  |   8070,8080   |         Tengine         |
+----------+------------+-----------------+---------------+-------------------------+
|    TCP   |    Core    | 192.168.100.31  |   8070,8080   |         Tengine         |
+----------+------------+-----------------+---------------+-------------------------+

安装步骤

安装 epel 库

yum upgrade -y
yum -y install epel-release wget

配置防火墙

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="8080" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="8070" accept"
firewall-cmd --reload
setsebool -P httpd_can_network_connect 1

192.168.100.100 为 tengine 服务器 ip, 请根据实际情况修改

安装 git

yum -y install gcc git

安装 python3.6

yum -y install python36 python36-devel

配置 py3 虚拟环境

python3.6 -m venv /opt/py3
source /opt/py3/bin/activate

下载 core

cd /opt && \
wget https://github.com/jumpserver/jumpserver/releases/download/v2.5.3/jumpserver-v2.5.3.tar.gz
tar xf jumpserver-v2.5.3.tar.gz
mv jumpserver-v2.5.3 jumpserver

安装 rpm 依赖包

yum -y install $(cat /opt/jumpserver/requirements/rpm_requirements.txt)

安装 python 依赖

pip install -r /opt/jumpserver/requirements/requirements.txt

修改配置文件

cd /opt/jumpserver
cp config_example.yml config.yml
SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`
echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc
BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`
echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc
sed -i "s/SECRET_KEY:/SECRET_KEY: $SECRET_KEY/g" /opt/jumpserver/config.yml
sed -i "s/BOOTSTRAP_TOKEN:/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /opt/jumpserver/config.yml
sed -i "s/# DEBUG: true/DEBUG: false/g" /opt/jumpserver/config.yml
sed -i "s/# LOG_LEVEL: DEBUG/LOG_LEVEL: ERROR/g" /opt/jumpserver/config.yml
sed -i "s/# SESSION_EXPIRE_AT_BROWSER_CLOSE: false/SESSION_EXPIRE_AT_BROWSER_CLOSE: true/g" /opt/jumpserver/config.yml
echo -e "\033[31m 你的SECRET_KEY是 $SECRET_KEY \033[0m"
echo -e "\033[31m 你的BOOTSTRAP_TOKEN是 $BOOTSTRAP_TOKEN \033[0m"

注意不能使用纯数字字符串, BOOTSTRAP_TOKEN 给其他组件使用, redis 信息要给 koko 使用
以下模板仅供参考
vi config.yml

# SECURITY WARNING: keep the secret key used in production secret!
# 加密秘钥 生产环境中请修改为随机字符串,请勿外泄, 可使用命令生成
# cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo
SECRET_KEY: W5Ic3fMXNZ0p5RIy5DhJYJllppTfcfkW8Yuf94VBMfpcssbfu

# SECURITY WARNING: keep the bootstrap token used in production secret!
# 预共享Token coco和guacamole用来注册服务账号,不在使用原来的注册接受机制
BOOTSTRAP_TOKEN: zxffNymGjP79j6BN

# Development env open this, when error occur display the full process track, Production disable it
# DEBUG 模式 开启DEBUG后遇到错误时可以看到更多日志
DEBUG: false

# DEBUG, INFO, WARNING, ERROR, CRITICAL can set. See https://docs.djangoproject.com/en/1.10/topics/logging/
# 日志级别
LOG_LEVEL: ERROR
# LOG_DIR:

# Session expiration setting, Default 24 hour, Also set expired on on browser close
# 浏览器Session过期时间,默认24小时, 也可以设置浏览器关闭则过期
# SESSION_COOKIE_AGE: 86400
SESSION_EXPIRE_AT_BROWSER_CLOSE: true

# Database setting, Support sqlite3, mysql, postgres ....
# 数据库设置
# See https://docs.djangoproject.com/en/1.10/ref/settings/#databases

# SQLite setting:
# 使用单文件sqlite数据库
# DB_ENGINE: sqlite3
# DB_NAME:

# MySQL or postgres setting like:
# 使用Mysql作为数据库
DB_ENGINE: mysql
DB_HOST: 192.168.100.10
DB_PORT: 3306
DB_USER: jumpserver
DB_PASSWORD: weakPassword
DB_NAME: jumpserver

# When Django start it will bind this host and port
# ./manage.py runserver 127.0.0.1:8080
# 运行时绑定端口
HTTP_BIND_HOST: 0.0.0.0
HTTP_LISTEN_PORT: 8080
WS_LISTEN_PORT: 8070

# Use Redis as broker for celery and web socket
# Redis配置
REDIS_HOST: 192.168.100.20
REDIS_PORT: 6379
REDIS_PASSWORD: weakPassword
# REDIS_DB_CELERY: 3
# REDIS_DB_CACHE: 4

# Use OpenID authorization
# 使用OpenID 来进行认证设置
# BASE_SITE_URL: http://localhost:8080
# AUTH_OPENID: false  # True or False
# AUTH_OPENID_SERVER_URL: https://openid-auth-server.com/
# AUTH_OPENID_REALM_NAME: realm-name
# AUTH_OPENID_CLIENT_ID: client-id
# AUTH_OPENID_CLIENT_SECRET: client-secret
# AUTH_OPENID_IGNORE_SSL_VERIFICATION: True
# AUTH_OPENID_SHARE_SESSION: True

# Use Radius authorization
# 使用Radius来认证
# AUTH_RADIUS: false
# RADIUS_SERVER: localhost
# RADIUS_PORT: 1812
# RADIUS_SECRET:

# CAS 配置
# AUTH_CAS\': False,
# CAS_SERVER_URL\': "http://host/cas/",
# CAS_ROOT_PROXIED_AS\': \'http://jumpserver-host:port\',  
# CAS_LOGOUT_COMPLETELY\': True,
# CAS_VERSION\': 3,

# LDAP/AD settings
# LDAP 搜索分页数量
# AUTH_LDAP_SEARCH_PAGED_SIZE: 1000
#
# 定时同步用户
# 启用 / 禁用
# AUTH_LDAP_SYNC_IS_PERIODIC: True
# 同步间隔 (单位: 时) (优先)
# AUTH_LDAP_SYNC_INTERVAL: 12
# Crontab 表达式
# AUTH_LDAP_SYNC_CRONTAB: * 6 * * *
#
# LDAP 用户登录时仅允许在用户列表中的用户执行 LDAP Server 认证
# AUTH_LDAP_USER_LOGIN_ONLY_IN_USERS: False
#
# LDAP 认证时如果日志中出现以下信息将参数设置为 0 (详情参见:https://www.python-ldap.org/en/latest/faq.html)
# In order to perform this operation a successful bind must be completed on the connection
# AUTH_LDAP_OPTIONS_OPT_REFERRALS: -1

# OTP settings
# OTP/MFA 配置
# OTP_VALID_WINDOW: 0
# OTP_ISSUER_NAME: Jumpserver

# Perm show single asset to ungrouped node
# 是否把未授权节点资产放入到 未分组 节点中
# PERM_SINGLE_ASSET_TO_UNGROUP_NODE: false
#
# 启用定时任务
# PERIOD_TASK_ENABLE: True
#
# 启用二次复合认证配置
# LOGIN_CONFIRM_ENABLE: False
#
# Windows 登录跳过手动输入密码
WINDOWS_SKIP_ALL_MANUAL_PASSWORD: True

挂载 nfs

yum -y install nfs-utils
showmount -e 192.168.100.99
mount -t nfs 192.168.100.99:/data /opt/jumpserver/data

192.168.100.99 为 nfs 服务器 ip, 请根据实际情况更改

vi /etc/fstab
192.168.100.99:/data /opt/jumpserver/data nfs defaults 0 0

运行 core

cd /opt/jumpserver
./jms start -d

多节点部署

多节点部署与上面一致, config.yml 不需要重新生成, 直接复制主节点的配置文件即可

  • 登录到新的节点服务器
yum upgrade -y
yum -y install gcc epel-release git
yum -y install python36 python36-devel
python3.6 -m venv /opt/py3
source /opt/py3/bin/activate
wget https://github.com/jumpserver/jumpserver/releases/download/v2.5.3/jumpserver-v2.5.3.tar.gz
tar xf jumpserver-v2.5.3.tar.gz
mv jumpserver-v2.5.3 jumpserver
yum -y install $(cat /opt/jumpserver/requirements/rpm_requirements.txt)
pip install -r /opt/jumpserver/requirements/requirements.txt
  • 复制主节点 config.yml 到 /opt/jumpserver
scp root@192.168.100.30:/opt/jumpserver/config.yml /opt/jumpserver

192.168.100.30 为主 core 服务器 ip,按照提示输入密码

  • 配置 nfs
yum -y install nfs-utils
showmount -e 192.168.100.99
mount -t nfs 192.168.100.99:/data /opt/jumpserver/data
echo "192.168.100.99:/data /opt/jumpserver/data nfs defaults 0 0" >> /etc/fstab

192.168.100.99 为 nfs 服务器

  • 启动 core
cd /opt/jumpserver
./jms start -d
  • 复制主节点的 jumpserver.conf 到当前节点(如果nginx没有提前部署,请提前创建目录)
scp root@192.168.100.30:/etc/nginx/conf.d/jumpserver.conf /etc/nginx/conf.d/

192.168.100.30 为主 core 服务器 ip,按照提示输入密码

koko 部署

环境

  • 系统: CentOS 7
  • IP: 192.168.100.40
+----------+------------+-----------------+---------------+------------------------+
| Protocol | ServerName |        IP       |      Port     |         Used By        |
+==========+============+=================+===============+========================+
|    TCP   |    koko    | 192.168.100.40  |   2222, 5000  |         Tengine        |
+----------+------------+-----------------+---------------+------------------------+
|    TCP   |    koko    | 192.168.100.41  |   2222, 5000  |         Tengine        |
+----------+------------+-----------------+---------------+------------------------+

安装步骤

安装 epel 库

yum upgrade -y
yum -y install epel-release wget

配置防火墙

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="2222" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="5000" accept"
firewall-cmd --reload

192.168.100.100 为 tengine 服务器 ip, 请根据实际情况修改

配置 docker 源

yum install -y yum-utils device-mapper-persistent-data lvm2 wget
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

安装 docker

yum -y install docker-ce

启动 docker

systemctl enable docker
systemctl start docker

启动 koko

docker run --name jms_koko -d \
  -p 2222:2222 \
  -p 5000:5000 \
  -e CORE_HOST=http://192.168.100.100 \
  -e BOOTSTRAP_TOKEN=zxffNymGjP79j6BN \
  -e LOG_LEVEL=ERROR \
  -e REDIS_HOST=192.168.100.20 \
  -e REDIS_PORT=6379 \
  -e REDIS_PASSWORD=weakPassword \
  --privileged=true \
  jumpserver/jms_koko:v2.5.3

如果你已经配置好了 域名ssl, 请使用域名注册

CORE_HOST=https://demo.jumpserver.org 请自行替换此处的域名
BOOTSTRAP_TOKEN 的值从 jumpserver/config.yml 里面获取
访问 web页面 会话管理 - 终端管理 检查 koko 注册

多节点部署

登录到新的节点服务器, 前面安装 docker 都是一样的

yum upgrade -y
yum -y install epel-release wget
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="2222" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="5000" accept"
firewall-cmd --reload
yum -y install docker-ce
systemctl enable docker
systemctl start docker

启动 koko

docker run --name jms_koko -d \
  -p 2222:2222 \
  -p 5000:5000 \
  -e CORE_HOST=http://192.168.100.100 \
  -e BOOTSTRAP_TOKEN=zxffNymGjP79j6BN \
  -e LOG_LEVEL=ERROR \
  -e REDIS_HOST=192.168.100.20 \
  -e REDIS_PORT=6379 \
  -e REDIS_PASSWORD=weakPassword \
  --privileged=true \
  jumpserver/jms_koko:v2.5.3

如果你已经配置好了 域名ssl, 请使用域名注册

CORE_HOST=https://demo.jumpserver.org 请自行替换此处的域名
BOOTSTRAP_TOKEN 的值从 jumpserver/config.yml 里面获取
访问 web页面 会话管理 - 终端管理 检查 koko 注册

guacamole 部署

环境

  • 系统: CentOS 7
  • IP: 192.168.100.50
+----------+------------+-----------------+---------------+------------------------+
| Protocol | ServerName |        IP       |      Port     |         Used By        |
+==========+============+=================+===============+========================+
|    TCP   | Guacamole  | 192.168.100.50  |      8081     |         Tengine        |
+----------+------------+-----------------+---------------+------------------------+
|    TCP   | Guacamole  | 192.168.100.51  |      8081     |         Tengine        |
+----------+------------+-----------------+---------------+------------------------+

安装步骤

安装 epel 库

yum upgrade -y
yum -y install epel-release wget

配置防火墙

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="8081" accept"
firewall-cmd --reload

192.168.100.100 为 tengine 服务器 ip, 请根据实际情况修改

配置 docker 源

yum install -y yum-utils device-mapper-persistent-data lvm2 wget
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

安装 docker

yum -y install docker-ce

启动 docker

systemctl enable docker
systemctl start docker

启动 guacamole

docker run --name jms_guacamole -d \
  -p 8081:8080 \
  -e JUMPSERVER_KEY_DIR=/config/guacamole/key \
  -e JUMPSERVER_SERVER=http://192.168.100.100 \
  -e BOOTSTRAP_TOKEN=zxffNymGjP79j6BN \
  -e GUACAMOLE_LOG_LEVEL=ERROR \
  jumpserver/jms_guacamole:v2.5.3

如果你已经配置好了 域名ssl, 请使用域名注册

JUMPSERVER_SERVER=https://demo.jumpserver.org 请自行替换此处的域名
BOOTSTRAP_TOKEN 的值从 jumpserver/config.yml 里面获取
访问 web页面 会话管理 - 终端管理 检查 guacamole 注册

多节点部署

登录到新的节点服务器, 前面安装 docker 都是一样的

yum upgrade -y
yum -y install epel-release wget
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" port="8081" accept"
firewall-cmd --reload
yum -y install docker-ce
systemctl enable docker
systemctl start docker

启动 guacamole

docker run --name jms_guacamole -d \
  -p 8081:8080 \
  -e JUMPSERVER_KEY_DIR=/config/guacamole/key \
  -e JUMPSERVER_SERVER=http://192.168.100.100 \
  -e BOOTSTRAP_TOKEN=zxffNymGjP79j6BN \
  -e GUACAMOLE_LOG_LEVEL=ERROR \
  jumpserver/jms_guacamole:v2.5.3

如果你已经配置好了 域名ssl, 请使用域名注册

JUMPSERVER_SERVER=https://demo.jumpserver.org 请自行替换此处的域名
BOOTSTRAP_TOKEN 的值从 jumpserver/config.yml 里面获取
访问 web页面 会话管理 - 终端管理 检查 guacamole 注册

Tengine 代理部署

环境

  • 系统: CentOS 7
  • IP: 192.168.100.100
+----------+------------+-----------------+---------------+
| Protocol | ServerName |        IP       |      Port     |
+==========+============+=================+===============+
|    TCP   |  Tengine   | 192.168.100.100 | 80, 443, 2222 |
+----------+------------+-----------------+---------------+

安装步骤

安装 epel 库

yum upgrade -y
yum -y install epel-release wget

配置防火墙

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=2222/tcp --permanent
firewall-cmd --reload
semanage fcontext -a -t httpd_sys_content_t \'/opt/jumpserver(/.*)?\'
setsebool -P httpd_can_network_connect 1

生产环境下不应该关闭 selinux

安装 tengine

cd /opt
yum localinstall -y http://demo.jumpserver.org/download/centos/7/tengine-2.3.2-1.el7.ngx.x86_64.rpm

生产环境请自行编译安装 tengine

部署 lina

cd /opt
wget https://github.com/jumpserver/lina/releases/download/v2.5.3/lina-v2.5.3.tar.gz
tar -xf lina-v2.5.3.tar.gz
mv lina-v2.5.3 lina
chown -R nginx:nginx lina

部署 luna

cd /opt
wget https://github.com/jumpserver/luna/releases/download/v2.5.3/luna-v2.5.3.tar.gz
tar -xf luna-v2.5.3.tar.gz
mv luna-v2.5.3 luna
chown -R nginx:nginx luna

安装 nfs

yum -y install nfs-utils

挂载 nfs

showmount -e 192.168.100.99
mkdir -p /opt/jumpserver/data
restorecon -R /opt/jumpserver/data/
mount -t nfs 192.168.100.99:/data /opt/jumpserver/data
echo "192.168.100.99:/data /opt/jumpserver/data nfs defaults 0 0" >> /etc/fstab

192.168.100.99 为 nfs server 地址,请自行更改

配置 ssh 反向代理

vi /etc/nginx/nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

stream {
    log_format  proxy  \'$remote_addr [$time_local] \'
                        \'$protocol $status $bytes_sent $bytes_received \'
                        \'$session_time "$upstream_addr" \'
                        \'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"\';

    access_log /var/log/nginx/tcp-access.log  proxy;
    open_log_file_cache off;

    upstream kokossh {               # 四层转发
        server 192.168.100.40:2222;
        server 192.168.100.41:2222;  # 多节点
        # 这里是 koko ssh 的后端ip
        least_conn;                  # 最少连接算法
    }

    server {
        listen 2222;
        proxy_pass kokossh;
        proxy_protocol on;
        proxy_connect_timeout 1s;
    }
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                        \'$status $body_bytes_sent "$http_referer" \'
                        \'"$http_user_agent" "$http_x_forwarded_for"\';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    # tcp_nopush     on;

    keepalive_timeout  65;

    # 关闭版本显示
    server_tokens off;

    include /etc/nginx/conf.d/*.conf;
}

配置 http 反向代理

vi /etc/nginx/conf.d/jumpserver.conf
upstream core {                # 七层http转发
    server 192.168.100.30:8080;
    server 192.168.100.31:8080;
    # 这里是 core 的后端ip
    session_sticky;            # nginx-sticky-module是nginx的一个模块,如果没有安装需要自行编译。
}

upstream ws {
    server 192.168.100.30:8070;
    server 192.168.100.31:8070;
    # 这里是 core 的后端ip
    session_sticky;
}

upstream koko {
    server 192.168.100.40:5000;
    server 192.168.100.41:5000;  # 多节点
    # 这里是 koko 的后端ip
    session_sticky;
}

upstream guacamole {
    server 192.168.100.50:8081;
    server 192.168.100.51:8081;  # 多节点
    # 这里是 guacamole 的后端ip
    session_sticky;
}

server {
    listen 80;
    # server_name demo.jumpserver.org;  # 自行修改成你的域名
    # return 301 https://$server_name$request_uri;
# }

# server {
    # 推荐使用 https 访问, 请自行修改下面的选项
    # listen 443 ssl;
    # server_name demo.jumpserver.org;  # 自行修改成你的域名
    # ssl_certificate   /etc/nginx/sslkey/1_jumpserver.org_bundle.crt;  # 自行设置证书
    # ssl_certificate_key  /etc/nginx/sslkey/2_jumpserver.org.key;  # 自行设置证书
    # ssl_session_timeout 5m;
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # ssl_prefer_server_ciphers on;

    client_max_body_size 100m;  # 录像上传大小限制

    location /ui/ {
        try_files $uri / /index.html;
        alias /opt/lina/;
    }

    location /luna/ {
        try_files $uri / /index.html;
        alias /opt/luna/;  # luna 路径
    }

    location /media/ {
        add_header Content-Encoding gzip;
        root /opt/jumpserver/data/;  # 录像位置, 如果修改安装目录, 此处需要修改
    }

    location /static/ {
        root /opt/jumpserver/data/;  # 静态资源, 如果修改安装目录, 此处需要修改
    }

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

    location /guacamole/ {
        proxy_pass       http://guacamole/;  #  guacamole
        proxy_buffering  off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log off;
    }

    location /ws/ {
        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_pass http://ws;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /api/ {
        proxy_pass http://core;
        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://core;
        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;
    }
}

注意

nginx会话保持之nginx-sticky-module模块

在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:

  1. ip hash,根据客户端的IP,将请求分配到不同的服务器上;
  2. cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者。

注意:cookie需要浏览器支持,且有时候会泄露数据

Sticky工作原理

Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route。

  1. 客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
  2. 后端服务器处理完请求,将响应数据返回给nginx。
  3. 此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
  4. 客户端接收请求,并保存带route的cookie。
  5. 当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。

参考1:https://www.cnblogs.com/tssc/p/7481885.html

启动 nginx

nginx -t
systemctl enable nginx
systemctl start nginx

访问 http://192.168.100.100 测试是否转发正常。

默认账号: admin 密码: admin
到会话管理-终端管理 检查 koko Guacamole 等应用的注册

ssh -p2222 admin@192.168.100.100  
sftp -P2222 admin@192.168.100.100

密码: admin
如果是用在 Windows 下, Xshell Terminal 登录语法如下

ssh admin@192.168.100.100 2222  
sftp admin@192.168.100.100 2222

密码: admin
如果能登陆代表部署成功.