mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2026-01-24 00:43:28 +01:00
Compare commits
1 Commits
reyesj2/pa
...
certtest
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7b4d471d7e |
2
.github/DISCUSSION_TEMPLATE/2-4.yml
vendored
2
.github/DISCUSSION_TEMPLATE/2-4.yml
vendored
@@ -33,8 +33,6 @@ body:
|
|||||||
- 2.4.180
|
- 2.4.180
|
||||||
- 2.4.190
|
- 2.4.190
|
||||||
- 2.4.200
|
- 2.4.200
|
||||||
- 2.4.201
|
|
||||||
- 2.4.210
|
|
||||||
- Other (please provide detail below)
|
- Other (please provide detail below)
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
### 2.4.201-20260114 ISO image released on 2026/1/15
|
### 2.4.190-20251024 ISO image released on 2025/10/24
|
||||||
|
|
||||||
|
|
||||||
### Download and Verify
|
### Download and Verify
|
||||||
|
|
||||||
2.4.201-20260114 ISO image:
|
2.4.190-20251024 ISO image:
|
||||||
https://download.securityonion.net/file/securityonion/securityonion-2.4.201-20260114.iso
|
https://download.securityonion.net/file/securityonion/securityonion-2.4.190-20251024.iso
|
||||||
|
|
||||||
MD5: 20E926E433203798512EF46E590C89B9
|
MD5: 25358481FB876226499C011FC0710358
|
||||||
SHA1: 779E4084A3E1A209B494493B8F5658508B6014FA
|
SHA1: 0B26173C0CE136F2CA40A15046D1DFB78BCA1165
|
||||||
SHA256: 3D10E7C885AEC5C5D4F4E50F9644FF9728E8C0A2E36EBB8C96B32569685A7C40
|
SHA256: 4FD9F62EDA672408828B3C0C446FE5EA9FF3C4EE8488A7AB1101544A3C487872
|
||||||
|
|
||||||
Signature for ISO image:
|
Signature for ISO image:
|
||||||
https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.201-20260114.iso.sig
|
https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.190-20251024.iso.sig
|
||||||
|
|
||||||
Signing key:
|
Signing key:
|
||||||
https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2.4/main/KEYS
|
https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2.4/main/KEYS
|
||||||
@@ -25,22 +25,22 @@ wget https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2.
|
|||||||
|
|
||||||
Download the signature file for the ISO:
|
Download the signature file for the ISO:
|
||||||
```
|
```
|
||||||
wget https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.201-20260114.iso.sig
|
wget https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.190-20251024.iso.sig
|
||||||
```
|
```
|
||||||
|
|
||||||
Download the ISO image:
|
Download the ISO image:
|
||||||
```
|
```
|
||||||
wget https://download.securityonion.net/file/securityonion/securityonion-2.4.201-20260114.iso
|
wget https://download.securityonion.net/file/securityonion/securityonion-2.4.190-20251024.iso
|
||||||
```
|
```
|
||||||
|
|
||||||
Verify the downloaded ISO image using the signature file:
|
Verify the downloaded ISO image using the signature file:
|
||||||
```
|
```
|
||||||
gpg --verify securityonion-2.4.201-20260114.iso.sig securityonion-2.4.201-20260114.iso
|
gpg --verify securityonion-2.4.190-20251024.iso.sig securityonion-2.4.190-20251024.iso
|
||||||
```
|
```
|
||||||
|
|
||||||
The output should show "Good signature" and the Primary key fingerprint should match what's shown below:
|
The output should show "Good signature" and the Primary key fingerprint should match what's shown below:
|
||||||
```
|
```
|
||||||
gpg: Signature made Wed 14 Jan 2026 05:23:39 PM EST using RSA key ID FE507013
|
gpg: Signature made Thu 23 Oct 2025 07:21:46 AM EDT using RSA key ID FE507013
|
||||||
gpg: Good signature from "Security Onion Solutions, LLC <info@securityonionsolutions.com>"
|
gpg: Good signature from "Security Onion Solutions, LLC <info@securityonionsolutions.com>"
|
||||||
gpg: WARNING: This key is not certified with a trusted signature!
|
gpg: WARNING: This key is not certified with a trusted signature!
|
||||||
gpg: There is no indication that the signature belongs to the owner.
|
gpg: There is no indication that the signature belongs to the owner.
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
ca:
|
|
||||||
server:
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
base:
|
base:
|
||||||
'*':
|
'*':
|
||||||
- ca
|
|
||||||
- global.soc_global
|
- global.soc_global
|
||||||
- global.adv_global
|
- global.adv_global
|
||||||
- docker.soc_docker
|
- docker.soc_docker
|
||||||
@@ -44,6 +43,8 @@ base:
|
|||||||
- secrets
|
- secrets
|
||||||
- manager.soc_manager
|
- manager.soc_manager
|
||||||
- manager.adv_manager
|
- manager.adv_manager
|
||||||
|
- idstools.soc_idstools
|
||||||
|
- idstools.adv_idstools
|
||||||
- logstash.nodes
|
- logstash.nodes
|
||||||
- logstash.soc_logstash
|
- logstash.soc_logstash
|
||||||
- logstash.adv_logstash
|
- logstash.adv_logstash
|
||||||
@@ -116,6 +117,8 @@ base:
|
|||||||
- elastalert.adv_elastalert
|
- elastalert.adv_elastalert
|
||||||
- manager.soc_manager
|
- manager.soc_manager
|
||||||
- manager.adv_manager
|
- manager.adv_manager
|
||||||
|
- idstools.soc_idstools
|
||||||
|
- idstools.adv_idstools
|
||||||
- soc.soc_soc
|
- soc.soc_soc
|
||||||
- soc.adv_soc
|
- soc.adv_soc
|
||||||
- kibana.soc_kibana
|
- kibana.soc_kibana
|
||||||
@@ -155,6 +158,8 @@ base:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
- secrets
|
- secrets
|
||||||
- healthcheck.standalone
|
- healthcheck.standalone
|
||||||
|
- idstools.soc_idstools
|
||||||
|
- idstools.adv_idstools
|
||||||
- kratos.soc_kratos
|
- kratos.soc_kratos
|
||||||
- kratos.adv_kratos
|
- kratos.adv_kratos
|
||||||
- hydra.soc_hydra
|
- hydra.soc_hydra
|
||||||
|
|||||||
@@ -15,7 +15,11 @@
|
|||||||
'salt.minion-check',
|
'salt.minion-check',
|
||||||
'sensoroni',
|
'sensoroni',
|
||||||
'salt.lasthighstate',
|
'salt.lasthighstate',
|
||||||
'salt.minion',
|
'salt.minion'
|
||||||
|
] %}
|
||||||
|
|
||||||
|
{% set ssl_states = [
|
||||||
|
'ssl',
|
||||||
'telegraf',
|
'telegraf',
|
||||||
'firewall',
|
'firewall',
|
||||||
'schedule',
|
'schedule',
|
||||||
@@ -24,7 +28,7 @@
|
|||||||
|
|
||||||
{% set manager_states = [
|
{% set manager_states = [
|
||||||
'salt.master',
|
'salt.master',
|
||||||
'ca.server',
|
'ca',
|
||||||
'registry',
|
'registry',
|
||||||
'manager',
|
'manager',
|
||||||
'nginx',
|
'nginx',
|
||||||
@@ -34,6 +38,8 @@
|
|||||||
'hydra',
|
'hydra',
|
||||||
'elasticfleet',
|
'elasticfleet',
|
||||||
'elastic-fleet-package-registry',
|
'elastic-fleet-package-registry',
|
||||||
|
'idstools',
|
||||||
|
'suricata.manager',
|
||||||
'utility'
|
'utility'
|
||||||
] %}
|
] %}
|
||||||
|
|
||||||
@@ -71,24 +77,28 @@
|
|||||||
{# Map role-specific states #}
|
{# Map role-specific states #}
|
||||||
{% set role_states = {
|
{% set role_states = {
|
||||||
'so-eval': (
|
'so-eval': (
|
||||||
|
ssl_states +
|
||||||
manager_states +
|
manager_states +
|
||||||
sensor_states +
|
sensor_states +
|
||||||
elastic_stack_states | reject('equalto', 'logstash') | list +
|
elastic_stack_states | reject('equalto', 'logstash') | list
|
||||||
['logstash.ssl']
|
|
||||||
),
|
),
|
||||||
'so-heavynode': (
|
'so-heavynode': (
|
||||||
|
ssl_states +
|
||||||
sensor_states +
|
sensor_states +
|
||||||
['elasticagent', 'elasticsearch', 'logstash', 'redis', 'nginx']
|
['elasticagent', 'elasticsearch', 'logstash', 'redis', 'nginx']
|
||||||
),
|
),
|
||||||
'so-idh': (
|
'so-idh': (
|
||||||
|
ssl_states +
|
||||||
['idh']
|
['idh']
|
||||||
),
|
),
|
||||||
'so-import': (
|
'so-import': (
|
||||||
|
ssl_states +
|
||||||
manager_states +
|
manager_states +
|
||||||
sensor_states | reject('equalto', 'strelka') | reject('equalto', 'healthcheck') | list +
|
sensor_states | reject('equalto', 'strelka') | reject('equalto', 'healthcheck') | list +
|
||||||
['elasticsearch', 'elasticsearch.auth', 'kibana', 'kibana.secrets', 'logstash.ssl', 'strelka.manager']
|
['elasticsearch', 'elasticsearch.auth', 'kibana', 'kibana.secrets', 'strelka.manager']
|
||||||
),
|
),
|
||||||
'so-manager': (
|
'so-manager': (
|
||||||
|
ssl_states +
|
||||||
manager_states +
|
manager_states +
|
||||||
['salt.cloud', 'libvirt.packages', 'libvirt.ssh.users', 'strelka.manager'] +
|
['salt.cloud', 'libvirt.packages', 'libvirt.ssh.users', 'strelka.manager'] +
|
||||||
stig_states +
|
stig_states +
|
||||||
@@ -96,6 +106,7 @@
|
|||||||
elastic_stack_states
|
elastic_stack_states
|
||||||
),
|
),
|
||||||
'so-managerhype': (
|
'so-managerhype': (
|
||||||
|
ssl_states +
|
||||||
manager_states +
|
manager_states +
|
||||||
['salt.cloud', 'strelka.manager', 'hypervisor', 'libvirt'] +
|
['salt.cloud', 'strelka.manager', 'hypervisor', 'libvirt'] +
|
||||||
stig_states +
|
stig_states +
|
||||||
@@ -103,6 +114,7 @@
|
|||||||
elastic_stack_states
|
elastic_stack_states
|
||||||
),
|
),
|
||||||
'so-managersearch': (
|
'so-managersearch': (
|
||||||
|
ssl_states +
|
||||||
manager_states +
|
manager_states +
|
||||||
['salt.cloud', 'libvirt.packages', 'libvirt.ssh.users', 'strelka.manager'] +
|
['salt.cloud', 'libvirt.packages', 'libvirt.ssh.users', 'strelka.manager'] +
|
||||||
stig_states +
|
stig_states +
|
||||||
@@ -110,10 +122,12 @@
|
|||||||
elastic_stack_states
|
elastic_stack_states
|
||||||
),
|
),
|
||||||
'so-searchnode': (
|
'so-searchnode': (
|
||||||
|
ssl_states +
|
||||||
['kafka.ca', 'kafka.ssl', 'elasticsearch', 'logstash', 'nginx'] +
|
['kafka.ca', 'kafka.ssl', 'elasticsearch', 'logstash', 'nginx'] +
|
||||||
stig_states
|
stig_states
|
||||||
),
|
),
|
||||||
'so-standalone': (
|
'so-standalone': (
|
||||||
|
ssl_states +
|
||||||
manager_states +
|
manager_states +
|
||||||
['salt.cloud', 'libvirt.packages', 'libvirt.ssh.users'] +
|
['salt.cloud', 'libvirt.packages', 'libvirt.ssh.users'] +
|
||||||
sensor_states +
|
sensor_states +
|
||||||
@@ -122,24 +136,29 @@
|
|||||||
elastic_stack_states
|
elastic_stack_states
|
||||||
),
|
),
|
||||||
'so-sensor': (
|
'so-sensor': (
|
||||||
|
ssl_states +
|
||||||
sensor_states +
|
sensor_states +
|
||||||
['nginx'] +
|
['nginx'] +
|
||||||
stig_states
|
stig_states
|
||||||
),
|
),
|
||||||
'so-fleet': (
|
'so-fleet': (
|
||||||
|
ssl_states +
|
||||||
stig_states +
|
stig_states +
|
||||||
['logstash', 'nginx', 'healthcheck', 'elasticfleet']
|
['logstash', 'nginx', 'healthcheck', 'elasticfleet']
|
||||||
),
|
),
|
||||||
'so-receiver': (
|
'so-receiver': (
|
||||||
|
ssl_states +
|
||||||
kafka_states +
|
kafka_states +
|
||||||
stig_states +
|
stig_states +
|
||||||
['logstash', 'redis']
|
['logstash', 'redis']
|
||||||
),
|
),
|
||||||
'so-hypervisor': (
|
'so-hypervisor': (
|
||||||
|
ssl_states +
|
||||||
stig_states +
|
stig_states +
|
||||||
['hypervisor', 'libvirt']
|
['hypervisor', 'libvirt']
|
||||||
),
|
),
|
||||||
'so-desktop': (
|
'so-desktop': (
|
||||||
|
['ssl', 'docker_clean', 'telegraf'] +
|
||||||
stig_states
|
stig_states
|
||||||
)
|
)
|
||||||
} %}
|
} %}
|
||||||
|
|||||||
4
salt/ca/dirs.sls
Normal file
4
salt/ca/dirs.sls
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
pki_issued_certs:
|
||||||
|
file.directory:
|
||||||
|
- name: /etc/pki/issued_certs
|
||||||
|
- makedirs: True
|
||||||
@@ -10,7 +10,7 @@ x509_signing_policies:
|
|||||||
- keyUsage: "digitalSignature, nonRepudiation"
|
- keyUsage: "digitalSignature, nonRepudiation"
|
||||||
- subjectKeyIdentifier: hash
|
- subjectKeyIdentifier: hash
|
||||||
- authorityKeyIdentifier: keyid,issuer:always
|
- authorityKeyIdentifier: keyid,issuer:always
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- copypath: /etc/pki/issued_certs/
|
- copypath: /etc/pki/issued_certs/
|
||||||
registry:
|
registry:
|
||||||
- minions: '*'
|
- minions: '*'
|
||||||
@@ -24,7 +24,7 @@ x509_signing_policies:
|
|||||||
- subjectKeyIdentifier: hash
|
- subjectKeyIdentifier: hash
|
||||||
- authorityKeyIdentifier: keyid,issuer:always
|
- authorityKeyIdentifier: keyid,issuer:always
|
||||||
- extendedKeyUsage: serverAuth
|
- extendedKeyUsage: serverAuth
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- copypath: /etc/pki/issued_certs/
|
- copypath: /etc/pki/issued_certs/
|
||||||
managerssl:
|
managerssl:
|
||||||
- minions: '*'
|
- minions: '*'
|
||||||
@@ -38,7 +38,7 @@ x509_signing_policies:
|
|||||||
- subjectKeyIdentifier: hash
|
- subjectKeyIdentifier: hash
|
||||||
- authorityKeyIdentifier: keyid,issuer:always
|
- authorityKeyIdentifier: keyid,issuer:always
|
||||||
- extendedKeyUsage: serverAuth
|
- extendedKeyUsage: serverAuth
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- copypath: /etc/pki/issued_certs/
|
- copypath: /etc/pki/issued_certs/
|
||||||
influxdb:
|
influxdb:
|
||||||
- minions: '*'
|
- minions: '*'
|
||||||
@@ -52,7 +52,7 @@ x509_signing_policies:
|
|||||||
- subjectKeyIdentifier: hash
|
- subjectKeyIdentifier: hash
|
||||||
- authorityKeyIdentifier: keyid,issuer:always
|
- authorityKeyIdentifier: keyid,issuer:always
|
||||||
- extendedKeyUsage: serverAuth
|
- extendedKeyUsage: serverAuth
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- copypath: /etc/pki/issued_certs/
|
- copypath: /etc/pki/issued_certs/
|
||||||
elasticfleet:
|
elasticfleet:
|
||||||
- minions: '*'
|
- minions: '*'
|
||||||
@@ -65,7 +65,7 @@ x509_signing_policies:
|
|||||||
- keyUsage: "digitalSignature, nonRepudiation"
|
- keyUsage: "digitalSignature, nonRepudiation"
|
||||||
- subjectKeyIdentifier: hash
|
- subjectKeyIdentifier: hash
|
||||||
- authorityKeyIdentifier: keyid,issuer:always
|
- authorityKeyIdentifier: keyid,issuer:always
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- copypath: /etc/pki/issued_certs/
|
- copypath: /etc/pki/issued_certs/
|
||||||
kafka:
|
kafka:
|
||||||
- minions: '*'
|
- minions: '*'
|
||||||
@@ -79,5 +79,5 @@ x509_signing_policies:
|
|||||||
- subjectKeyIdentifier: hash
|
- subjectKeyIdentifier: hash
|
||||||
- authorityKeyIdentifier: keyid,issuer:always
|
- authorityKeyIdentifier: keyid,issuer:always
|
||||||
- extendedKeyUsage: "serverAuth, clientAuth"
|
- extendedKeyUsage: "serverAuth, clientAuth"
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- copypath: /etc/pki/issued_certs/
|
- copypath: /etc/pki/issued_certs/
|
||||||
|
|||||||
@@ -3,10 +3,70 @@
|
|||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
# Elastic License 2.0.
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% if sls in allowed_states %}
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
|
||||||
|
|
||||||
include:
|
include:
|
||||||
{% if GLOBALS.is_manager %}
|
- ca.dirs
|
||||||
- ca.server
|
|
||||||
|
/etc/salt/minion.d/signing_policies.conf:
|
||||||
|
file.managed:
|
||||||
|
- source: salt://ca/files/signing_policies.conf
|
||||||
|
|
||||||
|
pki_private_key:
|
||||||
|
x509.private_key_managed:
|
||||||
|
- name: /etc/pki/ca.key
|
||||||
|
- keysize: 4096
|
||||||
|
- passphrase:
|
||||||
|
- backup: True
|
||||||
|
{% if salt['file.file_exists']('/etc/pki/ca.key') -%}
|
||||||
|
- prereq:
|
||||||
|
- x509: /etc/pki/ca.crt
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
pki_public_ca_crt:
|
||||||
|
x509.certificate_managed:
|
||||||
|
- name: /etc/pki/ca.crt
|
||||||
|
- signing_private_key: /etc/pki/ca.key
|
||||||
|
- CN: {{ GLOBALS.manager }}
|
||||||
|
- C: US
|
||||||
|
- ST: Utah
|
||||||
|
- L: Salt Lake City
|
||||||
|
- basicConstraints: "critical CA:true"
|
||||||
|
- keyUsage: "critical cRLSign, keyCertSign"
|
||||||
|
- extendedkeyUsage: "serverAuth, clientAuth"
|
||||||
|
- subjectKeyIdentifier: hash
|
||||||
|
- authorityKeyIdentifier: keyid:always, issuer
|
||||||
|
- days_valid: 11
|
||||||
|
- days_remaining: 7
|
||||||
|
- backup: True
|
||||||
|
- replace: False
|
||||||
|
- require:
|
||||||
|
- sls: ca.dirs
|
||||||
|
- timeout: 30
|
||||||
|
- retry:
|
||||||
|
attempts: 5
|
||||||
|
interval: 30
|
||||||
|
|
||||||
|
mine_update_ca_crt:
|
||||||
|
module.run:
|
||||||
|
- mine.update: []
|
||||||
|
- onchanges:
|
||||||
|
- x509: pki_public_ca_crt
|
||||||
|
|
||||||
|
cakeyperms:
|
||||||
|
file.managed:
|
||||||
|
- replace: False
|
||||||
|
- name: /etc/pki/ca.key
|
||||||
|
- mode: 640
|
||||||
|
- group: 939
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
- ca.trustca
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
{% set CA = {
|
|
||||||
'server': pillar.ca.server
|
|
||||||
}%}
|
|
||||||
@@ -1,35 +1,7 @@
|
|||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
pki_private_key:
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
|
||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
|
||||||
# Elastic License 2.0.
|
|
||||||
|
|
||||||
{% set setup_running = salt['cmd.retcode']('pgrep -x so-setup') == 0 %}
|
|
||||||
|
|
||||||
{% if setup_running%}
|
|
||||||
|
|
||||||
include:
|
|
||||||
- ssl.remove
|
|
||||||
|
|
||||||
remove_pki_private_key:
|
|
||||||
file.absent:
|
file.absent:
|
||||||
- name: /etc/pki/ca.key
|
- name: /etc/pki/ca.key
|
||||||
|
|
||||||
remove_pki_public_ca_crt:
|
pki_public_ca_crt:
|
||||||
file.absent:
|
file.absent:
|
||||||
- name: /etc/pki/ca.crt
|
- name: /etc/pki/ca.crt
|
||||||
|
|
||||||
remove_trusttheca:
|
|
||||||
file.absent:
|
|
||||||
- name: /etc/pki/tls/certs/intca.crt
|
|
||||||
|
|
||||||
remove_pki_public_ca_crt_symlink:
|
|
||||||
file.absent:
|
|
||||||
- name: /opt/so/saltstack/local/salt/ca/files/ca.crt
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
so-setup_not_running:
|
|
||||||
test.show_notification:
|
|
||||||
- text: "This state is reserved for usage during so-setup."
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
|
||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
|
||||||
# Elastic License 2.0.
|
|
||||||
|
|
||||||
{% from 'allowed_states.map.jinja' import allowed_states %}
|
|
||||||
{% if sls in allowed_states %}
|
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
|
||||||
|
|
||||||
pki_private_key:
|
|
||||||
x509.private_key_managed:
|
|
||||||
- name: /etc/pki/ca.key
|
|
||||||
- keysize: 4096
|
|
||||||
- passphrase:
|
|
||||||
- backup: True
|
|
||||||
{% if salt['file.file_exists']('/etc/pki/ca.key') -%}
|
|
||||||
- prereq:
|
|
||||||
- x509: /etc/pki/ca.crt
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
pki_public_ca_crt:
|
|
||||||
x509.certificate_managed:
|
|
||||||
- name: /etc/pki/ca.crt
|
|
||||||
- signing_private_key: /etc/pki/ca.key
|
|
||||||
- CN: {{ GLOBALS.manager }}
|
|
||||||
- C: US
|
|
||||||
- ST: Utah
|
|
||||||
- L: Salt Lake City
|
|
||||||
- basicConstraints: "critical CA:true"
|
|
||||||
- keyUsage: "critical cRLSign, keyCertSign"
|
|
||||||
- extendedkeyUsage: "serverAuth, clientAuth"
|
|
||||||
- subjectKeyIdentifier: hash
|
|
||||||
- authorityKeyIdentifier: keyid:always, issuer
|
|
||||||
- days_valid: 3650
|
|
||||||
- days_remaining: 7
|
|
||||||
- backup: True
|
|
||||||
- replace: False
|
|
||||||
- timeout: 30
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
pki_public_ca_crt_symlink:
|
|
||||||
file.symlink:
|
|
||||||
- name: /opt/so/saltstack/local/salt/ca/files/ca.crt
|
|
||||||
- target: /etc/pki/ca.crt
|
|
||||||
- require:
|
|
||||||
- x509: pki_public_ca_crt
|
|
||||||
|
|
||||||
cakeyperms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/ca.key
|
|
||||||
- mode: 640
|
|
||||||
- group: 939
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{{sls}}_state_not_allowed:
|
|
||||||
test.fail_without_changes:
|
|
||||||
- name: {{sls}}_state_not_allowed
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
|
||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
|
||||||
# Elastic License 2.0.
|
|
||||||
|
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
|
||||||
|
|
||||||
include:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
# Trust the CA
|
|
||||||
trusttheca:
|
|
||||||
file.managed:
|
|
||||||
- name: /etc/pki/tls/certs/intca.crt
|
|
||||||
- source: salt://ca/files/ca.crt
|
|
||||||
- watch_in:
|
|
||||||
- service: docker_running
|
|
||||||
- show_changes: False
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
{% if GLOBALS.os_family == 'Debian' %}
|
|
||||||
symlinkca:
|
|
||||||
file.symlink:
|
|
||||||
- target: /etc/pki/tls/certs/intca.crt
|
|
||||||
- name: /etc/ssl/certs/intca.crt
|
|
||||||
{% endif %}
|
|
||||||
@@ -177,7 +177,7 @@ so-status_script:
|
|||||||
- source: salt://common/tools/sbin/so-status
|
- source: salt://common/tools/sbin/so-status
|
||||||
- mode: 755
|
- mode: 755
|
||||||
|
|
||||||
{% if GLOBALS.is_sensor %}
|
{% if GLOBALS.role in GLOBALS.sensor_roles %}
|
||||||
# Add sensor cleanup
|
# Add sensor cleanup
|
||||||
so-sensor-clean:
|
so-sensor-clean:
|
||||||
cron.present:
|
cron.present:
|
||||||
|
|||||||
@@ -554,39 +554,21 @@ run_check_net_err() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
wait_for_salt_minion() {
|
wait_for_salt_minion() {
|
||||||
local minion="$1"
|
local minion="$1"
|
||||||
local max_wait="${2:-30}"
|
local timeout="${2:-5}"
|
||||||
local interval="${3:-2}"
|
local logfile="${3:-'/dev/stdout'}"
|
||||||
local logfile="${4:-'/dev/stdout'}"
|
retry 60 5 "journalctl -u salt-minion.service | grep 'Minion is ready to receive requests'" >> "$logfile" 2>&1 || fail
|
||||||
local elapsed=0
|
local attempt=0
|
||||||
|
# each attempts would take about 15 seconds
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - Waiting for salt-minion '$minion' to be ready..."
|
local maxAttempts=20
|
||||||
|
until check_salt_minion_status "$minion" "$timeout" "$logfile"; do
|
||||||
while [ $elapsed -lt $max_wait ]; do
|
attempt=$((attempt+1))
|
||||||
# Check if service is running
|
if [[ $attempt -eq $maxAttempts ]]; then
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - Check if salt-minion service is running"
|
return 1
|
||||||
if ! systemctl is-active --quiet salt-minion; then
|
fi
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - salt-minion service not running (elapsed: ${elapsed}s)"
|
sleep 10
|
||||||
sleep $interval
|
done
|
||||||
elapsed=$((elapsed + interval))
|
return 0
|
||||||
continue
|
|
||||||
fi
|
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - salt-minion service is running"
|
|
||||||
|
|
||||||
# Check if minion responds to ping
|
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - Check if $minion responds to ping"
|
|
||||||
if salt "$minion" test.ping --timeout=3 --out=json 2>> "$logfile" | grep -q "true"; then
|
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - salt-minion '$minion' is connected and ready!"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - Waiting... (${elapsed}s / ${max_wait}s)"
|
|
||||||
sleep $interval
|
|
||||||
elapsed=$((elapsed + interval))
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "$(date '+%a %d %b %Y %H:%M:%S.%6N') - ERROR: salt-minion '$minion' not ready after $max_wait seconds"
|
|
||||||
return 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
salt_minion_count() {
|
salt_minion_count() {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ container_list() {
|
|||||||
if [ $MANAGERCHECK == 'so-import' ]; then
|
if [ $MANAGERCHECK == 'so-import' ]; then
|
||||||
TRUSTED_CONTAINERS=(
|
TRUSTED_CONTAINERS=(
|
||||||
"so-elasticsearch"
|
"so-elasticsearch"
|
||||||
|
"so-idstools"
|
||||||
"so-influxdb"
|
"so-influxdb"
|
||||||
"so-kibana"
|
"so-kibana"
|
||||||
"so-kratos"
|
"so-kratos"
|
||||||
@@ -48,6 +49,7 @@ container_list() {
|
|||||||
"so-elastic-fleet-package-registry"
|
"so-elastic-fleet-package-registry"
|
||||||
"so-elasticsearch"
|
"so-elasticsearch"
|
||||||
"so-idh"
|
"so-idh"
|
||||||
|
"so-idstools"
|
||||||
"so-influxdb"
|
"so-influxdb"
|
||||||
"so-kafka"
|
"so-kafka"
|
||||||
"so-kibana"
|
"so-kibana"
|
||||||
@@ -67,6 +69,7 @@ container_list() {
|
|||||||
)
|
)
|
||||||
else
|
else
|
||||||
TRUSTED_CONTAINERS=(
|
TRUSTED_CONTAINERS=(
|
||||||
|
"so-idstools"
|
||||||
"so-elasticsearch"
|
"so-elasticsearch"
|
||||||
"so-logstash"
|
"so-logstash"
|
||||||
"so-nginx"
|
"so-nginx"
|
||||||
|
|||||||
@@ -129,8 +129,6 @@ if [[ $EXCLUDE_STARTUP_ERRORS == 'Y' ]]; then
|
|||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|responded with status-code 503" # telegraf getting 503 from ES during startup
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|responded with status-code 503" # telegraf getting 503 from ES during startup
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|process_cluster_event_timeout_exception" # logstash waiting for elasticsearch to start
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|process_cluster_event_timeout_exception" # logstash waiting for elasticsearch to start
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|not configured for GeoIP" # SO does not bundle the maxminddb with Zeek
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|not configured for GeoIP" # SO does not bundle the maxminddb with Zeek
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|HTTP 404: Not Found" # Salt loops until Kratos returns 200, during startup Kratos may not be ready
|
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|Cancelling deferred write event maybeFenceReplicas because the event queue is now closed" # Kafka controller log during shutdown/restart
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $EXCLUDE_FALSE_POSITIVE_ERRORS == 'Y' ]]; then
|
if [[ $EXCLUDE_FALSE_POSITIVE_ERRORS == 'Y' ]]; then
|
||||||
@@ -161,9 +159,7 @@ if [[ $EXCLUDE_FALSE_POSITIVE_ERRORS == 'Y' ]]; then
|
|||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|adding ingest pipeline" # false positive (elasticsearch ingest pipeline names contain 'error')
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|adding ingest pipeline" # false positive (elasticsearch ingest pipeline names contain 'error')
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|updating index template" # false positive (elasticsearch index or template names contain 'error')
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|updating index template" # false positive (elasticsearch index or template names contain 'error')
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|updating component template" # false positive (elasticsearch index or template names contain 'error')
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|updating component template" # false positive (elasticsearch index or template names contain 'error')
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|upgrading component template" # false positive (elasticsearch index or template names contain 'error')
|
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|upgrading composable template" # false positive (elasticsearch composable template names contain 'error')
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|upgrading composable template" # false positive (elasticsearch composable template names contain 'error')
|
||||||
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|Error while parsing document for index \[.ds-logs-kratos-so-.*object mapping for \[file\]" # false positive (mapping error occuring BEFORE kratos index has rolled over in 2.4.210)
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $EXCLUDE_KNOWN_ERRORS == 'Y' ]]; then
|
if [[ $EXCLUDE_KNOWN_ERRORS == 'Y' ]]; then
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ function suricata() {
|
|||||||
docker run --rm \
|
docker run --rm \
|
||||||
-v /opt/so/conf/suricata/suricata.yaml:/etc/suricata/suricata.yaml:ro \
|
-v /opt/so/conf/suricata/suricata.yaml:/etc/suricata/suricata.yaml:ro \
|
||||||
-v /opt/so/conf/suricata/threshold.conf:/etc/suricata/threshold.conf:ro \
|
-v /opt/so/conf/suricata/threshold.conf:/etc/suricata/threshold.conf:ro \
|
||||||
-v /opt/so/rules/suricata/:/etc/suricata/rules:ro \
|
-v /opt/so/conf/suricata/rules:/etc/suricata/rules:ro \
|
||||||
-v ${LOG_PATH}:/var/log/suricata/:rw \
|
-v ${LOG_PATH}:/var/log/suricata/:rw \
|
||||||
-v ${NSM_PATH}/:/nsm/:rw \
|
-v ${NSM_PATH}/:/nsm/:rw \
|
||||||
-v "$PCAP:/input.pcap:ro" \
|
-v "$PCAP:/input.pcap:ro" \
|
||||||
|
|||||||
@@ -3,16 +3,29 @@
|
|||||||
{# we only want this state to run it is CentOS #}
|
{# we only want this state to run it is CentOS #}
|
||||||
{% if GLOBALS.os == 'OEL' %}
|
{% if GLOBALS.os == 'OEL' %}
|
||||||
|
|
||||||
|
{% set global_ca_text = [] %}
|
||||||
|
{% set global_ca_server = [] %}
|
||||||
|
{% set manager = GLOBALS.manager %}
|
||||||
|
{% set x509dict = salt['mine.get'](manager | lower~'*', 'x509.get_pem_entries') %}
|
||||||
|
{% for host in x509dict %}
|
||||||
|
{% if host.split('_')|last in ['manager', 'managersearch', 'standalone', 'import', 'eval'] %}
|
||||||
|
{% do global_ca_text.append(x509dict[host].get('/etc/pki/ca.crt')|replace('\n', '')) %}
|
||||||
|
{% do global_ca_server.append(host) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% set trusttheca_text = global_ca_text[0] %}
|
||||||
|
{% set ca_server = global_ca_server[0] %}
|
||||||
|
|
||||||
trusted_ca:
|
trusted_ca:
|
||||||
file.managed:
|
x509.pem_managed:
|
||||||
- name: /etc/pki/ca-trust/source/anchors/ca.crt
|
- name: /etc/pki/ca-trust/source/anchors/ca.crt
|
||||||
- source: salt://ca/files/ca.crt
|
- text: {{ trusttheca_text }}
|
||||||
|
|
||||||
update_ca_certs:
|
update_ca_certs:
|
||||||
cmd.run:
|
cmd.run:
|
||||||
- name: update-ca-trust
|
- name: update-ca-trust
|
||||||
- onchanges:
|
- onchanges:
|
||||||
- file: trusted_ca
|
- x509: trusted_ca
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ docker:
|
|||||||
custom_bind_mounts: []
|
custom_bind_mounts: []
|
||||||
extra_hosts: []
|
extra_hosts: []
|
||||||
extra_env: []
|
extra_env: []
|
||||||
|
'so-idstools':
|
||||||
|
final_octet: 25
|
||||||
|
custom_bind_mounts: []
|
||||||
|
extra_hosts: []
|
||||||
|
extra_env: []
|
||||||
'so-influxdb':
|
'so-influxdb':
|
||||||
final_octet: 26
|
final_octet: 26
|
||||||
port_bindings:
|
port_bindings:
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
{% from 'docker/docker.map.jinja' import DOCKER %}
|
{% from 'docker/docker.map.jinja' import DOCKER %}
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
|
||||||
# docker service requires the ca.crt
|
# include ssl since docker service requires the intca
|
||||||
include:
|
include:
|
||||||
- ca
|
- ssl
|
||||||
|
|
||||||
dockergroup:
|
dockergroup:
|
||||||
group.present:
|
group.present:
|
||||||
@@ -89,9 +89,10 @@ docker_running:
|
|||||||
- enable: True
|
- enable: True
|
||||||
- watch:
|
- watch:
|
||||||
- file: docker_daemon
|
- file: docker_daemon
|
||||||
|
- x509: trusttheca
|
||||||
- require:
|
- require:
|
||||||
- file: docker_daemon
|
- file: docker_daemon
|
||||||
- file: trusttheca
|
- x509: trusttheca
|
||||||
|
|
||||||
|
|
||||||
# Reserve OS ports for Docker proxy in case boot settings are not already applied/present
|
# Reserve OS ports for Docker proxy in case boot settings are not already applied/present
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ docker:
|
|||||||
forcedType: "[]string"
|
forcedType: "[]string"
|
||||||
so-elastic-fleet: *dockerOptions
|
so-elastic-fleet: *dockerOptions
|
||||||
so-elasticsearch: *dockerOptions
|
so-elasticsearch: *dockerOptions
|
||||||
|
so-idstools: *dockerOptions
|
||||||
so-influxdb: *dockerOptions
|
so-influxdb: *dockerOptions
|
||||||
so-kibana: *dockerOptions
|
so-kibana: *dockerOptions
|
||||||
so-kratos: *dockerOptions
|
so-kratos: *dockerOptions
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ so-elastalert:
|
|||||||
- watch:
|
- watch:
|
||||||
- file: elastaconf
|
- file: elastaconf
|
||||||
- onlyif:
|
- onlyif:
|
||||||
- "so-elasticsearch-query / | jq -r '.version.number[0:1]' | grep -q 9" {# only run this state if elasticsearch is version 9 #}
|
- "so-elasticsearch-query / | jq -r '.version.number[0:1]' | grep -q 8" {# only run this state if elasticsearch is version 8 #}
|
||||||
|
|
||||||
delete_so-elastalert_so-status.disabled:
|
delete_so-elastalert_so-status.disabled:
|
||||||
file.uncomment:
|
file.uncomment:
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
{% from 'docker/docker.map.jinja' import DOCKER %}
|
{% from 'docker/docker.map.jinja' import DOCKER %}
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- ca
|
|
||||||
- elasticagent.config
|
- elasticagent.config
|
||||||
- elasticagent.sostatus
|
- elasticagent.sostatus
|
||||||
|
|
||||||
@@ -56,10 +55,8 @@ so-elastic-agent:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
- require:
|
- require:
|
||||||
- file: create-elastic-agent-config
|
- file: create-elastic-agent-config
|
||||||
- file: trusttheca
|
|
||||||
- watch:
|
- watch:
|
||||||
- file: create-elastic-agent-config
|
- file: create-elastic-agent-config
|
||||||
- file: trusttheca
|
|
||||||
|
|
||||||
delete_so-elastic-agent_so-status.disabled:
|
delete_so-elastic-agent_so-status.disabled:
|
||||||
file.uncomment:
|
file.uncomment:
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
{# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
|
||||||
or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
|
||||||
https://securityonion.net/license; you may not use this file except in compliance with the
|
|
||||||
Elastic License 2.0. #}
|
|
||||||
|
|
||||||
{% from 'elasticfleet/map.jinja' import ELASTICFLEETMERGED %}
|
|
||||||
|
|
||||||
{# advanced config_yaml options for elasticfleet logstash output #}
|
|
||||||
{% set ADV_OUTPUT_LOGSTASH_RAW = ELASTICFLEETMERGED.config.outputs.logstash %}
|
|
||||||
{% set ADV_OUTPUT_LOGSTASH = {} %}
|
|
||||||
{% for k, v in ADV_OUTPUT_LOGSTASH_RAW.items() %}
|
|
||||||
{% if v != "" and v is not none %}
|
|
||||||
{% if k == 'queue_mem_events' %}
|
|
||||||
{# rename queue_mem_events queue.mem.events #}
|
|
||||||
{% do ADV_OUTPUT_LOGSTASH.update({'queue.mem.events':v}) %}
|
|
||||||
{% elif k == 'loadbalance' %}
|
|
||||||
{% if v %}
|
|
||||||
{# only include loadbalance config when its True #}
|
|
||||||
{% do ADV_OUTPUT_LOGSTASH.update({k:v}) %}
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{% do ADV_OUTPUT_LOGSTASH.update({k:v}) %}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% set LOGSTASH_CONFIG_YAML_RAW = [] %}
|
|
||||||
{% if ADV_OUTPUT_LOGSTASH %}
|
|
||||||
{% for k, v in ADV_OUTPUT_LOGSTASH.items() %}
|
|
||||||
{% do LOGSTASH_CONFIG_YAML_RAW.append(k ~ ': ' ~ v) %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% set LOGSTASH_CONFIG_YAML = LOGSTASH_CONFIG_YAML_RAW | join('\\n') if LOGSTASH_CONFIG_YAML_RAW else '' %}
|
|
||||||
@@ -95,9 +95,6 @@ soresourcesrepoclone:
|
|||||||
- rev: 'main'
|
- rev: 'main'
|
||||||
- depth: 1
|
- depth: 1
|
||||||
- force_reset: True
|
- force_reset: True
|
||||||
- retry:
|
|
||||||
attempts: 3
|
|
||||||
interval: 10
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
elasticdefendconfdir:
|
elasticdefendconfdir:
|
||||||
|
|||||||
@@ -10,14 +10,6 @@ elasticfleet:
|
|||||||
grid_enrollment: ''
|
grid_enrollment: ''
|
||||||
defend_filters:
|
defend_filters:
|
||||||
enable_auto_configuration: False
|
enable_auto_configuration: False
|
||||||
outputs:
|
|
||||||
logstash:
|
|
||||||
bulk_max_size: ''
|
|
||||||
worker: ''
|
|
||||||
queue_mem_events: ''
|
|
||||||
timeout: ''
|
|
||||||
loadbalance: False
|
|
||||||
compression_level: ''
|
|
||||||
subscription_integrations: False
|
subscription_integrations: False
|
||||||
auto_upgrade_integrations: False
|
auto_upgrade_integrations: False
|
||||||
logging:
|
logging:
|
||||||
|
|||||||
@@ -13,11 +13,9 @@
|
|||||||
{% set SERVICETOKEN = salt['pillar.get']('elasticfleet:config:server:es_token','') %}
|
{% set SERVICETOKEN = salt['pillar.get']('elasticfleet:config:server:es_token','') %}
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- ca
|
|
||||||
- logstash.ssl
|
|
||||||
- elasticfleet.ssl
|
|
||||||
- elasticfleet.config
|
- elasticfleet.config
|
||||||
- elasticfleet.sostatus
|
- elasticfleet.sostatus
|
||||||
|
- ssl
|
||||||
|
|
||||||
{% if grains.role not in ['so-fleet'] %}
|
{% if grains.role not in ['so-fleet'] %}
|
||||||
# Wait for Elasticsearch to be ready - no reason to try running Elastic Fleet server if ES is not ready
|
# Wait for Elasticsearch to be ready - no reason to try running Elastic Fleet server if ES is not ready
|
||||||
@@ -34,17 +32,6 @@ so-elastic-fleet-auto-configure-logstash-outputs:
|
|||||||
- retry:
|
- retry:
|
||||||
attempts: 4
|
attempts: 4
|
||||||
interval: 30
|
interval: 30
|
||||||
|
|
||||||
{# Separate from above in order to catch elasticfleet-logstash.crt changes and force update to fleet output policy #}
|
|
||||||
so-elastic-fleet-auto-configure-logstash-outputs-force:
|
|
||||||
cmd.run:
|
|
||||||
- name: /usr/sbin/so-elastic-fleet-outputs-update --certs
|
|
||||||
- retry:
|
|
||||||
attempts: 4
|
|
||||||
interval: 30
|
|
||||||
- onchanges:
|
|
||||||
- x509: etc_elasticfleet_logstash_crt
|
|
||||||
- x509: elasticfleet_kafka_crt
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# If enabled, automatically update Fleet Server URLs & ES Connection
|
# If enabled, automatically update Fleet Server URLs & ES Connection
|
||||||
@@ -135,11 +122,6 @@ so-elastic-fleet:
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
- watch:
|
- watch:
|
||||||
- file: trusttheca
|
|
||||||
- x509: etc_elasticfleet_key
|
|
||||||
- x509: etc_elasticfleet_crt
|
|
||||||
- require:
|
|
||||||
- file: trusttheca
|
|
||||||
- x509: etc_elasticfleet_key
|
- x509: etc_elasticfleet_key
|
||||||
- x509: etc_elasticfleet_crt
|
- x509: etc_elasticfleet_crt
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{%- raw -%}
|
{%- raw -%}
|
||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "import-zeek-logs",
|
"name": "import-zeek-logs",
|
||||||
@@ -10,31 +10,19 @@
|
|||||||
"description": "Zeek Import logs",
|
"description": "Zeek Import logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/import/*/zeek/logs/*.log"
|
"/nsm/import/*/zeek/logs/*.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "import",
|
"data_stream.dataset": "import",
|
||||||
"pipeline": "",
|
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": ["({%- endraw -%}{{ ELASTICFLEETMERGED.logging.zeek.excluded | join('|') }}{%- raw -%}).log$"],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- dissect:\n tokenizer: \"/nsm/import/%{import.id}/zeek/logs/%{import.file}\"\n field: \"log.file.path\"\n target_prefix: \"\"\n- script:\n lang: javascript\n source: >\n function process(event) {\n var pl = event.Get(\"import.file\").slice(0,-4);\n event.Put(\"@metadata.pipeline\", \"zeek.\" + pl);\n }\n- add_fields:\n target: event\n fields:\n category: network\n module: zeek\n imported: true\n- add_tags:\n tags: \"ics\"\n when:\n regexp:\n import.file: \"^bacnet*|^bsap*|^cip*|^cotp*|^dnp3*|^ecat*|^enip*|^modbus*|^opcua*|^profinet*|^s7comm*\"",
|
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"recursive_glob": true,
|
"processors": "- dissect:\n tokenizer: \"/nsm/import/%{import.id}/zeek/logs/%{import.file}\"\n field: \"log.file.path\"\n target_prefix: \"\"\n- script:\n lang: javascript\n source: >\n function process(event) {\n var pl = event.Get(\"import.file\").slice(0,-4);\n event.Put(\"@metadata.pipeline\", \"zeek.\" + pl);\n }\n- add_fields:\n target: event\n fields:\n category: network\n module: zeek\n imported: true\n- add_tags:\n tags: \"ics\"\n when:\n regexp:\n import.file: \"^bacnet*|^bsap*|^cip*|^cotp*|^dnp3*|^ecat*|^enip*|^modbus*|^opcua*|^profinet*|^s7comm*\"",
|
||||||
"clean_inactive": -1,
|
"custom": "exclude_files: [\"{%- endraw -%}{{ ELASTICFLEETMERGED.logging.zeek.excluded | join('|') }}{%- raw -%}.log$\"]\n"
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,47 +11,31 @@
|
|||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "kratos-logs",
|
"name": "kratos-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Kratos logs",
|
"description": "Kratos logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/opt/so/log/kratos/kratos.log"
|
"/opt/so/log/kratos/kratos.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "kratos",
|
"data_stream.dataset": "kratos",
|
||||||
"pipeline": "kratos",
|
"tags": ["so-kratos"],
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
{%- if valid_identities -%}
|
{%- if valid_identities -%}
|
||||||
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true\n- add_fields:\n target: event\n fields:\n category: iam\n module: kratos\n- if:\n has_fields:\n - identity_id\n then:{% for id, email in identities %}\n - if:\n equals:\n identity_id: \"{{ id }}\"\n then:\n - add_fields:\n target: ''\n fields:\n user.name: \"{{ email }}\"{% endfor %}",
|
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true\n- add_fields:\n target: event\n fields:\n category: iam\n module: kratos\n- if:\n has_fields:\n - identity_id\n then:{% for id, email in identities %}\n - if:\n equals:\n identity_id: \"{{ id }}\"\n then:\n - add_fields:\n target: ''\n fields:\n user.name: \"{{ email }}\"{% endfor %}",
|
||||||
{%- else -%}
|
{%- else -%}
|
||||||
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true\n- add_fields:\n target: event\n fields:\n category: iam\n module: kratos",
|
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true\n- add_fields:\n target: event\n fields:\n category: iam\n module: kratos",
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
"tags": [
|
"custom": "pipeline: kratos"
|
||||||
"so-kratos"
|
|
||||||
],
|
|
||||||
"recursive_glob": true,
|
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -59,3 +43,4 @@
|
|||||||
},
|
},
|
||||||
"force": true
|
"force": true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,38 +2,28 @@
|
|||||||
{%- raw -%}
|
{%- raw -%}
|
||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
|
"id": "zeek-logs",
|
||||||
"name": "zeek-logs",
|
"name": "zeek-logs",
|
||||||
"namespace": "so",
|
"namespace": "so",
|
||||||
"description": "Zeek logs",
|
"description": "Zeek logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/zeek/logs/current/*.log"
|
"/nsm/zeek/logs/current/*.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "zeek",
|
"data_stream.dataset": "zeek",
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": ["({%- endraw -%}{{ ELASTICFLEETMERGED.logging.zeek.excluded | join('|') }}{%- raw -%}).log$"],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- dissect:\n tokenizer: \"/nsm/zeek/logs/current/%{pipeline}.log\"\n field: \"log.file.path\"\n trim_chars: \".log\"\n target_prefix: \"\"\n- script:\n lang: javascript\n source: >\n function process(event) {\n var pl = event.Get(\"pipeline\");\n event.Put(\"@metadata.pipeline\", \"zeek.\" + pl);\n }\n- add_fields:\n target: event\n fields:\n category: network\n module: zeek\n- add_tags:\n tags: \"ics\"\n when:\n regexp:\n pipeline: \"^bacnet*|^bsap*|^cip*|^cotp*|^dnp3*|^ecat*|^enip*|^modbus*|^opcua*|^profinet*|^s7comm*\"",
|
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"recursive_glob": true,
|
"processors": "- dissect:\n tokenizer: \"/nsm/zeek/logs/current/%{pipeline}.log\"\n field: \"log.file.path\"\n trim_chars: \".log\"\n target_prefix: \"\"\n- script:\n lang: javascript\n source: >\n function process(event) {\n var pl = event.Get(\"pipeline\");\n event.Put(\"@metadata.pipeline\", \"zeek.\" + pl);\n }\n- add_fields:\n target: event\n fields:\n category: network\n module: zeek\n- add_tags:\n tags: \"ics\"\n when:\n regexp:\n pipeline: \"^bacnet*|^bsap*|^cip*|^cotp*|^dnp3*|^ecat*|^enip*|^modbus*|^opcua*|^profinet*|^s7comm*\"",
|
||||||
"clean_inactive": -1,
|
"custom": "exclude_files: [\"{%- endraw -%}{{ ELASTICFLEETMERGED.logging.zeek.excluded | join('|') }}{%- raw -%}.log$\"]\n"
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"package": {
|
"package": {
|
||||||
"name": "endpoint",
|
"name": "endpoint",
|
||||||
"title": "Elastic Defend",
|
"title": "Elastic Defend",
|
||||||
"version": "9.0.2",
|
"version": "8.18.1",
|
||||||
"requires_root": true
|
"requires_root": true
|
||||||
},
|
},
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
|
|||||||
@@ -1,43 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "hydra-logs",
|
"name": "hydra-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Hydra logs",
|
"description": "Hydra logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/opt/so/log/hydra/hydra.log"
|
"/opt/so/log/hydra/hydra.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "hydra",
|
"data_stream.dataset": "hydra",
|
||||||
"pipeline": "hydra",
|
"tags": ["so-hydra"],
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: iam\n module: hydra",
|
||||||
"exclude_files": [
|
"custom": "pipeline: hydra"
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true\n- add_fields:\n target: event\n fields:\n category: iam\n module: hydra",
|
|
||||||
"tags": [
|
|
||||||
"so-hydra"
|
|
||||||
],
|
|
||||||
"recursive_glob": true,
|
|
||||||
"ignore_older": "72h",
|
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -45,5 +28,3 @@
|
|||||||
},
|
},
|
||||||
"force": true
|
"force": true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "idh-logs",
|
"name": "idh-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "IDH integration",
|
"description": "IDH integration",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/idh/opencanary.log"
|
"/nsm/idh/opencanary.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "idh",
|
"data_stream.dataset": "idh",
|
||||||
"pipeline": "common",
|
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "\n- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true\n- convert:\n fields:\n - {from: \"logtype\", to: \"event.code\", type: \"string\"}\n- drop_fields:\n when:\n equals:\n event.code: \"1001\"\n fields: [\"src_host\", \"src_port\", \"dst_host\", \"dst_port\" ]\n ignore_missing: true\n- rename:\n fields:\n - from: \"src_host\"\n to: \"source.ip\"\n - from: \"src_port\"\n to: \"source.port\"\n - from: \"dst_host\"\n to: \"destination.host\"\n - from: \"dst_port\"\n to: \"destination.port\"\n ignore_missing: true\n- drop_fields:\n fields: '[\"prospector\", \"input\", \"offset\", \"beat\"]'\n- add_fields:\n target: event\n fields:\n category: host\n module: opencanary",
|
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"recursive_glob": true,
|
"processors": "\n- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true\n- convert:\n fields:\n - {from: \"logtype\", to: \"event.code\", type: \"string\"}\n- drop_fields:\n when:\n equals:\n event.code: \"1001\"\n fields: [\"src_host\", \"src_port\", \"dst_host\", \"dst_port\" ]\n ignore_missing: true\n- rename:\n fields:\n - from: \"src_host\"\n to: \"source.ip\"\n - from: \"src_port\"\n to: \"source.port\"\n - from: \"dst_host\"\n to: \"destination.host\"\n - from: \"dst_port\"\n to: \"destination.port\"\n ignore_missing: true\n- drop_fields:\n fields: '[\"prospector\", \"input\", \"offset\", \"beat\"]'\n- add_fields:\n target: event\n fields:\n category: host\n module: opencanary",
|
||||||
"clean_inactive": -1,
|
"custom": "pipeline: common"
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +1,29 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "import-evtx-logs",
|
"name": "import-evtx-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Import Windows EVTX logs",
|
"description": "Import Windows EVTX logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
"vars": {},
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/import/*/evtx/*.json"
|
"/nsm/import/*/evtx/*.json"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "import",
|
"data_stream.dataset": "import",
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
"custom": "",
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- dissect:\n tokenizer: \"/nsm/import/%{import.id}/evtx/%{import.file}\"\n field: \"log.file.path\"\n target_prefix: \"\"\n- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n- drop_fields:\n fields: [\"host\"]\n ignore_missing: true\n- add_fields:\n target: data_stream\n fields:\n type: logs\n dataset: system.security\n- add_fields:\n target: event\n fields:\n dataset: system.security\n module: system\n imported: true\n- add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-system.security-2.6.1\n- if:\n equals:\n winlog.channel: 'Microsoft-Windows-Sysmon/Operational'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: windows.sysmon_operational\n - add_fields:\n target: event\n fields:\n dataset: windows.sysmon_operational\n module: windows\n imported: true\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-windows.sysmon_operational-3.1.2\n- if:\n equals:\n winlog.channel: 'Application'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: system.application\n - add_fields:\n target: event\n fields:\n dataset: system.application\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-system.application-2.6.1\n- if:\n equals:\n winlog.channel: 'System'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: system.system\n - add_fields:\n target: event\n fields:\n dataset: system.system\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-system.system-2.6.1\n \n- if:\n equals:\n winlog.channel: 'Microsoft-Windows-PowerShell/Operational'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: windows.powershell_operational\n - add_fields:\n target: event\n fields:\n dataset: windows.powershell_operational\n module: windows\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-windows.powershell_operational-3.1.2\n- add_fields:\n target: data_stream\n fields:\n dataset: import",
|
"processors": "- dissect:\n tokenizer: \"/nsm/import/%{import.id}/evtx/%{import.file}\"\n field: \"log.file.path\"\n target_prefix: \"\"\n- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n- drop_fields:\n fields: [\"host\"]\n ignore_missing: true\n- add_fields:\n target: data_stream\n fields:\n type: logs\n dataset: system.security\n- add_fields:\n target: event\n fields:\n dataset: system.security\n module: system\n imported: true\n- add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-system.security-2.6.1\n- if:\n equals:\n winlog.channel: 'Microsoft-Windows-Sysmon/Operational'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: windows.sysmon_operational\n - add_fields:\n target: event\n fields:\n dataset: windows.sysmon_operational\n module: windows\n imported: true\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-windows.sysmon_operational-3.1.2\n- if:\n equals:\n winlog.channel: 'Application'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: system.application\n - add_fields:\n target: event\n fields:\n dataset: system.application\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-system.application-2.6.1\n- if:\n equals:\n winlog.channel: 'System'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: system.system\n - add_fields:\n target: event\n fields:\n dataset: system.system\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-system.system-2.6.1\n \n- if:\n equals:\n winlog.channel: 'Microsoft-Windows-PowerShell/Operational'\n then: \n - add_fields:\n target: data_stream\n fields:\n dataset: windows.powershell_operational\n - add_fields:\n target: event\n fields:\n dataset: windows.powershell_operational\n module: windows\n - add_fields:\n target: \"@metadata\"\n fields:\n pipeline: logs-windows.powershell_operational-3.1.2\n- add_fields:\n target: data_stream\n fields:\n dataset: import",
|
||||||
"tags": [
|
"tags": [
|
||||||
"import"
|
"import"
|
||||||
],
|
]
|
||||||
"recursive_glob": true,
|
|
||||||
"ignore_older": "72h",
|
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "import-suricata-logs",
|
"name": "import-suricata-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Import Suricata logs",
|
"description": "Import Suricata logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/import/*/suricata/eve*.json"
|
"/nsm/import/*/suricata/eve*.json"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "import",
|
"data_stream.dataset": "import",
|
||||||
"pipeline": "suricata.common",
|
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- add_fields:\n target: event\n fields:\n category: network\n module: suricata\n imported: true\n- dissect:\n tokenizer: \"/nsm/import/%{import.id}/suricata/%{import.file}\"\n field: \"log.file.path\"\n target_prefix: \"\"\n",
|
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"recursive_glob": true,
|
"processors": "- add_fields:\n target: event\n fields:\n category: network\n module: suricata\n imported: true\n- dissect:\n tokenizer: \"/nsm/import/%{import.id}/suricata/%{import.file}\"\n field: \"log.file.path\"\n target_prefix: \"\"",
|
||||||
"ignore_older": "72h",
|
"custom": "pipeline: suricata.common"
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "rita-logs",
|
"name": "rita-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "RITA Logs",
|
"description": "RITA Logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
"vars": {},
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
@@ -19,28 +20,15 @@
|
|||||||
"/nsm/rita/exploded-dns.csv",
|
"/nsm/rita/exploded-dns.csv",
|
||||||
"/nsm/rita/long-connections.csv"
|
"/nsm/rita/long-connections.csv"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "rita",
|
"exclude_files": [],
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- dissect:\n tokenizer: \"/nsm/rita/%{pipeline}.csv\"\n field: \"log.file.path\"\n trim_chars: \".csv\"\n target_prefix: \"\"\n- script:\n lang: javascript\n source: >\n function process(event) {\n var pl = event.Get(\"pipeline\").split(\"-\");\n if (pl.length > 1) {\n pl = pl[1];\n }\n else {\n pl = pl[0];\n }\n event.Put(\"@metadata.pipeline\", \"rita.\" + pl);\n }\n- add_fields:\n target: event\n fields:\n category: network\n module: rita",
|
|
||||||
"tags": [],
|
|
||||||
"recursive_glob": true,
|
|
||||||
"ignore_older": "72h",
|
"ignore_older": "72h",
|
||||||
"clean_inactive": -1,
|
"data_stream.dataset": "rita",
|
||||||
"harvester_limit": 0,
|
"tags": [],
|
||||||
"fingerprint": false,
|
"processors": "- dissect:\n tokenizer: \"/nsm/rita/%{pipeline}.csv\"\n field: \"log.file.path\"\n trim_chars: \".csv\"\n target_prefix: \"\"\n- script:\n lang: javascript\n source: >\n function process(event) {\n var pl = event.Get(\"pipeline\").split(\"-\");\n if (pl.length > 1) {\n pl = pl[1];\n }\n else {\n pl = pl[0];\n }\n event.Put(\"@metadata.pipeline\", \"rita.\" + pl);\n }\n- add_fields:\n target: event\n fields:\n category: network\n module: rita",
|
||||||
"fingerprint_offset": 0,
|
"custom": "exclude_lines: ['^Score', '^Source', '^Domain', '^No results']"
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"force": true
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,29 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "so-ip-mappings",
|
"name": "so-ip-mappings",
|
||||||
|
"namespace": "so",
|
||||||
"description": "IP Description mappings",
|
"description": "IP Description mappings",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
"vars": {},
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/custom-mappings/ip-descriptions.csv"
|
"/nsm/custom-mappings/ip-descriptions.csv"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "hostnamemappings",
|
"data_stream.dataset": "hostnamemappings",
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- decode_csv_fields:\n fields:\n message: decoded.csv\n separator: \",\"\n ignore_missing: false\n overwrite_keys: true\n trim_leading_space: true\n fail_on_error: true\n\n- extract_array:\n field: decoded.csv\n mappings:\n so.ip_address: '0'\n so.description: '1'\n\n- script:\n lang: javascript\n source: >\n function process(event) {\n var ip = event.Get('so.ip_address');\n var validIpRegex = /^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)$/\n if (!validIpRegex.test(ip)) {\n event.Cancel();\n }\n }\n- fingerprint:\n fields: [\"so.ip_address\"]\n target_field: \"@metadata._id\"\n",
|
|
||||||
"tags": [
|
"tags": [
|
||||||
"so-ip-mappings"
|
"so-ip-mappings"
|
||||||
],
|
],
|
||||||
"recursive_glob": true,
|
"processors": "- decode_csv_fields:\n fields:\n message: decoded.csv\n separator: \",\"\n ignore_missing: false\n overwrite_keys: true\n trim_leading_space: true\n fail_on_error: true\n\n- extract_array:\n field: decoded.csv\n mappings:\n so.ip_address: '0'\n so.description: '1'\n\n- script:\n lang: javascript\n source: >\n function process(event) {\n var ip = event.Get('so.ip_address');\n var validIpRegex = /^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)$/\n if (!validIpRegex.test(ip)) {\n event.Cancel();\n }\n }\n- fingerprint:\n fields: [\"so.ip_address\"]\n target_field: \"@metadata._id\"\n",
|
||||||
"clean_inactive": -1,
|
"custom": ""
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,3 +31,5 @@
|
|||||||
},
|
},
|
||||||
"force": true
|
"force": true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "soc-auth-sync-logs",
|
"name": "soc-auth-sync-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Security Onion - Elastic Auth Sync - Logs",
|
"description": "Security Onion - Elastic Auth Sync - Logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/opt/so/log/soc/sync.log"
|
"/opt/so/log/soc/sync.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "soc",
|
"data_stream.dataset": "soc",
|
||||||
"pipeline": "common",
|
"tags": ["so-soc"],
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- dissect:\n tokenizer: \"%{event.action}\"\n field: \"message\"\n target_prefix: \"\"\n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: auth_sync",
|
"processors": "- dissect:\n tokenizer: \"%{event.action}\"\n field: \"message\"\n target_prefix: \"\"\n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: auth_sync",
|
||||||
"tags": [],
|
"custom": "pipeline: common"
|
||||||
"recursive_glob": true,
|
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +1,31 @@
|
|||||||
{
|
{
|
||||||
|
"policy_id": "so-grid-nodes_general",
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "soc-detections-logs",
|
"name": "soc-detections-logs",
|
||||||
"description": "Security Onion Console - Detections Logs",
|
"description": "Security Onion Console - Detections Logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
|
||||||
"namespace": "so",
|
"namespace": "so",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/opt/so/log/soc/detections_runtime-status_sigma.log",
|
"/opt/so/log/soc/detections_runtime-status_sigma.log",
|
||||||
"/opt/so/log/soc/detections_runtime-status_yara.log"
|
"/opt/so/log/soc/detections_runtime-status_yara.log"
|
||||||
],
|
],
|
||||||
|
"exclude_files": [],
|
||||||
|
"ignore_older": "72h",
|
||||||
"data_stream.dataset": "soc",
|
"data_stream.dataset": "soc",
|
||||||
"pipeline": "common",
|
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"soc\"\n process_array: true\n max_depth: 2\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: detections\n- rename:\n fields:\n - from: \"soc.fields.sourceIp\"\n to: \"source.ip\"\n - from: \"soc.fields.status\"\n to: \"http.response.status_code\"\n - from: \"soc.fields.method\"\n to: \"http.request.method\"\n - from: \"soc.fields.path\"\n to: \"url.path\"\n - from: \"soc.message\"\n to: \"event.action\"\n - from: \"soc.level\"\n to: \"log.level\"\n ignore_missing: true",
|
|
||||||
"tags": [
|
"tags": [
|
||||||
"so-soc"
|
"so-soc"
|
||||||
],
|
],
|
||||||
"recursive_glob": true,
|
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"soc\"\n process_array: true\n max_depth: 2\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: detections\n- rename:\n fields:\n - from: \"soc.fields.sourceIp\"\n to: \"source.ip\"\n - from: \"soc.fields.status\"\n to: \"http.response.status_code\"\n - from: \"soc.fields.method\"\n to: \"http.request.method\"\n - from: \"soc.fields.path\"\n to: \"url.path\"\n - from: \"soc.message\"\n to: \"event.action\"\n - from: \"soc.level\"\n to: \"log.level\"\n ignore_missing: true",
|
||||||
"ignore_older": "72h",
|
"custom": "pipeline: common"
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "soc-salt-relay-logs",
|
"name": "soc-salt-relay-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Security Onion - Salt Relay - Logs",
|
"description": "Security Onion - Salt Relay - Logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/opt/so/log/soc/salt-relay.log"
|
"/opt/so/log/soc/salt-relay.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "soc",
|
"data_stream.dataset": "soc",
|
||||||
"pipeline": "common",
|
"tags": ["so-soc"],
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- dissect:\n tokenizer: \"%{soc.ts} | %{event.action}\"\n field: \"message\"\n target_prefix: \"\"\n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: salt_relay",
|
"processors": "- dissect:\n tokenizer: \"%{soc.ts} | %{event.action}\"\n field: \"message\"\n target_prefix: \"\"\n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: salt_relay",
|
||||||
"tags": [
|
"custom": "pipeline: common"
|
||||||
"so-soc"
|
|
||||||
],
|
|
||||||
"recursive_glob": true,
|
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +1,30 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "soc-sensoroni-logs",
|
"name": "soc-sensoroni-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Security Onion - Sensoroni - Logs",
|
"description": "Security Onion - Sensoroni - Logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/opt/so/log/sensoroni/sensoroni.log"
|
"/opt/so/log/sensoroni/sensoroni.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "soc",
|
"data_stream.dataset": "soc",
|
||||||
"pipeline": "common",
|
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"sensoroni\"\n process_array: true\n max_depth: 2\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: sensoroni\n- rename:\n fields:\n - from: \"sensoroni.fields.sourceIp\"\n to: \"source.ip\"\n - from: \"sensoroni.fields.status\"\n to: \"http.response.status_code\"\n - from: \"sensoroni.fields.method\"\n to: \"http.request.method\"\n - from: \"sensoroni.fields.path\"\n to: \"url.path\"\n - from: \"sensoroni.message\"\n to: \"event.action\"\n - from: \"sensoroni.level\"\n to: \"log.level\"\n ignore_missing: true",
|
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"recursive_glob": true,
|
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"sensoroni\"\n process_array: true\n max_depth: 2\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: sensoroni\n- rename:\n fields:\n - from: \"sensoroni.fields.sourceIp\"\n to: \"source.ip\"\n - from: \"sensoroni.fields.status\"\n to: \"http.response.status_code\"\n - from: \"sensoroni.fields.method\"\n to: \"http.request.method\"\n - from: \"sensoroni.fields.path\"\n to: \"url.path\"\n - from: \"sensoroni.message\"\n to: \"event.action\"\n - from: \"sensoroni.level\"\n to: \"log.level\"\n ignore_missing: true",
|
||||||
"clean_inactive": -1,
|
"custom": "pipeline: common"
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"force": true
|
"force": true
|
||||||
}
|
}
|
||||||
@@ -1,42 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "soc-server-logs",
|
"name": "soc-server-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Security Onion Console Logs",
|
"description": "Security Onion Console Logs",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/opt/so/log/soc/sensoroni-server.log"
|
"/opt/so/log/soc/sensoroni-server.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "soc",
|
"data_stream.dataset": "soc",
|
||||||
"pipeline": "common",
|
"tags": ["so-soc"],
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"soc\"\n process_array: true\n max_depth: 2\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: server\n- rename:\n fields:\n - from: \"soc.fields.sourceIp\"\n to: \"source.ip\"\n - from: \"soc.fields.status\"\n to: \"http.response.status_code\"\n - from: \"soc.fields.method\"\n to: \"http.request.method\"\n - from: \"soc.fields.path\"\n to: \"url.path\"\n - from: \"soc.message\"\n to: \"event.action\"\n - from: \"soc.level\"\n to: \"log.level\"\n ignore_missing: true",
|
"processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"soc\"\n process_array: true\n max_depth: 2\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: host\n module: soc\n dataset_temp: server\n- rename:\n fields:\n - from: \"soc.fields.sourceIp\"\n to: \"source.ip\"\n - from: \"soc.fields.status\"\n to: \"http.response.status_code\"\n - from: \"soc.fields.method\"\n to: \"http.request.method\"\n - from: \"soc.fields.path\"\n to: \"url.path\"\n - from: \"soc.message\"\n to: \"event.action\"\n - from: \"soc.level\"\n to: \"log.level\"\n ignore_missing: true",
|
||||||
"tags": [
|
"custom": "pipeline: common"
|
||||||
"so-soc"
|
|
||||||
],
|
|
||||||
"recursive_glob": true,
|
|
||||||
"clean_inactive": -1,
|
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "strelka-logs",
|
"name": "strelka-logs",
|
||||||
"description": "Strelka Logs",
|
|
||||||
"policy_id": "so-grid-nodes_general",
|
|
||||||
"namespace": "so",
|
"namespace": "so",
|
||||||
|
"description": "Strelka logs",
|
||||||
|
"policy_id": "so-grid-nodes_general",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/strelka/log/strelka.log"
|
"/nsm/strelka/log/strelka.log"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "strelka",
|
"data_stream.dataset": "strelka",
|
||||||
"pipeline": "strelka.file",
|
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- add_fields:\n target: event\n fields:\n category: file\n module: strelka",
|
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"recursive_glob": true,
|
"processors": "- add_fields:\n target: event\n fields:\n category: file\n module: strelka",
|
||||||
"clean_inactive": -1,
|
"custom": "pipeline: strelka.file"
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,26 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"name": "filestream",
|
"name": "log",
|
||||||
"version": ""
|
"version": ""
|
||||||
},
|
},
|
||||||
"name": "suricata-logs",
|
"name": "suricata-logs",
|
||||||
|
"namespace": "so",
|
||||||
"description": "Suricata integration",
|
"description": "Suricata integration",
|
||||||
"policy_id": "so-grid-nodes_general",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"namespace": "so",
|
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"filestream-filestream": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"filestream.generic": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
"/nsm/suricata/eve*.json"
|
"/nsm/suricata/eve*.json"
|
||||||
],
|
],
|
||||||
"data_stream.dataset": "filestream.generic",
|
"data_stream.dataset": "suricata",
|
||||||
"pipeline": "suricata.common",
|
|
||||||
"parsers": "#- ndjson:\n# target: \"\"\n# message_key: msg\n#- multiline:\n# type: count\n# count_lines: 3\n",
|
|
||||||
"exclude_files": [
|
|
||||||
"\\.gz$"
|
|
||||||
],
|
|
||||||
"include_files": [],
|
|
||||||
"processors": "- add_fields:\n target: event\n fields:\n category: network\n module: suricata",
|
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"recursive_glob": true,
|
"processors": "- add_fields:\n target: event\n fields:\n category: network\n module: suricata",
|
||||||
"clean_inactive": -1,
|
"custom": "pipeline: suricata.common"
|
||||||
"harvester_limit": 0,
|
|
||||||
"fingerprint": false,
|
|
||||||
"fingerprint_offset": 0,
|
|
||||||
"fingerprint_length": "64",
|
|
||||||
"file_identity_native": true,
|
|
||||||
"exclude_lines": [],
|
|
||||||
"include_lines": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% set AGENT_STATUS = salt['service.available']('elastic-agent') %}
|
{% set AGENT_STATUS = salt['service.available']('elastic-agent') %}
|
||||||
{% set AGENT_EXISTS = salt['file.file_exists']('/opt/Elastic/Agent/elastic-agent') %}
|
{% if not AGENT_STATUS %}
|
||||||
|
|
||||||
{% if not AGENT_STATUS or not AGENT_EXISTS %}
|
|
||||||
|
|
||||||
pull_agent_installer:
|
pull_agent_installer:
|
||||||
file.managed:
|
file.managed:
|
||||||
@@ -21,7 +19,7 @@ pull_agent_installer:
|
|||||||
|
|
||||||
run_installer:
|
run_installer:
|
||||||
cmd.run:
|
cmd.run:
|
||||||
- name: ./so-elastic-agent_linux_amd64 -token={{ GRIDNODETOKEN }} -force
|
- name: ./so-elastic-agent_linux_amd64 -token={{ GRIDNODETOKEN }}
|
||||||
- cwd: /opt/so
|
- cwd: /opt/so
|
||||||
- retry:
|
- retry:
|
||||||
attempts: 3
|
attempts: 3
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
'azure_application_insights.app_state': 'azure.app_state',
|
'azure_application_insights.app_state': 'azure.app_state',
|
||||||
'azure_billing.billing': 'azure.billing',
|
'azure_billing.billing': 'azure.billing',
|
||||||
'azure_functions.metrics': 'azure.function',
|
'azure_functions.metrics': 'azure.function',
|
||||||
'azure_ai_foundry.metrics': 'azure.ai_foundry',
|
|
||||||
'azure_metrics.compute_vm_scaleset': 'azure.compute_vm_scaleset',
|
'azure_metrics.compute_vm_scaleset': 'azure.compute_vm_scaleset',
|
||||||
'azure_metrics.compute_vm': 'azure.compute_vm',
|
'azure_metrics.compute_vm': 'azure.compute_vm',
|
||||||
'azure_metrics.container_instance': 'azure.container_instance',
|
'azure_metrics.container_instance': 'azure.container_instance',
|
||||||
@@ -122,9 +121,6 @@
|
|||||||
"phases": {
|
"phases": {
|
||||||
"cold": {
|
"cold": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"allocate":{
|
|
||||||
"number_of_replicas": ""
|
|
||||||
},
|
|
||||||
"set_priority": {"priority": 0}
|
"set_priority": {"priority": 0}
|
||||||
},
|
},
|
||||||
"min_age": "60d"
|
"min_age": "60d"
|
||||||
@@ -141,31 +137,12 @@
|
|||||||
"max_age": "30d",
|
"max_age": "30d",
|
||||||
"max_primary_shard_size": "50gb"
|
"max_primary_shard_size": "50gb"
|
||||||
},
|
},
|
||||||
"forcemerge":{
|
|
||||||
"max_num_segments": ""
|
|
||||||
},
|
|
||||||
"shrink":{
|
|
||||||
"max_primary_shard_size": "",
|
|
||||||
"method": "COUNT",
|
|
||||||
"number_of_shards": ""
|
|
||||||
},
|
|
||||||
"set_priority": {"priority": 100}
|
"set_priority": {"priority": 100}
|
||||||
},
|
},
|
||||||
"min_age": "0ms"
|
"min_age": "0ms"
|
||||||
},
|
},
|
||||||
"warm": {
|
"warm": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"allocate": {
|
|
||||||
"number_of_replicas": ""
|
|
||||||
},
|
|
||||||
"forcemerge": {
|
|
||||||
"max_num_segments": ""
|
|
||||||
},
|
|
||||||
"shrink":{
|
|
||||||
"max_primary_shard_size": "",
|
|
||||||
"method": "COUNT",
|
|
||||||
"number_of_shards": ""
|
|
||||||
},
|
|
||||||
"set_priority": {"priority": 50}
|
"set_priority": {"priority": 50}
|
||||||
},
|
},
|
||||||
"min_age": "30d"
|
"min_age": "30d"
|
||||||
|
|||||||
@@ -50,46 +50,6 @@ elasticfleet:
|
|||||||
global: True
|
global: True
|
||||||
forcedType: bool
|
forcedType: bool
|
||||||
helpLink: elastic-fleet.html
|
helpLink: elastic-fleet.html
|
||||||
outputs:
|
|
||||||
logstash:
|
|
||||||
bulk_max_size:
|
|
||||||
description: The maximum number of events to bulk in a single Logstash request.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
helpLink: elastic-fleet.html
|
|
||||||
worker:
|
|
||||||
description: The number of workers per configured host publishing events.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: true
|
|
||||||
helpLink: elastic-fleet.html
|
|
||||||
queue_mem_events:
|
|
||||||
title: queued events
|
|
||||||
description: The number of events the queue can store. This value should be evenly divisible by the smaller of 'bulk_max_size' to avoid sending partial batches to the output.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
helpLink: elastic-fleet.html
|
|
||||||
timeout:
|
|
||||||
description: The number of seconds to wait for responses from the Logstash server before timing out. Eg 30s
|
|
||||||
regex: ^[0-9]+s$
|
|
||||||
advanced: True
|
|
||||||
global: True
|
|
||||||
helpLink: elastic-fleet.html
|
|
||||||
loadbalance:
|
|
||||||
description: If true and multiple Logstash hosts are configured, the output plugin load balances published events onto all Logstash hosts. If false, the output plugin sends all events to one host (determined at random) and switches to another host if the selected one becomes unresponsive.
|
|
||||||
forcedType: bool
|
|
||||||
advanced: True
|
|
||||||
global: True
|
|
||||||
helpLink: elastic-fleet.html
|
|
||||||
compression_level:
|
|
||||||
description: The gzip compression level. The compression level must be in the range of 1 (best speed) to 9 (best compression).
|
|
||||||
regex: ^[1-9]$
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
global: True
|
|
||||||
helpLink: elastic-fleet.html
|
|
||||||
server:
|
server:
|
||||||
custom_fqdn:
|
custom_fqdn:
|
||||||
description: Custom FQDN for Agents to connect to. One per line.
|
description: Custom FQDN for Agents to connect to. One per line.
|
||||||
|
|||||||
@@ -1,186 +0,0 @@
|
|||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
|
||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
|
||||||
# Elastic License 2.0.
|
|
||||||
|
|
||||||
{% from 'allowed_states.map.jinja' import allowed_states %}
|
|
||||||
{% if sls.split('.')[0] in allowed_states %}
|
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
|
||||||
{% from 'elasticfleet/map.jinja' import ELASTICFLEETMERGED %}
|
|
||||||
{% from 'ca/map.jinja' import CA %}
|
|
||||||
|
|
||||||
{% if GLOBALS.is_manager or GLOBALS.role in ['so-heavynode', 'so-fleet', 'so-receiver'] %}
|
|
||||||
|
|
||||||
{% if grains['role'] not in [ 'so-heavynode', 'so-receiver'] %}
|
|
||||||
# Start -- Elastic Fleet Host Cert
|
|
||||||
etc_elasticfleet_key:
|
|
||||||
x509.private_key_managed:
|
|
||||||
- name: /etc/pki/elasticfleet-server.key
|
|
||||||
- keysize: 4096
|
|
||||||
- backup: True
|
|
||||||
- new: True
|
|
||||||
{% if salt['file.file_exists']('/etc/pki/elasticfleet-server.key') -%}
|
|
||||||
- prereq:
|
|
||||||
- x509: etc_elasticfleet_crt
|
|
||||||
{%- endif %}
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
etc_elasticfleet_crt:
|
|
||||||
x509.certificate_managed:
|
|
||||||
- name: /etc/pki/elasticfleet-server.crt
|
|
||||||
- ca_server: {{ CA.server }}
|
|
||||||
- signing_policy: elasticfleet
|
|
||||||
- private_key: /etc/pki/elasticfleet-server.key
|
|
||||||
- CN: {{ GLOBALS.hostname }}
|
|
||||||
- subjectAltName: DNS:{{ GLOBALS.hostname }},DNS:{{ GLOBALS.url_base }},IP:{{ GLOBALS.node_ip }}{% if ELASTICFLEETMERGED.config.server.custom_fqdn | length > 0 %},DNS:{{ ELASTICFLEETMERGED.config.server.custom_fqdn | join(',DNS:') }}{% endif %}
|
|
||||||
- days_remaining: 7
|
|
||||||
- days_valid: 820
|
|
||||||
- backup: True
|
|
||||||
- timeout: 30
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
efperms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-server.key
|
|
||||||
- mode: 640
|
|
||||||
- group: 939
|
|
||||||
|
|
||||||
chownelasticfleetcrt:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-server.crt
|
|
||||||
- mode: 640
|
|
||||||
- user: 947
|
|
||||||
- group: 939
|
|
||||||
|
|
||||||
chownelasticfleetkey:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-server.key
|
|
||||||
- mode: 640
|
|
||||||
- user: 947
|
|
||||||
- group: 939
|
|
||||||
# End -- Elastic Fleet Host Cert
|
|
||||||
{% endif %} # endif is for not including HeavyNodes & Receivers
|
|
||||||
|
|
||||||
|
|
||||||
# Start -- Elastic Fleet Client Cert for Agent (Mutual Auth with Logstash Output)
|
|
||||||
etc_elasticfleet_agent_key:
|
|
||||||
x509.private_key_managed:
|
|
||||||
- name: /etc/pki/elasticfleet-agent.key
|
|
||||||
- keysize: 4096
|
|
||||||
- backup: True
|
|
||||||
- new: True
|
|
||||||
{% if salt['file.file_exists']('/etc/pki/elasticfleet-agent.key') -%}
|
|
||||||
- prereq:
|
|
||||||
- x509: etc_elasticfleet_agent_crt
|
|
||||||
{%- endif %}
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
etc_elasticfleet_agent_crt:
|
|
||||||
x509.certificate_managed:
|
|
||||||
- name: /etc/pki/elasticfleet-agent.crt
|
|
||||||
- ca_server: {{ CA.server }}
|
|
||||||
- signing_policy: elasticfleet
|
|
||||||
- private_key: /etc/pki/elasticfleet-agent.key
|
|
||||||
- CN: {{ GLOBALS.hostname }}
|
|
||||||
- days_remaining: 7
|
|
||||||
- days_valid: 820
|
|
||||||
- backup: True
|
|
||||||
- timeout: 30
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
cmd.run:
|
|
||||||
- name: "/usr/bin/openssl pkcs8 -in /etc/pki/elasticfleet-agent.key -topk8 -out /etc/pki/elasticfleet-agent.p8 -nocrypt"
|
|
||||||
- onchanges:
|
|
||||||
- x509: etc_elasticfleet_agent_key
|
|
||||||
|
|
||||||
efagentperms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-agent.key
|
|
||||||
- mode: 640
|
|
||||||
- group: 939
|
|
||||||
|
|
||||||
chownelasticfleetagentcrt:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-agent.crt
|
|
||||||
- mode: 640
|
|
||||||
- user: 947
|
|
||||||
- group: 939
|
|
||||||
|
|
||||||
chownelasticfleetagentkey:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-agent.key
|
|
||||||
- mode: 640
|
|
||||||
- user: 947
|
|
||||||
- group: 939
|
|
||||||
# End -- Elastic Fleet Client Cert for Agent (Mutual Auth with Logstash Output)
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if GLOBALS.role in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone'] %}
|
|
||||||
elasticfleet_kafka_key:
|
|
||||||
x509.private_key_managed:
|
|
||||||
- name: /etc/pki/elasticfleet-kafka.key
|
|
||||||
- keysize: 4096
|
|
||||||
- backup: True
|
|
||||||
- new: True
|
|
||||||
{% if salt['file.file_exists']('/etc/pki/elasticfleet-kafka.key') -%}
|
|
||||||
- prereq:
|
|
||||||
- x509: elasticfleet_kafka_crt
|
|
||||||
{%- endif %}
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
elasticfleet_kafka_crt:
|
|
||||||
x509.certificate_managed:
|
|
||||||
- name: /etc/pki/elasticfleet-kafka.crt
|
|
||||||
- ca_server: {{ CA.server }}
|
|
||||||
- signing_policy: kafka
|
|
||||||
- private_key: /etc/pki/elasticfleet-kafka.key
|
|
||||||
- CN: {{ GLOBALS.hostname }}
|
|
||||||
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
|
||||||
- days_remaining: 7
|
|
||||||
- days_valid: 820
|
|
||||||
- backup: True
|
|
||||||
- timeout: 30
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
elasticfleet_kafka_cert_perms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-kafka.crt
|
|
||||||
- mode: 640
|
|
||||||
- user: 947
|
|
||||||
- group: 939
|
|
||||||
|
|
||||||
elasticfleet_kafka_key_perms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticfleet-kafka.key
|
|
||||||
- mode: 640
|
|
||||||
- user: 947
|
|
||||||
- group: 939
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{{sls}}_state_not_allowed:
|
|
||||||
test.fail_without_changes:
|
|
||||||
- name: {{sls}}_state_not_allowed
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
@@ -14,7 +14,7 @@ if ! is_manager_node; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Get current list of Grid Node Agents that need to be upgraded
|
# Get current list of Grid Node Agents that need to be upgraded
|
||||||
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config -L "http://localhost:5601/api/fleet/agents?perPage=20&page=1&kuery=NOT%20agent.version%20:%20%22{{ELASTICSEARCHDEFAULTS.elasticsearch.version}}%22%20and%20policy_id%20:%20%22so-grid-nodes_general%22&showInactive=false&getStatusSummary=true" --retry 3 --retry-delay 30 --fail 2>/dev/null)
|
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config -L "http://localhost:5601/api/fleet/agents?perPage=20&page=1&kuery=NOT%20agent.version%20:%20%22{{ELASTICSEARCHDEFAULTS.elasticsearch.version}}%22%20and%20policy_id%20:%20%22so-grid-nodes_general%22&showInactive=false&getStatusSummary=true")
|
||||||
|
|
||||||
# Check to make sure that the server responded with good data - else, bail from script
|
# Check to make sure that the server responded with good data - else, bail from script
|
||||||
CHECKSUM=$(jq -r '.page' <<< "$RAW_JSON")
|
CHECKSUM=$(jq -r '.page' <<< "$RAW_JSON")
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ function update_es_urls() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Get current list of Fleet Elasticsearch URLs
|
# Get current list of Fleet Elasticsearch URLs
|
||||||
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/outputs/so-manager_elasticsearch' --retry 3 --retry-delay 30 --fail 2>/dev/null)
|
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/outputs/so-manager_elasticsearch')
|
||||||
|
|
||||||
# Check to make sure that the server responded with good data - else, bail from script
|
# Check to make sure that the server responded with good data - else, bail from script
|
||||||
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ if [[ -f $STATE_FILE_SUCCESS ]]; then
|
|||||||
latest_package_list=$(/usr/sbin/so-elastic-fleet-package-list)
|
latest_package_list=$(/usr/sbin/so-elastic-fleet-package-list)
|
||||||
echo '{ "packages" : []}' > $BULK_INSTALL_PACKAGE_LIST
|
echo '{ "packages" : []}' > $BULK_INSTALL_PACKAGE_LIST
|
||||||
rm -f $INSTALLED_PACKAGE_LIST
|
rm -f $INSTALLED_PACKAGE_LIST
|
||||||
echo $latest_package_list | jq '{packages: [.items[] | {name: .name, latest_version: .version, installed_version: .installationInfo.version, subscription: .conditions.elastic.subscription }]}' >> $INSTALLED_PACKAGE_LIST
|
echo $latest_package_list | jq '{packages: [.items[] | {name: .name, latest_version: .version, installed_version: .savedObject.attributes.install_version, subscription: .conditions.elastic.subscription }]}' >> $INSTALLED_PACKAGE_LIST
|
||||||
|
|
||||||
while read -r package; do
|
while read -r package; do
|
||||||
# get package details
|
# get package details
|
||||||
|
|||||||
@@ -3,36 +3,11 @@
|
|||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0; you may not use
|
# or more contributor license agreements. Licensed under the Elastic License 2.0; you may not use
|
||||||
# this file except in compliance with the Elastic License 2.0.
|
# this file except in compliance with the Elastic License 2.0.
|
||||||
{%- from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
{%- from 'elasticfleet/map.jinja' import ELASTICFLEETMERGED %}
|
{% from 'elasticfleet/map.jinja' import ELASTICFLEETMERGED %}
|
||||||
{%- from 'elasticfleet/config.map.jinja' import LOGSTASH_CONFIG_YAML %}
|
|
||||||
|
|
||||||
. /usr/sbin/so-common
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
FORCE_UPDATE=false
|
|
||||||
UPDATE_CERTS=false
|
|
||||||
LOGSTASH_PILLAR_CONFIG_YAML="{{ LOGSTASH_CONFIG_YAML }}"
|
|
||||||
LOGSTASH_PILLAR_STATE_FILE="/opt/so/state/esfleet_logstash_config_pillar"
|
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case $1 in
|
|
||||||
-f|--force)
|
|
||||||
FORCE_UPDATE=true
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-c| --certs)
|
|
||||||
UPDATE_CERTS=true
|
|
||||||
FORCE_UPDATE=true
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unknown option $1"
|
|
||||||
echo "Usage: $0 [-f|--force] [-c|--certs]"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# Only run on Managers
|
# Only run on Managers
|
||||||
if ! is_manager_node; then
|
if ! is_manager_node; then
|
||||||
printf "Not a Manager Node... Exiting"
|
printf "Not a Manager Node... Exiting"
|
||||||
@@ -42,49 +17,17 @@ fi
|
|||||||
function update_logstash_outputs() {
|
function update_logstash_outputs() {
|
||||||
if logstash_policy=$(curl -K /opt/so/conf/elasticsearch/curl.config -L "http://localhost:5601/api/fleet/outputs/so-manager_logstash" --retry 3 --retry-delay 10 --fail 2>/dev/null); then
|
if logstash_policy=$(curl -K /opt/so/conf/elasticsearch/curl.config -L "http://localhost:5601/api/fleet/outputs/so-manager_logstash" --retry 3 --retry-delay 10 --fail 2>/dev/null); then
|
||||||
SSL_CONFIG=$(echo "$logstash_policy" | jq -r '.item.ssl')
|
SSL_CONFIG=$(echo "$logstash_policy" | jq -r '.item.ssl')
|
||||||
LOGSTASHKEY=$(openssl rsa -in /etc/pki/elasticfleet-logstash.key)
|
|
||||||
LOGSTASHCRT=$(openssl x509 -in /etc/pki/elasticfleet-logstash.crt)
|
|
||||||
LOGSTASHCA=$(openssl x509 -in /etc/pki/tls/certs/intca.crt)
|
|
||||||
# Revert escaped \\n to \n for jq
|
|
||||||
LOGSTASH_PILLAR_CONFIG_YAML=$(printf '%b' "$LOGSTASH_PILLAR_CONFIG_YAML")
|
|
||||||
|
|
||||||
if SECRETS=$(echo "$logstash_policy" | jq -er '.item.secrets' 2>/dev/null); then
|
if SECRETS=$(echo "$logstash_policy" | jq -er '.item.secrets' 2>/dev/null); then
|
||||||
if [[ "$UPDATE_CERTS" != "true" ]]; then
|
JSON_STRING=$(jq -n \
|
||||||
# Reuse existing secret
|
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
||||||
JSON_STRING=$(jq -n \
|
--argjson SECRETS "$SECRETS" \
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
||||||
--arg CONFIG_YAML "$LOGSTASH_PILLAR_CONFIG_YAML" \
|
'{"name":"grid-logstash","type":"logstash","hosts": $UPDATEDLIST,"is_default":true,"is_default_monitoring":true,"config_yaml":"","ssl": $SSL_CONFIG,"secrets": $SECRETS}')
|
||||||
--argjson SECRETS "$SECRETS" \
|
|
||||||
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
|
||||||
'{"name":"grid-logstash","type":"logstash","hosts": $UPDATEDLIST,"is_default":true,"is_default_monitoring":true,"config_yaml":$CONFIG_YAML,"ssl": $SSL_CONFIG,"secrets": $SECRETS}')
|
|
||||||
else
|
|
||||||
# Update certs, creating new secret
|
|
||||||
JSON_STRING=$(jq -n \
|
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
|
||||||
--arg CONFIG_YAML "$LOGSTASH_PILLAR_CONFIG_YAML" \
|
|
||||||
--arg LOGSTASHKEY "$LOGSTASHKEY" \
|
|
||||||
--arg LOGSTASHCRT "$LOGSTASHCRT" \
|
|
||||||
--arg LOGSTASHCA "$LOGSTASHCA" \
|
|
||||||
'{"name":"grid-logstash","type":"logstash","hosts": $UPDATEDLIST,"is_default":true,"is_default_monitoring":true,"config_yaml":$CONFIG_YAML,"ssl": {"certificate": $LOGSTASHCRT,"certificate_authorities":[ $LOGSTASHCA ]},"secrets": {"ssl":{"key": $LOGSTASHKEY }}}')
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
if [[ "$UPDATE_CERTS" != "true" ]]; then
|
JSON_STRING=$(jq -n \
|
||||||
# Reuse existing ssl config
|
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
||||||
JSON_STRING=$(jq -n \
|
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
'{"name":"grid-logstash","type":"logstash","hosts": $UPDATEDLIST,"is_default":true,"is_default_monitoring":true,"config_yaml":"","ssl": $SSL_CONFIG}')
|
||||||
--arg CONFIG_YAML "$LOGSTASH_PILLAR_CONFIG_YAML" \
|
|
||||||
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
|
||||||
'{"name":"grid-logstash","type":"logstash","hosts": $UPDATEDLIST,"is_default":true,"is_default_monitoring":true,"config_yaml":$CONFIG_YAML,"ssl": $SSL_CONFIG}')
|
|
||||||
else
|
|
||||||
# Update ssl config
|
|
||||||
JSON_STRING=$(jq -n \
|
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
|
||||||
--arg CONFIG_YAML "$LOGSTASH_PILLAR_CONFIG_YAML" \
|
|
||||||
--arg LOGSTASHKEY "$LOGSTASHKEY" \
|
|
||||||
--arg LOGSTASHCRT "$LOGSTASHCRT" \
|
|
||||||
--arg LOGSTASHCA "$LOGSTASHCA" \
|
|
||||||
'{"name":"grid-logstash","type":"logstash","hosts": $UPDATEDLIST,"is_default":true,"is_default_monitoring":true,"config_yaml":$CONFIG_YAML,"ssl": {"certificate": $LOGSTASHCRT,"key": $LOGSTASHKEY,"certificate_authorities":[ $LOGSTASHCA ]}}')
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -95,42 +38,19 @@ function update_kafka_outputs() {
|
|||||||
# Make sure SSL configuration is included in policy updates for Kafka output. SSL is configured in so-elastic-fleet-setup
|
# Make sure SSL configuration is included in policy updates for Kafka output. SSL is configured in so-elastic-fleet-setup
|
||||||
if kafka_policy=$(curl -K /opt/so/conf/elasticsearch/curl.config -L "http://localhost:5601/api/fleet/outputs/so-manager_kafka" --fail 2>/dev/null); then
|
if kafka_policy=$(curl -K /opt/so/conf/elasticsearch/curl.config -L "http://localhost:5601/api/fleet/outputs/so-manager_kafka" --fail 2>/dev/null); then
|
||||||
SSL_CONFIG=$(echo "$kafka_policy" | jq -r '.item.ssl')
|
SSL_CONFIG=$(echo "$kafka_policy" | jq -r '.item.ssl')
|
||||||
KAFKAKEY=$(openssl rsa -in /etc/pki/elasticfleet-kafka.key)
|
|
||||||
KAFKACRT=$(openssl x509 -in /etc/pki/elasticfleet-kafka.crt)
|
|
||||||
KAFKACA=$(openssl x509 -in /etc/pki/tls/certs/intca.crt)
|
|
||||||
if SECRETS=$(echo "$kafka_policy" | jq -er '.item.secrets' 2>/dev/null); then
|
if SECRETS=$(echo "$kafka_policy" | jq -er '.item.secrets' 2>/dev/null); then
|
||||||
if [[ "$UPDATE_CERTS" != "true" ]]; then
|
# Update policy when fleet has secrets enabled
|
||||||
# Update policy when fleet has secrets enabled
|
JSON_STRING=$(jq -n \
|
||||||
JSON_STRING=$(jq -n \
|
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
||||||
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
--argjson SECRETS "$SECRETS" \
|
||||||
--argjson SECRETS "$SECRETS" \
|
'{"name": "grid-kafka","type": "kafka","hosts": $UPDATEDLIST,"is_default": true,"is_default_monitoring": true,"config_yaml": "","ssl": $SSL_CONFIG,"secrets": $SECRETS}')
|
||||||
'{"name": "grid-kafka","type": "kafka","hosts": $UPDATEDLIST,"is_default": true,"is_default_monitoring": true,"config_yaml": "","ssl": $SSL_CONFIG,"secrets": $SECRETS}')
|
|
||||||
else
|
|
||||||
# Update certs, creating new secret
|
|
||||||
JSON_STRING=$(jq -n \
|
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
|
||||||
--arg KAFKAKEY "$KAFKAKEY" \
|
|
||||||
--arg KAFKACRT "$KAFKACRT" \
|
|
||||||
--arg KAFKACA "$KAFKACA" \
|
|
||||||
'{"name": "grid-kafka","type": "kafka","hosts": $UPDATEDLIST,"is_default": true,"is_default_monitoring": true,"config_yaml": "","ssl": {"certificate_authorities":[ $KAFKACA ],"certificate": $KAFKACRT ,"key":"","verification_mode":"full"},"secrets": {"ssl":{"key": $KAFKAKEY }}}')
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
if [[ "$UPDATE_CERTS" != "true" ]]; then
|
# Update policy when fleet has secrets disabled or policy hasn't been force updated
|
||||||
# Update policy when fleet has secrets disabled or policy hasn't been force updated
|
JSON_STRING=$(jq -n \
|
||||||
JSON_STRING=$(jq -n \
|
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
||||||
--argjson SSL_CONFIG "$SSL_CONFIG" \
|
'{"name": "grid-kafka","type": "kafka","hosts": $UPDATEDLIST,"is_default": true,"is_default_monitoring": true,"config_yaml": "","ssl": $SSL_CONFIG}')
|
||||||
'{"name": "grid-kafka","type": "kafka","hosts": $UPDATEDLIST,"is_default": true,"is_default_monitoring": true,"config_yaml": "","ssl": $SSL_CONFIG}')
|
|
||||||
else
|
|
||||||
# Update ssl config
|
|
||||||
JSON_STRING=$(jq -n \
|
|
||||||
--arg UPDATEDLIST "$NEW_LIST_JSON" \
|
|
||||||
--arg KAFKAKEY "$KAFKAKEY" \
|
|
||||||
--arg KAFKACRT "$KAFKACRT" \
|
|
||||||
--arg KAFKACA "$KAFKACA" \
|
|
||||||
'{"name": "grid-kafka","type": "kafka","hosts": $UPDATEDLIST,"is_default": true,"is_default_monitoring": true,"config_yaml": "","ssl": { "certificate_authorities": [ $KAFKACA ], "certificate": $KAFKACRT, "key": $KAFKAKEY, "verification_mode": "full" }}')
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
# Update Kafka outputs
|
# Update Kafka outputs
|
||||||
curl -K /opt/so/conf/elasticsearch/curl.config -L -X PUT "localhost:5601/api/fleet/outputs/so-manager_kafka" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d "$JSON_STRING" | jq
|
curl -K /opt/so/conf/elasticsearch/curl.config -L -X PUT "localhost:5601/api/fleet/outputs/so-manager_kafka" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d "$JSON_STRING" | jq
|
||||||
@@ -142,7 +62,7 @@ function update_kafka_outputs() {
|
|||||||
|
|
||||||
{% if GLOBALS.pipeline == "KAFKA" %}
|
{% if GLOBALS.pipeline == "KAFKA" %}
|
||||||
# Get current list of Kafka Outputs
|
# Get current list of Kafka Outputs
|
||||||
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/outputs/so-manager_kafka' --retry 3 --retry-delay 30 --fail 2>/dev/null)
|
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/outputs/so-manager_kafka')
|
||||||
|
|
||||||
# Check to make sure that the server responded with good data - else, bail from script
|
# Check to make sure that the server responded with good data - else, bail from script
|
||||||
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
||||||
@@ -153,7 +73,7 @@ function update_kafka_outputs() {
|
|||||||
|
|
||||||
# Get the current list of kafka outputs & hash them
|
# Get the current list of kafka outputs & hash them
|
||||||
CURRENT_LIST=$(jq -c -r '.item.hosts' <<< "$RAW_JSON")
|
CURRENT_LIST=$(jq -c -r '.item.hosts' <<< "$RAW_JSON")
|
||||||
CURRENT_HASH=$(sha256sum <<< "$CURRENT_LIST" | awk '{print $1}')
|
CURRENT_HASH=$(sha1sum <<< "$CURRENT_LIST" | awk '{print $1}')
|
||||||
|
|
||||||
declare -a NEW_LIST=()
|
declare -a NEW_LIST=()
|
||||||
|
|
||||||
@@ -168,7 +88,7 @@ function update_kafka_outputs() {
|
|||||||
{# If global pipeline isn't set to KAFKA then assume default of REDIS / logstash #}
|
{# If global pipeline isn't set to KAFKA then assume default of REDIS / logstash #}
|
||||||
{% else %}
|
{% else %}
|
||||||
# Get current list of Logstash Outputs
|
# Get current list of Logstash Outputs
|
||||||
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/outputs/so-manager_logstash' --retry 3 --retry-delay 30 --fail 2>/dev/null)
|
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/outputs/so-manager_logstash')
|
||||||
|
|
||||||
# Check to make sure that the server responded with good data - else, bail from script
|
# Check to make sure that the server responded with good data - else, bail from script
|
||||||
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
||||||
@@ -176,19 +96,10 @@ function update_kafka_outputs() {
|
|||||||
printf "Failed to query for current Logstash Outputs..."
|
printf "Failed to query for current Logstash Outputs..."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
# logstash adv config - compare pillar to last state file value
|
|
||||||
if [[ -f "$LOGSTASH_PILLAR_STATE_FILE" ]]; then
|
|
||||||
PREVIOUS_LOGSTASH_PILLAR_CONFIG_YAML=$(cat "$LOGSTASH_PILLAR_STATE_FILE")
|
|
||||||
if [[ "$LOGSTASH_PILLAR_CONFIG_YAML" != "$PREVIOUS_LOGSTASH_PILLAR_CONFIG_YAML" ]]; then
|
|
||||||
echo "Logstash pillar config has changed - forcing update"
|
|
||||||
FORCE_UPDATE=true
|
|
||||||
fi
|
|
||||||
echo "$LOGSTASH_PILLAR_CONFIG_YAML" > "$LOGSTASH_PILLAR_STATE_FILE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get the current list of Logstash outputs & hash them
|
# Get the current list of Logstash outputs & hash them
|
||||||
CURRENT_LIST=$(jq -c -r '.item.hosts' <<< "$RAW_JSON")
|
CURRENT_LIST=$(jq -c -r '.item.hosts' <<< "$RAW_JSON")
|
||||||
CURRENT_HASH=$(sha256sum <<< "$CURRENT_LIST" | awk '{print $1}')
|
CURRENT_HASH=$(sha1sum <<< "$CURRENT_LIST" | awk '{print $1}')
|
||||||
|
|
||||||
declare -a NEW_LIST=()
|
declare -a NEW_LIST=()
|
||||||
|
|
||||||
@@ -237,10 +148,10 @@ function update_kafka_outputs() {
|
|||||||
|
|
||||||
# Sort & hash the new list of Logstash Outputs
|
# Sort & hash the new list of Logstash Outputs
|
||||||
NEW_LIST_JSON=$(jq --compact-output --null-input '$ARGS.positional' --args -- "${NEW_LIST[@]}")
|
NEW_LIST_JSON=$(jq --compact-output --null-input '$ARGS.positional' --args -- "${NEW_LIST[@]}")
|
||||||
NEW_HASH=$(sha256sum <<< "$NEW_LIST_JSON" | awk '{print $1}')
|
NEW_HASH=$(sha1sum <<< "$NEW_LIST_JSON" | awk '{print $1}')
|
||||||
|
|
||||||
# Compare the current & new list of outputs - if different, update the Logstash outputs
|
# Compare the current & new list of outputs - if different, update the Logstash outputs
|
||||||
if [[ "$NEW_HASH" = "$CURRENT_HASH" ]] && [[ "$FORCE_UPDATE" != "true" ]]; then
|
if [ "$NEW_HASH" = "$CURRENT_HASH" ]; then
|
||||||
printf "\nHashes match - no update needed.\n"
|
printf "\nHashes match - no update needed.\n"
|
||||||
printf "Current List: $CURRENT_LIST\nNew List: $NEW_LIST_JSON\n"
|
printf "Current List: $CURRENT_LIST\nNew List: $NEW_LIST_JSON\n"
|
||||||
|
|
||||||
|
|||||||
@@ -241,11 +241,9 @@ printf '%s\n'\
|
|||||||
"" >> "$global_pillar_file"
|
"" >> "$global_pillar_file"
|
||||||
|
|
||||||
# Call Elastic-Fleet Salt State
|
# Call Elastic-Fleet Salt State
|
||||||
printf "\nApplying elasticfleet state"
|
|
||||||
salt-call state.apply elasticfleet queue=True
|
salt-call state.apply elasticfleet queue=True
|
||||||
|
|
||||||
# Generate installers & install Elastic Agent on the node
|
# Generate installers & install Elastic Agent on the node
|
||||||
so-elastic-agent-gen-installers
|
so-elastic-agent-gen-installers
|
||||||
printf "\nApplying elasticfleet.install_agent_grid state"
|
|
||||||
salt-call state.apply elasticfleet.install_agent_grid queue=True
|
salt-call state.apply elasticfleet.install_agent_grid queue=True
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ function update_fleet_urls() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Get current list of Fleet Server URLs
|
# Get current list of Fleet Server URLs
|
||||||
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/fleet_server_hosts/grid-default' --retry 3 --retry-delay 30 --fail 2>/dev/null)
|
RAW_JSON=$(curl -K /opt/so/conf/elasticsearch/curl.config 'http://localhost:5601/api/fleet/fleet_server_hosts/grid-default')
|
||||||
|
|
||||||
# Check to make sure that the server responded with good data - else, bail from script
|
# Check to make sure that the server responded with good data - else, bail from script
|
||||||
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
CHECKSUM=$(jq -r '.item.id' <<< "$RAW_JSON")
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ if ! kafka_output=$(curl -sK /opt/so/conf/elasticsearch/curl.config -L "http://l
|
|||||||
--arg KAFKACA "$KAFKACA" \
|
--arg KAFKACA "$KAFKACA" \
|
||||||
--arg MANAGER_IP "{{ GLOBALS.manager_ip }}:9092" \
|
--arg MANAGER_IP "{{ GLOBALS.manager_ip }}:9092" \
|
||||||
--arg KAFKA_OUTPUT_VERSION "$KAFKA_OUTPUT_VERSION" \
|
--arg KAFKA_OUTPUT_VERSION "$KAFKA_OUTPUT_VERSION" \
|
||||||
'{"name":"grid-kafka", "id":"so-manager_kafka","type":"kafka","hosts":[ $MANAGER_IP ],"is_default":false,"is_default_monitoring":false,"config_yaml":"","ssl":{"certificate_authorities":[ $KAFKACA ],"certificate": $KAFKACRT ,"key":"","verification_mode":"full"},"proxy_id":null,"client_id":"Elastic","version": $KAFKA_OUTPUT_VERSION ,"compression":"none","auth_type":"ssl","partition":"round_robin","round_robin":{"group_events":10},"topic":"default-securityonion","headers":[{"key":"","value":""}],"timeout":30,"broker_timeout":30,"required_acks":1,"secrets":{"ssl":{"key": $KAFKAKEY }}}'
|
'{"name":"grid-kafka", "id":"so-manager_kafka","type":"kafka","hosts":[ $MANAGER_IP ],"is_default":false,"is_default_monitoring":false,"config_yaml":"","ssl":{"certificate_authorities":[ $KAFKACA ],"certificate": $KAFKACRT ,"key":"","verification_mode":"full"},"proxy_id":null,"client_id":"Elastic","version": $KAFKA_OUTPUT_VERSION ,"compression":"none","auth_type":"ssl","partition":"round_robin","round_robin":{"group_events":10},"topics":[{"topic":"default-securityonion"}],"headers":[{"key":"","value":""}],"timeout":30,"broker_timeout":30,"required_acks":1,"secrets":{"ssl":{"key": $KAFKAKEY }}}'
|
||||||
)
|
)
|
||||||
if ! response=$(curl -sK /opt/so/conf/elasticsearch/curl.config -L -X POST "localhost:5601/api/fleet/outputs" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d "$JSON_STRING" --fail 2>/dev/null); then
|
if ! response=$(curl -sK /opt/so/conf/elasticsearch/curl.config -L -X POST "localhost:5601/api/fleet/outputs" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d "$JSON_STRING" --fail 2>/dev/null); then
|
||||||
echo -e "\nFailed to setup Elastic Fleet output policy for Kafka...\n"
|
echo -e "\nFailed to setup Elastic Fleet output policy for Kafka...\n"
|
||||||
@@ -67,7 +67,7 @@ elif kafka_output=$(curl -sK /opt/so/conf/elasticsearch/curl.config -L "http://l
|
|||||||
--arg ENABLED_DISABLED "$ENABLED_DISABLED"\
|
--arg ENABLED_DISABLED "$ENABLED_DISABLED"\
|
||||||
--arg KAFKA_OUTPUT_VERSION "$KAFKA_OUTPUT_VERSION" \
|
--arg KAFKA_OUTPUT_VERSION "$KAFKA_OUTPUT_VERSION" \
|
||||||
--argjson HOSTS "$HOSTS" \
|
--argjson HOSTS "$HOSTS" \
|
||||||
'{"name":"grid-kafka","type":"kafka","hosts":$HOSTS,"is_default":$ENABLED_DISABLED,"is_default_monitoring":$ENABLED_DISABLED,"config_yaml":"","ssl":{"certificate_authorities":[ $KAFKACA ],"certificate": $KAFKACRT ,"key":"","verification_mode":"full"},"proxy_id":null,"client_id":"Elastic","version": $KAFKA_OUTPUT_VERSION ,"compression":"none","auth_type":"ssl","partition":"round_robin","round_robin":{"group_events":10},"topic":"default-securityonion","headers":[{"key":"","value":""}],"timeout":30,"broker_timeout":30,"required_acks":1,"secrets":{"ssl":{"key": $KAFKAKEY }}}'
|
'{"name":"grid-kafka","type":"kafka","hosts":$HOSTS,"is_default":$ENABLED_DISABLED,"is_default_monitoring":$ENABLED_DISABLED,"config_yaml":"","ssl":{"certificate_authorities":[ $KAFKACA ],"certificate": $KAFKACRT ,"key":"","verification_mode":"full"},"proxy_id":null,"client_id":"Elastic","version": $KAFKA_OUTPUT_VERSION ,"compression":"none","auth_type":"ssl","partition":"round_robin","round_robin":{"group_events":10},"topics":[{"topic":"default-securityonion"}],"headers":[{"key":"","value":""}],"timeout":30,"broker_timeout":30,"required_acks":1,"secrets":{"ssl":{"key": $KAFKAKEY }}}'
|
||||||
)
|
)
|
||||||
if ! response=$(curl -sK /opt/so/conf/elasticsearch/curl.config -L -X PUT "localhost:5601/api/fleet/outputs/so-manager_kafka" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d "$JSON_STRING" --fail 2>/dev/null); then
|
if ! response=$(curl -sK /opt/so/conf/elasticsearch/curl.config -L -X PUT "localhost:5601/api/fleet/outputs/so-manager_kafka" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d "$JSON_STRING" --fail 2>/dev/null); then
|
||||||
echo -e "\nFailed to force update to Elastic Fleet output policy for Kafka...\n"
|
echo -e "\nFailed to force update to Elastic Fleet output policy for Kafka...\n"
|
||||||
|
|||||||
@@ -26,14 +26,14 @@ catrustscript:
|
|||||||
GLOBALS: {{ GLOBALS }}
|
GLOBALS: {{ GLOBALS }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
elasticsearch_cacerts:
|
cacertz:
|
||||||
file.managed:
|
file.managed:
|
||||||
- name: /opt/so/conf/ca/cacerts
|
- name: /opt/so/conf/ca/cacerts
|
||||||
- source: salt://elasticsearch/cacerts
|
- source: salt://elasticsearch/cacerts
|
||||||
- user: 939
|
- user: 939
|
||||||
- group: 939
|
- group: 939
|
||||||
|
|
||||||
elasticsearch_capems:
|
capemz:
|
||||||
file.managed:
|
file.managed:
|
||||||
- name: /opt/so/conf/ca/tls-ca-bundle.pem
|
- name: /opt/so/conf/ca/tls-ca-bundle.pem
|
||||||
- source: salt://elasticsearch/tls-ca-bundle.pem
|
- source: salt://elasticsearch/tls-ca-bundle.pem
|
||||||
|
|||||||
@@ -5,6 +5,11 @@
|
|||||||
|
|
||||||
{% from 'allowed_states.map.jinja' import allowed_states %}
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
{% if sls.split('.')[0] in allowed_states %}
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
|
include:
|
||||||
|
- ssl
|
||||||
|
- elasticsearch.ca
|
||||||
|
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
{% from 'elasticsearch/config.map.jinja' import ELASTICSEARCHMERGED %}
|
{% from 'elasticsearch/config.map.jinja' import ELASTICSEARCHMERGED %}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
elasticsearch:
|
elasticsearch:
|
||||||
enabled: false
|
enabled: false
|
||||||
version: 9.0.8
|
version: 8.18.8
|
||||||
index_clean: true
|
index_clean: true
|
||||||
config:
|
config:
|
||||||
action:
|
action:
|
||||||
@@ -72,8 +72,6 @@ elasticsearch:
|
|||||||
actions:
|
actions:
|
||||||
set_priority:
|
set_priority:
|
||||||
priority: 0
|
priority: 0
|
||||||
allocate:
|
|
||||||
number_of_replicas: ""
|
|
||||||
min_age: 60d
|
min_age: 60d
|
||||||
delete:
|
delete:
|
||||||
actions:
|
actions:
|
||||||
@@ -86,25 +84,11 @@ elasticsearch:
|
|||||||
max_primary_shard_size: 50gb
|
max_primary_shard_size: 50gb
|
||||||
set_priority:
|
set_priority:
|
||||||
priority: 100
|
priority: 100
|
||||||
forcemerge:
|
|
||||||
max_num_segments: ""
|
|
||||||
shrink:
|
|
||||||
max_primary_shard_size: ""
|
|
||||||
method: COUNT
|
|
||||||
number_of_shards: ""
|
|
||||||
min_age: 0ms
|
min_age: 0ms
|
||||||
warm:
|
warm:
|
||||||
actions:
|
actions:
|
||||||
set_priority:
|
set_priority:
|
||||||
priority: 50
|
priority: 50
|
||||||
forcemerge:
|
|
||||||
max_num_segments: ""
|
|
||||||
shrink:
|
|
||||||
max_primary_shard_size: ""
|
|
||||||
method: COUNT
|
|
||||||
number_of_shards: ""
|
|
||||||
allocate:
|
|
||||||
number_of_replicas: ""
|
|
||||||
min_age: 30d
|
min_age: 30d
|
||||||
so-case:
|
so-case:
|
||||||
index_sorting: false
|
index_sorting: false
|
||||||
@@ -261,6 +245,7 @@ elasticsearch:
|
|||||||
set_priority:
|
set_priority:
|
||||||
priority: 50
|
priority: 50
|
||||||
min_age: 30d
|
min_age: 30d
|
||||||
|
warm: 7
|
||||||
so-detection:
|
so-detection:
|
||||||
index_sorting: false
|
index_sorting: false
|
||||||
index_template:
|
index_template:
|
||||||
@@ -299,19 +284,6 @@ elasticsearch:
|
|||||||
hot:
|
hot:
|
||||||
actions: {}
|
actions: {}
|
||||||
min_age: 0ms
|
min_age: 0ms
|
||||||
sos-backup:
|
|
||||||
index_sorting: false
|
|
||||||
index_template:
|
|
||||||
composed_of: []
|
|
||||||
ignore_missing_component_templates: []
|
|
||||||
index_patterns:
|
|
||||||
- sos-backup-*
|
|
||||||
priority: 501
|
|
||||||
template:
|
|
||||||
settings:
|
|
||||||
index:
|
|
||||||
number_of_replicas: 0
|
|
||||||
number_of_shards: 1
|
|
||||||
so-assistant-chat:
|
so-assistant-chat:
|
||||||
index_sorting: false
|
index_sorting: false
|
||||||
index_template:
|
index_template:
|
||||||
@@ -612,6 +584,7 @@ elasticsearch:
|
|||||||
set_priority:
|
set_priority:
|
||||||
priority: 50
|
priority: 50
|
||||||
min_age: 30d
|
min_age: 30d
|
||||||
|
warm: 7
|
||||||
so-import:
|
so-import:
|
||||||
index_sorting: false
|
index_sorting: false
|
||||||
index_template:
|
index_template:
|
||||||
@@ -857,11 +830,53 @@ elasticsearch:
|
|||||||
composed_of:
|
composed_of:
|
||||||
- agent-mappings
|
- agent-mappings
|
||||||
- dtc-agent-mappings
|
- dtc-agent-mappings
|
||||||
|
- base-mappings
|
||||||
|
- dtc-base-mappings
|
||||||
|
- client-mappings
|
||||||
|
- dtc-client-mappings
|
||||||
|
- container-mappings
|
||||||
|
- destination-mappings
|
||||||
|
- dtc-destination-mappings
|
||||||
|
- pb-override-destination-mappings
|
||||||
|
- dll-mappings
|
||||||
|
- dns-mappings
|
||||||
|
- dtc-dns-mappings
|
||||||
|
- ecs-mappings
|
||||||
|
- dtc-ecs-mappings
|
||||||
|
- error-mappings
|
||||||
|
- event-mappings
|
||||||
|
- dtc-event-mappings
|
||||||
|
- file-mappings
|
||||||
|
- dtc-file-mappings
|
||||||
|
- group-mappings
|
||||||
- host-mappings
|
- host-mappings
|
||||||
- dtc-host-mappings
|
- dtc-host-mappings
|
||||||
- http-mappings
|
- http-mappings
|
||||||
- dtc-http-mappings
|
- dtc-http-mappings
|
||||||
|
- log-mappings
|
||||||
- metadata-mappings
|
- metadata-mappings
|
||||||
|
- network-mappings
|
||||||
|
- dtc-network-mappings
|
||||||
|
- observer-mappings
|
||||||
|
- dtc-observer-mappings
|
||||||
|
- organization-mappings
|
||||||
|
- package-mappings
|
||||||
|
- process-mappings
|
||||||
|
- dtc-process-mappings
|
||||||
|
- related-mappings
|
||||||
|
- rule-mappings
|
||||||
|
- dtc-rule-mappings
|
||||||
|
- server-mappings
|
||||||
|
- service-mappings
|
||||||
|
- dtc-service-mappings
|
||||||
|
- source-mappings
|
||||||
|
- dtc-source-mappings
|
||||||
|
- pb-override-source-mappings
|
||||||
|
- threat-mappings
|
||||||
|
- tls-mappings
|
||||||
|
- url-mappings
|
||||||
|
- user_agent-mappings
|
||||||
|
- dtc-user_agent-mappings
|
||||||
- common-settings
|
- common-settings
|
||||||
- common-dynamic-mappings
|
- common-dynamic-mappings
|
||||||
data_stream:
|
data_stream:
|
||||||
@@ -917,6 +932,7 @@ elasticsearch:
|
|||||||
set_priority:
|
set_priority:
|
||||||
priority: 50
|
priority: 50
|
||||||
min_age: 30d
|
min_age: 30d
|
||||||
|
warm: 7
|
||||||
so-hydra:
|
so-hydra:
|
||||||
close: 30
|
close: 30
|
||||||
delete: 365
|
delete: 365
|
||||||
@@ -1027,6 +1043,7 @@ elasticsearch:
|
|||||||
set_priority:
|
set_priority:
|
||||||
priority: 50
|
priority: 50
|
||||||
min_age: 30d
|
min_age: 30d
|
||||||
|
warm: 7
|
||||||
so-lists:
|
so-lists:
|
||||||
index_sorting: false
|
index_sorting: false
|
||||||
index_template:
|
index_template:
|
||||||
@@ -1110,8 +1127,6 @@ elasticsearch:
|
|||||||
actions:
|
actions:
|
||||||
set_priority:
|
set_priority:
|
||||||
priority: 0
|
priority: 0
|
||||||
allocate:
|
|
||||||
number_of_replicas: ""
|
|
||||||
min_age: 60d
|
min_age: 60d
|
||||||
delete:
|
delete:
|
||||||
actions:
|
actions:
|
||||||
@@ -1124,25 +1139,11 @@ elasticsearch:
|
|||||||
max_primary_shard_size: 50gb
|
max_primary_shard_size: 50gb
|
||||||
set_priority:
|
set_priority:
|
||||||
priority: 100
|
priority: 100
|
||||||
forcemerge:
|
|
||||||
max_num_segments: ""
|
|
||||||
shrink:
|
|
||||||
max_primary_shard_size: ""
|
|
||||||
method: COUNT
|
|
||||||
number_of_shards: ""
|
|
||||||
min_age: 0ms
|
min_age: 0ms
|
||||||
warm:
|
warm:
|
||||||
actions:
|
actions:
|
||||||
set_priority:
|
set_priority:
|
||||||
priority: 50
|
priority: 50
|
||||||
allocate:
|
|
||||||
number_of_replicas: ""
|
|
||||||
forcemerge:
|
|
||||||
max_num_segments: ""
|
|
||||||
shrink:
|
|
||||||
max_primary_shard_size: ""
|
|
||||||
method: COUNT
|
|
||||||
number_of_shards: ""
|
|
||||||
min_age: 30d
|
min_age: 30d
|
||||||
so-logs-detections_x_alerts:
|
so-logs-detections_x_alerts:
|
||||||
index_sorting: false
|
index_sorting: false
|
||||||
@@ -3122,6 +3123,7 @@ elasticsearch:
|
|||||||
set_priority:
|
set_priority:
|
||||||
priority: 50
|
priority: 50
|
||||||
min_age: 30d
|
min_age: 30d
|
||||||
|
warm: 7
|
||||||
so-logs-system_x_application:
|
so-logs-system_x_application:
|
||||||
index_sorting: false
|
index_sorting: false
|
||||||
index_template:
|
index_template:
|
||||||
|
|||||||
@@ -14,9 +14,6 @@
|
|||||||
{% from 'elasticsearch/template.map.jinja' import ES_INDEX_SETTINGS %}
|
{% from 'elasticsearch/template.map.jinja' import ES_INDEX_SETTINGS %}
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- ca
|
|
||||||
- elasticsearch.ca
|
|
||||||
- elasticsearch.ssl
|
|
||||||
- elasticsearch.config
|
- elasticsearch.config
|
||||||
- elasticsearch.sostatus
|
- elasticsearch.sostatus
|
||||||
|
|
||||||
@@ -64,7 +61,11 @@ so-elasticsearch:
|
|||||||
- /nsm/elasticsearch:/usr/share/elasticsearch/data:rw
|
- /nsm/elasticsearch:/usr/share/elasticsearch/data:rw
|
||||||
- /opt/so/log/elasticsearch:/var/log/elasticsearch:rw
|
- /opt/so/log/elasticsearch:/var/log/elasticsearch:rw
|
||||||
- /opt/so/conf/ca/cacerts:/usr/share/elasticsearch/jdk/lib/security/cacerts:ro
|
- /opt/so/conf/ca/cacerts:/usr/share/elasticsearch/jdk/lib/security/cacerts:ro
|
||||||
|
{% if GLOBALS.is_manager %}
|
||||||
|
- /etc/pki/ca.crt:/usr/share/elasticsearch/config/ca.crt:ro
|
||||||
|
{% else %}
|
||||||
- /etc/pki/tls/certs/intca.crt:/usr/share/elasticsearch/config/ca.crt:ro
|
- /etc/pki/tls/certs/intca.crt:/usr/share/elasticsearch/config/ca.crt:ro
|
||||||
|
{% endif %}
|
||||||
- /etc/pki/elasticsearch.crt:/usr/share/elasticsearch/config/elasticsearch.crt:ro
|
- /etc/pki/elasticsearch.crt:/usr/share/elasticsearch/config/elasticsearch.crt:ro
|
||||||
- /etc/pki/elasticsearch.key:/usr/share/elasticsearch/config/elasticsearch.key:ro
|
- /etc/pki/elasticsearch.key:/usr/share/elasticsearch/config/elasticsearch.key:ro
|
||||||
- /etc/pki/elasticsearch.p12:/usr/share/elasticsearch/config/elasticsearch.p12:ro
|
- /etc/pki/elasticsearch.p12:/usr/share/elasticsearch/config/elasticsearch.p12:ro
|
||||||
@@ -81,21 +82,22 @@ so-elasticsearch:
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
- watch:
|
- watch:
|
||||||
- file: trusttheca
|
- file: cacertz
|
||||||
- x509: elasticsearch_crt
|
|
||||||
- x509: elasticsearch_key
|
|
||||||
- file: elasticsearch_cacerts
|
|
||||||
- file: esyml
|
- file: esyml
|
||||||
- require:
|
- require:
|
||||||
- file: trusttheca
|
|
||||||
- x509: elasticsearch_crt
|
|
||||||
- x509: elasticsearch_key
|
|
||||||
- file: elasticsearch_cacerts
|
|
||||||
- file: esyml
|
- file: esyml
|
||||||
- file: eslog4jfile
|
- file: eslog4jfile
|
||||||
- file: nsmesdir
|
- file: nsmesdir
|
||||||
- file: eslogdir
|
- file: eslogdir
|
||||||
|
- file: cacertz
|
||||||
|
- x509: /etc/pki/elasticsearch.crt
|
||||||
|
- x509: /etc/pki/elasticsearch.key
|
||||||
- file: elasticp12perms
|
- file: elasticp12perms
|
||||||
|
{% if GLOBALS.is_manager %}
|
||||||
|
- x509: pki_public_ca_crt
|
||||||
|
{% else %}
|
||||||
|
- x509: trusttheca
|
||||||
|
{% endif %}
|
||||||
- cmd: auth_users_roles_inode
|
- cmd: auth_users_roles_inode
|
||||||
- cmd: auth_users_inode
|
- cmd: auth_users_inode
|
||||||
|
|
||||||
|
|||||||
@@ -1,90 +1,9 @@
|
|||||||
{
|
{
|
||||||
"description": "kratos",
|
"description" : "kratos",
|
||||||
"processors": [
|
"processors" : [
|
||||||
{
|
{"set":{"field":"audience","value":"access","override":false,"ignore_failure":true}},
|
||||||
"set": {
|
{"set":{"field":"event.dataset","ignore_empty_value":true,"ignore_failure":true,"value":"kratos.{{{audience}}}","media_type":"text/plain"}},
|
||||||
"field": "audience",
|
{"set":{"field":"event.action","ignore_failure":true,"copy_from":"msg" }},
|
||||||
"value": "access",
|
{ "pipeline": { "name": "common" } }
|
||||||
"override": false,
|
]
|
||||||
"ignore_failure": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"set": {
|
|
||||||
"field": "event.dataset",
|
|
||||||
"ignore_empty_value": true,
|
|
||||||
"ignore_failure": true,
|
|
||||||
"value": "kratos.{{{audience}}}",
|
|
||||||
"media_type": "text/plain"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"set": {
|
|
||||||
"field": "event.action",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"copy_from": "msg"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rename": {
|
|
||||||
"field": "http_request",
|
|
||||||
"target_field": "http.request",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"ignore_missing": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rename": {
|
|
||||||
"field": "http_response",
|
|
||||||
"target_field": "http.response",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"ignore_missing": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rename": {
|
|
||||||
"field": "http.request.path",
|
|
||||||
"target_field": "http.uri",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"ignore_missing": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rename": {
|
|
||||||
"field": "http.request.method",
|
|
||||||
"target_field": "http.method",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"ignore_missing": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rename": {
|
|
||||||
"field": "http.request.method",
|
|
||||||
"target_field": "http.method",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"ignore_missing": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rename": {
|
|
||||||
"field": "http.request.query",
|
|
||||||
"target_field": "http.query",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"ignore_missing": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rename": {
|
|
||||||
"field": "http.request.headers.user-agent",
|
|
||||||
"target_field": "http.useragent",
|
|
||||||
"ignore_failure": true,
|
|
||||||
"ignore_missing": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pipeline": {
|
|
||||||
"name": "common"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
@@ -131,47 +131,6 @@ elasticsearch:
|
|||||||
description: Maximum primary shard size. Once an index reaches this limit, it will be rolled over into a new index.
|
description: Maximum primary shard size. Once an index reaches this limit, it will be rolled over into a new index.
|
||||||
global: True
|
global: True
|
||||||
helpLink: elasticsearch.html
|
helpLink: elasticsearch.html
|
||||||
shrink:
|
|
||||||
method:
|
|
||||||
description: Shrink the index to a new index with fewer primary shards. Shrink operation is by count or size.
|
|
||||||
options:
|
|
||||||
- COUNT
|
|
||||||
- SIZE
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
forcedType: string
|
|
||||||
number_of_shards:
|
|
||||||
title: shard count
|
|
||||||
description: Desired shard count. Note that this value is only used when the shrink method selected is 'COUNT'.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
max_primary_shard_size:
|
|
||||||
title: max shard size
|
|
||||||
description: Desired shard size in gb/tb/pb eg. 100gb. Note that this value is only used when the shrink method selected is 'SIZE'.
|
|
||||||
regex: ^[0-9]+(?:gb|tb|pb)$
|
|
||||||
global: True
|
|
||||||
forcedType: string
|
|
||||||
advanced: True
|
|
||||||
allow_write_after_shrink:
|
|
||||||
description: Allow writes after shrink.
|
|
||||||
global: True
|
|
||||||
forcedType: bool
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
forcemerge:
|
|
||||||
max_num_segments:
|
|
||||||
description: Reduce the number of segments in each index shard and clean up deleted documents.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
index_codec:
|
|
||||||
title: compression
|
|
||||||
description: Use higher compression for stored fields at the cost of slower performance.
|
|
||||||
forcedType: bool
|
|
||||||
global: True
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
cold:
|
cold:
|
||||||
min_age:
|
min_age:
|
||||||
description: Minimum age of index. ex. 60d - This determines when the index should be moved to the cold tier. While still searchable, this tier is typically optimized for lower storage costs rather than search speed. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and cold min_age set to 60 then there will be 30 days from index creation to rollover and then an additional 60 days before moving to cold tier.
|
description: Minimum age of index. ex. 60d - This determines when the index should be moved to the cold tier. While still searchable, this tier is typically optimized for lower storage costs rather than search speed. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and cold min_age set to 60 then there will be 30 days from index creation to rollover and then an additional 60 days before moving to cold tier.
|
||||||
@@ -185,12 +144,6 @@ elasticsearch:
|
|||||||
description: Used for index recovery after a node restart. Indices with higher priorities are recovered before indices with lower priorities.
|
description: Used for index recovery after a node restart. Indices with higher priorities are recovered before indices with lower priorities.
|
||||||
global: True
|
global: True
|
||||||
helpLink: elasticsearch.html
|
helpLink: elasticsearch.html
|
||||||
allocate:
|
|
||||||
number_of_replicas:
|
|
||||||
description: Set the number of replicas. Remains the same as the previous phase by default.
|
|
||||||
forcedType: int
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
warm:
|
warm:
|
||||||
min_age:
|
min_age:
|
||||||
description: Minimum age of index. ex. 30d - This determines when the index should be moved to the warm tier. Nodes in the warm tier generally don’t need to be as fast as those in the hot tier. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and warm min_age set to 30 then there will be 30 days from index creation to rollover and then an additional 30 days before moving to warm tier.
|
description: Minimum age of index. ex. 30d - This determines when the index should be moved to the warm tier. Nodes in the warm tier generally don’t need to be as fast as those in the hot tier. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and warm min_age set to 30 then there will be 30 days from index creation to rollover and then an additional 30 days before moving to warm tier.
|
||||||
@@ -205,52 +158,6 @@ elasticsearch:
|
|||||||
forcedType: int
|
forcedType: int
|
||||||
global: True
|
global: True
|
||||||
helpLink: elasticsearch.html
|
helpLink: elasticsearch.html
|
||||||
shrink:
|
|
||||||
method:
|
|
||||||
description: Shrink the index to a new index with fewer primary shards. Shrink operation is by count or size.
|
|
||||||
options:
|
|
||||||
- COUNT
|
|
||||||
- SIZE
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
number_of_shards:
|
|
||||||
title: shard count
|
|
||||||
description: Desired shard count. Note that this value is only used when the shrink method selected is 'COUNT'.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
max_primary_shard_size:
|
|
||||||
title: max shard size
|
|
||||||
description: Desired shard size in gb/tb/pb eg. 100gb. Note that this value is only used when the shrink method selected is 'SIZE'.
|
|
||||||
regex: ^[0-9]+(?:gb|tb|pb)$
|
|
||||||
global: True
|
|
||||||
forcedType: string
|
|
||||||
advanced: True
|
|
||||||
allow_write_after_shrink:
|
|
||||||
description: Allow writes after shrink.
|
|
||||||
global: True
|
|
||||||
forcedType: bool
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
forcemerge:
|
|
||||||
max_num_segments:
|
|
||||||
description: Reduce the number of segments in each index shard and clean up deleted documents.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
index_codec:
|
|
||||||
title: compression
|
|
||||||
description: Use higher compression for stored fields at the cost of slower performance.
|
|
||||||
forcedType: bool
|
|
||||||
global: True
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
allocate:
|
|
||||||
number_of_replicas:
|
|
||||||
description: Set the number of replicas. Remains the same as the previous phase by default.
|
|
||||||
forcedType: int
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
delete:
|
delete:
|
||||||
min_age:
|
min_age:
|
||||||
description: Minimum age of index. ex. 90d - This determines when the index should be deleted. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and delete min_age set to 90 then there will be 30 days from index creation to rollover and then an additional 90 days before deletion.
|
description: Minimum age of index. ex. 90d - This determines when the index should be deleted. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and delete min_age set to 90 then there will be 30 days from index creation to rollover and then an additional 90 days before deletion.
|
||||||
@@ -380,47 +287,6 @@ elasticsearch:
|
|||||||
global: True
|
global: True
|
||||||
advanced: True
|
advanced: True
|
||||||
helpLink: elasticsearch.html
|
helpLink: elasticsearch.html
|
||||||
shrink:
|
|
||||||
method:
|
|
||||||
description: Shrink the index to a new index with fewer primary shards. Shrink operation is by count or size.
|
|
||||||
options:
|
|
||||||
- COUNT
|
|
||||||
- SIZE
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
forcedType: string
|
|
||||||
number_of_shards:
|
|
||||||
title: shard count
|
|
||||||
description: Desired shard count. Note that this value is only used when the shrink method selected is 'COUNT'.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
max_primary_shard_size:
|
|
||||||
title: max shard size
|
|
||||||
description: Desired shard size in gb/tb/pb eg. 100gb. Note that this value is only used when the shrink method selected is 'SIZE'.
|
|
||||||
regex: ^[0-9]+(?:gb|tb|pb)$
|
|
||||||
global: True
|
|
||||||
forcedType: string
|
|
||||||
advanced: True
|
|
||||||
allow_write_after_shrink:
|
|
||||||
description: Allow writes after shrink.
|
|
||||||
global: True
|
|
||||||
forcedType: bool
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
forcemerge:
|
|
||||||
max_num_segments:
|
|
||||||
description: Reduce the number of segments in each index shard and clean up deleted documents.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
index_codec:
|
|
||||||
title: compression
|
|
||||||
description: Use higher compression for stored fields at the cost of slower performance.
|
|
||||||
forcedType: bool
|
|
||||||
global: True
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
warm:
|
warm:
|
||||||
min_age:
|
min_age:
|
||||||
description: Minimum age of index. ex. 30d - This determines when the index should be moved to the warm tier. Nodes in the warm tier generally don’t need to be as fast as those in the hot tier. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and warm min_age set to 30 then there will be 30 days from index creation to rollover and then an additional 30 days before moving to warm tier.
|
description: Minimum age of index. ex. 30d - This determines when the index should be moved to the warm tier. Nodes in the warm tier generally don’t need to be as fast as those in the hot tier. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and warm min_age set to 30 then there will be 30 days from index creation to rollover and then an additional 30 days before moving to warm tier.
|
||||||
@@ -448,52 +314,6 @@ elasticsearch:
|
|||||||
global: True
|
global: True
|
||||||
advanced: True
|
advanced: True
|
||||||
helpLink: elasticsearch.html
|
helpLink: elasticsearch.html
|
||||||
shrink:
|
|
||||||
method:
|
|
||||||
description: Shrink the index to a new index with fewer primary shards. Shrink operation is by count or size.
|
|
||||||
options:
|
|
||||||
- COUNT
|
|
||||||
- SIZE
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
number_of_shards:
|
|
||||||
title: shard count
|
|
||||||
description: Desired shard count. Note that this value is only used when the shrink method selected is 'COUNT'.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
max_primary_shard_size:
|
|
||||||
title: max shard size
|
|
||||||
description: Desired shard size in gb/tb/pb eg. 100gb. Note that this value is only used when the shrink method selected is 'SIZE'.
|
|
||||||
regex: ^[0-9]+(?:gb|tb|pb)$
|
|
||||||
global: True
|
|
||||||
forcedType: string
|
|
||||||
advanced: True
|
|
||||||
allow_write_after_shrink:
|
|
||||||
description: Allow writes after shrink.
|
|
||||||
global: True
|
|
||||||
forcedType: bool
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
forcemerge:
|
|
||||||
max_num_segments:
|
|
||||||
description: Reduce the number of segments in each index shard and clean up deleted documents.
|
|
||||||
global: True
|
|
||||||
forcedType: int
|
|
||||||
advanced: True
|
|
||||||
index_codec:
|
|
||||||
title: compression
|
|
||||||
description: Use higher compression for stored fields at the cost of slower performance.
|
|
||||||
forcedType: bool
|
|
||||||
global: True
|
|
||||||
default: False
|
|
||||||
advanced: True
|
|
||||||
allocate:
|
|
||||||
number_of_replicas:
|
|
||||||
description: Set the number of replicas. Remains the same as the previous phase by default.
|
|
||||||
forcedType: int
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
cold:
|
cold:
|
||||||
min_age:
|
min_age:
|
||||||
description: Minimum age of index. ex. 60d - This determines when the index should be moved to the cold tier. While still searchable, this tier is typically optimized for lower storage costs rather than search speed. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and cold min_age set to 60 then there will be 30 days from index creation to rollover and then an additional 60 days before moving to cold tier.
|
description: Minimum age of index. ex. 60d - This determines when the index should be moved to the cold tier. While still searchable, this tier is typically optimized for lower storage costs rather than search speed. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and cold min_age set to 60 then there will be 30 days from index creation to rollover and then an additional 60 days before moving to cold tier.
|
||||||
@@ -510,12 +330,6 @@ elasticsearch:
|
|||||||
global: True
|
global: True
|
||||||
advanced: True
|
advanced: True
|
||||||
helpLink: elasticsearch.html
|
helpLink: elasticsearch.html
|
||||||
allocate:
|
|
||||||
number_of_replicas:
|
|
||||||
description: Set the number of replicas. Remains the same as the previous phase by default.
|
|
||||||
forcedType: int
|
|
||||||
global: True
|
|
||||||
advanced: True
|
|
||||||
delete:
|
delete:
|
||||||
min_age:
|
min_age:
|
||||||
description: Minimum age of index. ex. 90d - This determines when the index should be deleted. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and delete min_age set to 90 then there will be 30 days from index creation to rollover and then an additional 90 days before deletion.
|
description: Minimum age of index. ex. 90d - This determines when the index should be deleted. It’s important to note that this is calculated relative to the rollover date (NOT the original creation date of the index). For example, if you have an index that is set to rollover after 30 days and delete min_age set to 90 then there will be 30 days from index creation to rollover and then an additional 90 days before deletion.
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
|
||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
|
||||||
# Elastic License 2.0.
|
|
||||||
|
|
||||||
{% from 'allowed_states.map.jinja' import allowed_states %}
|
|
||||||
{% if sls.split('.')[0] in allowed_states %}
|
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
|
||||||
{% from 'ca/map.jinja' import CA %}
|
|
||||||
|
|
||||||
# Create a cert for elasticsearch
|
|
||||||
elasticsearch_key:
|
|
||||||
x509.private_key_managed:
|
|
||||||
- name: /etc/pki/elasticsearch.key
|
|
||||||
- keysize: 4096
|
|
||||||
- backup: True
|
|
||||||
- new: True
|
|
||||||
{% if salt['file.file_exists']('/etc/pki/elasticsearch.key') -%}
|
|
||||||
- prereq:
|
|
||||||
- x509: /etc/pki/elasticsearch.crt
|
|
||||||
{%- endif %}
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
elasticsearch_crt:
|
|
||||||
x509.certificate_managed:
|
|
||||||
- name: /etc/pki/elasticsearch.crt
|
|
||||||
- ca_server: {{ CA.server }}
|
|
||||||
- signing_policy: registry
|
|
||||||
- private_key: /etc/pki/elasticsearch.key
|
|
||||||
- CN: {{ GLOBALS.hostname }}
|
|
||||||
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
|
||||||
- days_remaining: 7
|
|
||||||
- days_valid: 820
|
|
||||||
- backup: True
|
|
||||||
- timeout: 30
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
cmd.run:
|
|
||||||
- name: "/usr/bin/openssl pkcs12 -inkey /etc/pki/elasticsearch.key -in /etc/pki/elasticsearch.crt -export -out /etc/pki/elasticsearch.p12 -nodes -passout pass:"
|
|
||||||
- onchanges:
|
|
||||||
- x509: /etc/pki/elasticsearch.key
|
|
||||||
|
|
||||||
elastickeyperms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticsearch.key
|
|
||||||
- mode: 640
|
|
||||||
- group: 930
|
|
||||||
|
|
||||||
elasticp12perms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/elasticsearch.p12
|
|
||||||
- mode: 640
|
|
||||||
- group: 930
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{{sls}}_state_not_allowed:
|
|
||||||
test.fail_without_changes:
|
|
||||||
- name: {{sls}}_state_not_allowed
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
@@ -61,55 +61,5 @@
|
|||||||
{% do settings.index_template.template.settings.index.pop('sort') %}
|
{% do settings.index_template.template.settings.index.pop('sort') %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{# advanced ilm actions #}
|
|
||||||
{% if settings.policy is defined and settings.policy.phases is defined %}
|
|
||||||
{% set PHASE_NAMES = ["hot", "warm", "cold"] %}
|
|
||||||
{% for P in PHASE_NAMES %}
|
|
||||||
{% if settings.policy.phases[P] is defined and settings.policy.phases[P].actions is defined %}
|
|
||||||
{% set PHASE = settings.policy.phases[P].actions %}
|
|
||||||
{# remove allocate action if number_of_replicas isn't configured #}
|
|
||||||
{% if PHASE.allocate is defined %}
|
|
||||||
{% if PHASE.allocate.number_of_replicas is not defined or PHASE.allocate.number_of_replicas == "" %}
|
|
||||||
{% do PHASE.pop('allocate', none) %}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{# start shrink action #}
|
|
||||||
{% if PHASE.shrink is defined %}
|
|
||||||
{% if PHASE.shrink.method is defined %}
|
|
||||||
{% if PHASE.shrink.method == 'COUNT' and PHASE.shrink.number_of_shards is defined and PHASE.shrink.number_of_shards %}
|
|
||||||
{# remove max_primary_shard_size value when doing shrink operation by count vs size #}
|
|
||||||
{% do PHASE.shrink.pop('max_primary_shard_size', none) %}
|
|
||||||
{% elif PHASE.shrink.method == 'SIZE' and PHASE.shrink.max_primary_shard_size is defined and PHASE.shrink.max_primary_shard_size %}
|
|
||||||
{# remove number_of_shards value when doing shrink operation by size vs count #}
|
|
||||||
{% do PHASE.shrink.pop('number_of_shards', none) %}
|
|
||||||
{% else %}
|
|
||||||
{# method isn't defined or missing a required config number_of_shards/max_primary_shard_size #}
|
|
||||||
{% do PHASE.pop('shrink', none) %}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{# always remove shrink method since its only used for SOC config, not in the actual ilm policy #}
|
|
||||||
{% if PHASE.shrink is defined %}
|
|
||||||
{% do PHASE.shrink.pop('method', none) %}
|
|
||||||
{% endif %}
|
|
||||||
{# end shrink action #}
|
|
||||||
{# start force merge #}
|
|
||||||
{% if PHASE.forcemerge is defined %}
|
|
||||||
{% if PHASE.forcemerge.index_codec is defined and PHASE.forcemerge.index_codec %}
|
|
||||||
{% do PHASE.forcemerge.update({'index_codec': 'best_compression'}) %}
|
|
||||||
{% else %}
|
|
||||||
{% do PHASE.forcemerge.pop('index_codec', none) %}
|
|
||||||
{% endif %}
|
|
||||||
{% if PHASE.forcemerge.max_num_segments is not defined or not PHASE.forcemerge.max_num_segments %}
|
|
||||||
{# max_num_segments is empty, drop it #}
|
|
||||||
{% do PHASE.pop('forcemerge', none) %}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{# end force merge #}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% do ES_INDEX_SETTINGS.update({index | replace("_x_", "."): ES_INDEX_SETTINGS_GLOBAL_OVERRIDES[index]}) %}
|
{% do ES_INDEX_SETTINGS.update({index | replace("_x_", "."): ES_INDEX_SETTINGS_GLOBAL_OVERRIDES[index]}) %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
@@ -14,9 +14,8 @@ set -e
|
|||||||
# Check to see if we have extracted the ca cert.
|
# Check to see if we have extracted the ca cert.
|
||||||
if [ ! -f /opt/so/saltstack/local/salt/elasticsearch/cacerts ]; then
|
if [ ! -f /opt/so/saltstack/local/salt/elasticsearch/cacerts ]; then
|
||||||
docker run -v /etc/pki/ca.crt:/etc/ssl/ca.crt --name so-elasticsearchca --user root --entrypoint jdk/bin/keytool {{ GLOBALS.registry_host }}:5000/{{ GLOBALS.image_repo }}/so-elasticsearch:$ELASTIC_AGENT_TARBALL_VERSION -keystore /usr/share/elasticsearch/jdk/lib/security/cacerts -alias SOSCA -import -file /etc/ssl/ca.crt -storepass changeit -noprompt
|
docker run -v /etc/pki/ca.crt:/etc/ssl/ca.crt --name so-elasticsearchca --user root --entrypoint jdk/bin/keytool {{ GLOBALS.registry_host }}:5000/{{ GLOBALS.image_repo }}/so-elasticsearch:$ELASTIC_AGENT_TARBALL_VERSION -keystore /usr/share/elasticsearch/jdk/lib/security/cacerts -alias SOSCA -import -file /etc/ssl/ca.crt -storepass changeit -noprompt
|
||||||
# Make sure symbolic links are followed when copying from container
|
docker cp so-elasticsearchca:/usr/share/elasticsearch/jdk/lib/security/cacerts /opt/so/saltstack/local/salt/elasticsearch/cacerts
|
||||||
docker cp -L so-elasticsearchca:/usr/share/elasticsearch/jdk/lib/security/cacerts /opt/so/saltstack/local/salt/elasticsearch/cacerts
|
docker cp so-elasticsearchca:/etc/ssl/certs/ca-certificates.crt /opt/so/saltstack/local/salt/elasticsearch/tls-ca-bundle.pem
|
||||||
docker cp -L so-elasticsearchca:/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /opt/so/saltstack/local/salt/elasticsearch/tls-ca-bundle.pem
|
|
||||||
docker rm so-elasticsearchca
|
docker rm so-elasticsearchca
|
||||||
echo "" >> /opt/so/saltstack/local/salt/elasticsearch/tls-ca-bundle.pem
|
echo "" >> /opt/so/saltstack/local/salt/elasticsearch/tls-ca-bundle.pem
|
||||||
echo "sosca" >> /opt/so/saltstack/local/salt/elasticsearch/tls-ca-bundle.pem
|
echo "sosca" >> /opt/so/saltstack/local/salt/elasticsearch/tls-ca-bundle.pem
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ if [ ! -f $STATE_FILE_SUCCESS ]; then
|
|||||||
echo "Loading Security Onion index templates..."
|
echo "Loading Security Onion index templates..."
|
||||||
shopt -s extglob
|
shopt -s extglob
|
||||||
{% if GLOBALS.role == 'so-heavynode' %}
|
{% if GLOBALS.role == 'so-heavynode' %}
|
||||||
pattern="!(*1password*|*aws*|*azure*|*cloudflare*|*elastic_agent*|*fim*|*github*|*google*|*osquery*|*system*|*windows*|*endpoint*|*elasticsearch*|*generic*|*fleet_server*|*soc*)"
|
pattern="!(*1password*|*aws*|*azure*|*cloudflare*|*elastic_agent*|*fim*|*github*|*google*|*osquery*|*system*|*windows*)"
|
||||||
{% else %}
|
{% else %}
|
||||||
pattern="*"
|
pattern="*"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
65
salt/idstools/config.sls
Normal file
65
salt/idstools/config.sls
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
|
include:
|
||||||
|
- idstools.sync_files
|
||||||
|
|
||||||
|
idstoolslogdir:
|
||||||
|
file.directory:
|
||||||
|
- name: /opt/so/log/idstools
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
|
idstools_sbin:
|
||||||
|
file.recurse:
|
||||||
|
- name: /usr/sbin
|
||||||
|
- source: salt://idstools/tools/sbin
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- file_mode: 755
|
||||||
|
|
||||||
|
# If this is used, exclude so-rule-update
|
||||||
|
#idstools_sbin_jinja:
|
||||||
|
# file.recurse:
|
||||||
|
# - name: /usr/sbin
|
||||||
|
# - source: salt://idstools/tools/sbin_jinja
|
||||||
|
# - user: 939
|
||||||
|
# - group: 939
|
||||||
|
# - file_mode: 755
|
||||||
|
# - template: jinja
|
||||||
|
|
||||||
|
idstools_so-rule-update:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/sbin/so-rule-update
|
||||||
|
- source: salt://idstools/tools/sbin_jinja/so-rule-update
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- mode: 755
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
|
suricatacustomdirsfile:
|
||||||
|
file.directory:
|
||||||
|
- name: /nsm/rules/detect-suricata/custom_file
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
|
suricatacustomdirsurl:
|
||||||
|
file.directory:
|
||||||
|
- name: /nsm/rules/detect-suricata/custom_temp
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
10
salt/idstools/defaults.yaml
Normal file
10
salt/idstools/defaults.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
idstools:
|
||||||
|
enabled: False
|
||||||
|
config:
|
||||||
|
urls: []
|
||||||
|
ruleset: ETOPEN
|
||||||
|
oinkcode: ""
|
||||||
|
sids:
|
||||||
|
enabled: []
|
||||||
|
disabled: []
|
||||||
|
modify: []
|
||||||
31
salt/idstools/disabled.sls
Normal file
31
salt/idstools/disabled.sls
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
|
include:
|
||||||
|
- idstools.sostatus
|
||||||
|
|
||||||
|
so-idstools:
|
||||||
|
docker_container.absent:
|
||||||
|
- force: True
|
||||||
|
|
||||||
|
so-idstools_so-status.disabled:
|
||||||
|
file.comment:
|
||||||
|
- name: /opt/so/conf/so-status/so-status.conf
|
||||||
|
- regex: ^so-idstools$
|
||||||
|
|
||||||
|
so-rule-update:
|
||||||
|
cron.absent:
|
||||||
|
- identifier: so-rule-update
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
91
salt/idstools/enabled.sls
Normal file
91
salt/idstools/enabled.sls
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
{% from 'docker/docker.map.jinja' import DOCKER %}
|
||||||
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
{% set proxy = salt['pillar.get']('manager:proxy') %}
|
||||||
|
|
||||||
|
include:
|
||||||
|
- idstools.config
|
||||||
|
- idstools.sostatus
|
||||||
|
|
||||||
|
so-idstools:
|
||||||
|
docker_container.running:
|
||||||
|
- image: {{ GLOBALS.registry_host }}:5000/{{ GLOBALS.image_repo }}/so-idstools:{{ GLOBALS.so_version }}
|
||||||
|
- hostname: so-idstools
|
||||||
|
- user: socore
|
||||||
|
- networks:
|
||||||
|
- sobridge:
|
||||||
|
- ipv4_address: {{ DOCKER.containers['so-idstools'].ip }}
|
||||||
|
{% if proxy %}
|
||||||
|
- environment:
|
||||||
|
- http_proxy={{ proxy }}
|
||||||
|
- https_proxy={{ proxy }}
|
||||||
|
- no_proxy={{ salt['pillar.get']('manager:no_proxy') }}
|
||||||
|
{% if DOCKER.containers['so-idstools'].extra_env %}
|
||||||
|
{% for XTRAENV in DOCKER.containers['so-idstools'].extra_env %}
|
||||||
|
- {{ XTRAENV }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% elif DOCKER.containers['so-idstools'].extra_env %}
|
||||||
|
- environment:
|
||||||
|
{% for XTRAENV in DOCKER.containers['so-idstools'].extra_env %}
|
||||||
|
- {{ XTRAENV }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
- binds:
|
||||||
|
- /opt/so/conf/idstools/etc:/opt/so/idstools/etc:ro
|
||||||
|
- /opt/so/rules/nids/suri:/opt/so/rules/nids/suri:rw
|
||||||
|
- /nsm/rules/:/nsm/rules/:rw
|
||||||
|
{% if DOCKER.containers['so-idstools'].custom_bind_mounts %}
|
||||||
|
{% for BIND in DOCKER.containers['so-idstools'].custom_bind_mounts %}
|
||||||
|
- {{ BIND }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
- extra_hosts:
|
||||||
|
- {{ GLOBALS.manager }}:{{ GLOBALS.manager_ip }}
|
||||||
|
{% if DOCKER.containers['so-idstools'].extra_hosts %}
|
||||||
|
{% for XTRAHOST in DOCKER.containers['so-idstools'].extra_hosts %}
|
||||||
|
- {{ XTRAHOST }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
- watch:
|
||||||
|
- file: idstoolsetcsync
|
||||||
|
- file: idstools_so-rule-update
|
||||||
|
|
||||||
|
delete_so-idstools_so-status.disabled:
|
||||||
|
file.uncomment:
|
||||||
|
- name: /opt/so/conf/so-status/so-status.conf
|
||||||
|
- regex: ^so-idstools$
|
||||||
|
|
||||||
|
so-rule-update:
|
||||||
|
cron.present:
|
||||||
|
- name: /usr/sbin/so-rule-update > /opt/so/log/idstools/download_cron.log 2>&1
|
||||||
|
- identifier: so-rule-update
|
||||||
|
- user: root
|
||||||
|
- minute: '1'
|
||||||
|
- hour: '7'
|
||||||
|
|
||||||
|
# order this last to give so-idstools container time to be ready
|
||||||
|
run_so-rule-update:
|
||||||
|
cmd.run:
|
||||||
|
- name: '/usr/sbin/so-rule-update > /opt/so/log/idstools/download_idstools_state.log 2>&1'
|
||||||
|
- require:
|
||||||
|
- docker_container: so-idstools
|
||||||
|
- onchanges:
|
||||||
|
- file: idstools_so-rule-update
|
||||||
|
- file: idstoolsetcsync
|
||||||
|
- file: synclocalnidsrules
|
||||||
|
- order: last
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
16
salt/idstools/etc/disable.conf
Normal file
16
salt/idstools/etc/disable.conf
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{%- set disabled_sids = salt['pillar.get']('idstools:sids:disabled', {}) -%}
|
||||||
|
# idstools - disable.conf
|
||||||
|
|
||||||
|
# Example of disabling a rule by signature ID (gid is optional).
|
||||||
|
# 1:2019401
|
||||||
|
# 2019401
|
||||||
|
|
||||||
|
# Example of disabling a rule by regular expression.
|
||||||
|
# - All regular expression matches are case insensitive.
|
||||||
|
# re:hearbleed
|
||||||
|
# re:MS(0[7-9]|10)-\d+
|
||||||
|
{%- if disabled_sids != None %}
|
||||||
|
{%- for sid in disabled_sids %}
|
||||||
|
{{ sid }}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
16
salt/idstools/etc/enable.conf
Normal file
16
salt/idstools/etc/enable.conf
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{%- set enabled_sids = salt['pillar.get']('idstools:sids:enabled', {}) -%}
|
||||||
|
# idstools-rulecat - enable.conf
|
||||||
|
|
||||||
|
# Example of enabling a rule by signature ID (gid is optional).
|
||||||
|
# 1:2019401
|
||||||
|
# 2019401
|
||||||
|
|
||||||
|
# Example of enabling a rule by regular expression.
|
||||||
|
# - All regular expression matches are case insensitive.
|
||||||
|
# re:hearbleed
|
||||||
|
# re:MS(0[7-9]|10)-\d+
|
||||||
|
{%- if enabled_sids != None %}
|
||||||
|
{%- for sid in enabled_sids %}
|
||||||
|
{{ sid }}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
12
salt/idstools/etc/modify.conf
Normal file
12
salt/idstools/etc/modify.conf
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{%- set modify_sids = salt['pillar.get']('idstools:sids:modify', {}) -%}
|
||||||
|
# idstools-rulecat - modify.conf
|
||||||
|
|
||||||
|
# Format: <sid> "<from>" "<to>"
|
||||||
|
|
||||||
|
# Example changing the seconds for rule 2019401 to 3600.
|
||||||
|
#2019401 "seconds \d+" "seconds 3600"
|
||||||
|
{%- if modify_sids != None %}
|
||||||
|
{%- for sid in modify_sids %}
|
||||||
|
{{ sid }}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
23
salt/idstools/etc/rulecat.conf
Normal file
23
salt/idstools/etc/rulecat.conf
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{%- from 'vars/globals.map.jinja' import GLOBALS -%}
|
||||||
|
{%- from 'soc/merged.map.jinja' import SOCMERGED -%}
|
||||||
|
--suricata-version=7.0.3
|
||||||
|
--merged=/opt/so/rules/nids/suri/all.rules
|
||||||
|
--output=/nsm/rules/detect-suricata/custom_temp
|
||||||
|
--local=/opt/so/rules/nids/suri/local.rules
|
||||||
|
{%- if GLOBALS.md_engine == "SURICATA" %}
|
||||||
|
--local=/opt/so/rules/nids/suri/extraction.rules
|
||||||
|
--local=/opt/so/rules/nids/suri/filters.rules
|
||||||
|
{%- endif %}
|
||||||
|
--url=http://{{ GLOBALS.manager }}:7788/suricata/emerging-all.rules
|
||||||
|
--disable=/opt/so/idstools/etc/disable.conf
|
||||||
|
--enable=/opt/so/idstools/etc/enable.conf
|
||||||
|
--modify=/opt/so/idstools/etc/modify.conf
|
||||||
|
{%- if SOCMERGED.config.server.modules.suricataengine.customRulesets %}
|
||||||
|
{%- for ruleset in SOCMERGED.config.server.modules.suricataengine.customRulesets %}
|
||||||
|
{%- if 'url' in ruleset %}
|
||||||
|
--url={{ ruleset.url }}
|
||||||
|
{%- elif 'file' in ruleset %}
|
||||||
|
--local={{ ruleset.file }}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
@@ -3,13 +3,11 @@
|
|||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
# Elastic License 2.0.
|
# Elastic License 2.0.
|
||||||
|
|
||||||
# when the salt-minion signs the cert, a copy is stored here
|
{% from 'idstools/map.jinja' import IDSTOOLSMERGED %}
|
||||||
issued_certs_copypath:
|
|
||||||
file.directory:
|
|
||||||
- name: /etc/pki/issued_certs
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
signing_policy:
|
include:
|
||||||
file.managed:
|
{% if IDSTOOLSMERGED.enabled %}
|
||||||
- name: /etc/salt/minion.d/signing_policies.conf
|
- idstools.enabled
|
||||||
- source: salt://ca/files/signing_policies.conf
|
{% else %}
|
||||||
|
- idstools.disabled
|
||||||
|
{% endif %}
|
||||||
7
salt/idstools/map.jinja
Normal file
7
salt/idstools/map.jinja
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
Elastic License 2.0. #}
|
||||||
|
|
||||||
|
{% import_yaml 'idstools/defaults.yaml' as IDSTOOLSDEFAULTS with context %}
|
||||||
|
{% set IDSTOOLSMERGED = salt['pillar.get']('idstools', IDSTOOLSDEFAULTS.idstools, merge=True) %}
|
||||||
@@ -9,4 +9,3 @@
|
|||||||
#config tls any any -> any any (tls.fingerprint; content:"4f:a4:5e:58:7e:d9:db:20:09:d7:b6:c7:ff:58:c4:7b:dc:3f:55:b4"; config: logging disable, type tx, scope tx; sid:1200003;)
|
#config tls any any -> any any (tls.fingerprint; content:"4f:a4:5e:58:7e:d9:db:20:09:d7:b6:c7:ff:58:c4:7b:dc:3f:55:b4"; config: logging disable, type tx, scope tx; sid:1200003;)
|
||||||
# Example of filtering out a md5 of a file from being in the files log.
|
# Example of filtering out a md5 of a file from being in the files log.
|
||||||
#config fileinfo any any -> any any (fileinfo.filemd5; content:"7a125dc69c82d5caf94d3913eecde4b5"; config: logging disable, type tx, scope tx; sid:1200004;)
|
#config fileinfo any any -> any any (fileinfo.filemd5; content:"7a125dc69c82d5caf94d3913eecde4b5"; config: logging disable, type tx, scope tx; sid:1200004;)
|
||||||
|
|
||||||
1
salt/idstools/rules/local.rules
Normal file
1
salt/idstools/rules/local.rules
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Add your custom Suricata rules in this file.
|
||||||
72
salt/idstools/soc_idstools.yaml
Normal file
72
salt/idstools/soc_idstools.yaml
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
idstools:
|
||||||
|
enabled:
|
||||||
|
description: Enables or disables the IDStools process which is used by the Detection system.
|
||||||
|
config:
|
||||||
|
oinkcode:
|
||||||
|
description: Enter your registration code or oinkcode for paid NIDS rulesets.
|
||||||
|
title: Registration Code
|
||||||
|
global: True
|
||||||
|
forcedType: string
|
||||||
|
helpLink: rules.html
|
||||||
|
ruleset:
|
||||||
|
description: 'Defines the ruleset you want to run. Options are ETOPEN or ETPRO. Once you have changed the ruleset here, you will need to wait for the rule update to take place (every 24 hours), or you can force the update by nagivating to Detections --> Options dropdown menu --> Suricata --> Full Update. WARNING! Changing the ruleset will remove all existing non-overlapping Suricata rules of the previous ruleset and their associated overrides. This removal cannot be undone.'
|
||||||
|
global: True
|
||||||
|
regex: ETPRO\b|ETOPEN\b
|
||||||
|
helpLink: rules.html
|
||||||
|
urls:
|
||||||
|
description: This is a list of additional rule download locations. This feature is currently disabled.
|
||||||
|
global: True
|
||||||
|
multiline: True
|
||||||
|
forcedType: "[]string"
|
||||||
|
readonly: True
|
||||||
|
helpLink: rules.html
|
||||||
|
sids:
|
||||||
|
disabled:
|
||||||
|
description: Contains the list of NIDS rules (or regex patterns) disabled across the grid. This setting is readonly; Use the Detections screen to disable rules.
|
||||||
|
global: True
|
||||||
|
multiline: True
|
||||||
|
forcedType: "[]string"
|
||||||
|
regex: \d*|re:.*
|
||||||
|
helpLink: managing-alerts.html
|
||||||
|
readonlyUi: True
|
||||||
|
advanced: true
|
||||||
|
enabled:
|
||||||
|
description: Contains the list of NIDS rules (or regex patterns) enabled across the grid. This setting is readonly; Use the Detections screen to enable rules.
|
||||||
|
global: True
|
||||||
|
multiline: True
|
||||||
|
forcedType: "[]string"
|
||||||
|
regex: \d*|re:.*
|
||||||
|
helpLink: managing-alerts.html
|
||||||
|
readonlyUi: True
|
||||||
|
advanced: true
|
||||||
|
modify:
|
||||||
|
description: Contains the list of NIDS rules (SID "REGEX_SEARCH_TERM" "REGEX_REPLACE_TERM"). This setting is readonly; Use the Detections screen to modify rules.
|
||||||
|
global: True
|
||||||
|
multiline: True
|
||||||
|
forcedType: "[]string"
|
||||||
|
helpLink: managing-alerts.html
|
||||||
|
readonlyUi: True
|
||||||
|
advanced: true
|
||||||
|
rules:
|
||||||
|
local__rules:
|
||||||
|
description: Contains the list of custom NIDS rules applied to the grid. This setting is readonly; Use the Detections screen to adjust rules.
|
||||||
|
file: True
|
||||||
|
global: True
|
||||||
|
advanced: True
|
||||||
|
title: Local Rules
|
||||||
|
helpLink: local-rules.html
|
||||||
|
readonlyUi: True
|
||||||
|
filters__rules:
|
||||||
|
description: If you are using Suricata for metadata, then you can set custom filters for that metadata here.
|
||||||
|
file: True
|
||||||
|
global: True
|
||||||
|
advanced: True
|
||||||
|
title: Filter Rules
|
||||||
|
helpLink: suricata.html
|
||||||
|
extraction__rules:
|
||||||
|
description: If you are using Suricata for metadata, then you can set a list of MIME types for file extraction here.
|
||||||
|
file: True
|
||||||
|
global: True
|
||||||
|
advanced: True
|
||||||
|
title: Extraction Rules
|
||||||
|
helpLink: suricata.html
|
||||||
@@ -4,14 +4,13 @@
|
|||||||
# Elastic License 2.0.
|
# Elastic License 2.0.
|
||||||
|
|
||||||
{% from 'allowed_states.map.jinja' import allowed_states %}
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
{% if sls.split('.')[0] in allowed_states or sls in allowed_states%}
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
stenoca:
|
append_so-idstools_so-status.conf:
|
||||||
file.directory:
|
file.append:
|
||||||
- name: /opt/so/conf/steno/certs
|
- name: /opt/so/conf/so-status/so-status.conf
|
||||||
- user: 941
|
- text: so-idstools
|
||||||
- group: 939
|
- unless: grep -q so-idstools /opt/so/conf/so-status/so-status.conf
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
37
salt/idstools/sync_files.sls
Normal file
37
salt/idstools/sync_files.sls
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
idstoolsdir:
|
||||||
|
file.directory:
|
||||||
|
- name: /opt/so/conf/idstools/etc
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
|
idstoolsetcsync:
|
||||||
|
file.recurse:
|
||||||
|
- name: /opt/so/conf/idstools/etc
|
||||||
|
- source: salt://idstools/etc
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
|
rulesdir:
|
||||||
|
file.directory:
|
||||||
|
- name: /opt/so/rules/nids/suri
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
|
# Don't show changes because all.rules can be large
|
||||||
|
synclocalnidsrules:
|
||||||
|
file.recurse:
|
||||||
|
- name: /opt/so/rules/nids/suri/
|
||||||
|
- source: salt://idstools/rules/
|
||||||
|
- user: 939
|
||||||
|
- group: 939
|
||||||
|
- show_changes: False
|
||||||
|
- include_pat: 'E@.rules'
|
||||||
12
salt/idstools/tools/sbin/so-idstools-restart
Executable file
12
salt/idstools/tools/sbin/so-idstools-restart
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
/usr/sbin/so-restart idstools $1
|
||||||
12
salt/idstools/tools/sbin/so-idstools-start
Executable file
12
salt/idstools/tools/sbin/so-idstools-start
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
/usr/sbin/so-start idstools $1
|
||||||
12
salt/idstools/tools/sbin/so-idstools-stop
Executable file
12
salt/idstools/tools/sbin/so-idstools-stop
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
/usr/sbin/so-stop idstools $1
|
||||||
40
salt/idstools/tools/sbin_jinja/so-rule-update
Executable file
40
salt/idstools/tools/sbin_jinja/so-rule-update
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# if this script isn't already running
|
||||||
|
if [[ ! "`pidof -x $(basename $0) -o %PPID`" ]]; then
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
{%- from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
{%- from 'idstools/map.jinja' import IDSTOOLSMERGED %}
|
||||||
|
|
||||||
|
{%- set proxy = salt['pillar.get']('manager:proxy') %}
|
||||||
|
{%- set noproxy = salt['pillar.get']('manager:no_proxy', '') %}
|
||||||
|
|
||||||
|
{%- if proxy %}
|
||||||
|
# Download the rules from the internet
|
||||||
|
export http_proxy={{ proxy }}
|
||||||
|
export https_proxy={{ proxy }}
|
||||||
|
export no_proxy="{{ noproxy }}"
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
mkdir -p /nsm/rules/suricata
|
||||||
|
chown -R socore:socore /nsm/rules/suricata
|
||||||
|
{%- if not GLOBALS.airgap %}
|
||||||
|
# Download the rules from the internet
|
||||||
|
{%- if IDSTOOLSMERGED.config.ruleset == 'ETOPEN' %}
|
||||||
|
docker exec so-idstools idstools-rulecat -v --suricata-version 7.0.3 -o /nsm/rules/suricata/ --merged=/nsm/rules/suricata/emerging-all.rules --force
|
||||||
|
{%- elif IDSTOOLSMERGED.config.ruleset == 'ETPRO' %}
|
||||||
|
docker exec so-idstools idstools-rulecat -v --suricata-version 7.0.3 -o /nsm/rules/suricata/ --merged=/nsm/rules/suricata/emerging-all.rules --force --etpro={{ IDSTOOLSMERGED.config.oinkcode }}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
|
||||||
|
argstr=""
|
||||||
|
for arg in "$@"; do
|
||||||
|
argstr="${argstr} \"${arg}\""
|
||||||
|
done
|
||||||
|
|
||||||
|
docker exec so-idstools /bin/bash -c "cd /opt/so/idstools/etc && idstools-rulecat --force ${argstr}"
|
||||||
|
|
||||||
|
fi
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
include:
|
include:
|
||||||
- salt.minion
|
- salt.minion
|
||||||
|
- ssl
|
||||||
|
|
||||||
# Influx DB
|
# Influx DB
|
||||||
influxconfdir:
|
influxconfdir:
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
{% set TOKEN = salt['pillar.get']('influxdb:token') %}
|
{% set TOKEN = salt['pillar.get']('influxdb:token') %}
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- influxdb.ssl
|
|
||||||
- influxdb.config
|
- influxdb.config
|
||||||
- influxdb.sostatus
|
- influxdb.sostatus
|
||||||
|
|
||||||
@@ -60,8 +59,6 @@ so-influxdb:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
- watch:
|
- watch:
|
||||||
- file: influxdbconf
|
- file: influxdbconf
|
||||||
- x509: influxdb_key
|
|
||||||
- x509: influxdb_crt
|
|
||||||
- require:
|
- require:
|
||||||
- file: influxdbconf
|
- file: influxdbconf
|
||||||
- x509: influxdb_key
|
- x509: influxdb_key
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
|
||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
|
||||||
# Elastic License 2.0.
|
|
||||||
|
|
||||||
{% from 'allowed_states.map.jinja' import allowed_states %}
|
|
||||||
{% if sls.split('.')[0] in allowed_states %}
|
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
|
||||||
{% from 'ca/map.jinja' import CA %}
|
|
||||||
|
|
||||||
influxdb_key:
|
|
||||||
x509.private_key_managed:
|
|
||||||
- name: /etc/pki/influxdb.key
|
|
||||||
- keysize: 4096
|
|
||||||
- backup: True
|
|
||||||
- new: True
|
|
||||||
{% if salt['file.file_exists']('/etc/pki/influxdb.key') -%}
|
|
||||||
- prereq:
|
|
||||||
- x509: /etc/pki/influxdb.crt
|
|
||||||
{%- endif %}
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
# Create a cert for the talking to influxdb
|
|
||||||
influxdb_crt:
|
|
||||||
x509.certificate_managed:
|
|
||||||
- name: /etc/pki/influxdb.crt
|
|
||||||
- ca_server: {{ CA.server }}
|
|
||||||
- signing_policy: influxdb
|
|
||||||
- private_key: /etc/pki/influxdb.key
|
|
||||||
- CN: {{ GLOBALS.hostname }}
|
|
||||||
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
|
||||||
- days_remaining: 7
|
|
||||||
- days_valid: 820
|
|
||||||
- backup: True
|
|
||||||
- timeout: 30
|
|
||||||
- retry:
|
|
||||||
attempts: 5
|
|
||||||
interval: 30
|
|
||||||
|
|
||||||
influxkeyperms:
|
|
||||||
file.managed:
|
|
||||||
- replace: False
|
|
||||||
- name: /etc/pki/influxdb.key
|
|
||||||
- mode: 640
|
|
||||||
- group: 939
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
{{sls}}_state_not_allowed:
|
|
||||||
test.fail_without_changes:
|
|
||||||
- name: {{sls}}_state_not_allowed
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
@@ -68,8 +68,6 @@ so-kafka:
|
|||||||
- file: kafka_server_jaas_properties
|
- file: kafka_server_jaas_properties
|
||||||
{% endif %}
|
{% endif %}
|
||||||
- file: kafkacertz
|
- file: kafkacertz
|
||||||
- x509: kafka_crt
|
|
||||||
- file: kafka_pkcs12_perms
|
|
||||||
- require:
|
- require:
|
||||||
- file: kafkacertz
|
- file: kafkacertz
|
||||||
|
|
||||||
|
|||||||
@@ -6,13 +6,22 @@
|
|||||||
{% from 'allowed_states.map.jinja' import allowed_states %}
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
{% if sls.split('.')[0] in allowed_states or sls in allowed_states %}
|
{% if sls.split('.')[0] in allowed_states or sls in allowed_states %}
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
{% from 'ca/map.jinja' import CA %}
|
|
||||||
{% set kafka_password = salt['pillar.get']('kafka:config:password') %}
|
{% set kafka_password = salt['pillar.get']('kafka:config:password') %}
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- ca
|
- ca.dirs
|
||||||
|
{% set global_ca_server = [] %}
|
||||||
|
{% set x509dict = salt['mine.get'](GLOBALS.manager | lower~'*', 'x509.get_pem_entries') %}
|
||||||
|
{% for host in x509dict %}
|
||||||
|
{% if 'manager' in host.split('_')|last or host.split('_')|last == 'standalone' %}
|
||||||
|
{% do global_ca_server.append(host) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% set ca_server = global_ca_server[0] %}
|
||||||
|
|
||||||
{% if GLOBALS.role in ['so-manager', 'so-managersearch', 'so-standalone'] %}
|
{% if GLOBALS.pipeline == "KAFKA" %}
|
||||||
|
|
||||||
|
{% if GLOBALS.role in ['so-manager', 'so-managersearch', 'so-standalone'] %}
|
||||||
kafka_client_key:
|
kafka_client_key:
|
||||||
x509.private_key_managed:
|
x509.private_key_managed:
|
||||||
- name: /etc/pki/kafka-client.key
|
- name: /etc/pki/kafka-client.key
|
||||||
@@ -30,13 +39,13 @@ kafka_client_key:
|
|||||||
kafka_client_crt:
|
kafka_client_crt:
|
||||||
x509.certificate_managed:
|
x509.certificate_managed:
|
||||||
- name: /etc/pki/kafka-client.crt
|
- name: /etc/pki/kafka-client.crt
|
||||||
- ca_server: {{ CA.server }}
|
- ca_server: {{ ca_server }}
|
||||||
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
||||||
- signing_policy: kafka
|
- signing_policy: kafka
|
||||||
- private_key: /etc/pki/kafka-client.key
|
- private_key: /etc/pki/kafka-client.key
|
||||||
- CN: {{ GLOBALS.hostname }}
|
- CN: {{ GLOBALS.hostname }}
|
||||||
- days_remaining: 7
|
- days_remaining: 7
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- backup: True
|
- backup: True
|
||||||
- timeout: 30
|
- timeout: 30
|
||||||
- retry:
|
- retry:
|
||||||
@@ -58,9 +67,9 @@ kafka_client_crt_perms:
|
|||||||
- mode: 640
|
- mode: 640
|
||||||
- user: 960
|
- user: 960
|
||||||
- group: 939
|
- group: 939
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if GLOBALS.role in ['so-manager', 'so-managersearch','so-receiver', 'so-standalone'] %}
|
{% if GLOBALS.role in ['so-manager', 'so-managersearch','so-receiver', 'so-standalone'] %}
|
||||||
kafka_key:
|
kafka_key:
|
||||||
x509.private_key_managed:
|
x509.private_key_managed:
|
||||||
- name: /etc/pki/kafka.key
|
- name: /etc/pki/kafka.key
|
||||||
@@ -78,13 +87,13 @@ kafka_key:
|
|||||||
kafka_crt:
|
kafka_crt:
|
||||||
x509.certificate_managed:
|
x509.certificate_managed:
|
||||||
- name: /etc/pki/kafka.crt
|
- name: /etc/pki/kafka.crt
|
||||||
- ca_server: {{ CA.server }}
|
- ca_server: {{ ca_server }}
|
||||||
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
||||||
- signing_policy: kafka
|
- signing_policy: kafka
|
||||||
- private_key: /etc/pki/kafka.key
|
- private_key: /etc/pki/kafka.key
|
||||||
- CN: {{ GLOBALS.hostname }}
|
- CN: {{ GLOBALS.hostname }}
|
||||||
- days_remaining: 7
|
- days_remaining: 7
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- backup: True
|
- backup: True
|
||||||
- timeout: 30
|
- timeout: 30
|
||||||
- retry:
|
- retry:
|
||||||
@@ -94,7 +103,6 @@ kafka_crt:
|
|||||||
- name: "/usr/bin/openssl pkcs12 -inkey /etc/pki/kafka.key -in /etc/pki/kafka.crt -export -out /etc/pki/kafka.p12 -nodes -passout pass:{{ kafka_password }}"
|
- name: "/usr/bin/openssl pkcs12 -inkey /etc/pki/kafka.key -in /etc/pki/kafka.crt -export -out /etc/pki/kafka.p12 -nodes -passout pass:{{ kafka_password }}"
|
||||||
- onchanges:
|
- onchanges:
|
||||||
- x509: /etc/pki/kafka.key
|
- x509: /etc/pki/kafka.key
|
||||||
|
|
||||||
kafka_key_perms:
|
kafka_key_perms:
|
||||||
file.managed:
|
file.managed:
|
||||||
- replace: False
|
- replace: False
|
||||||
@@ -118,11 +126,11 @@ kafka_pkcs12_perms:
|
|||||||
- mode: 640
|
- mode: 640
|
||||||
- user: 960
|
- user: 960
|
||||||
- group: 939
|
- group: 939
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Standalone needs kafka-logstash for automated testing. Searchnode/manager search need it for logstash to consume from Kafka.
|
# Standalone needs kafka-logstash for automated testing. Searchnode/manager search need it for logstash to consume from Kafka.
|
||||||
# Manager will have cert, but be unused until a pipeline is created and logstash enabled.
|
# Manager will have cert, but be unused until a pipeline is created and logstash enabled.
|
||||||
{% if GLOBALS.role in ['so-standalone', 'so-managersearch', 'so-searchnode', 'so-manager'] %}
|
{% if GLOBALS.role in ['so-standalone', 'so-managersearch', 'so-searchnode', 'so-manager'] %}
|
||||||
kafka_logstash_key:
|
kafka_logstash_key:
|
||||||
x509.private_key_managed:
|
x509.private_key_managed:
|
||||||
- name: /etc/pki/kafka-logstash.key
|
- name: /etc/pki/kafka-logstash.key
|
||||||
@@ -140,13 +148,13 @@ kafka_logstash_key:
|
|||||||
kafka_logstash_crt:
|
kafka_logstash_crt:
|
||||||
x509.certificate_managed:
|
x509.certificate_managed:
|
||||||
- name: /etc/pki/kafka-logstash.crt
|
- name: /etc/pki/kafka-logstash.crt
|
||||||
- ca_server: {{ CA.server }}
|
- ca_server: {{ ca_server }}
|
||||||
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
- subjectAltName: DNS:{{ GLOBALS.hostname }}, IP:{{ GLOBALS.node_ip }}
|
||||||
- signing_policy: kafka
|
- signing_policy: kafka
|
||||||
- private_key: /etc/pki/kafka-logstash.key
|
- private_key: /etc/pki/kafka-logstash.key
|
||||||
- CN: {{ GLOBALS.hostname }}
|
- CN: {{ GLOBALS.hostname }}
|
||||||
- days_remaining: 7
|
- days_remaining: 7
|
||||||
- days_valid: 820
|
- days_valid: 9
|
||||||
- backup: True
|
- backup: True
|
||||||
- timeout: 30
|
- timeout: 30
|
||||||
- retry:
|
- retry:
|
||||||
@@ -181,6 +189,7 @@ kafka_logstash_pkcs12_perms:
|
|||||||
- user: 931
|
- user: 931
|
||||||
- group: 939
|
- group: 939
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -25,10 +25,11 @@ kibana:
|
|||||||
discardCorruptObjects: "8.18.8"
|
discardCorruptObjects: "8.18.8"
|
||||||
telemetry:
|
telemetry:
|
||||||
enabled: False
|
enabled: False
|
||||||
|
security:
|
||||||
|
showInsecureClusterWarning: False
|
||||||
xpack:
|
xpack:
|
||||||
security:
|
security:
|
||||||
secureCookies: true
|
secureCookies: true
|
||||||
showInsecureClusterWarning: false
|
|
||||||
reporting:
|
reporting:
|
||||||
kibanaServer:
|
kibanaServer:
|
||||||
hostname: localhost
|
hostname: localhost
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ kratosconfig:
|
|||||||
- group: 928
|
- group: 928
|
||||||
- mode: 600
|
- mode: 600
|
||||||
- template: jinja
|
- template: jinja
|
||||||
- show_changes: False
|
|
||||||
- defaults:
|
- defaults:
|
||||||
KRATOSMERGED: {{ KRATOSMERGED }}
|
KRATOSMERGED: {{ KRATOSMERGED }}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ kratos:
|
|||||||
ui_url: https://URL_BASE/
|
ui_url: https://URL_BASE/
|
||||||
login:
|
login:
|
||||||
ui_url: https://URL_BASE/login/
|
ui_url: https://URL_BASE/login/
|
||||||
lifespan: 60m
|
|
||||||
error:
|
error:
|
||||||
ui_url: https://URL_BASE/login/
|
ui_url: https://URL_BASE/login/
|
||||||
registration:
|
registration:
|
||||||
|
|||||||
@@ -182,10 +182,6 @@ kratos:
|
|||||||
global: True
|
global: True
|
||||||
advanced: True
|
advanced: True
|
||||||
helpLink: kratos.html
|
helpLink: kratos.html
|
||||||
lifespan:
|
|
||||||
description: Defines the duration that a login form will remain valid.
|
|
||||||
global: True
|
|
||||||
helpLink: kratos.html
|
|
||||||
error:
|
error:
|
||||||
ui_url:
|
ui_url:
|
||||||
description: User accessible URL containing the Security Onion login page. Leave as default to ensure proper operation.
|
description: User accessible URL containing the Security Onion login page. Leave as default to ensure proper operation.
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
logrotate:
|
logrotate:
|
||||||
config:
|
config:
|
||||||
|
/opt/so/log/idstools/*_x_log:
|
||||||
|
- daily
|
||||||
|
- rotate 14
|
||||||
|
- missingok
|
||||||
|
- copytruncate
|
||||||
|
- compress
|
||||||
|
- create
|
||||||
|
- extension .log
|
||||||
|
- dateext
|
||||||
|
- dateyesterday
|
||||||
/opt/so/log/nginx/*_x_log:
|
/opt/so/log/nginx/*_x_log:
|
||||||
- daily
|
- daily
|
||||||
- rotate 14
|
- rotate 14
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
logrotate:
|
logrotate:
|
||||||
config:
|
config:
|
||||||
|
"/opt/so/log/idstools/*_x_log":
|
||||||
|
description: List of logrotate options for this file.
|
||||||
|
title: /opt/so/log/idstools/*.log
|
||||||
|
advanced: True
|
||||||
|
multiline: True
|
||||||
|
global: True
|
||||||
|
forcedType: "[]string"
|
||||||
"/opt/so/log/nginx/*_x_log":
|
"/opt/so/log/nginx/*_x_log":
|
||||||
description: List of logrotate options for this file.
|
description: List of logrotate options for this file.
|
||||||
title: /opt/so/log/nginx/*.log
|
title: /opt/so/log/nginx/*.log
|
||||||
|
|||||||
@@ -10,10 +10,11 @@
|
|||||||
{% from 'logstash/map.jinja' import LOGSTASH_MERGED %}
|
{% from 'logstash/map.jinja' import LOGSTASH_MERGED %}
|
||||||
{% set ASSIGNED_PIPELINES = LOGSTASH_MERGED.assigned_pipelines.roles[GLOBALS.role.split('-')[1]] %}
|
{% set ASSIGNED_PIPELINES = LOGSTASH_MERGED.assigned_pipelines.roles[GLOBALS.role.split('-')[1]] %}
|
||||||
|
|
||||||
{% if GLOBALS.role not in ['so-receiver','so-fleet'] %}
|
|
||||||
include:
|
include:
|
||||||
|
- ssl
|
||||||
|
{% if GLOBALS.role not in ['so-receiver','so-fleet'] %}
|
||||||
- elasticsearch
|
- elasticsearch
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Create the logstash group
|
# Create the logstash group
|
||||||
logstashgroup:
|
logstashgroup:
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ logstash:
|
|||||||
settings:
|
settings:
|
||||||
lsheap: 500m
|
lsheap: 500m
|
||||||
config:
|
config:
|
||||||
api_x_http_x_host: 0.0.0.0
|
http_x_host: 0.0.0.0
|
||||||
path_x_logs: /var/log/logstash
|
path_x_logs: /var/log/logstash
|
||||||
pipeline_x_workers: 1
|
pipeline_x_workers: 1
|
||||||
pipeline_x_batch_x_size: 125
|
pipeline_x_batch_x_size: 125
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
{% set lsheap = LOGSTASH_MERGED.settings.lsheap %}
|
{% set lsheap = LOGSTASH_MERGED.settings.lsheap %}
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- ca
|
|
||||||
{% if GLOBALS.role not in ['so-receiver','so-fleet'] %}
|
{% if GLOBALS.role not in ['so-receiver','so-fleet'] %}
|
||||||
- elasticsearch.ca
|
- elasticsearch.ca
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -21,9 +20,9 @@ include:
|
|||||||
- kafka.ca
|
- kafka.ca
|
||||||
- kafka.ssl
|
- kafka.ssl
|
||||||
{% endif %}
|
{% endif %}
|
||||||
- logstash.ssl
|
|
||||||
- logstash.config
|
- logstash.config
|
||||||
- logstash.sostatus
|
- logstash.sostatus
|
||||||
|
- ssl
|
||||||
|
|
||||||
so-logstash:
|
so-logstash:
|
||||||
docker_container.running:
|
docker_container.running:
|
||||||
@@ -66,18 +65,22 @@ so-logstash:
|
|||||||
- /opt/so/log/logstash:/var/log/logstash:rw
|
- /opt/so/log/logstash:/var/log/logstash:rw
|
||||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
||||||
- /opt/so/conf/logstash/etc/certs:/usr/share/logstash/certs:ro
|
- /opt/so/conf/logstash/etc/certs:/usr/share/logstash/certs:ro
|
||||||
- /etc/pki/tls/certs/intca.crt:/usr/share/filebeat/ca.crt:ro
|
{% if GLOBALS.role in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-import', 'so-heavynode', 'so-receiver'] %}
|
||||||
|
- /etc/pki/filebeat.crt:/usr/share/logstash/filebeat.crt:ro
|
||||||
|
- /etc/pki/filebeat.p8:/usr/share/logstash/filebeat.key:ro
|
||||||
|
{% endif %}
|
||||||
{% if GLOBALS.is_manager or GLOBALS.role in ['so-fleet', 'so-heavynode', 'so-receiver'] %}
|
{% if GLOBALS.is_manager or GLOBALS.role in ['so-fleet', 'so-heavynode', 'so-receiver'] %}
|
||||||
- /etc/pki/elasticfleet-logstash.crt:/usr/share/logstash/elasticfleet-logstash.crt:ro
|
- /etc/pki/elasticfleet-logstash.crt:/usr/share/logstash/elasticfleet-logstash.crt:ro
|
||||||
- /etc/pki/elasticfleet-logstash.key:/usr/share/logstash/elasticfleet-logstash.key:ro
|
- /etc/pki/elasticfleet-logstash.key:/usr/share/logstash/elasticfleet-logstash.key:ro
|
||||||
- /etc/pki/elasticfleet-lumberjack.crt:/usr/share/logstash/elasticfleet-lumberjack.crt:ro
|
- /etc/pki/elasticfleet-lumberjack.crt:/usr/share/logstash/elasticfleet-lumberjack.crt:ro
|
||||||
- /etc/pki/elasticfleet-lumberjack.key:/usr/share/logstash/elasticfleet-lumberjack.key:ro
|
- /etc/pki/elasticfleet-lumberjack.key:/usr/share/logstash/elasticfleet-lumberjack.key:ro
|
||||||
{% if GLOBALS.role != 'so-fleet' %}
|
|
||||||
- /etc/pki/filebeat.crt:/usr/share/logstash/filebeat.crt:ro
|
|
||||||
- /etc/pki/filebeat.p8:/usr/share/logstash/filebeat.key:ro
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if GLOBALS.role not in ['so-receiver','so-fleet'] %}
|
{% if GLOBALS.role in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-import'] %}
|
||||||
|
- /etc/pki/ca.crt:/usr/share/filebeat/ca.crt:ro
|
||||||
|
{% else %}
|
||||||
|
- /etc/pki/tls/certs/intca.crt:/usr/share/filebeat/ca.crt:ro
|
||||||
|
{% endif %}
|
||||||
|
{% if GLOBALS.role in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-import', 'so-heavynode', 'so-searchnode' ] %}
|
||||||
- /opt/so/conf/ca/cacerts:/etc/pki/ca-trust/extracted/java/cacerts:ro
|
- /opt/so/conf/ca/cacerts:/etc/pki/ca-trust/extracted/java/cacerts:ro
|
||||||
- /opt/so/conf/ca/tls-ca-bundle.pem:/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem:ro
|
- /opt/so/conf/ca/tls-ca-bundle.pem:/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem:ro
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -97,22 +100,11 @@ so-logstash:
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
- watch:
|
- watch:
|
||||||
- file: lsetcsync
|
{% if GLOBALS.is_manager or GLOBALS.role in ['so-fleet', 'so-receiver'] %}
|
||||||
- file: trusttheca
|
|
||||||
{% if GLOBALS.is_manager %}
|
|
||||||
- file: elasticsearch_cacerts
|
|
||||||
- file: elasticsearch_capems
|
|
||||||
{% endif %}
|
|
||||||
{% if GLOBALS.is_manager or GLOBALS.role in ['so-fleet', 'so-heavynode', 'so-receiver'] %}
|
|
||||||
- x509: etc_elasticfleet_logstash_crt
|
|
||||||
- x509: etc_elasticfleet_logstash_key
|
- x509: etc_elasticfleet_logstash_key
|
||||||
- x509: etc_elasticfleetlumberjack_crt
|
- x509: etc_elasticfleet_logstash_crt
|
||||||
- x509: etc_elasticfleetlumberjack_key
|
|
||||||
{% if GLOBALS.role != 'so-fleet' %}
|
|
||||||
- x509: etc_filebeat_crt
|
|
||||||
- file: logstash_filebeat_p8
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
- file: lsetcsync
|
||||||
{% for assigned_pipeline in LOGSTASH_MERGED.assigned_pipelines.roles[GLOBALS.role.split('-')[1]] %}
|
{% for assigned_pipeline in LOGSTASH_MERGED.assigned_pipelines.roles[GLOBALS.role.split('-')[1]] %}
|
||||||
- file: ls_pipeline_{{assigned_pipeline}}
|
- file: ls_pipeline_{{assigned_pipeline}}
|
||||||
{% for CONFIGFILE in LOGSTASH_MERGED.defined_pipelines[assigned_pipeline] %}
|
{% for CONFIGFILE in LOGSTASH_MERGED.defined_pipelines[assigned_pipeline] %}
|
||||||
@@ -123,20 +115,17 @@ so-logstash:
|
|||||||
- file: kafkacertz
|
- file: kafkacertz
|
||||||
{% endif %}
|
{% endif %}
|
||||||
- require:
|
- require:
|
||||||
- file: trusttheca
|
{% if grains['role'] in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-import', 'so-heavynode', 'so-receiver'] %}
|
||||||
{% if GLOBALS.is_manager %}
|
|
||||||
- file: elasticsearch_cacerts
|
|
||||||
- file: elasticsearch_capems
|
|
||||||
{% endif %}
|
|
||||||
{% if GLOBALS.is_manager or GLOBALS.role in ['so-fleet', 'so-heavynode', 'so-receiver'] %}
|
|
||||||
- x509: etc_elasticfleet_logstash_crt
|
|
||||||
- x509: etc_elasticfleet_logstash_key
|
|
||||||
- x509: etc_elasticfleetlumberjack_crt
|
|
||||||
- x509: etc_elasticfleetlumberjack_key
|
|
||||||
{% if GLOBALS.role != 'so-fleet' %}
|
|
||||||
- x509: etc_filebeat_crt
|
- x509: etc_filebeat_crt
|
||||||
- file: logstash_filebeat_p8
|
{% endif %}
|
||||||
{% endif %}
|
{% if grains['role'] in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-import'] %}
|
||||||
|
- x509: pki_public_ca_crt
|
||||||
|
{% else %}
|
||||||
|
- x509: trusttheca
|
||||||
|
{% endif %}
|
||||||
|
{% if grains.role in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-import'] %}
|
||||||
|
- file: cacertz
|
||||||
|
- file: capemz
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if GLOBALS.pipeline == 'KAFKA' and GLOBALS.role in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-searchnode'] %}
|
{% if GLOBALS.pipeline == 'KAFKA' and GLOBALS.role in ['so-manager', 'so-managerhype', 'so-managersearch', 'so-standalone', 'so-searchnode'] %}
|
||||||
- file: kafkacertz
|
- file: kafkacertz
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user