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模块
在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:
- ip hash,根据客户端的IP,将请求分配到不同的服务器上;
- cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者。
注意:cookie需要浏览器支持,且有时候会泄露数据
Sticky工作原理
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route。
- 客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
- 后端服务器处理完请求,将响应数据返回给nginx。
- 此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
- 客户端接收请求,并保存带route的cookie。
- 当客户端下一次发送请求时,会带上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
如果能登陆代表部署成功.