咱们对堡垒机(跳板机)不会陌生,为了保证服务器安全,加个堡垒机,全部ssh链接都经过堡垒机来完成,堡垒机也须要有身份认证、受权、访问控制、审计等功能。html
Jumpserver 是全球首款彻底开源的堡垒机, 是符合 4A 的专业运维审计系统。前端
Jumpserver 使用 Python / Django 进行开发, 采纳分布式架构, 支持多机房跨区域部署, 中心节点提供 API, 各机房部署登陆节点, 可横向扩展、无并发访问限制。python
Jumpserver 现已支持管理 SSH、 Telnet、 RDP、 VNC 协议资产。mysql
Jumpserver包含四个组件,各个组件的做用以下:linux
- Jumpserver 为管理后台, 管理员能够经过 Web 页面进行资产管理、用户管理、资产受权等操做, 用户能够经过 Web 页面进行资产登陆, 文件管理等操做
- Coco 为 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 来访问)
各个组件的监听端口以下:nginx
- Jumpserver 默认端口为 8080/tcp 配置文件 jumpserver/config.yml
- Coco 默认 SSH 端口为 2222/tcp, 默认 Web Terminal 端口为 5000/tcp 配置文件在 coco/config.yml
- Guacamole 默认端口为 8081/tcp, 配置文件 /config/tomcat8/conf/server.xml
- Nginx 默认端口为 80/tcp
- Redis 默认端口为 6379/tcp
- Mysql 默认端口为 3306/tcp
这篇博文将采用一站式的方式部署Jumpserver,其实更建议取参考官方文档部署Jumpserver。git
- 系统:CentOS 7
- IP:192.168.20.6
- 数据库:mariadb
- 反向代理:nginx
[root@jumpserver ~]# yum -y install wget gcc epel-release git #安装依赖包 #下载网络yum源 [root@jumpserver ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo [root@jumpserver ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@jumpserver ~]# yum makecache 安装 Redis, Jumpserver 使用 Redis 作 cache 和 celery broke [root@jumpserver ~]# yum -y install redis [root@jumpserver ~]# systemctl enable redis [root@jumpserver ~]# systemctl start redis # 安装 MySQL, 若是不使用 Mysql 能够跳过相关 Mysql 安装和配置, 支持sqlite3, mysql, postgres等 [root@jumpserver ~]# yum -y install mariadb* [root@jumpserver ~]# systemctl enable mariadb [root@jumpserver ~]# systemctl start mariadb #启动数据库后,建立一个库并添加一个受权用户,设置密码为123.com [root@jumpserver ~]# mysql -uroot -e "create database jumpserver default charset 'utf8'; grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by '123.com'; flush privileges;"
#安装 Nginx, 用做代理服务器整合 Jumpserver 与各个组件 [root@jumpserver conf.d]# vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 [root@jumpserver ~]# yum -y install nginx [root@jumpserver ~]# systemctl enable nginx #安装Python3.6 [root@jumpserver ~]# yum -y install python36 python36-devel # 配置并载入 Python3 虚拟环境 [root@jumpserver ~]# cd /opt [root@jumpserver opt]# python3 -m venv py3 # py3 为虚拟环境名称, 可自定义 #进入Python3.6虚拟环境 [root@jumpserver opt]# source /opt/py3/bin/activate # 退出虚拟环境可使用 deactivate 命令 # 看到下面的提示符表明虚拟环境配置成功 (py3) [root@jumpserver opt]#
# 下载 Jumpserver (py3) [root@jumpserver opt]# cd /opt (py3) [root@jumpserver opt]# wget https://github.com/jumpserver/jumpserver/archive/1.4.7.tar.gz (py3) [root@jumpserver opt]# tar zxf 1.4.7.tar.gz (py3) [root@jumpserver opt]# mv jumpserver-1.4.7 jumpserver # 安装依赖 RPM 包 (py3) [root@jumpserver opt]# yum -y install $(cat /opt/jumpserver/requirements/rpm_requirements.txt) # 安装 Python 库依赖 (py3) [root@jumpserver opt]# pip install --upgrade pip setuptools (py3) [root@jumpserver opt]# pip install -r /opt/jumpserver/requirements/requirements.txt # 修改 Jumpserver 配置文件 (py3) [root@jumpserver opt]# cd /opt/jumpserver (py3) [root@jumpserver jumpserver]# cp config_example.yml config.yml #生成秘钥令牌 (py3) [root@jumpserver jumpserver]# SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50` (py3) [root@jumpserver jumpserver]# echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc (py3) [root@jumpserver jumpserver]# BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16` (py3) [root@jumpserver jumpserver]# echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc (py3) [root@jumpserver jumpserver]# sed -i "s/SECRET_KEY:/SECRET_KEY: $SECRET_KEY/g" /opt/jumpserver/config.yml (py3) [root@jumpserver jumpserver]# sed -i "s/BOOTSTRAP_TOKEN:/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /opt/jumpserver/config.yml (py3) [root@jumpserver jumpserver]# sed -i "s/# DEBUG: true/DEBUG: false/g" /opt/jumpserver/config.yml (py3) [root@jumpserver jumpserver]# sed -i "s/# LOG_LEVEL: DEBUG/LOG_LEVEL: ERROR/g" /opt/jumpserver/config.yml (py3) [root@jumpserver jumpserver]# sed -i "s/# SESSION_EXPIRE_AT_BROWSER_CLOSE: False/SESSION_EXPIRE_AT_BROWSER_CLOSE: true/g" /opt/jumpserver/config.yml (py3) [root@jumpserver jumpserver]# sed -i "s/DB_PASSWORD: /DB_PASSWORD: 123.com/g" /opt/jumpserver/config.yml (py3) [root@jumpserver jumpserver]# echo -e "\033[31m 你的SECRET_KEY是 $SECRET_KEY \033[0m" 你的SECRET_KEY是 Z6bUvXTZRpc73pnRp4qNwn1eMWNYrgzbEWkVJqIVXc6cXfpKDU (py3) [root@jumpserver jumpserver]# echo -e "\033[31m 你的BOOTSTRAP_TOKEN是 $BOOTSTRAP_TOKEN \033[0m" 你的BOOTSTRAP_TOKEN是 aGXZtXKnhP3StNA3 (py3) [root@jumpserver jumpserver]# cat config.yml # 确认内容有没有错误 # SECURITY WARNING: keep the secret key used in production secret! # 加密秘钥 生产环境中请修改成随机字符串,请勿外泄, PS: 纯数字不能够 # $ cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo SECRET_KEY: Z6bUvXTZRpc73pnRp4qNwn1eMWNYrgzbEWkVJqIVXc6cXfpKDU # SECURITY WARNING: keep the bootstrap token used in production secret! # 预共享Token coco和guacamole用来注册服务帐号,不在使用原来的注册接受机制 BOOTSTRAP_TOKEN: aGXZtXKnhP3StNA3 # 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: 3600 * 24 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: 123.com 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 # 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 # OTP settings # OTP/MFA 配置 # OTP_VALID_WINDOW: 0 # OTP_ISSUER_NAME: Jumpserver # 运行 Jumpserver (py3) [root@jumpserver jumpserver]# cd /opt/jumpserver (py3) [root@jumpserver jumpserver]# ./jms start all -d #后台运行,可将start更改换为status、stop #设置jumpserver开机自启动 (py3) [root@jumpserver jumpserver]# wget -O /usr/lib/systemd/system/jms.service https://demo.jumpserver.org/download/shell/centos/jms.service (py3) [root@jumpserver jumpserver]# chmod 755 /usr/lib/systemd/system/jms.service (py3) [root@jumpserver jumpserver]# systemctl enable jms
(py3) [root@jumpserver jumpserver]# yum install -y yum-utils device-mapper-persistent-data lvm2 (py3) [root@jumpserver jumpserver]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo (py3) [root@jumpserver jumpserver]# yum makecache fast (py3) [root@jumpserver jumpserver]# rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg (py3) [root@jumpserver jumpserver]# yum -y install docker-ce #安装docker社区版 (py3) [root@jumpserver jumpserver]# systemctl enable docker #使用daocloud镜像加速 (py3) [root@jumpserver jumpserver]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io (py3) [root@jumpserver jumpserver]# systemctl restart docker #启动coco和guacamole容器,“-e CORE_HOST”指定的是Jumpserver的服务端口 #“BOOTSTRAP_TOKEN”为 Jumpserver/config.yml 里面的 BOOTSTRAP_TOKEN值 (py3) [root@jumpserver jumpserver]# docker run --name jms_koko -d -p 2222:2222 -p 127.0.0.1:5000:5000 -e CORE_HOST=http://192.168.20.2:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN --restart=always jumpserver/jms_koko:1.5.4 (py3) [root@jumpserver jumpserver]# docker run --name jms_guacamole -d -p 127.0.0.1:8081:8080 -e JUMPSERVER_SERVER=http://192.168.20.2:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN --restart=always jumpserver/jms_guacamole:1.5.4
Luna 须要 Nginx 来运行访问 访问(https://github.com/jumpserver/luna/releases)下载对应版本的 release 包, 直接解压, 不须要编译github
(py3) [root@jumpserver jumpserver]# cd /opt (py3) [root@jumpserver opt]# wget https://demo.jumpserver.org/download/luna/1.4.7/luna.tar.gz (py3) [root@jumpserver opt]# tar zxf luna.tar.gz (py3) [root@jumpserver opt]# chown -R root:root luna
(py3) [root@jumpserver opt]# deactivate #退出Python3虚拟环境 #因为在上面yum安装的nginx可能有些问题,因此我选择源码从新安装一下 [root@jumpserver ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src[root@jumpserver ~]# cd /usr/src/nginx-1.14.0/ [root@jumpserver nginx-1.14.0]# ./configure --prefix=/usr/local/nginx && make && make install [root@jumpserver nginx-1.14.0]# cd /usr/local/nginx/conf/ [root@jumpserver conf]# vim nginx.conf #nginx修改后的配置文件以下,可直接复制使用 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; client_max_body_size 100m; # 录像及文件上传大小限制 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://localhost:5000; 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://localhost:8081/; 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_pass http://localhost:8070; 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 / { proxy_pass http://localhost: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; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } [root@jumpserver /]# ln -sf /usr/local/nginx/sbin/nginx /usr/local/sbin/ [root@jumpserver ~]# nginx -t #检查配置文件是否有误 [root@jumpserver ~]# nginx #启动nginx服务
提交后,显示以下:web
管理用户名称:system,用户:ljz,操做以下:redis
系统用户名称:jumpserver;用户:root
注意:用户名尽可能为root,选择手动登陆,这个用户是用来链接后端资产的。
在进行下面的操做以前,须要先准备一台Centos服务器,用来测试,我这里开启了一台IP为:192.168.20.3的测试服务器。
建立完成后,显示以下: