{{tag>elasticsearch kibana opensearch}}
====== Creating Opensearch Dashboards users ======
This user will only see the dashboards and visualizations and will not have any other access. Make sure that you have set
opensearch_security.readonly_mode.roles: ["kibana_read_only"]
in ///usr/share/opensearch-dashboards/config/opensearch_dashboards.yml//
You can do it 3 ways.
===== UI =====
You can use UI and create new users then assign roles to this user in //Management>Security>Internal// users. If you are using Docker and the volume is deleted obviously this will not persist.
===== Config files =====
Another way is to add the users directly in config file ///usr/share/opensearch/config/opensearch-security/internal_users.yml//:
readall:
hash: "xxxxxxxxxxxxxxxxxxxxxxxxxee"
reserved: false
opendistro_security_roles:
- "mbb_ro_role"
- "kibana_read_only"
description: "readall user, using custom role"
Create the role(s) (opensearch already provides the kibana_read_only by default) in //roles.yml//:
mbb_ro_role:
reserved: false
cluster_permissions:
- "cluster_composite_ops_ro"
index_permissions:
- index_patterns:
- ".kibana*"
- "logstash-nginx-access-logs-*"
allowed_actions:
- "read"
- "indices:admin/resolve/index"
- "cluster:admin/opensearch/ql/datasources/read"
- "indices:data/read/search"
tenant_permissions:
- tenant_patterns:
- "global_tenant"
allowed_actions:
- "read"
- "write"
Then we need to map the role to user in //roles_mapping.yml//:
mbb_ro_role:
reserved: false
users:
- "readall"
If the Opensearch is already running and you add the above in config files you need to run the securityadmin.sh (which will be deprecated in the next major release https://github.com/opensearch-project/security/issues/1755)
cd /usr/share/opensearch/plugins/opensearch-security/tools/ && ./securityadmin.sh -cd ../../../config/opensearch-security/ -icl -nhnv -cacert ../../../config/root-ca.crt -cert ../../../config/admin.pem -key ../../../config/admin-key.pem
Take care when running this because any users created through web UI will be destroyed (https://opensearch.org/docs/latest/security/configuration/security-admin/#a-word-of-caution) as the command will apply changes from the config files. Make a backup first with
cd /usr/share/opensearch/plugins/opensearch-security/tools/ && ./securityadmin.sh -backup my-backup -icl -nhnv -cacert ../../../config/root-ca.crt -cert ../../../config/admin.pem -key ../../../config/admin-key.pem
then add the user to internal_users.yml file.
===== API =====
Create the role:
PUT _plugins/_security/api/roles/mbb_ro_role
{
"cluster_permissions": ["cluster_composite_ops_ro"],
"index_permissions": [
{
"index_patterns": [".kibana*", "logstash-nginx-access-logs-*"],
"dls": "",
"fls": [],
"masked_fields": [],
"allowed_actions": ["read",
"indices:admin/resolve/index",
"cluster:admin/opensearch/ql/datasources/read",
"indices:data/read/search"
]
}
],
"tenant_permissions": [
{
"tenant_patterns": ["global_tenant"],
"allowed_actions": ["read", "write"]
}
]
}
Index pattern has to contain kibana indexes, the second pattern should be your index name (or datastream name(s))
Now we create a user and map roles (we also need to map predefined //kibana_read_only// role to our user)
PUT _plugins/_security/api/internalusers/tstuser
{
"password": "kirkpass123!",
"opendistro_security_roles": [ "mbb_ro_role", "kibana_read_only"]
}
====== Troubleshooting ======
You should tail the logs while logged in as user to see what permissions are required.
Here the request for .kibana index (originalRequested=[.kibana]), so we need to add this permission
opensearch-node2 | [2024-09-04T11:06:34,884][INFO ][o.o.s.p.PrivilegesEvaluator] [opensearch-node2] No index-level perm match for User [name=mbb-ro-user, backend_roles=[], requestedTenant=] Resolved [aliases=[.kibana], allIndices=[.kibana_1], types=[*], originalRequested=[.kibana], remoteIndices=[]] [Action [indices:data/read/get]] [RolesChecked [mbb-ro-role, own_index]]
opensearch-dashboards | {"type":"log","@timestamp":"2024-09-04T09:06:34Z","tags":["error","opensearch","data"],"pid":1,"message":"[security_exception]: no permissions for [indices:data/read/get] and User [name=mbb-ro-user, backend_roles=[], requestedTenant=]"}
Request for logstash-nginx-access-logs-live* (originalRequested=[logstash-nginx-access-logs-live*]), so we add this as well
opensearch-node1 | [2024-09-04T11:08:39,048][INFO ][o.o.s.p.PrivilegesEvaluator] [opensearch-node1] No index-level perm match for User [name=mbb-ro-user, backend_roles=[], requestedTenant=] Resolved [aliases=[], allIndices=[logstash-nginx-access-logs-live01-frontend-services-i18n, logstash-nginx-access-logs-live02-frontend-services-i18n], types=[*], originalRequested=[logstash-nginx-access-logs-live*], remoteIndices=[]] [Action [indices:data/read/search]] [RolesChecked [mbb-ro-role, own_index]]
====== Tested on ======
* Opensearch 2.15
====== See also ======
* [[wiki:opensearch_installation|Opensearch installation]]
====== References ======
* https://opensearch.org/docs/latest/security/configuration/yaml/#rolesyml
* https://opensearch.org/docs/2.15/security/access-control/api/#get-role-mapping