柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

JumpServer安装部署

堡垒机大家都已经不在陌生,堡垒机不仅仅是跳板机,还会有操作日志审计等一系列的功能,简而言之就是你对服务器的操作就是交给堡垒机,堡垒机会验证你的权限,有对应主机的权限才能做相应的操作。堡垒机分商业的也分开源的,当然开源大家印象比较深的就是jumpserver。这些概念性的东西百度一搜很多的,很详细。

jumpserver官网:http://www.jumpserver.org/

jumpserver源码下载:https://github.com/jumpserver/jumpserver

jumpserver的wiki:https://github.com/jumpserver/jumpserver/wiki

作者介绍自己的版本发展过程:http://www.gzyingzhou.com/news/201601/t1844413.html

一、Jumpserver服务器的安装

我这里操作系统用的是Centos7.2,jumpserver的版本是最新的0.3.2.

1.1 安装依赖并下载软件包:

# yum -y install git
# mkdir  /opt/tools
# cd /opt/tools/
# wget https://github.com/jumpserver/jumpserver/archive/0.3.2.zip
# unzip 0.3.2.zip
# cd jumpserver-0.3.2/install/
# ./install.py

1.2 解决一些问题:

问题1:

按照上面当执行# ./install.py的时候会发现并没有执行过去:

请务必先查看wiki https://github.com/jumpserver/jumpserver/wiki
支持的平台: CentOS, RedHat, Fedora, Debian, Ubuntu, Amazon Linux, 暂不支持其他平台安装.

图片.png

#如上图并没有出现安装过程

解决办法:

# vim install.py +88

if self.dist == "centos linux" or self.dist == "redhat" or self.dist == "fedora" or self.dist == "amazon linux ami":
#也就是将if self.dist == "centos"修改为if self.dist == "centos linux"

问题2:

这时候软件包以及相关的依赖工具啥的都会安装,但是当安装mysql服务器的话,又会卡主,因为Centos7默认是安装mariadb。

图片.png

#上图就是卡在了mysql安装那里

解决办法:

# vim install.py +93

if self.dist == "centos linux" and self.version.startswith("7"):
#也就是将if self.dist == "centos" 变为if self.dist == "centos linux"

博文来自:www.51niux.com

1.3 继续安装:

解决完上面两个错误,就应该没啥问题了,就要到输入一些信息的地方了。

图片.png

图片.png

#自己会给自己发一封邮件来进行发送邮件是否OK。

图片.png

#到上图这里就已经安装结束了。

图片.png

#可见本地启动了一个mysqld服务还启动了一个8000端口,这是django的服务。

1.4 web端登录测试:

浏览器访问URL:http://192.168.14.40:8000/login/

#192.168.14.40就是我jumpserver的IP地址。

图片.png

图片.png

#通过上图可以验证出web登陆已经没问题了。

1.5 服务的启动、关闭、重启操作

./service.sh  stop #jumpserver安装包里面有一个脚本文件,通过传参可以做到服务的关闭启动以及重启操作,如下图:

图片.png

博文来自:www.51niux.com

1.6 更改django的web监听端口

#python /opt/tools/jumpserver-0.3.2/manage.py runserver 0.0.0.0:80 &   #这种方式就不推荐使用了,还是nginx代理搞一下吧

# cat /usr/local/nginx/conf/nginx.conf  #nginx的配置样例

#user    nginx;
worker_processes        4;
 
error_log       /var/log/nginx/error.log;
pid     /var/run/nginx.pid;

events {
      worker_connections  1024;
 } 


