clusters/core/addons/opensearch/values.yaml (404 lines of code) (raw):
# Configuration for setting up resources in Keycloak to enable OIDC authentication.
# Prerequisite: Ensure that the Keycloak Operator is installed and integrated with Keycloak.
# Refer to the installation guide for the Keycloak Operator:
# https://github.com/epam/edp-cluster-add-ons/tree/main/clusters/core/addons/keycloak-operator
#
# Additionally, necessary Keycloak resources such as realms, roles, and groups must be created
# to support component functionality. This can be done using the provided add-ons or manually:
# https://github.com/epam/edp-cluster-add-ons/tree/main/clusters/core/addons/kuberocketci-rbac
oidc:
enabled: true
dashboardUrl: https://opensearch-dashboards.example.com
# This section enables configuration for using External Secrets Operator (ESO) as the secret manager.
# Prerequisite: Ensure that ESO is installed in the cluster.
# Refer to the EDP cluster add-on for ESO installation and setup:
# https://github.com/epam/edp-cluster-add-ons/tree/main/clusters/core/addons/external-secrets
#
# Ensure that you have created the necessary roles for ESO integration.
# Follow the detailed instructions here:
# https://docs.kuberocketci.io/docs/operator-guide/secrets-management/external-secrets-operator-integration#aws-parameter-store-scenario-in-kuberocketci
eso:
# -- Install components of the ESO.
enabled: true
# -- Defines provider type. One of `aws` or `generic`.
type: "aws"
# -- Defines Secret Store name.
secretStoreName: "aws-parameterstore"
# -- Value name in AWS ParameterStore, AWS SecretsManager or other Secret Store.
secretName: "/infra/core/addons/opensearch"
# -- Role ARN for the ExternalSecretOperator to assume.
roleArn: arn:aws:iam::012345678910:role/AWSIRSA_Shared_ExternalSecretOperatorAccess
# Defines Secret Store configuration. Used when eso.type is set to "generic".
generic:
secretStore:
# -- Defines SecretStore provider configuration.
providerConfig: {}
# gcpsm:
# projectID: "alphabet-123"
opensearch:
nameOverride: "opensearch"
fullnameOverride: "opensearch"
singleNode: true
resources:
requests:
cpu: "500m"
memory: "1024Mi"
persistence:
storageClass: "ebs-sc"
# Set to false to disable the `fsgroup-volume` initContainer that will update permissions on the persistent disk.
enableInitChown: false
config:
opensearch.yml: |
cluster.name: opensearch-cluster
# Bind to all interfaces because we don't know what IP address Docker will assign to us.
network.host: 0.0.0.0
# # minimum_master_nodes need to be explicitly set when bound on a public IP
# # set to 1 to allow single node clusters
# discovery.zen.minimum_master_nodes: 1
# Setting network.host to a non-loopback address enables the annoying bootstrap checks. "Single-node" mode disables them again.
#discovery.type: single-node
######## Start OpenSearch Security Demo Configuration ########
# WARNING: revise all the lines below before you go into production
plugins:
security:
nodes_dn:
- 'CN=opensearch.cluster.local'
ssl:
transport:
pemcert_filepath: certs/tls.crt
pemkey_filepath: certs/tls.key
pemtrustedcas_filepath: certs/ca.crt
enforce_hostname_verification: false
http:
enabled: true
pemcert_filepath: certs/tls.crt
pemkey_filepath: certs/tls.key
pemtrustedcas_filepath: certs/ca.crt
allow_unsafe_democertificates: false
allow_default_init_securityindex: true
authcz:
admin_dn:
- 'CN=admin'
audit.type: internal_opensearch
enable_snapshot_restore_privilege: true
check_snapshot_restore_write_privileges: true
restapi:
roles_enabled: ["all_access", "security_rest_api_access"]
system_indices:
enabled: true
indices:
[
".opendistro-alerting-config",
".opendistro-alerting-alert*",
".opendistro-anomaly-results*",
".opendistro-anomaly-detector*",
".opendistro-anomaly-checkpoints",
".opendistro-anomaly-detection-state",
".opendistro-reports-*",
".opendistro-notifications-*",
".opendistro-notebooks",
".opendistro-asynchronous-search-response*",
]
######## End OpenSearch Security Demo Configuration ########
extraEnvs:
- name: DISABLE_INSTALL_DEMO_CONFIG
value: "true"
secretMounts:
- name: opensearch-certs
secretName: tls-for-opensearch-key-pair
path: /usr/share/opensearch/config/certs
- name: opensearch-admin-certs
secretName: tls-for-opensearch-admin-key-pair
path: /usr/share/opensearch/config/admin-certs
securityConfig:
enabled: true
path: "/usr/share/opensearch/config/opensearch-security"
actionGroupsSecret:
configSecret:
internalUsersSecret:
rolesSecret:
rolesMappingSecret:
tenantsSecret:
# The following option simplifies securityConfig by using a single secret and
# specifying the config files as keys in the secret instead of creating
# different secrets for each config file.
# Note that this is an alternative to the individual secret configuration
# above and shouldn't be used if the above secrets are used.
config:
# There are multiple ways to define the configuration here:
# * If you define anything under data, the chart will automatically create
# a secret and mount it.
# * If you define securityConfigSecret, the chart will assume this secret is
# created externally and mount it.
# * It is an error to define both data and securityConfigSecret.
securityConfigSecret: ""
data:
action_groups.yml: |-
_meta:
type: "actiongroups"
config_version: 2
config.yml: |-
_meta:
type: "config"
config_version: 2
config:
dynamic:
http:
anonymous_auth_enabled: false
xff:
enabled: false
internalProxies: "192\\.168\\.0\\.10|192\\.168\\.0\\.11"
authc:
basic_internal_auth_domain:
description: "Authenticate via HTTP Basic against internal users database"
http_enabled: true
transport_enabled: true
order: 0
http_authenticator:
type: basic
challenge: false
authentication_backend:
type: internal
openid_auth_domain:
http_enabled: true
transport_enabled: true
order: 1
http_authenticator:
type: openid
challenge: false
config:
subject_key: preferred_username
roles_key: roles
openid_connect_url: https://keycloak.example.com/auth/realms/shared/.well-known/openid-configuration
openid_connect_idp:
enable_ssl: false
verify_hostnames: false
authentication_backend:
type: noop
internal_users.yml: |-
_meta:
type: "internalusers"
config_version: 2
admin:
hash: "CONSULT OpenSearch FOR HASHED PASSWORD"
reserved: true
hidden: false
backend_roles:
- "admin"
attributes: {}
description: "Demo admin user"
static: false
kibanaserver:
hash: "CONSULT OpenSearch FOR HASHED PASSWORD"
reserved: true
hidden: false
backend_roles: []
attributes: {}
description: "Kibanaserver user"
static: false
logstash:
hash: "CONSULT OpenSearch FOR HASHED PASSWORD"
reserved: false
hidden: false
backend_roles:
- "logstash"
attributes: {}
description: "Log injection user"
static: false
nodes_dn.yml: |-
_meta:
type: "nodesdn"
config_version: 2
trustednodes:
nodes_dn:
- "CN=opensearch.cluster.local"
roles_mapping.yml: |-
_meta:
type: "rolesmapping"
config_version: 2
all_access:
reserved: true
backend_roles:
- "administrator"
- "admin"
description: "Maps EDP administrator role and internal admin role to all_access"
logstash:
reserved: true
backend_roles:
- "logstash"
description: "Maps log injection role to logstash. It might be logstash, fluent-bit, fluentd, ..."
kibana_user:
reserved: false
backend_roles:
- "kibanauser"
- "developer"
description: "Maps kibanauser and EDP developer role to kibana_user"
kibana_server:
reserved: true
users:
- "kibanaserver"
edp_developer:
reserved: false
backend_roles:
- "developer"
description: "Maps EDP developer role to view kube index"
roles.yml: |-
_meta:
type: "roles"
config_version: 2
edp_developer:
reserved: false
hidden: false
cluster_permissions: []
index_permissions:
- index_patterns:
- "logstash-edp*"
allowed_actions:
- "indices:data/read/*"
tenant_permissions:
- tenant_patterns:
- "*"
allowed_actions:
- "kibana:discover/*"
tenants.yml: |-
_meta:
type: "tenants"
config_version: 2
admin_tenant:
reserved: false
description: "Demo tenant for admin user"
whitelist.yml: |-
_meta:
type: "whitelist"
config_version: 2
opensearch-dashboards:
nameOverride: "opensearch-dashboards"
fullnameOverride: "opensearch-dashboards"
ingress:
enabled: true
ingressClassName: nginx
hosts:
- host: kibana.example.com
paths:
- path: /
backend:
serviceName: ""
servicePort: ""
secretMounts:
- name: opensearch-certs
secretName: tls-for-dashboards-key-pair
path: /usr/share/opensearch-dashboards/certs
extraEnvs:
- name: OIDC_CLIENT_SECRET
valueFrom:
secretKeyRef:
# ensure this secret name is equal to the secret name in opensearchAccount section
name: opensearch-dashboards-account
key: OIDC_CLIENT_SECRET
opensearchAccount:
secret: "opensearch-dashboards-account"
keyPassphrase:
enabled: false
config:
opensearch_dashboards.yml:
server:
#name: dashboards
host: 0.0.0.0
ssl:
# we disable ssl with self-signed certs, because we are behind alb+nginx
enabled: false
key: /usr/share/opensearch-dashboards/certs/tls.key
certificate: /usr/share/opensearch-dashboards/certs/tls.crt
opensearch:
ssl:
verificationMode: certificate
certificateAuthorities: /usr/share/opensearch-dashboards/certs/ca.crt
username: ${OPENSEARCH_USERNAME}
password: ${OPENSEARCH_PASSWORD}
requestHeadersAllowlist: ["Authorization", "security_tenant"]
opensearch_security:
multitenancy:
enabled: true
tenants.enable_global: true
tenants.enable_private: true
tenants.preferred: ["Private", "Global"]
enable_filter: false
cookie:
secure: false
password: ${COOKIE_PASS}
auth.type: openid
openid:
connect_url: https://keycloak.example.com/auth/realms/shared/.well-known/openid-configuration
base_redirect_url: https://kibana.example.com
client_id: opensearch
client_secret: ${OIDC_CLIENT_SECRET}
scope: openid profile email
header: Authorization
# root_ca: /usr/share/opensearch-dashboards/config/certificates/ca/ca.pem
verify_hostnames: false
trust_dynamic_headers: true
# Example logic for create index pattern
# lifecycle:
# postStart:
# exec:
# command:
# - bash
# - -c
# - |
# #!/usr/bin/bash
# # Config the index_pattern
# INDEX_PATTERN="logstash-edp*"
# OPENSEARCH_DASHBOARD=http://localhost:5601
# # Wait until service is ready
# while [ "$(curl -s -o /dev/null -w '%{http_code}\n' $OPENSEARCH_DASHBOARD/app/kibana)" != "302" ]; do
# sleep 1
# done
# # Apply Index Pattern into Kibana
# curl -X POST $OPENSEARCH_DASHBOARD/api/saved_objects/index-pattern \
# -u $OPENSEARCH_USERNAME:$OPENSEARCH_PASSWORD \
# -H 'osd-xsrf: true' \
# -H 'Content-Type: application/json' \
# -d '{"attributes":{"title": "'$INDEX_PATTERN'"}}'
startupProbe:
# let's give more time for opensearch to start
initialDelaySeconds: 60
fluent-bit:
testFramework:
enabled: false
env:
- name: ES_SUPERUSER_USER
valueFrom:
secretKeyRef:
name: fluentbit-creds
key: username
- name: ES_SUPERUSER_PASSWORD
valueFrom:
secretKeyRef:
name: fluentbit-creds
key: password
config:
customParsers: |
[PARSER]
Name docker_no_time
Format json
Time_Keep Off
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
[PARSER]
Name java_multiline
Format regex
Regex /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}) (?<level>[^\s]+)(?<message>.*)/
Time_Key time
Time_Format %Y-%m-%d %H:%M:%S
inputs: |
[INPUT]
Name tail
Path /var/log/containers/*.log
multiline.parser docker, cri
Tag kube.*
Mem_Buf_Limit 5MB
Skip_Long_Lines On
[INPUT]
Name systemd
Tag host.*
Systemd_Filter _SYSTEMD_UNIT=kubelet.service
Read_From_Tail On
[INPUT]
# Grab EDP namespace logs to separate index for development team
Name tail
Tag kube.edp.*
Path /var/log/containers/*edp*.log
multiline.parser docker, cri
Mem_Buf_Limit 5MB
Skip_Long_Lines On
filters: |
[FILTER]
Name kubernetes
Match kube.*
Merge_Log On
Keep_Log Off
K8S-Logging.Parser On
K8S-Logging.Exclude On
# START of EDP logs chain
[FILTER]
Name kubernetes
Match kube.edp.*
Merge_Log On
Keep_Log Off
Kube_Tag_Prefix kube.edp.var.log.containers.
K8S-Logging.Parser On
K8S-Logging.Exclude On
outputs: |
[OUTPUT]
Name es
Match kube.*
Host opensearch-cluster-master
Port 9200
HTTP_User ${ES_SUPERUSER_USER}
HTTP_Passwd ${ES_SUPERUSER_PASSWORD}
Logstash_Format On
Logstash_Prefix logstash-infra
Time_Key @timestamp
Replace_Dots On
Retry_Limit False
Trace_Error Off
Suppress_Type_Name On
tls On
tls.verify Off
[OUTPUT]
Name es
Match host.*
Host opensearch-cluster-master
Port 9200
HTTP_User ${ES_SUPERUSER_USER}
HTTP_Passwd ${ES_SUPERUSER_PASSWORD}
Logstash_Format On
Logstash_Prefix logstash-host
Time_Key @timestamp
Replace_Dots On
Retry_Limit False
Trace_Error Off
Suppress_Type_Name On
tls On
tls.verify Off
[OUTPUT]
Name es
Match kube.edp.*
Host opensearch-cluster-master
Port 9200
HTTP_User ${ES_SUPERUSER_USER}
HTTP_Passwd ${ES_SUPERUSER_PASSWORD}
Logstash_Format On
Logstash_Prefix logstash-edp
Time_Key @timestamp
Replace_Dots On
Retry_Limit False
Trace_Error Off
Suppress_Type_Name On
tls On
tls.verify Off