運転次元python進行(一)nmapスキャンポート


紹介する
python-nmapはシステムnmapコマンドに基づくポートスキャンツールであり、使いやすい.
最近では、サーバのセキュリティと監督管理を強化するために、毎日会社のサーバをオープンポートでスキャンして記録する必要があり、増加すると減少することがわかります.
前にshellで書いたhttps://github.com/bashhu/monitor-shell/blob/master/python-script/scan_port.sh
最近、私たちのメンテナンスプラットフォームを改善し、スクリプトを再作成し、プラットフォームの呼び出しを容易にするつもりです.
https://github.com/bashhu/monitor-shell/blob/master/python-script/scan_port.py
                                 
In [17]: import nmap
 nmap              
In [18]: s=nmap.PortScanner()
  scan('192.168.0.0/16',port='0-65536','sV')  ,       ,    ,nmap   
In [19]: result = s.scan('192.168.199.211', '20-443','')
  result      
In [20]: print result
{'nmap': {'scanstats': {'uphosts': '1', 'timestr': 'Sat Dec 17 16:24:11 2016', 'downhosts': '0', 'totalhosts': '1', 'elapsed': '0.11'}, 'scaninfo': {'tcp': {'services': '20-443', 'method': 'syn'}}, 'command_line': 'nmap -oX - -p 20-443 192.168.199.211'}, 'scan': {'192.168.199.211': {'status': {'state': 'up', 'reason': 'localhost-response'}, 'hostnames': [{'type': 'PTR', 'name': 'salt'}], 'vendor': {}, 'addresses': {'ipv4': '192.168.199.211'}, 'tcp': {80: {'product': '', 'state': 'open', 'version': '', 'name': 'http', 'conf': '3', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': ''}, 443: {'product': '', 'state': 'open', 'version': '', 'name': 'https', 'conf': '3', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': ''}, 22: {'product': '', 'state': 'open', 'version': '', 'name': 'ssh', 'conf': '3', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': ''}}}}}
          
In [21]: s.
            s.all_hosts             s.csv                   s.listscan              s.scaninfo              
            s.analyse_nmap_xml_scan s.get_nmap_last_output  s.nmap_version          s.scanstats             
            s.command_line          s.has_host              s.scan 
            
       
In [21]: s.all_hosts()
Out[21]: ['192.168.199.211']  
           
In [23]: s['192.168.199.211'].keys()
Out[23]: ['status', 'hostnames', 'vendor', 'addresses', 'tcp']  
    tcp       
In [26]: s['192.168.199.211']['tcp'].keys()
Out[26]: [80, 443, 22]
  22       
In [30]: s['192.168.199.211']['tcp'][22]
Out[30]: 
{'conf': '3',
 'cpe': '',
 'extrainfo': '',
 'name': 'ssh',
 'product': '',
 'reason': 'syn-ack',
 'state': 'open',
 'version': ''}

上からs=nmapが見えます.PortScanner()をインスタンス化すると、「s」に情報が格納され、「s」はjsonからデータを取り出すように超便利になります.
次はシナリオの原理です.レンガを撮って、もっと良い意見を言ってください.
  • python-nmapモジュールに依存してフェースセグメントをスイープするか、ipポート
  • を指定します.
  • redis内の昨日のipのポートセットと比較し、相互差セットを取得してテキスト
  • に記録する.
  • 昨日のポートスイープレコードを削除し、今日の情報ipをKEYポートとしてセットでredis
  • に記録する
    #!/bin/bash
    '''
    	author: baishaohua
    	date: 20161215
    '''
    host='192.168.1.224'
    port='6379'
    import nmap
    import redis
    import time
    ctime = time.strftime('%Y_%m_%d')
    r = redis.StrictRedis(host,port=port,db=12)
    
    def get_info(ip):
            '''    ,           '''
    	a=[]
    	for i in r.smembers(ip):
    		a.append(int(i))
    	return a
    	
    def set_info(ip, port_list):
    	r.delete(ip)#         ,           
    	try:
    		for port in port_list:
    			r.sadd(ip, port)
    	except:
    		print "set redis err"
    		
    def r_log(msg):
    	f_path = "/tmp/report_%s.txt" % ctime
    	f = open(f_path, 'a+')
    	f.write(msg)
    	f.close()
    
    def scan_port(my_ip,port_range):
    	'''
    	tow parameter: ip,port. will return a port list 
    	'''
    	s = nmap.PortScanner()
    	result = s.scan(my_ip,port_range,'')
    	return s[my_ip]['tcp'].keys()
    
    def scan_ips(ip_range,port_range):
            '''
            tow parameter: ip,port. will return a port list 
            '''
            s = nmap.PortScanner()
            result = s.scan(ip_range,port_range,'')
    	report_key = "report_%s" % ctime
    	a  = {}
    	b  = {}
    	for i in s.all_hosts():
    		a[i] = set(get_info(i))
    		b[i] = set(s[i]['tcp'].keys())
    		if r.exists(i):
    			less_port = a[i].difference(b[i])
    			add_port = b[i].difference(a[i])
    			if len(add_port)>0 and len(less_port)>0:
    				msg = "%s port %s new open \t   %s have close
    " % (i, add_port, less_port) print msg r_log(msg) elif len(add_port)>0: msg = "%s port %s new open 
    " % (i, add_port) print msg r_log(msg) elif len(less_port)>0: msg = "%s port %s close 
    " % (i, less_port) print msg r_log(msg) else: print "%s port no change: %s , %s" % (i, a[i], b[i]) set_info(i, s[i]['tcp'].keys()) else: msg = "new host: %s port %s  open
    " % (i, s[i]['tcp'].keys()) print msg r_log(msg) set_info(i,s[i]['tcp'].keys()) def __main__():     scan_ips('192.168.1.211/28','20-8080')