http {
     include       mime.types;
     default_type  application/octet-stream;


log_format jumpserver '$host $remote_addr - $remote_user [$time_local] "$request" 
                     $status $upstream_status $body_bytes_sent "$http_referer" 
                    "$http_user_agent" "$http_x_forwarded_for" $ssl_protocol 
                    $ssl_cipher $upstream_addr $request_time $upstream_response_time';
server {
  listen 443;
  server_name jump.test.com;
  server_name_in_redirect off;

  access_log /var/log/nginx/jumpserver_access.log jumpserver;
  error_log /var/log/nginx/jumpserver_error.log;


  proxy_connect_timeout 300;
  proxy_read_timeout 300;
  proxy_send_timeout 300;
  proxy_buffer_size 64k;
  proxy_buffers 4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;


  ssl on;
  ssl_certificate /usr/local/nginx/conf/ssl/51niux.com.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/51niux.com.key;
  ssl_client_certificate /usr/local/nginx/conf/ssl/ca.crt;
  ssl_session_timeout 5m;
  #ssl_verify_client on;
  ssl_protocols  SSLv2 SSLv3 TLSv1;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  ssl_prefer_server_ciphers   on;
  
  location = /favicon.ico {
        log_not_found off;
   }
  location ^~ /ws/ {
        proxy_pass http://localhost:8000/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;
        # WebSocket support (nginx 1.12)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
  }
  location / {
        root html;
        index index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $https;
        proxy_pass http://127.0.0.1:8000;
      }
}
server {
  listen 80;
  server_name jump.test.com;
  charset utf-8;
  rewrite ^/(.*) https://jump.test.com/$1 permanent;
}
}

#mkdir /var/log/nginx

图片.png

图片.png

#测试登录也是可以的,说明nginx来做代理访问jumpserver的web程序是可以的了。

另外:

# vim /opt/tools/jumpserver-0.3.2/jumpserver.conf   #这个jumpserver.conf文件里面就是我们smtp的设置,连接mysql的设置,以及web的一些设置

[base]
url =  url = https://jump.test.com    #这里将url从http改为https,url从IP变为了域名。
key = b7efqwre8s9r1ajx
ip = 127.0.0.1                  #监听在本地
port = 8000 
log = warning                    #如果用起来就将日志级别从debug改为warning

[db]
host = 127.0.0.1
port = 3306
user = jumpserver
password = 5Lov@wife
database = jumpserver

[mail]
mail_enable = 1
email_host = smtp.163.com
email_port = 25
email_host_user = 51niux@163.com
email_host_password = 51niux
email_use_tls = True
email_use_ssl = False

#如果上面的url不更改的话,创建用户的时候发送邮件提示的是下面的截图的形式:

图片.png

#如果上面的url更改为域名的话,创建用户的时候发送邮件提示的是下面的截图的形式:

图片.png

#另外:后端服务器如果开启了selinux,请安装libselinux-python,当然默认在执行install.sh的时候就会把这个包安装上了。

1.7 /ws/terminal问题

到这里还是有一点点的问题的,当然不是配置问题而是软件本身的bug问题。为了呈现这个问题,我直接用run_server.py启动一下服务。

图片.png

图片.png

#通过上图可以看到报了一个Connection Reset By Peer错误。

# /opt/tools/jumpserver-0.3.2/run_server.py

DEBUG:jumpserver:获取授权系统用户: dev
DEBUG:jumpserver:Websocket: session_key: dvb2nsp1fkw1m3m0ieb4xg5ychne03en
DEBUG:jumpserver:Websocket: session: Session object
DEBUG:jumpserver:Websocket: user [ chaishao ] request websocket
DEBUG:jumpserver:Websocket: Open request
DEBUG:jumpserver:set([<PermRole: dev>])
DEBUG:jumpserver:系统用户: dev
DEBUG:jumpserver:Websocket: request web terminal Host: 192.168.14.41 User: chaishao Role: dev
DEBUG:jumpserver:{'ip': u'192.168.14.41', 'role_name': u'dev', 'role_key': u'/opt/tools/jumpserver-0.3.2/keys/user/chaishao_dev.pem', 'user': <User: chaishao>, 'role_pass': '49OCAYCpiIsKo7j3tXpm', 'port': 22, 'asset': <Asset: 192.168.14.41>}
ERROR:tornado.application:Uncaught exception in /ws/terminal   #这里有个报错信息
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 417, in _run_callback
    callback(*args, **kwargs)
  File "/opt/tools/jumpserver-0.3.2/run_server.py", line 367, in on_message
    self.termlog.write(jsondata)
  File "/opt/tools/jumpserver-0.3.2/jlog/views.py", line 267, in write
    self.log[str(time.time() - self.recoderStartTime)] = msg.decode('utf-8', 'replace')
