Python:跳板机审计服务器

1.修改paramiko源码包实现

https://github.com/paramiko/paramiko/tree/1.10.1  下载源码包

unzip paramiko-1.10.1.zip

paramiko/demos/demo.py  模拟用户登录,在demo.py中会调用interactive.py

paramiko/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!‘
		    print
		    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就可以登陆跳板机

展示:

  

原文地址:https://www.cnblogs.com/ywxbbbbb/p/10013177.html

时间: 2024-10-12 09:16:53

Python:跳板机审计服务器的相关文章

python 跳板机日志审计系统

下载安装Ajaxterm 创建一个新用户 这里我建了一个ip.txt文件存放ip地址 su - HaojieMao vi term__ssh.py 代码如下: #! /usr/bin/env python import os ip_file = 'ip.txt' ip_dic = {} num = 0 f = file(ip_file) while True: num += 1 line = f.readline() if len(line) == 0:break ip_dic[num] = l

python 跳板机登录脚本

这里有个功能没能实现,就是让人员自己输入密码,交互式的.传入密码进来,而不是在这里定义好. 还望指点.想在python这里实现交互让用户输入MySQL的密码 passwd = '123.com' logou_flag = False for i in range(3):     user_input = raw_input("Please input your passwd:").strip()     if len(user_input) ==0:continue     if us

python 跳板机程序

[[email protected] ~]# cat /home/python/term_console.py #!/usr/bin/env python import os ip_file = 'ip.txt' log_file = "/home/python/a.txt" ip_dic = {} num = 0 f = file(ip_file) while True:     num += 1     line = f.readline()     if len(line) ==

运维堡垒机(跳板机)系统 python

相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有 身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了上述功能. AD:2014WOT全球软件技术峰会北京站 课程视频发布 11月21日-22日 与WOT技术大会相约深圳 现在抢票 相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有 身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了

记述一次通过跳板机部署内网服务器

前几天做了一个任务,需要将一个配置参数下发服务器部署到客户的服务器上,之前没弄过这个,中间耽误了点时间,现在对涉及到的技术做一下总结,为了保护客户的隐私,下面设计到具体数据的地方都是为描述方便虚拟的,并不是真实的. 网络架构大概是这个样子的: 我是没办法直接连到配置参数下发服务器的,中间需要通过一台跳板机,所谓的跳板机可以看做是一台带Linux操作系统的路由器,上面一般会有很多网卡(物理的或者虚拟的),这些网卡连接到了不同的网络,从不同网络过来的连接可以通过这里中转. 这里的跳板机主要目的就是为

ansible工具如果通过堡垒机或者跳板机管理远程服务器

在ansible的使用过程中,存在这样的场景,ansible所在的管理节点与被管理的机器需要 通过一个跳板机才能连接,无法直接连接.要解决这个问题,并不需要在 ansible里做什么处理,而是在ssh连接层面解决这个问题. 例如, 我们有三类节点: 管理节点,admin.example.com,是执行ansible命令的服务器 被管理的节点,internal1.example.com, internal2.example.com 跳板机,bastion.example.com 管理节点不能直连

jmeter连接配置带跳板机(SSH)的mysql服务器

jmeter连接配置mysql服务器时,如果数据库服务器没有通过ssh连接,则只需要配置相应的jdbc参数就可以了,即请求域名或ip地址:3306,如果数据库服务器是通过SSH连接的,那需要通过中间远程连接工具来登录,此处使用的远程连接工具为Putty,配置的时候需要将数据库的ssh->tunnel中的请求域名先映射到本地3306的端口(一般mysql的请求端口设置为3306,只是符合大众流~~~),然后通过ssh的服务器ip及端口来访问,具体的配置请参考如下: 1.首先,下载并打开Putty喽

【效率工具】SSH一键登录脚本(可一键从跳板机登录线上服务器)

说明 前阵子上线,一次性上了十个服务,一直上到凌晨才完事,期间每个服务都要先输入跳板机的登录信息来登录跳板机,然后再输入线上服务器的信息来登录线上服务器,实在是太过于麻烦,而且有些服务还有好几台服务器,检查问题的时候,服务器跳来跳去的,简直苦不堪言. 于是,便萌发了用shell脚本的方式来一键跳转的想法,先上github上搜了搜现成的轮子,发现都不太好用,要不就是没说明,要不就是只能登一台服务器,不能满足从跳板机A跳转到线上服务器B的需求. 所以,还是自己动手,丰衣足食. Shell脚本 She

mysql ssh 跳板机(堡垒机???)连接服务器

跳板机(Jump Server),也称堡垒机,是一类可作为跳板批量操作远程设备的网络设备,是系统管理员或运维人员常用的操作平台之一. 正常的登录流程 使用ssh命令登录跳板机: 登录跳板机成功后,在跳板机分配的终端中使用ssh命令再登录开发机,跳板机和开发机之间采用带密码的ssh验证,因此需要输入ssh私钥的密码. ssh隧道(通过跳板机)连接mysql 案例: A服务器   B服务器   C服务器mysql 现在mysql服务器C只能通过内网访问,B服务器就能通过内网连接访问到mysql A服