diff --git a/main.go b/main.go index 95946ad..6421f53 100644 --- a/main.go +++ b/main.go @@ -25,22 +25,30 @@ import ( "time" ) +// 主机安全配置 +type HostSafe struct { + RevProxy *httputil.ReverseProxy + Rule utils.RuleHelper + TargetHost string +} + var ( // 建立域名和目标map - hostTarget = map[string]string{ + /*hostTarget = map[string]string{ //"mybaidu1.com:8082": "http://dhjemu.binaite.net", //"mybing2.com:8082": "http://djdemu.binaite.net", - } + }*/ // 用于缓存 httputil.ReverseProxy - hostProxy = map[string]*httputil.ReverseProxy{} + /*hostProxy = map[string]*httputil.ReverseProxy{}*/ + + hostTarget = map[string]*HostSafe{} ipcBuff = []byte{} //ip数据 server_online = map[int]innerbean.ServerRunTime{} //所有证书情况 对应端口 可能多个端口都是https 443,或者其他非标准端口也要实现https证书 all_certificate = map[int]map[string]*tls.Certificate{} //all_certificate = map[int] map[string] string{} - esHelper utils.EsHelper - ruleHelper utils.RuleHelper + esHelper utils.EsHelper ) type baseHandle struct{} @@ -130,24 +138,28 @@ func (h *baseHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) { BODY: string(bodyByte), } esHelper.BatchInsert(weblogbean) - - if !CheckIP(weblogbean.SRC_IP) { + rule := &innerbean.WAF_REQUEST_FULL{ + SRC_INFO: weblogbean, + ExecResult: 0, + } + hostTarget[host].Rule.Exec("fact", rule) + if rule.ExecResult == 1 { log.Println("no china") + w.Header().Set("WAF", "SAMWAF DROP") w.Write([]byte(" no china " + host)) - return } // 取出代理ip // 直接从缓存取出 - if fn, ok := hostProxy[host]; ok { - fn.ServeHTTP(w, r) + if hostTarget[host].RevProxy != nil { + hostTarget[host].RevProxy.ServeHTTP(w, r) return } // 检查域名白名单 if target, ok := hostTarget[host]; ok { - remoteUrl, err := url.Parse(target) + remoteUrl, err := url.Parse(target.TargetHost) if err != nil { log.Println("target parse fail:", err) return @@ -157,7 +169,7 @@ func (h *baseHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) { proxy.ModifyResponse = modifyResponse() proxy.ErrorHandler = errorHandler() - hostProxy[host] = proxy // 放入缓存 + hostTarget[host].RevProxy = proxy // 放入缓存 proxy.ServeHTTP(w, r) return } @@ -178,8 +190,7 @@ func modifyResponse() func(*http.Response) error { } func main() { - ruleHelper.LoadRule("") - rule := &innerbean.WAF_REQUEST_FULL{ + /*rule := &innerbean.WAF_REQUEST_FULL{ SRC_INFO: innerbean.WebLog{ HOST: "cc9", URL: "", @@ -200,7 +211,7 @@ func main() { ruleerr := ruleHelper.Exec("fact", rule) if ruleerr != nil { log.Fatal(ruleerr) - } + }*/ esHelper.Init() @@ -270,8 +281,18 @@ func main() { Status: 0, } } + + //加载主机对于的规则 + ruleHelper := utils.RuleHelper{} + ruleHelper.LoadRule("") + + hostsafe := &HostSafe{ + RevProxy: nil, + Rule: ruleHelper, + TargetHost: hosts[i].Remote_host + ":" + strconv.Itoa(hosts[i].Remote_port), + } //赋值到白名单里面 - hostTarget[hosts[i].Host+":"+strconv.Itoa(hosts[i].Port)] = hosts[i].Remote_host + ":" + strconv.Itoa(hosts[i].Remote_port) + hostTarget[hosts[i].Host+":"+strconv.Itoa(hosts[i].Port)] = hostsafe } for k, v := range server_online { diff --git a/utils/rulehelper.go b/utils/rulehelper.go index 137656c..d80efeb 100644 --- a/utils/rulehelper.go +++ b/utils/rulehelper.go @@ -22,21 +22,21 @@ func (rulehelper *RuleHelper) LoadRule(drls string) { ruleBuilder := builder.NewRuleBuilder(knowledgeLibrary) drls = ` -rule CheckValues "Check the default values" salience 10 { +rule CheckRegionNotChina "CheckRegionNotChina" salience 10 { when - fact.SRC_INFO.CONTENT_LENGTH == 0 && fact.SRC_INFO.HOST == "cc" + fact.SRC_INFO.CONTENT_LENGTH == 0 && fact.SRC_INFO.HOST == "mybaidu1.com:8081" then fact.ExecResult = 1; - Retract("CheckValues"); + Retract("CheckRegionNotChina"); } ` byteArr := pkg.NewBytesResource([]byte(drls)) - err := ruleBuilder.BuildRuleFromResource("Tutorial", "0.0.1", byteArr) + err := ruleBuilder.BuildRuleFromResource("Region", "0.0.1", byteArr) if err != nil { log.Fatal(err) } - rulehelper.knowledgeBase = knowledgeLibrary.NewKnowledgeBaseInstance("Tutorial", "0.0.1") + rulehelper.knowledgeBase = knowledgeLibrary.NewKnowledgeBaseInstance("Region", "0.0.1") rulehelper.engine = engine.NewGruleEngine() } diff --git a/wafengine.go b/wafengine.go new file mode 100644 index 0000000..a17b38e --- /dev/null +++ b/wafengine.go @@ -0,0 +1,4 @@ +package main + +type WafEngine struct { +}