AttributeError: 'dict' object has no attribute 'decode'
DEBUG:jumpserver:Websocket: Close request

#从上面的输出信息可以看到有个错误信息:ERROR:tornado.application:Uncaught exception in /ws/terminal

然后我通过xshell登陆跳板机然后跳转到对应的后端机器是可以的,如下图:

图片.png

#https://github.com/jumpserver/jumpserver/issues     #这里有一些大家使用过程中遇到的问题。

#然后可以看下jumpserver的web界面的右下角:

图片.png

#并没0.3.2版本。

解决办法就是:

 #wget https://github.com/jumpserver/jumpserver/archive/master.zip     #下载master版本,安装过程就不写了,差别并不是太大。

图片.png

#再次查看jumpserver的web界面的右下角看到版本发送了变化。

图片.png

#已经可以通过web界面操作后端服务器了。

# /opt/tools/jumpserver-master/run_server.py

Run server on 0.0.0.0:8000
DEBUG:jumpserver:获取授权系统用户: dev
DEBUG:jumpserver:Websocket: session_key: dvb2nsp1fkw1m3m0ieb4xg5ychne03en
DEBUG:jumpserver:Websocket: session: Session object
DEBUG:jumpserver:Websocket: user [ chaishao ] request websocket
DEBUG:jumpserver:Websocket: Open request
DEBUG:jumpserver:set([<PermRole: dev>])
DEBUG:jumpserver:系统用户: dev
DEBUG:jumpserver:Websocket: request web terminal Host: 192.168.14.41 User: chaishao Role: dev
DEBUG:jumpserver:{'ip': u'192.168.14.41', 'role_name': u'dev', 'role_key': u'/opt/tools/jumpserver-master/keys/user/chaishao_dev.pem', 'user': <User: chaishao>, 'role_pass': '\x84\xd8\xbeIl\xad\x8c\x89\x02\xdc\x1b\x12l\xd7\x8e\xad\xda\x1d\x1f0k\x9a\xb3h\xcey\xdcI#+>3', 'port': 22, 'asset': <Asset: 192.168.14.41>}

#从上面的信息结合上面的截图可以看到web端登录已经没有报错了。

#这还不算完,我们不是用nginx代理嘛,但是nginx的443代理不可以还是报这个错误,算算,就先搞成80端口可以正常使用吧。

# vim /usr/local/nginx/conf/nginx.conf

upstream jumpserver{
    server 127.0.0.1:8000;
}
#server {
#  listen 80;
#  server_name jump.test.com;
#  charset utf-8;
#  rewrite ^/(.*) https://jump.test.com/$1 permanent;
#}
server {
  listen 80;
  server_name jump.test.com;
  location / {
     proxy_pass http://jumpserver;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_read_timeout 86400;
  }
}

# /usr/local/nginx/sbin/nginx -s reload

图片.png

#如果有人知道怎么ssl的形式也可以实现terminal登录可以评论说一下,当然这些都不重要,我们主要还是要使用ssh工具来进行连接操作。

#当然推送任务啥的可以使用ansible,这种远程ssh连接是通过调用paramiko模块的长连接形式实现的。

1.8 jumpserver显示主机配置

图片.png

#怎么样哪些新加的主机也显示操作系统、CPU之类的配置呢?

# cd /opt/tools/jumpserver-master/

#python manage.py crontab add

# crontab  -l

