1、 jumpserver 简介
Jumpserver 采用了分布式架构设计, 支持多云环境 并可灵活扩展。 资产管理方面,
Jumpserver 无并发和资产数量限制, 支持水平扩容。 Jumpserver 采用了业界领先的容器化
部署方式, 并且提供体验极佳的 Web Terminal 。 Jumpserver 还可实现基于 Web 的文件
传输, 并且支持用户将运维审计录像保存在云端( 例如 AWS S3 、 阿里云 OSS 、 ElasticSearch
等) 。 Jumpserver 是全球首款完全开源、 符合 4A 规范( 包含认证 Authentication 、 授权
Authorization、 账号 Accounting 和审计 Auditing ) 的运维安全审计系统, Jumpserver 通过
软件订阅服务或者软硬件一体机的方式, 向企业级用户交付多云环境下更好用的堡垒机

2、 为何要学习 jumpserver
企业应用当中, 监控系统 (zabbix,prometheus),日志分析系统(filebeat+kafka+elk) 几乎是每个
公司必不可少的, 同样 jumpserver 也是非常重要的统一登录入口堡垒机,对运维审计及安全 起到非常重要的作用,完全有必要应用到你的公司,接下来我将按照企业生产标准带领大家一步一步部署jumpserver

3.本次实验环境相关软件版本 如下
[root@jumpserver ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
nginx-1.16.0.tar.gz
Python-3.6.7.tar.xz
redis-5.0.8.tar.gz
jumpserver1.5.8

相关软件包已提前下载好

4、NGINX编译部署

[root@jumpserver src]# yum install pcre pcre-devel openssl-devel -y ##安装依赖
[root@jumpserver nginx-1.16.0]# useradd -s /sbin/nologin -M nginx
[root@jumpserver src]# wget http://nginx.org/download/nginx-1.16.0.tar.gz
[root@jumpserver src]# tar xf nginx-1.16.0.tar.gz
[root@jumpserver src]# cd nginx-1.16.0
[root@jumpserver nginx-1.16.0]# ./configure --prefix=/usr/local/nginx-1.16.0 --user=nginx
--group=nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
[root@jumpserver nginx-1.16.0]# make && make install
[root@jumpserver nginx-1.16.0]# ln -s /usr/local/nginx-1.16.0/ /usr/local/nginx

nginx启动
/usr/local/nginx/sbin/nginx 

检查结果
2020年Jumpserver1.5.8企业生产部署指南

5、redis编译部署
1、 Redis 简介
Redis 是完全开源免费的, 遵守 BSD 协议, 是一个高性能的 key-value 数据库。
Redis 支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进
行使用。
Redis 不仅仅支持简单的 key-value 类型的数据, 同时还提供 list, set, zset, hash 等数据结
构的存储

  1. redis部署
tar xf redis-5.0.8.tar.gz
cd redis-5.0.8
make PREFIX=/usr/local/redis5.0.8 install
ln -s /usr/local/redis5.0.8/ /usr/local/redis
echo "export PATH=$PATH:/usr/local/redis/bin/" >> /etc/profile
source /etc/profile
创建配置文件及数据持久化目录
[root@jumpserver redis-5.0.8]# mkdir /usr/local/redis/{etc,data}

redis 简单配置
cat /usr/local/redis/etc/redis.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 0.0.0.0
### 监听端口
port 6379
### pid 文件和 log 文件的保存地址
pidfile "/var/run/redis_6379.pid"
logfile "/var/log/redis_6379.log"
### 指定本地持久化文件的文件名,默认是 dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /usr/local/redis/data/

redis启动
[root@jumpserver redis-5.0.8]# redis-server /usr/local/redis/etc/redis.conf

检查结果
2020年Jumpserver1.5.8企业生产部署指南

3、Python3编译部署

1、 先安装相关依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel
tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
2、 Python 源码部署
[root@jumpserver src]# wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
[root@jumpserver src]# tar xf Python-3.6.6.tgz
[root@jumpserver src]# cd Python-3.6.6
[root@jumpserver Python-3.6.6]# ./configure --prefix=/usr/local/python3
[root@jumpserver Python-3.6.6]# make && make install
3、 设定环境变量
[root@jumpserver Python-3.6.6]# echo "export PATH=$PATH:/usr/local/python3/bin/" >>
/etc/profile
[root@jumpserver Python-3.6.6]# source /etc/profile

检查结果
2020年Jumpserver1.5.8企业生产部署指南

4、MySQL5.7.28 二进制版本规范化部署
去 mysql 官网下载 mysql5.7.28 二进制版本
https://downloads.mysql.com/archives/community/
2020年Jumpserver1.5.8企业生产部署指南

MySQL部署

[root@jumpserver software]# useradd -s /sbin/nologin -M mysql #创建数据库运行账户
[root@jumpserver software]# tar xf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz #解压软件包
[root@jumpserver software]# mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.28
[root@jumpserver software]# ln -s /usr/local/mysql-5.7.28/ /usr/local/mysql
[root@jumpserver software]# mkdir /data/mysql/mysql3306/{data,logs,tmp} -p #建立目录
[root@jumpserver software]# chown -R mysql.mysql /usr/local/mysql/ /data/mysql/ ##授权
mysql 账户
[root@jumpserver software]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@jumpserver software]# source /etc/profile #配置环境变量
###注意如果之前有 mariadb 请先卸载干净

这里提供一份生产配置文件
[root@jumpserver software]# cat /data/mysql/mysql3306/my3306.cnf
#my.cnf
[client]
port = 3306
#socket = /tmp/mysql3306.sock
[mysql]
prompt="\\u@\\h:\\p [\\d]>"
no-auto-rehash
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
server_id = 23306
port = 3306
socket = /tmp/mysql3306.sock
event_scheduler = 0
interactive_timeout = 300
wait_timeout = 300
#character set
character-set-server = utf8
open_files_limit = 65535
max_connections = 100
max_connect_errors = 100000
lower_case_table_names =1explicit_defaults_for_timestamp=1
#logs
log-output=file
slow_query_log = 1
slow_query_log_file = slow.log
log-error = /data/mysql/mysql3306/logs/error.log
pid-file = mysql.pid
long_query_time = 1
log-slow-slave-statements = 1
#binlog
binlog_format = row
log-bin = /data/mysql/mysql3306/logs/mysql-bin
binlog_cache_size = 1M
max_binlog_size = 256M
sync_binlog = 0
expire_logs_days = 10
#procedure
log_bin_trust_function_creators=1
# gt
id-mode = on
enforce-gtid-consistency=1
#relay log
skip_slave_start = 1
max_relay_log_size = 128M
relay_log_purge = 1
relay_log_recovery = 1
relay-log=relay-bin
relay-log-index=relay-bin.index
log_slave_updates
#slave-skip-errors=1000,1001,1002
#skip-grant-tables
#buffers & cache
table_open_cache = 2048
table_definition_cache = 2048
table_open_cache = 2048
max_heap_table_size = 96M
sort_buffer_size = 128Kjoin_buffer_size = 128K
thread_cache_size = 200
query_cache_size = 0
query_cache_type = 0
query_cache_limit = 256K
query_cache_min_res_unit = 512
thread_stack = 192K
tmp_table_size = 96M
key_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 32M
#myisam
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
#innodb
innodb_buffer_pool_size = 100M ##这里跟进生产实际情况调整, 因为虚拟机, 这里设置的
比较小
innodb_buffer_pool_instances = 1
innodb_data_file_path = ibdata1:100M:autoextend
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 8M
innodb_log_file_size = 100M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 50
innodb_file_per_table = 1
innodb_rollback_on_timeout
innodb_status_file = 1
innodb_io_capacity = 2000
transaction_isolation = READ-COMMITTED
innodb_flush_method = O_DIRECT
loose_tokudb_cache_size=100M
loose_tokudb_directio=ON
loose_tokudb_fsync_log_period=1000
loose_tokudb_commit_sync=0

初始化MySQL

[root@jumpserver software]# /usr/local/mysql/bin/mysqld
--defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize
[root@jumpserver local]# grep password /data/mysql/mysql3306/data/error.log
2020-04-21T13:52:57.356296Z 1 [Note] A temporary password is generated for root@localhost: 2loA_aBNk0?I   ##这个代表初始随机密码

检查结果

