Skip to content

Commit 7000d19

Browse files
authored
osquery_manager: generate ECS section mappings from config (#18989)
Move ECS keep fields into osquery-gen config so parent object mappings such as *.sections are regenerated consistently, and refresh generated artifacts for osquery 5.23.0.
1 parent e4a085a commit 7000d19

11 files changed

Lines changed: 218 additions & 94 deletions

File tree

packages/osquery_manager/_dev/scripts/osquery-gen/README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Config-driven generator for osquery_manager field/schema generation.
44

5-
This tool reads `osquery` version and `beats` git selection from `config.yml`,
5+
This tool reads `osquery` version, `beats` git selection, and ECS keep fields from `config.yml`,
66
reads the ECS git ref from `packages/osquery_manager/_dev/build/build.yml`
77
(`dependencies.ecs.reference`, e.g. `git@v9.3.0`), resolves the latest matching
88
patch for osquery/beats when using semver config, and generates:
@@ -20,13 +20,16 @@ Extension metadata in osquery schema is enforced:
2020

2121
## Config
2222

23-
`config.yml` — osquery and beats only:
23+
`config.yml`:
2424

2525
```yaml
2626
osquery:
2727
version: "5.21.0"
2828
beats:
2929
version: "9.3"
30+
ecs:
31+
keep_fields:
32+
- file.pe.sections
3033
```
3134
3235
**Beats** (extension specs under `elastic/beats`): set **either** an explicit git ref **or** a semver-style `version`. Precedence is **tag > branch > version**:
@@ -51,6 +54,10 @@ dependencies:
5154
reference: git@v9.3.0
5255
```
5356

57+
**ECS** `keep_fields` entries force specific ECS field names into the generated
58+
`data_stream/result/fields/ecs.yml` even when the field is an object/nested node
59+
or has a type outside the generator's default allow-list.
60+
5461
Notes:
5562

5663
- Output is always written to `packages/osquery_manager` under the detected `integrations` repo root.
Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,61 @@
11
osquery:
22
# Exact patch (5.21.0) or prefix (5.21) to auto-pick latest patch.
3-
version: "5.22.1"
3+
version: "5.23.0"
44
beats:
55
# Git ref for elastic/beats osquery extension specs (raw.githubusercontent.com).
66
# Precedence: tag > branch > version (semver / prefix resolution).
77
# tag: "v9.4.2"
88
# branch: "main"
99
# Exact patch (9.3.1) or prefix (9.3) to auto-pick latest patch when tag/branch unset:
1010
version: "9.4.0"
11+
ecs:
12+
# ECS field names to include even when they are objects/nested or otherwise
13+
# filtered out by the default type allow-list.
14+
keep_fields:
15+
- dll.pe.sections
16+
- email
17+
- email.attachments
18+
- email.attachments.file.extension
19+
- email.attachments.file.hash.md5
20+
- email.attachments.file.hash.sha1
21+
- email.attachments.file.hash.sha256
22+
- email.attachments.file.hash.sha384
23+
- email.attachments.file.hash.sha512
24+
- email.attachments.file.hash.ssdeep
25+
- email.attachments.file.hash.tlsh
26+
- email.attachments.file.mime_type
27+
- email.attachments.file.name
28+
- email.attachments.file.size
29+
- email.bcc.address
30+
- email.cc.address
31+
- email.content_type
32+
- email.delivery_timestamp
33+
- email.direction
34+
- email.from.address
35+
- email.local_id
36+
- email.message_id
37+
- email.origination_timestamp
38+
- email.reply_to.address
39+
- email.sender.address
40+
- email.subject
41+
- email.to.address
42+
- email.x_mailer
43+
- file.elf.sections
44+
- file.macho.sections
45+
- file.pe.sections
46+
- group.id
47+
- network.iana_number
48+
- network.type
49+
- process.elf.sections
50+
- process.macho.sections
51+
- process.parent.elf.sections
52+
- process.parent.macho.sections
53+
- process.parent.pe.sections
54+
- process.pe.sections
55+
- threat.enrichments
56+
- threat.enrichments.indicator.file.elf.sections
57+
- threat.enrichments.indicator.file.pe.sections
58+
- threat.indicator.file.elf.sections
59+
- threat.indicator.file.pe.sections
60+
- user.group.id
61+
- user.id

packages/osquery_manager/_dev/scripts/osquery-gen/ecs_keep_fields.txt

Lines changed: 0 additions & 39 deletions
This file was deleted.

packages/osquery_manager/_dev/scripts/osquery-gen/generator.go

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package main
66

77
import (
88
"bytes"
9-
_ "embed"
109
"encoding/csv"
1110
"encoding/json"
1211
"fmt"
@@ -45,9 +44,6 @@ var (
4544
ecsRestrictedSet = makeSet(ecsRestrictedFields)
4645
)
4746

48-
//go:embed ecs_keep_fields.txt
49-
var ecsKeepFieldsContent string
50-
5147
type kibanaOsqueryTable struct {
5248
Name string `json:"name"`
5349
Description string `json:"description"`
@@ -123,7 +119,7 @@ type columnInfo struct {
123119
Column osqueryCol
124120
}
125121

126-
func generateArtifacts(outputRoot, osqueryVersion, ecsVersion, beatsRef string, runPackageCheck bool) error {
122+
func generateArtifacts(outputRoot, osqueryVersion, ecsVersion, beatsRef string, ecsKeepFields []string, runPackageCheck bool) error {
127123
outFields := filepath.Join(outputRoot, "packages", "osquery_manager", "data_stream", "result", "fields")
128124
outSchemas := filepath.Join(outputRoot, "packages", "osquery_manager", "schemas")
129125

@@ -165,7 +161,7 @@ func generateArtifacts(outputRoot, osqueryVersion, ecsVersion, beatsRef string,
165161
if err != nil {
166162
return fmt.Errorf("download ECS fields: %w", err)
167163
}
168-
ecsOut, err := generateECSFieldsYAML(ecsYAML)
164+
ecsOut, err := generateECSFieldsYAML(ecsYAML, ecsKeepFields)
169165
if err != nil {
170166
return fmt.Errorf("generate ecs.yml: %w", err)
171167
}
@@ -500,20 +496,8 @@ func marshalYAMLWithIndent(v any, indent int) ([]byte, error) {
500496
return buf.Bytes(), nil
501497
}
502498

503-
func loadKeepFields() []string {
504-
var out []string
505-
for _, line := range strings.Split(ecsKeepFieldsContent, "\n") {
506-
line = strings.TrimSpace(line)
507-
if line == "" || strings.HasPrefix(line, "#") {
508-
continue
509-
}
510-
out = append(out, line)
511-
}
512-
return out
513-
}
514-
515-
func generateECSFieldsYAML(ecsBeatsYAML []byte) ([]byte, error) {
516-
keepFields := makeSet(loadKeepFields())
499+
func generateECSFieldsYAML(ecsBeatsYAML []byte, ecsKeepFields []string) ([]byte, error) {
500+
keepFields := makeSet(ecsKeepFields)
517501
var root any
518502
if err := yaml.Unmarshal(ecsBeatsYAML, &root); err != nil {
519503
return nil, err
@@ -550,12 +534,16 @@ func collectECSFieldNames(root any, parent string, keepFields map[string]struct{
550534
if parent == "" && inSet(excludeFromTopLevelSet, name) {
551535
continue
552536
}
537+
fieldName := joinPath(parent, name)
538+
kept := inSet(keepFields, fieldName)
539+
if kept && name != "@timestamp" {
540+
*ecsFields = append(*ecsFields, fieldName)
541+
}
553542
if childFields, hasFields := m["fields"]; hasFields {
554543
collectECSFieldNames(childFields, joinPath(parent, name), keepFields, ecsFields)
555544
} else {
556-
fieldName := joinPath(parent, name)
557545
typ, _ := m["type"].(string)
558-
if (inSet(keepFields, fieldName) || isAllowedECSType(typ)) && name != "@timestamp" {
546+
if !kept && isAllowedECSType(typ) && name != "@timestamp" {
559547
*ecsFields = append(*ecsFields, fieldName)
560548
}
561549
}

packages/osquery_manager/_dev/scripts/osquery-gen/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,14 @@ type beatsConfig struct {
3737
Version string `yaml:"version"`
3838
}
3939

40+
type ecsConfig struct {
41+
KeepFields []string `yaml:"keep_fields"`
42+
}
43+
4044
type config struct {
4145
Osquery versionConfig `yaml:"osquery"`
4246
Beats beatsConfig `yaml:"beats"`
47+
ECS ecsConfig `yaml:"ecs"`
4348
}
4449

4550
type packageBuildYAML struct {
@@ -93,7 +98,7 @@ func main() {
9398
}
9499

95100
log.Printf("Resolved versions: osquery=%s beats=%s ecs=%s", osqueryVersion, beatsRef, ecsVersion)
96-
if err := generateArtifacts(outputRoot, osqueryVersion, ecsVersion, beatsRef, !*skipPackageCheck); err != nil {
101+
if err := generateArtifacts(outputRoot, osqueryVersion, ecsVersion, beatsRef, cfg.ECS.KeepFields, !*skipPackageCheck); err != nil {
97102
log.Fatalf("generate artifacts: %v", err)
98103
}
99104
log.Println("Done.")

packages/osquery_manager/changelog.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
# newer versions go on top
2+
- version: "1.29.0"
3+
changes:
4+
- description: Generate ECS `*.sections` parent mappings from osquery-gen config
5+
type: bugfix
6+
link: https://github.com/elastic/integrations/pull/16650
7+
- description: Upgrade osquery version to 5.23.0
8+
type: enhancement
9+
link: https://github.com/elastic/integrations/pull/16650
210
- version: "1.28.1"
311
changes:
412
- description: Update ECS mappings for `*.sections` fields in results dataset

packages/osquery_manager/data_stream/result/fields/ecs.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@
7777
name: dns.answers.ttl
7878
- external: ecs
7979
name: dns.resolved_ip
80+
- external: ecs
81+
name: email
8082
- external: ecs
8183
name: email.attachments
8284
- external: ecs

0 commit comments

Comments
 (0)