0 1 * * * /bin/python /opt/tools/jumpserver-master/manage.py crontab run 3718e5baf203ed0f54703b2f0b7e9e16 # django-cronjobs for jumpserver
*/10 * * * * /bin/python /opt/tools/jumpserver-master/manage.py crontab run 9956b75140f4453ab1dc4aeb62962a74 # django-cronjobs for jumpserver

#然后定时任务里面会多两条定时任务信息,它们就是通过ansible执行收集服务器信息的操作,然后jumpserver会从采集上来的信息取自己需要的信息。

图片.png

#想要立即显示配置的话,可以再Web页面选中机器点击更新,或者手工执行定时任务里面要执行的语句。

#特别注意,一定要让admin用户已经将密钥推送到了被管理资产机器并且已经获得了他们连接权限才可以,不然的话这里的资产也是显示不出来的。

博文来自:www.51niux.com

二、Jumpserver的一些常用操作

本来想贴图写一写的,转念一想网上相关的博客已经很多了,而且本身jumpserver需要设置的地方也就哪些,所以就贴个其他的人的链接吧。

http://blog.csdn.net/my_bai/article/details/62226474    #记录的操作还是详细的

2.1 备注1

创建用户的操作,以前用的是ldap的形式,这样就避免了在jumpserver系统上面创建对应的系统用户了,但是3.0版本开始就摒弃了ldap这种形式,又改成了创建系统用户的形式,比如你想给wanghai这个用户一些权限让其登录一些机器,那么就会在jumpserver这台服务器上面创建一个叫wanghai的系统用户。

先会在数据库里面添加这个用户,然后会创建系统用户,并且会产生一对密钥对,会存放在/opt/tools/jumpserver-master/keys/user/目录下面,并且会将公钥丢到新创建的系统用户的.ssh目录下面去。

图片.png

#当然私钥是需要密码口令的形式,然后添加用户添加的邮箱就会收到一封邮件,如果不想收邮件的话,会在web页面显示,上面有截图说过了。然后用户就可以通过url或者登陆自己的用户将密钥下载到本地然后通过xshell来通过密钥的形式登陆jumpserver服务器了。

2.2 备注2

如果想快速添加设置,在添加主机的时候可以再管理用户那里选择使用默认。

图片.png

#但是默认是不能勾选的,需要在设置那里设置一下。如下图:

图片.png

#也就是设置默认像管理主机推送的时候使用的用户密码或者密钥以及端口号。这样添加主机的时候选择使用默认好多信息都不用填写了,写个主机IP就可以了。

2.3 备注3

使用普通用户进行sudo操作的话,一般也这么干,就要在授权管理那里进行操作。

图片.png

图片.png

#定义别名以及系统命令的形式,这样在推送的时候就会在被推送的主机上面sudoer文件里面进行修改。

#然后就是系统用户,就是在被推送的主机上面创建对应的系统用户,并且拥有哪些sudo权限,如下图:

图片.png

#如上图选择完要创建的系统用户之后,关联了sudo别名,然后点击推送就可以对资产(单个主机)或者资产组(一群主机)进行推送了,推送的目的也就是在被推送短主机创建系统用户并且给此系统用户创建密码或者创建密钥对,然后就是进行visudo设置,这些都是通过ansible来进行操作的。

#includedir /etc/sudoers.d
Cmnd_Alias NETWORK = /usr/sbin/ifconfig, /usr/sbin/route
dev ALL = (root)  NOPASSWD: NETWORK

#上面就是在对端的sudoer配置文件里面进行的更改

#然后添加规则,就是让用户和系统用户和资产主机相关联,也就是哪个用户拥有哪些主机的哪些权限,如下图:

图片.png

#上图就是创建了一个授权规则,让admin用户和chaishao用户对五台主机都有dev用户所具有的权限。

