mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-06 01:50:25 +08:00
访问日志策略增加只记录WAF相关访问日志选项
This commit is contained in:
@@ -12,8 +12,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type BaseStorage struct {
|
type BaseStorage struct {
|
||||||
isOk bool
|
isOk bool
|
||||||
version int
|
version int
|
||||||
|
firewallOnly bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *BaseStorage) SetVersion(version int) {
|
func (this *BaseStorage) SetVersion(version int) {
|
||||||
@@ -32,6 +33,10 @@ func (this *BaseStorage) SetOk(isOk bool) {
|
|||||||
this.isOk = isOk
|
this.isOk = isOk
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *BaseStorage) SetFirewallOnly(firewallOnly bool) {
|
||||||
|
this.firewallOnly = firewallOnly
|
||||||
|
}
|
||||||
|
|
||||||
// Marshal 对日志进行编码
|
// Marshal 对日志进行编码
|
||||||
func (this *BaseStorage) Marshal(accessLog *pb.HTTPAccessLog) ([]byte, error) {
|
func (this *BaseStorage) Marshal(accessLog *pb.HTTPAccessLog) ([]byte, error) {
|
||||||
return json.Marshal(accessLog)
|
return json.Marshal(accessLog)
|
||||||
|
|||||||
@@ -61,6 +61,10 @@ func (this *CommandStorage) Write(accessLogs []*pb.HTTPAccessLog) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, accessLog := range accessLogs {
|
for _, accessLog := range accessLogs {
|
||||||
|
if this.firewallOnly && accessLog.FirewallPolicyId == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
data, err := this.Marshal(accessLog)
|
data, err := this.Marshal(accessLog)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
|
|||||||
@@ -59,6 +59,10 @@ func (this *ESStorage) Write(accessLogs []*pb.HTTPAccessLog) error {
|
|||||||
indexName := this.FormatVariables(this.config.Index)
|
indexName := this.FormatVariables(this.config.Index)
|
||||||
typeName := this.FormatVariables(this.config.MappingType)
|
typeName := this.FormatVariables(this.config.MappingType)
|
||||||
for _, accessLog := range accessLogs {
|
for _, accessLog := range accessLogs {
|
||||||
|
if this.firewallOnly && accessLog.FirewallPolicyId == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if len(accessLog.RequestId) == 0 {
|
if len(accessLog.RequestId) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ func (this *FileStorage) Write(accessLogs []*pb.HTTPAccessLog) error {
|
|||||||
defer this.writeLocker.Unlock()
|
defer this.writeLocker.Unlock()
|
||||||
|
|
||||||
for _, accessLog := range accessLogs {
|
for _, accessLog := range accessLogs {
|
||||||
|
if this.firewallOnly && accessLog.FirewallPolicyId == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
data, err := this.Marshal(accessLog)
|
data, err := this.Marshal(accessLog)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ type StorageInterface interface {
|
|||||||
// SetVersion 设置版本
|
// SetVersion 设置版本
|
||||||
SetVersion(version int)
|
SetVersion(version int)
|
||||||
|
|
||||||
|
// SetFirewallOnly 设置是否只处理防火墙相关的访问日志
|
||||||
|
SetFirewallOnly(firewallOnly bool)
|
||||||
|
|
||||||
IsOk() bool
|
IsOk() bool
|
||||||
|
|
||||||
SetOk(ok bool)
|
SetOk(ok bool)
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ func (this *StorageManager) Loop() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
storage.SetVersion(types.Int(policy.Version))
|
storage.SetVersion(types.Int(policy.Version))
|
||||||
|
storage.SetFirewallOnly(policy.FirewallOnly == 1)
|
||||||
err := storage.Start()
|
err := storage.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
remotelogs.Error("ACCESS_LOG_STORAGE_MANAGER", "start policy '"+types.String(policyId)+"' failed: "+err.Error())
|
remotelogs.Error("ACCESS_LOG_STORAGE_MANAGER", "start policy '"+types.String(policyId)+"' failed: "+err.Error())
|
||||||
@@ -116,6 +117,7 @@ func (this *StorageManager) Loop() error {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
storage.SetVersion(types.Int(policy.Version))
|
storage.SetVersion(types.Int(policy.Version))
|
||||||
|
storage.SetFirewallOnly(policy.FirewallOnly == 1)
|
||||||
this.storageMap[policyId] = storage
|
this.storageMap[policyId] = storage
|
||||||
err = storage.Start()
|
err = storage.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -106,6 +106,9 @@ func (this *SyslogStorage) Write(accessLogs []*pb.HTTPAccessLog) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, accessLog := range accessLogs {
|
for _, accessLog := range accessLogs {
|
||||||
|
if this.firewallOnly && accessLog.FirewallPolicyId == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
data, err := this.Marshal(accessLog)
|
data, err := this.Marshal(accessLog)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
|
|||||||
@@ -60,6 +60,9 @@ func (this *TCPStorage) Write(accessLogs []*pb.HTTPAccessLog) error {
|
|||||||
defer this.writeLocker.Unlock()
|
defer this.writeLocker.Unlock()
|
||||||
|
|
||||||
for _, accessLog := range accessLogs {
|
for _, accessLog := range accessLogs {
|
||||||
|
if this.firewallOnly && accessLog.FirewallPolicyId == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
data, err := this.Marshal(accessLog)
|
data, err := this.Marshal(accessLog)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
"github.com/iwind/TeaGo/Tea"
|
"github.com/iwind/TeaGo/Tea"
|
||||||
"github.com/iwind/TeaGo/dbs"
|
"github.com/iwind/TeaGo/dbs"
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -109,7 +106,7 @@ func (this *HTTPAccessLogPolicyDAO) FindAllEnabledAndOnPolicies(tx *dbs.Tx) (res
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CreatePolicy 创建策略
|
// CreatePolicy 创建策略
|
||||||
func (this *HTTPAccessLogPolicyDAO) CreatePolicy(tx *dbs.Tx, name string, policyType string, optionsJSON []byte, condsJSON []byte, isPublic bool) (policyId int64, err error) {
|
func (this *HTTPAccessLogPolicyDAO) CreatePolicy(tx *dbs.Tx, name string, policyType string, optionsJSON []byte, condsJSON []byte, isPublic bool, firewallOnly bool) (policyId int64, err error) {
|
||||||
var op = NewHTTPAccessLogPolicyOperator()
|
var op = NewHTTPAccessLogPolicyOperator()
|
||||||
op.Name = name
|
op.Name = name
|
||||||
op.Type = policyType
|
op.Type = policyType
|
||||||
@@ -121,12 +118,13 @@ func (this *HTTPAccessLogPolicyDAO) CreatePolicy(tx *dbs.Tx, name string, policy
|
|||||||
}
|
}
|
||||||
op.IsPublic = isPublic
|
op.IsPublic = isPublic
|
||||||
op.IsOn = true
|
op.IsOn = true
|
||||||
|
op.FirewallOnly = firewallOnly
|
||||||
op.State = HTTPAccessLogPolicyStateEnabled
|
op.State = HTTPAccessLogPolicyStateEnabled
|
||||||
return this.SaveInt64(tx, op)
|
return this.SaveInt64(tx, op)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdatePolicy 修改策略
|
// UpdatePolicy 修改策略
|
||||||
func (this *HTTPAccessLogPolicyDAO) UpdatePolicy(tx *dbs.Tx, policyId int64, name string, optionsJSON []byte, condsJSON []byte, isPublic bool, isOn bool) error {
|
func (this *HTTPAccessLogPolicyDAO) UpdatePolicy(tx *dbs.Tx, policyId int64, name string, optionsJSON []byte, condsJSON []byte, isPublic bool, firewallOnly bool, isOn bool) error {
|
||||||
if policyId <= 0 {
|
if policyId <= 0 {
|
||||||
return errors.New("invalid policyId")
|
return errors.New("invalid policyId")
|
||||||
}
|
}
|
||||||
@@ -140,7 +138,6 @@ func (this *HTTPAccessLogPolicyDAO) UpdatePolicy(tx *dbs.Tx, policyId int64, nam
|
|||||||
if oldOne == nil {
|
if oldOne == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var oldPolicy = oldOne.(*HTTPAccessLogPolicy)
|
|
||||||
|
|
||||||
var op = NewHTTPAccessLogPolicyOperator()
|
var op = NewHTTPAccessLogPolicyOperator()
|
||||||
op.Id = policyId
|
op.Id = policyId
|
||||||
@@ -156,22 +153,11 @@ func (this *HTTPAccessLogPolicyDAO) UpdatePolicy(tx *dbs.Tx, policyId int64, nam
|
|||||||
op.Conds = "{}"
|
op.Conds = "{}"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 版本号
|
// 版本号总是加1
|
||||||
if len(oldPolicy.Options) == 0 || len(optionsJSON) == 0 {
|
op.Version = dbs.SQL("version+1")
|
||||||
op.Version = dbs.SQL("version+1")
|
|
||||||
} else {
|
|
||||||
var m1 = maps.Map{}
|
|
||||||
_ = json.Unmarshal(oldPolicy.Options, &m1)
|
|
||||||
|
|
||||||
var m2 = maps.Map{}
|
|
||||||
_ = json.Unmarshal(optionsJSON, &m2)
|
|
||||||
|
|
||||||
if bytes.Compare(m1.AsJSON(), m2.AsJSON()) != 0 {
|
|
||||||
op.Version = dbs.SQL("version+1")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
op.IsPublic = isPublic
|
op.IsPublic = isPublic
|
||||||
|
op.FirewallOnly = firewallOnly
|
||||||
op.IsOn = isOn
|
op.IsOn = isOn
|
||||||
return this.Save(tx, op)
|
return this.Save(tx, op)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,35 +4,37 @@ import "github.com/iwind/TeaGo/dbs"
|
|||||||
|
|
||||||
// HTTPAccessLogPolicy 访问日志策略
|
// HTTPAccessLogPolicy 访问日志策略
|
||||||
type HTTPAccessLogPolicy struct {
|
type HTTPAccessLogPolicy struct {
|
||||||
Id uint32 `field:"id"` // ID
|
Id uint32 `field:"id"` // ID
|
||||||
TemplateId uint32 `field:"templateId"` // 模版ID
|
TemplateId uint32 `field:"templateId"` // 模版ID
|
||||||
AdminId uint32 `field:"adminId"` // 管理员ID
|
AdminId uint32 `field:"adminId"` // 管理员ID
|
||||||
UserId uint32 `field:"userId"` // 用户ID
|
UserId uint32 `field:"userId"` // 用户ID
|
||||||
State uint8 `field:"state"` // 状态
|
State uint8 `field:"state"` // 状态
|
||||||
CreatedAt uint64 `field:"createdAt"` // 创建时间
|
CreatedAt uint64 `field:"createdAt"` // 创建时间
|
||||||
Name string `field:"name"` // 名称
|
Name string `field:"name"` // 名称
|
||||||
IsOn bool `field:"isOn"` // 是否启用
|
IsOn bool `field:"isOn"` // 是否启用
|
||||||
Type string `field:"type"` // 存储类型
|
Type string `field:"type"` // 存储类型
|
||||||
Options dbs.JSON `field:"options"` // 存储选项
|
Options dbs.JSON `field:"options"` // 存储选项
|
||||||
Conds dbs.JSON `field:"conds"` // 请求条件
|
Conds dbs.JSON `field:"conds"` // 请求条件
|
||||||
IsPublic bool `field:"isPublic"` // 是否为公用
|
IsPublic bool `field:"isPublic"` // 是否为公用
|
||||||
Version uint32 `field:"version"` // 版本号
|
FirewallOnly uint8 `field:"firewallOnly"` // 是否只记录防火墙相关
|
||||||
|
Version uint32 `field:"version"` // 版本号
|
||||||
}
|
}
|
||||||
|
|
||||||
type HTTPAccessLogPolicyOperator struct {
|
type HTTPAccessLogPolicyOperator struct {
|
||||||
Id interface{} // ID
|
Id interface{} // ID
|
||||||
TemplateId interface{} // 模版ID
|
TemplateId interface{} // 模版ID
|
||||||
AdminId interface{} // 管理员ID
|
AdminId interface{} // 管理员ID
|
||||||
UserId interface{} // 用户ID
|
UserId interface{} // 用户ID
|
||||||
State interface{} // 状态
|
State interface{} // 状态
|
||||||
CreatedAt interface{} // 创建时间
|
CreatedAt interface{} // 创建时间
|
||||||
Name interface{} // 名称
|
Name interface{} // 名称
|
||||||
IsOn interface{} // 是否启用
|
IsOn interface{} // 是否启用
|
||||||
Type interface{} // 存储类型
|
Type interface{} // 存储类型
|
||||||
Options interface{} // 存储选项
|
Options interface{} // 存储选项
|
||||||
Conds interface{} // 请求条件
|
Conds interface{} // 请求条件
|
||||||
IsPublic interface{} // 是否为公用
|
IsPublic interface{} // 是否为公用
|
||||||
Version interface{} // 版本号
|
FirewallOnly interface{} // 是否只记录防火墙相关
|
||||||
|
Version interface{} // 版本号
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHTTPAccessLogPolicyOperator() *HTTPAccessLogPolicyOperator {
|
func NewHTTPAccessLogPolicyOperator() *HTTPAccessLogPolicyOperator {
|
||||||
|
|||||||
@@ -41,13 +41,14 @@ func (this *HTTPAccessLogPolicyService) ListEnabledHTTPAccessLogPolicies(ctx con
|
|||||||
var pbPolicies = []*pb.HTTPAccessLogPolicy{}
|
var pbPolicies = []*pb.HTTPAccessLogPolicy{}
|
||||||
for _, policy := range policies {
|
for _, policy := range policies {
|
||||||
pbPolicies = append(pbPolicies, &pb.HTTPAccessLogPolicy{
|
pbPolicies = append(pbPolicies, &pb.HTTPAccessLogPolicy{
|
||||||
Id: int64(policy.Id),
|
Id: int64(policy.Id),
|
||||||
Name: policy.Name,
|
Name: policy.Name,
|
||||||
IsOn: policy.IsOn,
|
IsOn: policy.IsOn,
|
||||||
Type: policy.Type,
|
Type: policy.Type,
|
||||||
OptionsJSON: policy.Options,
|
OptionsJSON: policy.Options,
|
||||||
CondsJSON: policy.Conds,
|
CondsJSON: policy.Conds,
|
||||||
IsPublic: policy.IsPublic,
|
IsPublic: policy.IsPublic,
|
||||||
|
FirewallOnly: policy.FirewallOnly == 1,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return &pb.ListEnabledHTTPAccessLogPoliciesResponse{HttpAccessLogPolicies: pbPolicies}, nil
|
return &pb.ListEnabledHTTPAccessLogPoliciesResponse{HttpAccessLogPolicies: pbPolicies}, nil
|
||||||
@@ -71,7 +72,7 @@ func (this *HTTPAccessLogPolicyService) CreateHTTPAccessLogPolicy(ctx context.Co
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建
|
// 创建
|
||||||
policyId, err := models.SharedHTTPAccessLogPolicyDAO.CreatePolicy(tx, req.Name, req.Type, req.OptionsJSON, req.CondsJSON, req.IsPublic)
|
policyId, err := models.SharedHTTPAccessLogPolicyDAO.CreatePolicy(tx, req.Name, req.Type, req.OptionsJSON, req.CondsJSON, req.IsPublic, req.FirewallOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -96,7 +97,7 @@ func (this *HTTPAccessLogPolicyService) UpdateHTTPAccessLogPolicy(ctx context.Co
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 保存修改
|
// 保存修改
|
||||||
err = models.SharedHTTPAccessLogPolicyDAO.UpdatePolicy(tx, req.HttpAccessLogPolicyId, req.Name, req.OptionsJSON, req.CondsJSON, req.IsPublic, req.IsOn)
|
err = models.SharedHTTPAccessLogPolicyDAO.UpdatePolicy(tx, req.HttpAccessLogPolicyId, req.Name, req.OptionsJSON, req.CondsJSON, req.IsPublic, req.FirewallOnly, req.IsOn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -119,13 +120,14 @@ func (this *HTTPAccessLogPolicyService) FindEnabledHTTPAccessLogPolicy(ctx conte
|
|||||||
return &pb.FindEnabledHTTPAccessLogPolicyResponse{HttpAccessLogPolicy: nil}, nil
|
return &pb.FindEnabledHTTPAccessLogPolicyResponse{HttpAccessLogPolicy: nil}, nil
|
||||||
}
|
}
|
||||||
return &pb.FindEnabledHTTPAccessLogPolicyResponse{HttpAccessLogPolicy: &pb.HTTPAccessLogPolicy{
|
return &pb.FindEnabledHTTPAccessLogPolicyResponse{HttpAccessLogPolicy: &pb.HTTPAccessLogPolicy{
|
||||||
Id: int64(policy.Id),
|
Id: int64(policy.Id),
|
||||||
Name: policy.Name,
|
Name: policy.Name,
|
||||||
IsOn: policy.IsOn,
|
IsOn: policy.IsOn,
|
||||||
Type: policy.Type,
|
Type: policy.Type,
|
||||||
OptionsJSON: policy.Options,
|
OptionsJSON: policy.Options,
|
||||||
CondsJSON: policy.Conds,
|
CondsJSON: policy.Conds,
|
||||||
IsPublic: policy.IsPublic,
|
IsPublic: policy.IsPublic,
|
||||||
|
FirewallOnly: policy.FirewallOnly == 1,
|
||||||
}}, nil
|
}}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user