Jumpserver是基于Django开发的堡垒机系统,官方有非常详细的安装文档,但是对于如果用Docker一键安装写得不是那么详细,官方觉得这样对于系统的可用性与健壮性方面会有严重的不足,且有可能存在未知的Bug,极力不推荐,自然文档就比较少一点。
在以前我按照官方一步步安装文档部署过,是一套比较简单的系统,但是因为并不仅仅像平时用到的LNMP系统(Linux+Nginx+MySQL+PHP),因为使用Python3开发,需要配置Python虚拟环境,在Windows远程桌面的组件Guacmole部署上,需要Docker,还有单独的Web终端Coco组件,看了社区有好多人在部署的时候都会卡在这里,其实在我看来,很多人都是想纯粹使用一下Jumpserver,对于这类人来说,越简单越好,不需要性能也不需要可用性,扩展性、分布式完全不需要,只需要看看这系统到底如何运作,抑或是小型公司,没有几台服务器,Docker版的更节约设备,不论是何原因,我觉得有必要把最简单部署的方式更详细地做成文档。
本文档是采用Jumpserver Docker All in One官方镜像部署,采用Nginx进行反向代理,属于非常简单又常规的做法,为保证安全,Nginx服务器启用了Selinx,这就会涉及到Selinx上关于http权限的问题,比较有趣,接下来开始部署。


Server

  • Nginx :10.0.1.2
  • JumpServer: 10.0.1.3

域名:jump.spex.top
系统均采用CentOS7.6最小化安装。

1. Server:Jumpserver

因为Jumpserver服务器上我还跑了其他服务,预先是关掉Selinux的,所以这台服务器上不会涉及Selinux的问题。

1.1. 准备环境

这里配置了外置的Mysql与Redis,同时新建了用于jumpserver的数据库以及安装docker且配置docker国内镜像加速。

#安装Mariadb与Redis
yum update
yum intall -y epel-release
yum install mariadb mariadb-server redis -y

# 启动数据库并添加开机自启动
systemctl start mariadb
systemctl enable mariadb

# 新建Jumpserver数据库
mysql -uroot -p
create database jumpserver char set utf8;
grant all on jumpserver to jumpserver@'%' identified by 'jumpserver';
\q

# 配置Redis密码,注意因为我们的Jumpserver使用Docker部署,会分配不同的地址,Redis默认会bind 127.0.0.1地址,需要将其注释不生效。
# 同时设置连接redis密码为jumpserver
#bind 127.0.0.1

cat /etc/redis.conf | grep -v '#'
···
protected-mode no
requirepass jumpserver
···

# 启动&自启动Redis
systemctl restart redis
systemctl enable redis

# 安装docker
yum install -y docker-ce

# 配置docker镜像加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

# 启动&自启动Docker
systemctl restart docker
systemctl enable docker
1.2. 启动Docker Jumpserver镜像

因为会使用Nginx进行反向代理,所以随便映射一个端口8001用于Web访问,2222用户ssh访问,因为本服务器关闭了Selinux,如果没有关闭,还需要将8001与2222加入可http的端口,在Nginx服务器将会详细配置。

docker run --name jms_all -d \
-v /opt/jumpserver:/opt/jumpserver/data/media \
-p 8001:80 \
-p 2222:2222 \
-e SECRET_KEY=secret \
-e BOOTSTRAP_TOKEN=secret \
-e DB_HOST=10.0.1.3 \
-e DB_PORT=3306 \
-e DB_USER=jumpserver \
-e DB_PASSWORD=jumpserver \
-e DB_NAME=jumpserver \
-e REDIS_HOST=10.0.1.3 \
-e REDIS_PORT=6379 \
-e REDIS_PASSWORD=jumpserver \
-e JUMPSERVER_KEY_DIR=/config/guacamole/keys \
-e GUACAMOLE_HOME=/config/guacamole \
-e JUMPSERVER_SERVER=http://127.0.0.1:8080 \
jumpserver/jms_all

根据服务器性能,启动需要一点时间,可以利用docker logs 容器id来查看实时日志,docker ps 容器id来查看容器状态,如果docker ps 容器id中没有看到,那可能是发生错误没启动成功,用docker ps 容器id -a来查看,不断确认日志的错误信息排查,当然我是一次启动成功了。

1.3. 配置防火墙

我们的服务器默认是安装了systemctl-cmd进行端口的管理的,其实你可以直接systemctl stop firewalld关闭防火墙,既然Selinux都关掉了,还留着防火墙干嘛,有道理……
如果你恰巧是跟我一样没有关闭防火墙的,可以将端口进行放行。