#也就是让用户和资产主机相关联,资产主机必须是已经推送成功的主机,不然保存失败,然后登录chaishao用户就可以看到自己的管理主机了。管理员如果也想管理资产主机的话,上图就要把管理员admin用户也加一下。然后做到这里用户就可以通过xshell或者自己的web界面来连接自己所能管理的后端主机了。

2.4 备注4

日志审计就是可以看到谁什么时候干了啥事,所以应该一个人一个用户而不要共用一个账户。如下图:

图片.png

#日志审计:在线 查看当前登录的用户登录情况,点击监控查看用户执行的命令, 点击阻断,结束用户的会话

2.5 备注5

关于上传和下载,就是调用的lrzsz这个工具包,上传就是rz,下载就是sz,jumpserver做个中转,然后通过ansible跟被管理机之间进行文件的发送或下载,然后再转给客户端。然后上传的话,就是你先将要上传的文件(文件不是目录哦)上传到jumpserver的/tmp目录下面,然后再发送给被控制端的/tmp目录下面。

现在我上传了一个iso镜像到后端的192.168.14.41,看下目录结构:

jumpserver上的目录结构:

图片.png

192.168.14.41上面的目录结构:

图片.png

#另外要注意的是,当然xshell最大支持4G之内的文件上传,而jumpserver呢可能并不支持这么多的文件上传,如果发现出现上传文件过大的提醒呢,可以更改一个地方:

# vim /opt/tools/jumpserver-master/static/js/dropzone/dropzone.js +296

maxFilesize: 4000,   #默认是256(MB)的,可以加大这里重启服务,当然nginx配置文件那里也要如果上传文件大小做了限制也要调整哦。

2.6 备注6

jumpserver是支持批量的,所以需要批量的话,就做好资产组和用户组,选择用户组来搞事情。当然批量上传或下载的话就得通过xshell通过:分隔的形式选择多个主机,或者web界面的形式选择多个主机了。

# tail -f /opt/tools/jumpserver-master/logs/jumpserver.log   #了解详细的过程或者排查问题,可以通过查看日志的方式

#当然一般建议jumpserver搭建在内网,通过拨通openvpn的形式连接到内网再登录跳板机,然后再搞双机冗余热备,如果有能力的话最好二次开发再使用。

#提问题的网友清下下面

#网页端的上传功能:

请看这个截图:

image.png

#这样你就可以通过web页面上传文件了,但是此文件会产生在跳板机的:

# ls -l /tmp/20180418-235205-ea0d/1.jpg 

-rw-rw-r-- 1 chaishao chaishao 13485 Apr 18 23:52 /tmp/20180418-235205-ea0d/1.jpg

#然后就会把/tmp/20180418-235205-ea0d/拷贝到你制定的机器的/tmp目录下。

xshell的上传功能:

image.png

#xshell登录,用户就是你创建的用户,产生的那个密码是登录web页面用的,然后产生的秘钥和秘钥文件是这里要的。

image.png

#192.168.14.62:192.168.14.63   #多个主机间用:隔开。退出按q。按回车之后就会弹出rz选择框这时候你就可以上传你的文件了。

image.png

#上传成功后会告诉你上传的文件上传到了哪个目录下面。

直连上传文件:

image.png

当然如果你就一台机器的话,你可以通过直接登录机器的方式然后通过rz的方式上传文件。当然这种方式你就可以直接把文件上传到家里面下面了。

作者:忙碌的柴少 分类:Jumpserver 浏览:17193 评论:3
留言列表
小草
小草 请问怎么操作上传文件呢 跳板机的shell上也没有上传的选项  回复
忙碌的柴少
忙碌的柴少 哦你是不是想用admin用户上传文件啊,你得先选择用户拥有哪些主机的管理权限,然后再切换到对应的用户在web界面的(文件上传==》文件上传)上传栏那里就可以选择主机并且选择文件上传了。  回复
忙碌的柴少
忙碌的柴少 我稍微的丰富了下你直接看最下面这段  回复
发表评论
来宾的头像