feat(aa-log): parse log file to AA object to allow easy print.
This commit is contained in:
parent
574891d445
commit
d06a474b0c
2 changed files with 82 additions and 0 deletions
|
|
@ -3,6 +3,14 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
|
||||||
package aa
|
package aa
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
|
)
|
||||||
|
|
||||||
// AppArmorProfiles represents a full set of apparmor profiles
|
// AppArmorProfiles represents a full set of apparmor profiles
|
||||||
type AppArmorProfiles map[string]*AppArmorProfile
|
type AppArmorProfiles map[string]*AppArmorProfile
|
||||||
|
|
||||||
|
|
@ -29,3 +37,53 @@ func (p *AppArmorProfile) String() string {
|
||||||
return res.String()
|
return res.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddRule adds a new rule to the profile from a log map
|
||||||
|
func (p *AppArmorProfile) AddRule(log map[string]string) {
|
||||||
|
noNewPrivs := false
|
||||||
|
fileInherit := false
|
||||||
|
if log["operation"] == "file_inherit" {
|
||||||
|
fileInherit = true
|
||||||
|
}
|
||||||
|
|
||||||
|
switch log["error"] {
|
||||||
|
case "-1":
|
||||||
|
noNewPrivs = true
|
||||||
|
case "-2":
|
||||||
|
if !slices.Contains(p.Flags, "mediate_deleted") {
|
||||||
|
p.Flags = append(p.Flags, "mediate_deleted")
|
||||||
|
}
|
||||||
|
case "-13":
|
||||||
|
if !slices.Contains(p.Flags, "attach_disconnected") {
|
||||||
|
p.Flags = append(p.Flags, "attach_disconnected")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
switch log["class"] {
|
||||||
|
case "cap":
|
||||||
|
p.Capability = append(p.Capability, NewCapability(log, noNewPrivs, fileInherit))
|
||||||
|
case "file":
|
||||||
|
p.File = append(p.File, NewFile(log, noNewPrivs, fileInherit))
|
||||||
|
case "net":
|
||||||
|
if log["family"] == "unix" {
|
||||||
|
p.Unix = append(p.Unix, NewUnix(log, noNewPrivs, fileInherit))
|
||||||
|
} else {
|
||||||
|
p.Network = append(p.Network, NewNetwork(log, noNewPrivs, fileInherit))
|
||||||
|
}
|
||||||
|
case "signal":
|
||||||
|
p.Signal = append(p.Signal, NewSignal(log, noNewPrivs, fileInherit))
|
||||||
|
case "ptrace":
|
||||||
|
p.Ptrace = append(p.Ptrace, NewPtrace(log, noNewPrivs, fileInherit))
|
||||||
|
case "unix":
|
||||||
|
p.Unix = append(p.Unix, NewUnix(log, noNewPrivs, fileInherit))
|
||||||
|
case "mount":
|
||||||
|
p.Mount = append(p.Mount, NewMount(log, noNewPrivs, fileInherit))
|
||||||
|
default:
|
||||||
|
if strings.Contains(log["operation"], "dbus") {
|
||||||
|
p.Dbus = append(p.Dbus, NewDbus(log, noNewPrivs, fileInherit))
|
||||||
|
} else if log["family"] == "unix" {
|
||||||
|
p.Unix = append(p.Unix, NewUnix(log, noNewPrivs, fileInherit))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/roddhjav/apparmor.d/pkg/aa"
|
||||||
"github.com/roddhjav/apparmor.d/pkg/util"
|
"github.com/roddhjav/apparmor.d/pkg/util"
|
||||||
"golang.org/x/exp/slices"
|
"golang.org/x/exp/slices"
|
||||||
)
|
)
|
||||||
|
|
@ -219,3 +220,26 @@ func (aaLogs AppArmorLogs) String() string {
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ParseToProfiles convert the log data into a new AppArmorProfiles
|
||||||
|
func (aaLogs AppArmorLogs) ParseToProfiles() aa.AppArmorProfiles {
|
||||||
|
profiles := make(aa.AppArmorProfiles, 0)
|
||||||
|
for _, log := range aaLogs {
|
||||||
|
name := ""
|
||||||
|
if strings.Contains(log["operation"], "dbus") {
|
||||||
|
name = log["label"]
|
||||||
|
} else {
|
||||||
|
name = log["profile"]
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := profiles[name]; !ok {
|
||||||
|
profile := &aa.AppArmorProfile{}
|
||||||
|
profile.Name = name
|
||||||
|
profile.AddRule(log)
|
||||||
|
profiles[name] = profile
|
||||||
|
} else {
|
||||||
|
profiles[name].AddRule(log)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return profiles
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue