Python:webshell 跳板机审计服务器
1.修改paramiko源码包实现
https://github.com/paramiko/paramiko/tree/1.10.1 下载源码包
unzip paramiko-1.10.1.zip
paramiko-1.10.1/demos/demo.py 模拟用户登录,在demo.py中会调用interactive.py
paramiko-1.10.1/demos/interactive.py 会把用户执行的命令以及服务器返回的结果打印出来
修改interactive.py,可以把用户名、执行的命令、时间、主机ip记录到日志中
demo.py
- import base64
- from binascii import hexlify
- import getpass
- import os
- import select
- import socket
- import sys
- import threading
- import time
- import traceback
- import paramiko
- import interactive
- #define host
- print("\033[34;1mWelcome zhengshun's Fort Machine\nThere have those machines:\033[0m")
- dictroy = {
- "vc-app01":"192.168.101.131",
- "vc-app02":"192.168.101.130",
- "vc-app03":"192.168.101.132"
- }
- while 1:
- try:
- print('')
- for k,v in dictroy.items():
- print k,v
- print('')
- hostname = raw_input('please input IP:')
- if hostname == '':continue
- elif hostname == 'exit':break
- elif hostname == 'quit':break
- def agent_auth(transport, username):
- """
- Attempt to authenticate to the given transport using any of the private
- keys available from an SSH agent.
- """
- agent = paramiko.Agent()
- agent_keys = agent.get_keys()
- if len(agent_keys) == 0:
- return
- for key in agent_keys:
- print 'Trying ssh-agent key %s' % hexlify(key.get_fingerprint()),
- try:
- transport.auth_publickey(username, key)
- print '... success!'
- return
- except paramiko.SSHException:
- print '... nope.'
- def manual_auth(username, hostname):
- default_auth = 'p'
- auth = 'p'
- if len(auth) == 0:
- auth = default_auth
- if auth == 'r':
- default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
- path = raw_input('RSA key [%s]: ' % default_path)
- if len(path) == 0:
- path = default_path
- try:
- key = paramiko.RSAKey.from_private_key_file(path)
- except paramiko.PasswordRequiredException:
- password = getpass.getpass('RSA key password: ')
- key = paramiko.RSAKey.from_private_key_file(path, password)
- t.auth_publickey(username, key)
- elif auth == 'd':
- default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_dsa')
- path = raw_input('DSS key [%s]: ' % default_path)
- if len(path) == 0:
- path = default_path
- try:
- key = paramiko.DSSKey.from_private_key_file(path)
- except paramiko.PasswordRequiredException:
- password = getpass.getpass('DSS key password: ')
- key = paramiko.DSSKey.from_private_key_file(path, password)
- t.auth_publickey(username, key)
- else:
- pw = '123456'
- t.auth_password(username, pw)
- # setup logging
- paramiko.util.log_to_file('demo.log')
- username = 'root'
- if len(hostname) == 0:
- print '*** Hostname required.'
- sys.exit(1)
- port = 22
- if hostname.find(':') >= 0:
- hostname, portstr = hostname.split(':')
- port = int(portstr)
- # now connect
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((hostname, port))
- except:
- print('\033[31;1minvalid value\033[0m')
- continue
- #except Exception, e:
- # print '*** Connect failed: ' + str(e)
- # traceback.print_exc()
- # sys.exit(1)
- try:
- t = paramiko.Transport(sock)
- try:
- t.start_client()
- except paramiko.SSHException:
- print '*** SSH negotiation failed.'
- sys.exit(1)
- try:
- keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
- except IOError:
- try:
- keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts'))
- except IOError:
- print '*** Unable to open host keys file'
- keys = {}
- # check server's host key -- this is important.
- key = t.get_remote_server_key()
- if not keys.has_key(hostname):
- print '*** WARNING: Unknown host key!'
- elif not keys[hostname].has_key(key.get_name()):
- print '*** WARNING: Unknown host key!'
- elif keys[hostname][key.get_name()] != key:
- print '*** WARNING: Host key has changed!!!'
- sys.exit(1)
- else:
- print '*** Host key OK.'
- # get username
- if username == '':
- default_username = getpass.getuser()
- username = raw_input('Username [%s]: ' % default_username)
- if len(username) == 0:
- username = default_username
- agent_auth(t, username)
- if not t.is_authenticated():
- manual_auth(username, hostname)
- if not t.is_authenticated():
- print '*** Authentication failed. :('
- t.close()
- sys.exit(1)
- chan = t.open_session()
- chan.get_pty()
- chan.invoke_shell()
- print '*** Here we go!'
- interactive.interactive_shell(chan)
- chan.close()
- t.close()
- except Exception, e:
- print '*** Caught exception: ' + str(e.__class__) + ': ' + str(e)
- traceback.print_exc()
- try:
- t.close()
- except:
- pass
- sys.exit(1)
- except:
- continue
2.创建跳板机用户,并设置用户登陆的环境变量
注意事项:用户登录跳板机后不能跳过demo.py程序,如果退出demo.py程序则注销跳板机的登陆,只能选择要登陆的主机ip,选择后直接登陆,如果用户在输入错误时,要循环从头开始
adduser audit
vim /home/audit/.bash_profile 在环境变量中加入执行python demo.py文件,执行后logout
3.使用shellinabox实现webssh
https://code.google.com/archive/p/shellinabox/downloads 下载shellinabox-2.14.tar.gz
tar zxf shellinabox-2.14.tar.gz
cd shellinabox-2.14
./configure --prefix=/usr/local/webshell && make && make install
bash /usr/local/webshell/bin/shellinaboxd & 后台运行,shellinabox默认端口是4200
访问https://ip:4200就可以登陆跳板机
展示:
Python:webshell 跳板机审计服务器的更多相关文章
- python实现跳板机
公司有1000多台服务器,线上机器都是禁止root登录的,所以平时是用普通用户登录,然后在su到root,密码都是在excel表中存的,这样登录一台机器,输两次命令,搜两次密码,实在很麻烦,有一天备份 ...
- winScp 跳板机到服务器
http://jingyan.baidu.com/article/454316ab6ffe1af7a7c03a31.html?qq-pf-to=pcqq.group
- Python通过跳板机链接MySQL的一种方法
- 运维堡垒机(跳板机)系统 python
相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有 身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了上述功能. A ...
- 不输入用户名密码通过跳板机登录到线上linux机器
问题: 一般情况下,公司所有的服务器都在内网,公网访问.管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址.我们经常看到的现象就是下图这样, ...
- 【python】-- paramiko、跳板机(堡垒机)
paramiko Python的paramiko模块,该模块用于连接远程服务器并执行相关命令,常用于作批量管理使用 一.下载: pip3 install paramiko 源码:查看 二.parami ...
- 使用pycharm、跳板机连接内网服务器
使用pycharm.跳板机连接内网服务器 接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器. 总体就是实验室服务器仅限内网访 ...
- 在有跳板机的情况下,SecureCRT自动连接到目标服务器
为了服务器的安全,运维人员经常会要求我们先登录到跳板机,然后再SSH连接到目标服务器.但是这样是很繁琐的,每次在SecureCRT创建一个连接,都需要输入SSH命令,然后输入密码. 下面的方法可以实现 ...
- jmeter连接配置带跳板机(SSH)的mysql服务器
jmeter连接配置mysql服务器时,如果数据库服务器没有通过ssh连接,则只需要配置相应的jdbc参数就可以了,即请求域名或ip地址:3306,如果数据库服务器是通过SSH连接的,那需要通过中间远 ...
随机推荐
- HDU1180:诡异的楼梯
传送门 题意 迷宫搜索 分析 这题写起来挺简单的,锻炼搜索基本功,一开始用记忆化搜索TLE了,改用访问标记,0ms过了,用优先队列保证终点最快达到,我会在代码中提供一些强力数据 trick 1.遇到梯 ...
- bzoj 4785: [Zjoi2017]树状数组【树套树】
参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现 ...
- caj转pdf——包含下载链接
很多人在知网上下载论文后,想转换成PDF格式,本片一站式教学,包含下载链接. 需要工具 1 caj格式的文件,即要转换的文件. 2 cajviewer,可以在知网的官网上面下载,下载地址参考这里. 3 ...
- jQuery笔记之data方法
成品图如下所示: 搭建HTML+CSS结构 <style> /* 给tpl设置为不可见,因为我们不需要用到他,我们只是要克隆他身上的东西,克隆完就把他删掉.就跟渣男一样!!!*/ .tpl ...
- BZOJ4571
BZOJ4571 Description Transmission Gate 给定n个数, m次询问, 每次询问[l,r]范围内的数加上x后异或b的最大值, x, b给出. \[n,m <= 2 ...
- MySQL DECIMAL数据类型
https://blog.csdn.net/zyz511919766/article/details/49335565
- jdk线程池,使用手记
Executors----------------------------------------------Executors------------------------------------ ...
- dotnet cors 跨域问题
研究了一整子的.net core框架,感觉挺好用的,可以用在实际项目中,前端avalon框架也在研究: 问题:跨域,相比原来的跨域解决方案,还是有不小的变化的,原来的.net api 只需要在WebA ...
- logging模块基础3
1.logging模块的日志级别 CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 D ...
- css的过渡背景色
css3新增的渐变背景色属性用法 原博客地址:http://caibaojian.com/css3-background-gradient.html