diff --git a/internal/web/actions/default/servers/components/waf/log.go b/internal/web/actions/default/servers/components/waf/log.go index a2a80060..e38ab2c2 100644 --- a/internal/web/actions/default/servers/components/waf/log.go +++ b/internal/web/actions/default/servers/components/waf/log.go @@ -34,13 +34,15 @@ func (this *LogAction) RunGet(params struct { this.Data["path"] = this.Request.URL.Path this.Data["day"] = params.Day this.Data["groupId"] = params.GroupId - this.Data["accessLogs"] = []interface{}{} + this.Data["accessLogs"] = []maps.Map{} + this.Data["partition"] = params.Partition - day := params.Day - ipList := []string{} + var day = params.Day + var ipList = []string{} + var wafMaps = []maps.Map{} if len(day) > 0 && regexp.MustCompile(`\d{4}-\d{2}-\d{2}`).MatchString(day) { day = strings.ReplaceAll(day, "-", "") - size := int64(10) + var size = int64(20) resp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{ Partition: params.Partition, @@ -60,11 +62,31 @@ func (this *LogAction) RunGet(params struct { } else { this.Data["accessLogs"] = resp.HttpAccessLogs for _, accessLog := range resp.HttpAccessLogs { + // IP if len(accessLog.RemoteAddr) > 0 { if !lists.ContainsString(ipList, accessLog.RemoteAddr) { ipList = append(ipList, accessLog.RemoteAddr) } } + + // WAF信息集合 + if accessLog.FirewallPolicyId > 0 && accessLog.FirewallRuleGroupId > 0 && accessLog.FirewallRuleSetId > 0 { + // 检查Set是否已经存在 + var existSet = false + for _, wafMap := range wafMaps { + if wafMap.GetInt64("setId") == accessLog.FirewallRuleSetId { + existSet = true + break + } + } + if !existSet { + wafMaps = append(wafMaps, maps.Map{ + "policyId": accessLog.FirewallPolicyId, + "groupId": accessLog.FirewallRuleGroupId, + "setId": accessLog.FirewallRuleSetId, + }) + } + } } } this.Data["hasMore"] = resp.HasMore @@ -134,5 +156,79 @@ func (this *LogAction) RunGet(params struct { } this.Data["regions"] = regionMap + // WAF相关 + var wafInfos = map[int64]maps.Map{} // set id => WAF Map + var wafPolicyCacheMap = map[int64]*pb.HTTPFirewallPolicy{} // id => *pb.HTTPFirewallPolicy + var wafGroupCacheMap = map[int64]*pb.HTTPFirewallRuleGroup{} // id => *pb.HTTPFirewallRuleGroup + var wafSetCacheMap = map[int64]*pb.HTTPFirewallRuleSet{} // id => *pb.HTTPFirewallRuleSet + for _, wafMap := range wafMaps { + var policyId = wafMap.GetInt64("policyId") + var groupId = wafMap.GetInt64("groupId") + var setId = wafMap.GetInt64("setId") + if policyId > 0 { + pbPolicy, ok := wafPolicyCacheMap[policyId] + if !ok { + policyResp, err := this.RPC().HTTPFirewallPolicyRPC().FindEnabledHTTPFirewallPolicy(this.AdminContext(), &pb.FindEnabledHTTPFirewallPolicyRequest{HttpFirewallPolicyId: policyId}) + if err != nil { + this.ErrorPage(err) + return + } + pbPolicy = policyResp.HttpFirewallPolicy + wafPolicyCacheMap[policyId] = pbPolicy + } + if pbPolicy != nil { + wafMap = maps.Map{ + "policy": maps.Map{ + "id": pbPolicy.Id, + "name": pbPolicy.Name, + "serverId": pbPolicy.ServerId, + }, + } + if groupId > 0 { + pbGroup, ok := wafGroupCacheMap[groupId] + if !ok { + groupResp, err := this.RPC().HTTPFirewallRuleGroupRPC().FindEnabledHTTPFirewallRuleGroup(this.AdminContext(), &pb.FindEnabledHTTPFirewallRuleGroupRequest{FirewallRuleGroupId: groupId}) + if err != nil { + this.ErrorPage(err) + return + } + pbGroup = groupResp.FirewallRuleGroup + wafGroupCacheMap[groupId] = pbGroup + } + + if pbGroup != nil { + wafMap["group"] = maps.Map{ + "id": pbGroup.Id, + "name": pbGroup.Name, + } + + if setId > 0 { + pbSet, ok := wafSetCacheMap[setId] + if !ok { + setResp, err := this.RPC().HTTPFirewallRuleSetRPC().FindEnabledHTTPFirewallRuleSet(this.AdminContext(), &pb.FindEnabledHTTPFirewallRuleSetRequest{FirewallRuleSetId: setId}) + if err != nil { + this.ErrorPage(err) + return + } + pbSet = setResp.FirewallRuleSet + wafSetCacheMap[setId] = pbSet + } + + if pbSet != nil { + wafMap["set"] = maps.Map{ + "id": pbSet.Id, + "name": pbSet.Name, + } + } + } + } + } + } + } + + wafInfos[setId] = wafMap + } + this.Data["wafInfos"] = wafInfos + this.Show() } diff --git a/internal/web/actions/default/servers/components/waf/policy.go b/internal/web/actions/default/servers/components/waf/policy.go index bfe29666..ef4fecc0 100644 --- a/internal/web/actions/default/servers/components/waf/policy.go +++ b/internal/web/actions/default/servers/components/waf/policy.go @@ -96,6 +96,7 @@ func (this *PolicyAction) RunGet(params struct { "blockOptions": firewallPolicy.BlockOptions, "useLocalFirewall": firewallPolicy.UseLocalFirewall, "synFlood": firewallPolicy.SYNFlood, + "log": firewallPolicy.Log, } // 正在使用此策略的集群 diff --git a/internal/web/actions/default/servers/components/waf/update.go b/internal/web/actions/default/servers/components/waf/update.go index dc9fe16a..435b334c 100644 --- a/internal/web/actions/default/servers/components/waf/update.go +++ b/internal/web/actions/default/servers/components/waf/update.go @@ -58,6 +58,11 @@ func (this *UpdateAction) RunGet(params struct { } } + // log + if firewallPolicy.Log == nil { + firewallPolicy.Log = firewallconfigs.DefaultHTTPFirewallPolicyLogConfig + } + this.Data["firewallPolicy"] = maps.Map{ "id": firewallPolicy.Id, "name": firewallPolicy.Name, @@ -67,10 +72,11 @@ func (this *UpdateAction) RunGet(params struct { "blockOptions": firewallPolicy.BlockOptions, "useLocalFirewall": firewallPolicy.UseLocalFirewall, "synFloodConfig": firewallPolicy.SYNFlood, + "log": firewallPolicy.Log, } // 预置分组 - groups := []maps.Map{} + var groups = []maps.Map{} templatePolicy := firewallconfigs.HTTPFirewallTemplate() for _, group := range templatePolicy.AllRuleGroups() { if len(group.Code) > 0 { @@ -101,6 +107,7 @@ func (this *UpdateAction) RunPost(params struct { Mode string UseLocalFirewall bool SynFloodJSON []byte + LogJSON []byte Must *actions.Must }) { @@ -128,6 +135,7 @@ func (this *UpdateAction) RunPost(params struct { Mode: params.Mode, UseLocalFirewall: params.UseLocalFirewall, SynFloodJSON: params.SynFloodJSON, + LogJSON: params.LogJSON, }) if err != nil { this.ErrorPage(err) diff --git a/web/public/js/components/server/http-access-log-box.js b/web/public/js/components/server/http-access-log-box.js index 3032bf21..bf2140c9 100644 --- a/web/public/js/components/server/http-access-log-box.js +++ b/web/public/js/components/server/http-access-log-box.js @@ -60,9 +60,9 @@ Vue.component("http-access-log-box", { - - WAF -- - {{accessLog.wafInfo.group.name}} -- + + WAF - + {{accessLog.wafInfo.group.name}} - {{accessLog.wafInfo.set.name}} diff --git a/web/views/@default/servers/components/waf/log.html b/web/views/@default/servers/components/waf/log.html index c590d696..0acacf70 100644 --- a/web/views/@default/servers/components/waf/log.html +++ b/web/views/@default/servers/components/waf/log.html @@ -25,6 +25,8 @@ + +

暂时还没有日志。

diff --git a/web/views/@default/servers/components/waf/log.js b/web/views/@default/servers/components/waf/log.js index e2735a13..e551ce4e 100644 --- a/web/views/@default/servers/components/waf/log.js +++ b/web/views/@default/servers/components/waf/log.js @@ -13,5 +13,10 @@ Tea.context(function () { } else { accessLog.region = "" } + if (accessLog.firewallRuleSetId > 0 && typeof (that.wafInfos[accessLog.firewallRuleSetId]) == "object") { + accessLog.wafInfo = that.wafInfos[accessLog.firewallRuleSetId] + } else { + accessLog.wafInfo = null + } }) }) \ No newline at end of file diff --git a/web/views/@default/servers/components/waf/policy.html b/web/views/@default/servers/components/waf/policy.html index dfbff4de..d9995e38 100644 --- a/web/views/@default/servers/components/waf/policy.html +++ b/web/views/@default/servers/components/waf/policy.html @@ -92,6 +92,13 @@
+ + 记录日志 + + 默认 + 开启 + + 描述 diff --git a/web/views/@default/servers/components/waf/update.html b/web/views/@default/servers/components/waf/update.html index 8a13feab..1b8e594b 100644 --- a/web/views/@default/servers/components/waf/update.html +++ b/web/views/@default/servers/components/waf/update.html @@ -49,6 +49,14 @@ + + + 记录日志 + + + +

选中后,总是记录WAF相关日志,即使服务中没有开启访问日志。

+