Add support for Docker configuration and refactor related settings

This commit is contained in:
2026-01-07 20:28:54 +05:00
parent 48be913c57
commit bc177f83b8
9 changed files with 112 additions and 34 deletions

View File

@@ -0,0 +1,8 @@
###
# Включает поддержку docker.
# По умолчанию: false
# ***
# Includes docker support.
# Default: false
###
enabled = false

View File

@@ -339,15 +339,6 @@ saves_rules = false
### ###
saves_rules_path = "/etc/nftables.conf" saves_rules_path = "/etc/nftables.conf"
###
# Включает поддержку docker.
# По умолчанию: false
# ***
# Includes docker support.
# Default: false
###
docker_support = false
### ###
# Включает строгие правила nftables к DNS-трафику. Если включить этот режим, то некоторые правила, # Включает строгие правила nftables к DNS-трафику. Если включить этот режим, то некоторые правила,
# связанные с DNS, не добавятся в nftables. Что улучшит безопасность и предотвратить злоупотребление # связанные с DNS, не добавятся в nftables. Что улучшит безопасность и предотвратить злоупотребление

View File

@@ -37,7 +37,12 @@ func runDaemon(ctx context.Context, _ *cli.Command) error {
_ = logger.Sync() _ = logger.Sync()
}() }()
config, err := setting.Config.ToDaemonOptions() dockerService, dockerSupport, err := newDockerService(ctx, logger)
if err != nil {
logger.Error(fmt.Sprintf("Failed to create docker service: %s", err))
}
config, err := setting.Config.ToDaemonOptions(dockerSupport)
if err != nil { if err != nil {
logger.Fatal(err.Error()) logger.Fatal(err.Error())
@@ -55,11 +60,6 @@ func runDaemon(ctx context.Context, _ *cli.Command) error {
return err return err
} }
dockerService, err := newDockerService(ctx, logger, config.ConfigFirewall.Options.DockerSupport)
if err != nil {
logger.Error(fmt.Sprintf("Failed to create docker service: %s", err))
}
d, err := daemon.NewDaemon(config, logger, notificationsService, dockerService) d, err := daemon.NewDaemon(config, logger, notificationsService, dockerService)
if err != nil { if err != nil {
logger.Fatal(err.Error()) logger.Fatal(err.Error())
@@ -90,17 +90,18 @@ func newNotificationsService(logger log.Logger) (notifications.Notifications, er
return notifications.New(config, logger), nil return notifications.New(config, logger), nil
} }
func newDockerService(ctx context.Context, logger log.Logger, dockerSupport bool) (dockerService docker_monitor.Docker, err error) { func newDockerService(ctx context.Context, logger log.Logger) (dockerService docker_monitor.Docker, dockerSupport bool, err error) {
if dockerSupport { config, dockerSupport, err := setting.Config.OtherSettingsPath.ToDockerConfig(setting.Config.BinaryLocations)
dockerPath := setting.Config.BinaryLocations.Docker if err != nil {
if dockerPath == "" { return docker_monitor.NewDockerNotSupport(), false, err
return docker_monitor.NewDockerNotSupport(), fmt.Errorf("docker path is empty")
}
dockerService = docker_monitor.New(dockerPath, ctx, logger)
} else {
dockerService = docker_monitor.NewDockerNotSupport()
} }
return dockerService, nil if !dockerSupport {
dockerService = docker_monitor.NewDockerNotSupport()
return dockerService, false, nil
}
dockerService = docker_monitor.New(&config, ctx, logger)
return dockerService, dockerSupport, nil
} }

View File

@@ -0,0 +1,5 @@
package docker_monitor
type Config struct {
Path string
}

View File

@@ -25,9 +25,9 @@ type docker struct {
chains chain.Chains chains chain.Chains
} }
func New(path string, ctx context.Context, logger log.Logger) Docker { func New(config *Config, ctx context.Context, logger log.Logger) Docker {
return &docker{ return &docker{
client: client.NewDocker(path, ctx, logger), client: client.NewDocker(config.Path, ctx, logger),
logger: logger, logger: logger,
ctx: ctx, ctx: ctx,
} }

View File

@@ -0,0 +1,50 @@
package docker
import (
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/validate"
"github.com/spf13/viper"
)
type Setting struct {
Enabled bool `mapstructure:"enabled"`
}
func InitSetting(path string) (Setting, error) {
if err := validate.IsTomlFile(path, "otherSettingsPath.docker"); err != nil {
return Setting{}, err
}
setting := settingDefault()
v := viper.New()
v.SetConfigType("toml")
v.SetConfigFile(path)
if err := v.ReadInConfig(); err != nil {
return Setting{}, err
}
if err := v.Unmarshal(&setting); err != nil {
return Setting{}, err
}
if !setting.Enabled {
return setting, nil
}
if err := setting.Validate(); err != nil {
return Setting{}, err
}
return setting, nil
}
func settingDefault() Setting {
return Setting{
Enabled: false,
}
}
func (s Setting) Validate() error {
return nil
}

View File

@@ -15,7 +15,6 @@ type options struct {
DnsStrict bool `mapstructure:"dns_strict"` DnsStrict bool `mapstructure:"dns_strict"`
DnsStrictNs bool `mapstructure:"dns_strict_ns"` DnsStrictNs bool `mapstructure:"dns_strict_ns"`
PacketFilter bool `mapstructure:"packet_filter"` PacketFilter bool `mapstructure:"packet_filter"`
DockerSupport bool `mapstructure:"docker_support"`
} }
func defaultOptions() options { func defaultOptions() options {
@@ -26,7 +25,6 @@ func defaultOptions() options {
DnsStrict: false, DnsStrict: false,
DnsStrictNs: false, DnsStrictNs: false,
PacketFilter: true, PacketFilter: true,
DockerSupport: false,
} }
} }

View File

@@ -4,10 +4,12 @@ import (
"errors" "errors"
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/daemon/analyzer/config" "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/daemon/analyzer/config"
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/daemon/docker_monitor"
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/daemon/firewall" "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/daemon/firewall"
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/daemon/notifications" "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/daemon/notifications"
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/i18n" "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/i18n"
analyzerSetting "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/analyzer" analyzerSetting "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/analyzer"
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/docker"
firewallSetting "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/firewall" firewallSetting "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/firewall"
notificationsSetting "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/notifications" notificationsSetting "git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting/notifications"
"github.com/wneessen/go-mail" "github.com/wneessen/go-mail"
@@ -17,6 +19,7 @@ type otherSettingsPath struct {
Firewall string `mapstructure:"firewall"` Firewall string `mapstructure:"firewall"`
Notifications string `mapstructure:"notifications"` Notifications string `mapstructure:"notifications"`
Analyzer string `mapstructure:"analyzer"` Analyzer string `mapstructure:"analyzer"`
Docker string `mapstructure:"docker"`
} }
func otherSettingsPathDefault() *otherSettingsPath { func otherSettingsPathDefault() *otherSettingsPath {
@@ -24,10 +27,11 @@ func otherSettingsPathDefault() *otherSettingsPath {
Firewall: "/etc/kor-elf-shield/firewall.toml", Firewall: "/etc/kor-elf-shield/firewall.toml",
Notifications: "/etc/kor-elf-shield/notifications.toml", Notifications: "/etc/kor-elf-shield/notifications.toml",
Analyzer: "/etc/kor-elf-shield/analyzer.toml", Analyzer: "/etc/kor-elf-shield/analyzer.toml",
Docker: "/etc/kor-elf-shield/docker.toml",
} }
} }
func (o *otherSettingsPath) ToFirewallConfig() (firewall.Config, error) { func (o *otherSettingsPath) ToFirewallConfig(dockerSupport bool) (firewall.Config, error) {
setting, err := firewallSetting.InitSetting(o.Firewall) setting, err := firewallSetting.InitSetting(o.Firewall)
if err != nil { if err != nil {
return firewall.Config{}, err return firewall.Config{}, err
@@ -78,7 +82,7 @@ func (o *otherSettingsPath) ToFirewallConfig() (firewall.Config, error) {
DnsStrict: setting.Options.DnsStrict, DnsStrict: setting.Options.DnsStrict,
DnsStrictNs: setting.Options.DnsStrictNs, DnsStrictNs: setting.Options.DnsStrictNs,
PacketFilter: setting.Options.PacketFilter, PacketFilter: setting.Options.PacketFilter,
DockerSupport: setting.Options.DockerSupport, DockerSupport: dockerSupport,
}, },
MetadataNaming: firewall.ConfigMetadata{ MetadataNaming: firewall.ConfigMetadata{
TableName: setting.MetadataNaming.TableName, TableName: setting.MetadataNaming.TableName,
@@ -160,3 +164,24 @@ func (o *otherSettingsPath) ToAnalyzerConfig(binaryLocations *binaryLocations) (
Login: login, Login: login,
}, nil }, nil
} }
func (o *otherSettingsPath) ToDockerConfig(binaryLocations *binaryLocations) (config docker_monitor.Config, dockerSupport bool, err error) {
if binaryLocations.Docker == "" {
return docker_monitor.Config{}, false, errors.New(i18n.Lang.T("parameter is not specified", map[string]any{
"Parameter": "binaryLocations.docker",
}))
}
setting, err := docker.InitSetting(o.Docker)
if err != nil {
return docker_monitor.Config{}, false, err
}
if err := setting.Validate(); err != nil {
return docker_monitor.Config{}, false, err
}
return docker_monitor.Config{
Path: binaryLocations.Docker,
}, setting.Enabled, nil
}

View File

@@ -37,7 +37,7 @@ func settingDefault() *setting {
} }
} }
func (s setting) ToDaemonOptions() (daemon.DaemonOptions, error) { func (s setting) ToDaemonOptions(dockerSupport bool) (daemon.DaemonOptions, error) {
if s.PidFile == "" { if s.PidFile == "" {
return daemon.DaemonOptions{}, errors.New(i18n.Lang.T("parameter is not specified", map[string]any{ return daemon.DaemonOptions{}, errors.New(i18n.Lang.T("parameter is not specified", map[string]any{
"Parameter": "pid_file", "Parameter": "pid_file",
@@ -56,7 +56,7 @@ func (s setting) ToDaemonOptions() (daemon.DaemonOptions, error) {
})) }))
} }
firewallConfig, err := s.OtherSettingsPath.ToFirewallConfig() firewallConfig, err := s.OtherSettingsPath.ToFirewallConfig(dockerSupport)
if err != nil { if err != nil {
return daemon.DaemonOptions{}, err return daemon.DaemonOptions{}, err
} }