firewall-cmd --add-port=8001/tcp --permanent
firewall-cmd --add-port=2222/tcp --permanent
firewall-cmd --reload

这样我们就开启了外部直接访问8001与2222端口的tcp连接了,等下子就可以用Nginx反向代理这两个端口。


2. Server:Nginx

现在的Nginx版本是1.13,我们这次不仅需要使用到http模块,还需要使用到stream模块,来自epel仓库的Nginx包含了stream模块,我们无需再去编译安装了,轻松。

2.1 安装Nginx
yum update
yum install -y epel-release
yum install -y nginx
systemctl enable nginx
systemctl start nginx
2.2 配置Selinux

这次我们需要进行两个端口的反向代理,分别为:

  • 10.0.1.2:80 --> 10.0.1.3:8001
  • 10.0.1.2:2222 --> 10.0.1.3:2222

80端口无需配置,但是2222端口并不是Selinux允许的可http端口,可使用semange进行管理。

# 安装semanage
yum install -y policycoreutils-python

# 查看selinux允许的http端口,发现结果并不包含2222
semanage port -l | grep http_port_t

# 添加端口
semanage port -a -t http_port_t  -p tcp 2222

如若不做如上操作,在配置好Nginx listen 2222端口会,Nginx会报错

[emerg] bind() to 0.0.0.0:2222 failed (13: Permission denied)
2.3 配置Nginx http

本次我们仍然使用acme.sh进行https证书的管理,acme使用教程参见:ACME.SH自动申请管理SSL证书 - SPEX
查看Nginx配置文件可以看到如下配置

cat /etc/nginx/nginx.conf

···(省略)
http {
    include /etc/nginx/conf.d/*.conf
}
···(省略)

对于Web的反向代理,我们使用的是http,所以直接在/etc/nginx/conf.d/下建立配置文件填入配置即可。

cat /etc/nginx/conf.d/jump.conf

upstream jumpserver {
    server 10.0.1.3:8001;
}

server {
    listen 80;
    server_name jump.spex.top;
    
    rewrite ^(.*)$ https://$host$1 permanent;
}    
server {
    listen 443;
    server_name jump.spex.top;
    
    ssl on;
    ssl_certificate /etc/nginx/ssl/jump.spex.top/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/jump.spex.top/jump.spex.top.key;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:20m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;
    location / {
        proxy_pass http://jumpserver;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    }
}
2.4 配置Nginx stream

对于ssh端口反向代理,则需要使用stream模块,Nginx配置文件中默认并未包含Stream信息,而Nginx作为网站的入口,会有众多的配置文件,这里我们消防队http模块添加stream模块。
注意:stream模块与http模块属于同一个级别,注意缩进与包含关系。

cat /etc/nginx/nginx.conf

···(省略)
stream {
    include /etc/nginx/conf.d/*.streamconf
}
http {
    include /etc/nginx/conf.d/*.conf
}
···(省略)

这里我们仍然将配置文件放入conf.d文件夹内,只是将文件名限制为*.streamconf,好与http模块配置文件区分。

cat jump.streamconf 

upstream jumpserver_ssh {
    server 10.0.1.3:2222;
}
server {
    listen 2222;
    proxy_pass jumpserver_ssh;
    proxy_connect_timeout 5s;
}

最后运行nginx -s reload使配置生效。

2.5 配置防火墙

我们使用了3个端口,80、443与2222,需要在防火墙配置放行。

systemctl-cmd --add-service=http --permanent
systemctl-cmd --add-service=https --permanent
systemctl-cmd --add-port=2222/tcp --permanent
systemctl-cmd --reload

当然你如果没有忘记执行2.3步的话,那么你早就配置好了域名解析,这时候就可以访问Jumpserver了。

Web --> http://jump.spex.top
Ssh --> ssh -p 2222 user@jump.spex.top

后记

部署结束了,对于如何配置Jumpserver,看官方文档即可,基本的流程与其他系统相同,基本是按照如下流程:

  • 建立用户组
  • 建立用户,赋予用户组
  • 建立系统账号(用于登陆与管理,一般为root)
  • 建立管理账号(用于授权用户、用户组登陆服务器的账号)
  • 建立服务器分组
  • 建立服务器(需要选择:系统账号)
  • 建立授权分组
  • 授权服务器、服务器分组给用户、用户组(需要选择:管理账号)

按照以上流程,即可完成基本使用,如果你服务器配置还行的话,Jumpserver还挺流畅的。

Last modification:June 26th, 2019 at 05:21 pm