[root@jumpserver software]# ll /data/mysql/mysql3306/data/
总用量 409676
-rw-r----- 1 mysql mysql 56 4 月 21 14:17 auto.cnf
-rw------- 1 mysql mysql 1676 4 月 21 14:17 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 4 月 21 14:17 ca.pem
-rw-r--r-- 1 mysql mysql 1112 4 月 21 14:17 client-cert.pem
-rw------- 1 mysql mysql 1676 4 月 21 14:17 client-key.pem
-rw-r----- 1 mysql mysql 1062 4 月 21 14:17 error.log
-rw-r----- 1 mysql mysql 425 4 月 21 14:17 ib_buffer_pool
-rw-r----- 1 mysql mysql 104857600 4 月 21 14:17 ibdata1
-rw-r----- 1 mysql mysql 104857600 4 月 21 14:17 ib_logfile0
-rw-r----- 1 mysql mysql 104857600 4 月 21 14:17 ib_logfile1
-rw-r----- 1 mysql mysql 104857600 4 月 21 14:17 ib_logfile2
drwxr-x--- 2 mysql mysql 4096 4 月 21 14:17 mysql
drwxr-x--- 2 mysql mysql 8192 4 月 21 14:17 performance_schema
-rw------- 1 mysql mysql 1680 4 月 21 14:17 private_key.pem
-rw-r--r-- 1 mysql mysql 452 4 月 21 14:17 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 4 月 21 14:17 server-cert.pem
-rw------- 1 mysql mysql 1680 4 月 21 14:17 server-key.pem-rw-r----- 1 mysql mysql 184 4 月 21 14:17 slow.log
drwxr-x--- 2 mysql mysql 8192 4 月 21 14:17 sys

MySQL启动
[root@jumpserver software]# /usr/local/mysql/bin/mysqld \
--defaults-file=/data/mysql/mysql3306/my3306.cnf &

检查结果
2020年Jumpserver1.5.8企业生产部署指南

登陆和修改初始密码

[root@jumpserver software]# mysql -uroot -p -S /tmp/mysql3306.sock
Enter password:
mysql> alter user user() identified by '123456';

2020年Jumpserver1.5.8企业生产部署指南

5.docker部署
1、 docker 简介
docker 通过内核虚拟化技术(namespace 及 cgroups 等) 来提供容器的资源隔离与安全保障
等, 由于 docker 通过操作系统层的虚拟化实现隔离, 所以 docker 容器在运行时, 不需要类
似虚拟机额外的操作系统开销, 提供资源利用率

2、 docker vs kvm
2020年Jumpserver1.5.8企业生产部署指南

3、docker部署

https://docs.docker.com/engine/install/centos/
如之前有安装就先卸载
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y

4.docker基础操作

配置 docker 镜像加速
[root@jumpserver ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
} s
ystemctl enable docker
systemctl start docker
Docker info 查看版本及加速情况
[root@jumpserver ~]# docker pull centos ##拉取 centos 镜像
[root@jumpserver ~]# docker save -o centos.tar centos ##导出镜像
[root@jumpserver ~]# docker load -i cnetos.tar ##导入镜像
[root@jumpserver ~]# docker run --name docker-demo -itd centos /bin/bash ##生成容器
[root@jumpserver ~]# docker container ls #查看容器

2020年Jumpserver1.5.8企业生产部署指南

6.jumpserver部署

组件说明
JumpServer 为管理后台, 管理员可以通过 Web 页面进行资产管理、用户管理、资产授权等操作, 用户可以通过 Web 页面进行资产登录, 文件管理等操作
koko 为 SSH Server 和 Web Terminal Server 。用户可以使用自己的账户通过 SSH 或者 Web Terminal 访问 SSH 协议和 Telnet 协议资产
Luna 为 Web Terminal Server 前端页面, 用户使用 Web Terminal 方式登录所需要的组件
Guacamole 为 RDP 协议和 VNC 协议资产组件, 用户可以通过 Web Terminal 来连接 RDP 协议和 VNC 协议资产 (暂时只能通过 Web Terminal 来访问)

端口说明
JumpServer 默认 Web 端口为 8080/tcp, 默认 WS 端口为 8070/tcp, 配置文件 jumpserver/config.yml
koko 默认 SSH 端口为 2222/tcp, 默认 Web Terminal 端口为 5000/tcp 配置文件在 koko/config.yml
Guacamole 默认端口为 8081/tcp, 配置文件 /config/tomcat9/conf/server.xml
Nginx 默认端口为 80/tcp
Redis 默认端口为 6379/tcp
Mysql 默认端口为 3306/tcp

jumpserver部署

