2020年Jumpserver1.5.8企业生产部署指南
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
5、redis编译部署
1、 Redis 简介
Redis 是完全开源免费的, 遵守 BSD 协议, 是一个高性能的 key-value 数据库。
Redis 支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进
行使用。
Redis 不仅仅支持简单的 key-value 类型的数据, 同时还提供 list, set, zset, hash 等数据结
构的存储
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
检查结果
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
4、MySQL5.7.28 二进制版本规范化部署
去 mysql 官网下载 mysql5.7.28 二进制版本
https://downloads.mysql.com/archives/community/
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 &
登陆和修改初始密码
[root@jumpserver software]# mysql -uroot -p -S /tmp/mysql3306.sock Enter password: mysql> alter user user() identified by '123456';
5.docker部署
1、 docker 简介
docker 通过内核虚拟化技术(namespace 及 cgroups 等) 来提供容器的资源隔离与安全保障
等, 由于 docker 通过操作系统层的虚拟化实现隔离, 所以 docker 容器在运行时, 不需要类
似虚拟机额外的操作系统开销, 提供资源利用率
2、 docker vs kvm
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 #查看容器
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 参数
# 获取当前服务器 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
至此整个生产应用部署完毕
现已录制了一套按照企业生产标准的jumpserver落地到企业应用视频,如有兴趣请前往
https://edu.51cto.com/sd/84158
部分效果图