安全一直是我观注的重点,为防止规则直接上线误杀正常请求,通过交换机流量静像到我的一台机器,进行流量静像分析,匹配我的规则,抓除需要加入白名单的url,然后联动nginx 和前端防火墙,行成一套入侵防御系统,以下只为针对七层做分析,稍后会对四层数据一起分析入库

config下whiteurl.py中添加需要过滤的白名单即可,当然可以是txt,可根据自己的实际情况进行修改,核心代码就这么多,IP库自己下一个就可以了

waf

代码如下:
waf.py

# !/usr/bin/env python
#-*- coding: utf-8 -*-
#=============================================================================
#     FileName: test.py
#         Desc:
#       Author: 苦咖啡
#        Email: voilet@qq.com
#     HomePage: http://blog.kukafei520.net
#      Version: 0.0.1
#   LastChange: 2014-09-01
#      History:
#=============================================================================
import pcap
import dpkt
import sys
import time
import re

#初始化ip库
from api.QQWry import *
from check_data import hack_filter, hackerinfo
#导入白名单
from config.whiteurl import *

pc = pcap.pcap("p2p1")    #注,参数可为网卡名,如eth0
pc.setfilter('tcp port 80')    #设置监听过滤器



for ts, buf in pc:    #ptime为收到时间,pdata为收到数据

    eth = dpkt.ethernet.Ethernet(buf)
    ip = eth.data
    tcp = ip.data
    src_ip = '%d.%d.%d.%d' % tuple(map(ord, list(eth.data.src)))
    src_time = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(ts + 28800))

    try:
        if tcp.dport == 80:

            http = dpkt.http.Request(tcp.data)

            #截取url以便白名单验证
            get_data_url = http.uri.split("?")[0]

            check_data = hack_filter(http)
            result = check_data.run()

            if result["status"] and get_data_url not in url_list:

                hack_data = hackerinfo(http, result["acl"], src_ip, src_time)
                hack_status = hack_data.run()

                print hack_status

    except:pass

源码下载地址:

https://github.com/voilet/waf

(更多…)

九月 4th, 2014

Posted In: python

最近使用python写一脚本,就字符串中数字问题,网上查了下原来python早都为我们提供了很好的方法,在次感叹自己python的无知,在此做下记录

>>> crazystring = ‘dade142.;!0142f[.,]ad’

只保留数字 >>> filter(str.isdigit, crazystring) ‘1420142’

只保留字母 >>> filter(str.isalpha, crazystring) ‘dadefad’

只保留字母和数字 >>> filter(str.isalnum, crazystring) ‘dade1420142fad’

如果想保留数字0-9和小数点’.’ 则需要自定义函数

>>> filter(lambda ch: ch in ‘0123456789.’, crazystring) ‘142.0142.’

或者使用正则表达式或循环

九月 2nd, 2014

Posted In: python

我们常常在使用saltstack的时候,需要根据不同主机名或id去区分不同业务,不同环境,同时我们又不想写太多配置文件,在saltstack里提供了salt[‘grains.filter_by’]的使用方法,可以轻松快速帮我们解决多环境下发不同配置文件及参数,直接上代码

我的主机名如下

[root@localhost ~]# salt 'java-15' grains.item fqdn
java-15:
  fqdn: l-salttest1.ops.beta.bj1

我们新建一个map.jinja文件

{% set env = salt['grains.filter_by']({
    'prod': {
        'file_path': '/tmp/prod.txt',
        'salt_source_path': 'salt://test/test.conf',

    },
    'beta': {
        'file_path': '/tmp/beta.txt',
        'salt_source_path': 'salt://test/test.conf',
    },
}, 'env', default='st')%}

在我们的init.sls中引用我们添加的变量,这里我们要注意哦 import env是set env,env就是你定议需要加载的名称就是一个json的key,你可以定义多个

{% from 'test/map.jinja' import env with context %}

test:
  file.managed:
    - source: {{env.salt_source_path}}
    - name: {{ env.file_path }}
    - user: root
    - group: root
    - mode: 644
    - template: jinja

看我们使用的结果

salt2

 

这里salt自动截取我们fqdn中的值做key,需要使用自定义grains
我的grains定义如下

# !/usr/bin/env python
#-*- coding: utf-8 -*-
#=============================================================================
#     FileName: node.py
#         Desc:
#       Author: 苦咖啡
#        Email: voilet@qq.com
#     HomePage: http://blog.kukafei520.net
#      Version: 0.0.1
#   LastChange: 2014-08-20
#      History:
#=============================================================================
import commands
def node():
    """
    取主机名相应字段
    """
    grains = {}
    hostname = commands.getoutput("hostname")
    data = hostname.split(".")
    grains['room'] = data[-1]
    grains['env'] = data[2]
    grains['project'] = data[1]
    grains['pro_name'] = data[0].split("-")[1]
    return grains

然后执行以下命令

state “*” saltutil.sync_all

salt ‘*’ sys.reload_modules

 

我们来看下代码
salt3

def filter_by(lookup_dict, grain='os_family', merge=None, default='default'):
   ret = lookup_dict.get(
            __grains__.get(
                grain, default),
            lookup_dict.get(
                default, None)
            )

    if merge:
        if not isinstance(merge, collections.Mapping):
            raise SaltException('filter_by merge argument must be a dictionary.')

        else:

            if ret is None:
                ret = merge

            else:
                salt.utils.dictupdate.update(ret, merge)

    return ret

其实非常简单,第一个传一个字典,第二个是我们传的变量,默认是取当前系统是centos还是debian,所以只要传我们自己定义的变量,就可以获取到我们想要的key和value

九月 1st, 2014

Posted In: 网络技术

无觅相关文章插件,快速提升流量