# 创建数据库 JumpServer 并授权
$ DB_PASSWORD=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 24`  # 生成随机数据库密码
$ echo -e "\033[31m 你的数据库密码是 $DB_PASSWORD \033[0m"

你的数据库密码是 2vWNIylwdxyHjYKLVkpBMtUz

$ mysql -uroot -p -S /tmp/mysql3306.sock -e "create database jumpserver default charset 'utf8' collate 'utf8_bin'; grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by '$DB_PASSWORD'; flush privileges;"

[root@jumpserver data]# python3 -m venv py3
source /data/py3/bin/activate  # 退出虚拟环境可以使用 deactivate 命令

(py3) [root@localhost py3]

# 下载 JumpServer
$ cd /data/
$ git clone --depth=1 https://github.com/jumpserver/jumpserver.git

# 安装依赖 RPM 包
$ yum -y install $(cat /data/jumpserver/requirements/rpm_requirements.txt)

# 安装 Python 库依赖
$ pip install wheel
$ pip install --upgrade pip setuptools
$ pip install -r /data/jumpserver/requirements/requirements.txt   -i  https://mirrors.aliyun.com/pypi/simple/

修改配置文件

# 修改 JumpServer 配置文件
$ cd /data/jumpserver
$ cp config_example.yml config.yml

$ SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`  # 生成随机SECRET_KEY
$ echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc
$ BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`  # 生成随机BOOTSTRAP_TOKEN
$ echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc

$ sed -i "s/SECRET_KEY:/SECRET_KEY: $SECRET_KEY/g" /data/jumpserver/config.yml
$ sed -i "s/BOOTSTRAP_TOKEN:/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /data/jumpserver/config.yml
$ sed -i "s/# DEBUG: true/DEBUG: false/g" /data/jumpserver/config.yml
$ sed -i "s/# LOG_LEVEL: DEBUG/LOG_LEVEL: ERROR/g" /data/jumpserver/config.yml
$ sed -i "s/# SESSION_EXPIRE_AT_BROWSER_CLOSE: false/SESSION_EXPIRE_AT_BROWSER_CLOSE: true/g" /data/jumpserver/config.yml
$ sed -i "s/DB_PASSWORD: /DB_PASSWORD: $DB_PASSWORD/g" /data/jumpserver/config.yml

查看最终的配置文件

[root@jumpserver ~]# cat /data/jumpserver/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: ESgqBEs6umFh0wBnyJpiewTS06XQJavc5YhEUCB1iHGLsxQY5i

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

# 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: 127.0.0.1
DB_PORT: 3306
DB_USER: jumpserver
DB_PASSWORD: 2vWNIylwdxyHjYKLVkpBMtUz
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: 127.0.0.1
REDIS_PORT: 6379
# REDIS_PASSWORD: 
# 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: False

启动jumpserver

$ cd /data/jumpserver
$ ./jms start -d  # 后台运行使用 -d 参数./jms start -d
# 新版本更新了运行脚本, 使用方式./jms start|stop|status all  后台运行请添加 -d 参数

2020年Jumpserver1.5.8企业生产部署指南

# 获取当前服务器 IP
$ Server_IP=`ip addr | grep 'state UP' -A2 | grep inet | egrep -v '(127.0.0.1|inet6|docker)' | awk '{print $2}' | tr -d "addr:" | head -n 1 | cut -d / -f1`
$ echo -e "\033[31m 你的服务器IP是 $Server_IP \033[0m"

# http://<Jumpserver_url> 指向 jumpserver 的服务端口, 如 http://192.168.244.144:8080
# BOOTSTRAP_TOKEN 为 Jumpserver/config.yml 里面的 BOOTSTRAP_TOKEN

$ docker run --name jms_koko -d -p 2222:2222 -p 127.0.0.1:5000:5000 -e CORE_HOST=http://$Server_IP:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN -e LOG_LEVEL=ERROR --restart=always jumpserver/jms_koko:1.5.8

$ cd /opt
$ wget https://github.com/jumpserver/luna/releases/download/1.5.8/luna.tar.gz
$ tar xf luna.tar.gz
$ chown -R root:root luna

配置nginx 代理到 jumpserver 访问即可

http://ip
默认用户名密码 admin/admin

2020年Jumpserver1.5.8企业生产部署指南

2020年Jumpserver1.5.8企业生产部署指南

至此整个生产应用部署完毕

本人曾经从0到1将jumpserver系统完全应用到公司中,整个完善过程花了三个月时间左右,现已录制了一套按照企业生产标准的jumpserver落地到企业应用视频,如有兴趣请前往
https://edu.51cto.com/sd/84158