堡垒机大家都已经不在陌生,堡垒机不仅仅是跳板机,还会有操作日志审计等一系列的功能,简而言之就是你对服务器的操作就是交给堡垒机,堡垒机会验证你的权限,有对应主机的权限才能做相应的操作。堡垒机分商业的也分开源的,当然开源大家印象比较深的就是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
我这里操作系统用的是Centos7.2,jumpserver的版本是最新的0.3.2.
# 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:
按照上面当执行# ./install.py的时候会发现并没有执行过去:
请务必先查看wiki https://github.com/jumpserver/jumpserver/wiki
支持的平台: CentOS, RedHat, Fedora, Debian, Ubuntu, Amazon Linux, 暂不支持其他平台安装.
#如上图并没有出现安装过程
解决办法:
# 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。
#上图就是卡在了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
解决完上面两个错误,就应该没啥问题了,就要到输入一些信息的地方了。
#自己会给自己发一封邮件来进行发送邮件是否OK。
#到上图这里就已经安装结束了。
#可见本地启动了一个mysqld服务还启动了一个8000端口,这是django的服务。
浏览器访问URL:http://192.168.14.40:8000/login/
#192.168.14.40就是我jumpserver的IP地址。
#通过上图可以验证出web登陆已经没问题了。
./service.sh stop #jumpserver安装包里面有一个脚本文件,通过传参可以做到服务的关闭启动以及重启操作,如下图:
博文来自:www.51niux.com
#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
#测试登录也是可以的,说明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 = [email protected]
email_host_password = 51niux
email_use_tls = True
email_use_ssl = False
#如果上面的url不更改的话,创建用户的时候发送邮件提示的是下面的截图的形式:
#如果上面的url更改为域名的话,创建用户的时候发送邮件提示的是下面的截图的形式:
#另外:后端服务器如果开启了selinux,请安装libselinux-python,当然默认在执行install.sh的时候就会把这个包安装上了。
到这里还是有一点点的问题的,当然不是配置问题而是软件本身的bug问题。为了呈现这个问题,我直接用run_server.py启动一下服务。
#通过上图可以看到报了一个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登陆跳板机然后跳转到对应的后端机器是可以的,如下图:
#https://github.com/jumpserver/jumpserver/issues #这里有一些大家使用过程中遇到的问题。
#然后可以看下jumpserver的web界面的右下角:
#并没0.3.2版本。
解决办法就是:
#wget https://github.com/jumpserver/jumpserver/archive/master.zip #下载master版本,安装过程就不写了,差别并不是太大。
#再次查看jumpserver的web界面的右下角看到版本发送了变化。
#已经可以通过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': }
#从上面的信息结合上面的截图可以看到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
#如果有人知道怎么ssl的形式也可以实现terminal登录可以评论说一下,当然这些都不重要,我们主要还是要使用ssh工具来进行连接操作。
#当然推送任务啥的可以使用ansible,这种远程ssh连接是通过调用paramiko模块的长连接形式实现的。
#怎么样哪些新加的主机也显示操作系统、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会从采集上来的信息取自己需要的信息。
#想要立即显示配置的话,可以再Web页面选中机器点击更新,或者手工执行定时任务里面要执行的语句。
#特别注意,一定要让admin用户已经将密钥推送到了被管理资产机器并且已经获得了他们连接权限才可以,不然的话这里的资产也是显示不出来的。
博文来自:www.51niux.com
本来想贴图写一写的,转念一想网上相关的博客已经很多了,而且本身jumpserver需要设置的地方也就哪些,所以就贴个其他的人的链接吧。
http://blog.csdn.net/my_bai/article/details/62226474 #记录的操作还是详细的
创建用户的操作,以前用的是ldap的形式,这样就避免了在jumpserver系统上面创建对应的系统用户了,但是3.0版本开始就摒弃了ldap这种形式,又改成了创建系统用户的形式,比如你想给wanghai这个用户一些权限让其登录一些机器,那么就会在jumpserver这台服务器上面创建一个叫wanghai的系统用户。
先会在数据库里面添加这个用户,然后会创建系统用户,并且会产生一对密钥对,会存放在/opt/tools/jumpserver-master/keys/user/目录下面,并且会将公钥丢到新创建的系统用户的.ssh目录下面去。
#当然私钥是需要密码口令的形式,然后添加用户添加的邮箱就会收到一封邮件,如果不想收邮件的话,会在web页面显示,上面有截图说过了。然后用户就可以通过url或者登陆自己的用户将密钥下载到本地然后通过xshell来通过密钥的形式登陆jumpserver服务器了。
如果想快速添加设置,在添加主机的时候可以再管理用户那里选择使用默认。
#但是默认是不能勾选的,需要在设置那里设置一下。如下图:
#也就是设置默认像管理主机推送的时候使用的用户密码或者密钥以及端口号。这样添加主机的时候选择使用默认好多信息都不用填写了,写个主机IP就可以了。
使用普通用户进行sudo操作的话,一般也这么干,就要在授权管理那里进行操作。
#定义别名以及系统命令的形式,这样在推送的时候就会在被推送的主机上面sudoer文件里面进行修改。
#然后就是系统用户,就是在被推送的主机上面创建对应的系统用户,并且拥有哪些sudo权限,如下图:
#如上图选择完要创建的系统用户之后,关联了sudo别名,然后点击推送就可以对资产(单个主机)或者资产组(一群主机)进行推送了,推送的目的也就是在被推送短主机创建系统用户并且给此系统用户创建密码或者创建密钥对,然后就是进行visudo设置,这些都是通过ansible来进行操作的。
#includedir /etc/sudoers.d
Cmnd_Alias NETWORK = /usr/sbin/ifconfig, /usr/sbin/route
dev ALL = (root) NOPASSWD: NETWORK
#上面就是在对端的sudoer配置文件里面进行的更改
#然后添加规则,就是让用户和系统用户和资产主机相关联,也就是哪个用户拥有哪些主机的哪些权限,如下图:
#上图就是创建了一个授权规则,让admin用户和chaishao用户对五台主机都有dev用户所具有的权限。
#也就是让用户和资产主机相关联,资产主机必须是已经推送成功的主机,不然保存失败,然后登录chaishao用户就可以看到自己的管理主机了。管理员如果也想管理资产主机的话,上图就要把管理员admin用户也加一下。然后做到这里用户就可以通过xshell或者自己的web界面来连接自己所能管理的后端主机了。
日志审计就是可以看到谁什么时候干了啥事,所以应该一个人一个用户而不要共用一个账户。如下图:
#日志审计:在线 查看当前登录的用户登录情况,点击监控查看用户执行的命令, 点击阻断,结束用户的会话
关于上传和下载,就是调用的lrzsz这个工具包,上传就是rz,下载就是sz,jumpserver做个中转,然后通过ansible跟被管理机之间进行文件的发送或下载,然后再转给客户端。然后上传的话,就是你先将要上传的文件(文件不是目录哦)上传到jumpserver的/tmp目录下面,然后再发送给被控制端的/tmp目录下面。
现在我上传了一个iso镜像到后端的192.168.14.41,看下目录结构:
jumpserver上的目录结构:
192.168.14.41上面的目录结构:
#另外要注意的是,当然xshell最大支持4G之内的文件上传,而jumpserver呢可能并不支持这么多的文件上传,如果发现出现上传文件过大的提醒呢,可以更改一个地方:
# vim /opt/tools/jumpserver-master/static/js/dropzone/dropzone.js +296
maxFilesize: 4000, #默认是256(MB)的,可以加大这里重启服务,当然nginx配置文件那里也要如果上传文件大小做了限制也要调整哦。
jumpserver是支持批量的,所以需要批量的话,就做好资产组和用户组,选择用户组来搞事情。当然批量上传或下载的话就得通过xshell通过:分隔的形式选择多个主机,或者web界面的形式选择多个主机了。
# tail -f /opt/tools/jumpserver-master/logs/jumpserver.log #了解详细的过程或者排查问题,可以通过查看日志的方式
#当然一般建议jumpserver搭建在内网,通过拨通open的形式连接到内网再登录跳板机,然后再搞双机冗余热备,如果有能力的话最好二次开发再使用。
#提问题的网友清下下面
#网页端的上传功能:
请看这个截图:
#这样你就可以通过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的上传功能:
#xshell登录,用户就是你创建的用户,产生的那个密码是登录web页面用的,然后产生的秘钥和秘钥文件是这里要的。
#192.168.14.62:192.168.14.63 #多个主机间用:隔开。退出按q。按回车之后就会弹出rz选择框这时候你就可以上传你的文件了。
#上传成功后会告诉你上传的文件上传到了哪个目录下面。
直连上传文件:
当然如果你就一台机器的话,你可以通过直接登录机器的方式然后通过rz的方式上传文件。当然这种方式你就可以直接把文件上传到家里面下面了。