Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
e9e527f
test: Add security-config integration test
siegfriedweber Feb 5, 2026
419447c
feat: Add securityConfig to the CRD; Deploy the initial security conf…
siegfriedweber Feb 9, 2026
d12a691
Deploy security config files only if completely managed by the API
siegfriedweber Feb 10, 2026
a0382d0
test(smoke): Use securityConfig
siegfriedweber Feb 10, 2026
0b8ab8a
Deploy security config files only to the managing role group
siegfriedweber Feb 11, 2026
dce4c40
Create admin certificate in init container
siegfriedweber Feb 11, 2026
f6387a9
Add update-security-config container
siegfriedweber Feb 11, 2026
fefcfdb
Configure DN of the admin certificate
siegfriedweber Feb 11, 2026
5aa8f8b
Allow only one pod to manage the security configuration
siegfriedweber Feb 12, 2026
d9e4787
Validate the security configuration; Fix all unit tests
siegfriedweber Feb 12, 2026
5d5cf8a
Allow to disable the security plugin
siegfriedweber Feb 13, 2026
96745ee
Use a structure for the validated security configuration
siegfriedweber Feb 13, 2026
b2c611d
Declare security init containers
siegfriedweber Feb 13, 2026
88cb259
test(backup-restore): Use securityConfig
siegfriedweber Feb 18, 2026
c3d403e
test(external-access): Use securityConfig
siegfriedweber Feb 18, 2026
0d31398
test(ldap): Use securityConfig
siegfriedweber Feb 18, 2026
a8c71c2
test(logging): Use securityConfig
siegfriedweber Feb 18, 2026
dbd5eae
test(metrics): Use securityConfig
siegfriedweber Feb 18, 2026
ad31980
test(opensearch-dashboards): Use securityConfig
siegfriedweber Feb 19, 2026
1b4e332
Rename clusterConfig.security.config to clusterConfig.security.settin…
siegfriedweber Feb 19, 2026
6530f2d
Merge branch 'main' into feat/security-config
siegfriedweber Feb 19, 2026
fd55eda
Update the CRD documentation
siegfriedweber Feb 19, 2026
f78b37f
Rename admin_dn() to super_admin_dn()
siegfriedweber Feb 19, 2026
732b082
Do not use overrides to determine if TLS is enabled
siegfriedweber Feb 19, 2026
7b2bb04
Delete unit tests for removed functions
siegfriedweber Feb 19, 2026
01c34dc
Update changelog
siegfriedweber Feb 19, 2026
1e119a0
Fix shellcheck warnings
siegfriedweber Feb 19, 2026
62548be
Extend node_config unit test
siegfriedweber Feb 19, 2026
1742f57
Rename ValidatedSecurity::config to settings
siegfriedweber Feb 19, 2026
771bd5b
Restructure role group builder
siegfriedweber Feb 20, 2026
63fbded
Move init-keystore script into separate file
siegfriedweber Feb 20, 2026
87585ae
Add security modes to the role group builder
siegfriedweber Feb 20, 2026
f5de51d
test(smoke): Fix assertion
siegfriedweber Feb 23, 2026
f8dcd33
test: Test role group security modes
siegfriedweber Feb 23, 2026
6e0c459
Regenerate charts
siegfriedweber Feb 24, 2026
ee78b3f
Rework RoleGroupSecurityMode
siegfriedweber Feb 25, 2026
7a1fbda
Test NodeConfig::super_admin_dn
siegfriedweber Feb 25, 2026
99bb124
Remove redundant enum SecurityConfigFileType
siegfriedweber Feb 25, 2026
fe86178
Fix comments
siegfriedweber Feb 26, 2026
e94a82d
Test RoleGroupBuilder::security_settings_file_type_managed_by_env_var
siegfriedweber Feb 26, 2026
4b67f0e
Add ValidatedSecurity::Disabled
siegfriedweber Feb 26, 2026
c8d4e81
Test the preprocess step
siegfriedweber Feb 26, 2026
521ca8d
Rename security_config_managing_role_group to security_config_managin…
siegfriedweber Feb 26, 2026
03de85b
Upgrade opensearch-py to version 3.1.0
siegfriedweber Feb 26, 2026
e517f53
Fix tests
siegfriedweber Feb 26, 2026
db0d856
Merge branch 'main' into feat/security-config
siegfriedweber Feb 26, 2026
7e987a3
Fix the test cases that work with the original image
siegfriedweber Feb 26, 2026
8397acc
Add support for DEPRECATION log level
siegfriedweber Feb 27, 2026
540c373
test: Set backoffLimit for all jobs
siegfriedweber Feb 27, 2026
4323261
Merge branch 'main' into feat/security-config
siegfriedweber Feb 27, 2026
7f21cef
Validate node roles; Fix coordinating_only node role
siegfriedweber Mar 2, 2026
a45edb7
doc: Document the security plugin configuration
siegfriedweber Mar 2, 2026
00b3594
Rename allow_list.yml to allowlist.yml
siegfriedweber Mar 2, 2026
a16b282
test(smoke): Fix test assertion
siegfriedweber Mar 2, 2026
2bbcfc8
doc: Improve the security documentation
siegfriedweber Mar 3, 2026
539bee3
doc: Remove deprecation warning for the opensearch-operator
siegfriedweber Mar 3, 2026
f7db727
Merge branch 'main' into feat/security-config
siegfriedweber Mar 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ All notable changes to this project will be documented in this file.
- Configuration parameter `spec.nodes.roleGroups.<role-group-name>.config.discoveryServiceExposed`
added to expose a role-group via the discovery service.
- Add support for OpenSearch 3.4.0 ([#108]).
- Allow the configuration of the OpenSearch security plugin ([#117]).

### Changed

Expand All @@ -49,6 +50,7 @@ All notable changes to this project will be documented in this file.
[#108]: https://github.com/stackabletech/opensearch-operator/pull/108
[#110]: https://github.com/stackabletech/opensearch-operator/pull/110
[#114]: https://github.com/stackabletech/opensearch-operator/pull/114
[#117]: https://github.com/stackabletech/opensearch-operator/pull/117

## [25.11.0] - 2025-11-07

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ esac

echo "Creating OpenSearch security plugin configuration"
# tag::apply-security-config[]
kubectl apply -f opensearch-security-config.yaml
kubectl apply -f initial-opensearch-security-config.yaml
# end::apply-security-config[]

echo "Creating OpenSearch cluster"
Expand Down Expand Up @@ -91,17 +91,40 @@ curl \
--json '{"name": "Stackable"}' \
"$OPENSEARCH_HOST/sample_index/_doc/1"

# Output:
# {"_index":"sample_index","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
# Formatted output:
# {
# "_index": "sample_index",
# "_id": "1",
# "_version": 1,
# "result": "created",
# "_shards": {
# "total": 2,
# "successful": 1,
# "failed": 0
# },
# "_seq_no": 0,
# "_primary_term": 1
# }


curl \
--insecure \
--user $CREDENTIALS \
--request GET \
"$OPENSEARCH_HOST/sample_index/_doc/1"

# Output:
# {"_index":"sample_index","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"name": "Stackable"}}
# Formatted output:
# {
# "_index": "sample_index",
# "_id": "1",
# "_version": 1,
# "_seq_no": 0,
# "_primary_term": 1,
# "found": true,
# "_source": {
# "name": "Stackable"
# }
# }
# end::rest-api[]

echo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ esac

echo "Creating OpenSearch security plugin configuration"
# tag::apply-security-config[]
kubectl apply -f opensearch-security-config.yaml
kubectl apply -f initial-opensearch-security-config.yaml
# end::apply-security-config[]

echo "Creating OpenSearch cluster"
Expand Down Expand Up @@ -91,17 +91,40 @@ curl \
--json '{"name": "Stackable"}' \
"$OPENSEARCH_HOST/sample_index/_doc/1"

# Output:
# {"_index":"sample_index","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
# Formatted output:
# {
# "_index": "sample_index",
# "_id": "1",
# "_version": 1,
# "result": "created",
# "_shards": {
# "total": 2,
# "successful": 1,
# "failed": 0
# },
# "_seq_no": 0,
# "_primary_term": 1
# }


curl \
--insecure \
--user $CREDENTIALS \
--request GET \
"$OPENSEARCH_HOST/sample_index/_doc/1"

# Output:
# {"_index":"sample_index","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"name": "Stackable"}}
# Formatted output:
# {
# "_index": "sample_index",
# "_id": "1",
# "_version": 1,
# "_seq_no": 0,
# "_primary_term": 1,
# "found": true,
# "_source": {
# "name": "Stackable"
# }
# }
# end::rest-api[]

echo
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
apiVersion: v1
kind: Secret
metadata:
name: initial-opensearch-security-config
stringData:
internal_users.yml: |
---
_meta:
type: internalusers
config_version: 2
admin:
hash: $2y$10$xRtHZFJ9QhG9GcYhRpAGpufCZYsk//nxsuel5URh0GWEBgmiI4Q/e
reserved: true
backend_roles:
- admin
description: OpenSearch admin user
kibanaserver:
hash: $2y$10$vPgQ/6ilKDM5utawBqxoR.7euhVQ0qeGl8mPTeKhmFT475WUDrfQS
reserved: true
description: OpenSearch Dashboards user
roles_mapping.yml: |
---
_meta:
type: rolesmapping
config_version: 2
all_access:
reserved: false
backend_roles:
- admin
kibana_server:
reserved: true
users:
- kibanaserver
Original file line number Diff line number Diff line change
Expand Up @@ -17,43 +17,43 @@ config:
ssl:
verificationMode: full
certificateAuthorities:
- /stackable/opensearch-dashboards/config/tls/ca.crt
- /stackable/opensearch-dashboards/config/tls/ca.crt
opensearch_security:
cookie:
secure: true
# See https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch-dashboards/templates/deployment.yaml#L122
opensearchHosts: ""
extraEnvs:
- name: OPENSEARCH_HOSTS
valueFrom:
configMapKeyRef:
name: simple-opensearch
key: OPENSEARCH_HOSTS
- name: OPENSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: opensearch-credentials
key: kibanaserver
- name: OPENSEARCH_HOSTS
valueFrom:
configMapKeyRef:
name: simple-opensearch
key: OPENSEARCH_HOSTS
- name: OPENSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: opensearch-credentials
key: kibanaserver
extraVolumes:
- name: tls
ephemeral:
volumeClaimTemplate:
metadata:
annotations:
secrets.stackable.tech/class: tls
secrets.stackable.tech/scope: service=opensearch-dashboards
spec:
storageClassName: secrets.stackable.tech
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "1"
- name: tls
ephemeral:
volumeClaimTemplate:
metadata:
annotations:
secrets.stackable.tech/class: tls
secrets.stackable.tech/scope: service=opensearch-dashboards
spec:
storageClassName: secrets.stackable.tech
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "1"
extraVolumeMounts:
- mountPath: /stackable/opensearch-dashboards/config/tls
name: tls
- mountPath: /stackable/opensearch-dashboards/config/opensearch_dashboards.yml
name: config
subPath: opensearch_dashboards.yml
- mountPath: /stackable/opensearch-dashboards/config/tls
name: tls
- mountPath: /stackable/opensearch-dashboards/config/opensearch_dashboards.yml
name: config
subPath: opensearch_dashboards.yml
podSecurityContext:
fsGroup: 1000
Original file line number Diff line number Diff line change
Expand Up @@ -17,43 +17,43 @@ config:
ssl:
verificationMode: full
certificateAuthorities:
- /stackable/opensearch-dashboards/config/tls/ca.crt
- /stackable/opensearch-dashboards/config/tls/ca.crt
opensearch_security:
cookie:
secure: true
# See https://github.com/opensearch-project/helm-charts/blob/main/charts/opensearch-dashboards/templates/deployment.yaml#L122
opensearchHosts: ""
extraEnvs:
- name: OPENSEARCH_HOSTS
valueFrom:
configMapKeyRef:
name: simple-opensearch
key: OPENSEARCH_HOSTS
- name: OPENSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: opensearch-credentials
key: kibanaserver
- name: OPENSEARCH_HOSTS
valueFrom:
configMapKeyRef:
name: simple-opensearch
key: OPENSEARCH_HOSTS
- name: OPENSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: opensearch-credentials
key: kibanaserver
extraVolumes:
- name: tls
ephemeral:
volumeClaimTemplate:
metadata:
annotations:
secrets.stackable.tech/class: tls
secrets.stackable.tech/scope: service=opensearch-dashboards
spec:
storageClassName: secrets.stackable.tech
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "1"
- name: tls
ephemeral:
volumeClaimTemplate:
metadata:
annotations:
secrets.stackable.tech/class: tls
secrets.stackable.tech/scope: service=opensearch-dashboards
spec:
storageClassName: secrets.stackable.tech
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "1"
extraVolumeMounts:
- mountPath: /stackable/opensearch-dashboards/config/tls
name: tls
- mountPath: /stackable/opensearch-dashboards/config/opensearch_dashboards.yml
name: config
subPath: opensearch_dashboards.yml
- mountPath: /stackable/opensearch-dashboards/config/tls
name: tls
- mountPath: /stackable/opensearch-dashboards/config/opensearch_dashboards.yml
name: config
subPath: opensearch_dashboards.yml
podSecurityContext:
fsGroup: 1000
52 changes: 38 additions & 14 deletions docs/modules/opensearch/examples/getting_started/opensearch.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,44 @@ metadata:
spec:
image:
productVersion: 3.4.0
clusterConfig:
security:
settings:
config:
managedBy: API
content:
value:
_meta:
type: config
config_version: 2
config:
dynamic:
authc:
basic_internal_auth_domain:
description: Authenticate via HTTP Basic against internal users database
http_enabled: true
transport_enabled: true
order: 1
http_authenticator:
type: basic
challenge: true
authentication_backend:
type: intern
authz: {}
internalUsers:
managedBy: API
content:
valueFrom:
secretKeyRef:
name: initial-opensearch-security-config
key: internal_users.yml
rolesMapping:
managedBy: API
content:
valueFrom:
secretKeyRef:
name: initial-opensearch-security-config
key: roles_mapping.yml
nodes:
roleConfig:
discoveryServiceListenerClass: external-stable
Expand All @@ -14,18 +52,4 @@ spec:
replicas: 3
configOverrides:
opensearch.yml:
plugins.security.allow_default_init_securityindex: "true"
plugins.security.restapi.roles_enabled: all_access
podOverrides:
spec:
containers:
- name: opensearch
volumeMounts:
- name: security-config
mountPath: /stackable/opensearch/config/opensearch-security
readOnly: true
volumes:
- name: security-config
secret:
secretName: opensearch-security-config
defaultMode: 0o660
Loading