OpenSearch
opensearch安装
OpenSearch
1. OpenSearch插件
OpenSearch插件的前身就是Open Distro。这些插件是默认安装的。他们被安装在OPENSEARCH_HOME/plugins
目录下面。这些插件很大程度上丰富了整个系统的功能,但是到目前位置,社区上的很多插件还是适配ES的,而不是OpenSearch。如果我们强行把ES上的插件搬到OpenSearch用,大概率会起不来。
2. OpenSearch集群
2.1 节点的类型
节点类型 | 作用 | 机器配置 |
---|---|---|
master | 索引的创建或删除 跟踪哪些节点是集群的一部分 决定哪些分片分配给相关的节点 | CPU 内存 消耗一般 |
Master-eligible | 参与集群选举 | CPU 内存 消耗一般 |
data | 存储索引数据 对文档进行增删改查,聚合操作 | 资源大户,主要消耗磁盘,内存 |
Ingest | Ingest节点和集群中的其他节点一样,但是它能够创建多个处理器管道,用以修改传入文档。类似 最常用的Logstash过滤器已被实现为处理器。 Ingest节点 可用于执行常见的数据转换和丰富。 处理器配置为形成管道。 在写入时,Ingest Node有20个内置处理器,例如grok,date,gsub,小写/大写,删除和重命名 在批量请求或索引操作之前,Ingest节点拦截请求,并对文档进行处理。 | CPU 内存 消耗一般 |
Coordinating | 协调节点,是一种角色,而不是真实的Elasticsearch的节点,你没有办法通过配置项来配置哪个节点为协调节点。集群中的任何节点,都可以充当协调节点的角色。当一个节点A收到用户的查询请求后,会把查询子句分发到其它的节点,然后合并各个节点返回的查询结果,最后返回一个完整的数据集给用户。在这个过程中,节点A扮演的就是协调节点的角色。 | 资源大户,主要消耗磁盘,内存 |
2.2 常见的部署方式
常见的集群部署方式可以归为两大类,一类是使用SaaS服务,比如AWS的OpenSearch服务,一类是自己搭建。而自己搭建的集群也有两种大类,一个是部署在虚拟机或者实例上,一个是在k8s集群中部署。
在实例上部署:
在k8s上部署
3. 安装集群
我们这里使用二进制包的方式来部属,让大家更容易理解架构
3.1 准备安装
3.1.1 下载安装包
进入下载界面,下载最新版OpenSearch和OpenSearch-Dashboard,如果要下载历史版本,就要去github去下载了。
wget https://artifacts.opensearch.org/releases/bundle/opensearch/1.3.2/opensearch-1.3.2-linux-x64.tar.gz
wget https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/1.3.2/opensearch-dashboards-1.3.2-linux-x64.tar.gz
3.1.2 初始化操作系统
-
文件系统:创建三个文件架来分别存放OpenSearch数据(data)、日志(logs)、快照(snapshots)
# 二进制包的大小基本不会变 # 日志是有rotation机制的,大小也基本不会变 # 数据盘比较重要,为了保证性能,在有条件的情况下,建议使用SSD硬盘 mkdir -p /data/opensearch/{data,logs,snapshot} mkdir -p /data/opensearch-dashboards/{data,logs,snapshot}
-
解压二进制包到/data目录下
tar xf opensearch-1.3.2-linux-x64.tar.gz -C /data/opensearch ln -sf /data/opensearch/opensearch-1.3.2 /data/opensearch/opensearch tar xf opensearch-dashboards-1.3.2-linux-x64.tar.gz -C /data/opensearch-dashboards ln -sf /data/opensearch-dashboards/opensearch-dashboards-1.3.2 /data/opensearch-dashboards/opensearch-dashboards
-
配置Linux内核参数,修改/etc/sysctl.conf
vm.max_map_count=262144
执行
sudo sysctl -p
重新加载内核 -
设置 Java 堆的大小(我们推荐系统 RAM 的一半),官方建议修改环境变量
OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m
,我这里修改了/data/opensearch/opensearch/config/jvm.options。-Xms32g -Xmx32g
-
修改打开文件数,
nofile 65536
,我们这里使用的是RHEL7,修改/etc/security/limits.d/20-nproc.conf
,增加下面一行opensearch soft nproc 65536
-
创建opensearch用户,整个opensearch和opensearch-dashboard都需要使用opensearch用户来运行
useradd -r opensearch -s /usr/sbin/nologin chown -R opensearch:opensearch /data/opensearch*
-
创建OpenSearch启动Unit
cat >/lib/systemd/system/opensearch.service <<-\EOF [Unit] Description=OpenSearch Documentation=https://opensearch.org Wants=network-online.target After=network-online.target [Service] Type=simple RuntimeDirectory=opensearch PrivateTmp=true User=opensearch Group=opensearch Environment=OPENSEARCH_HOME=/data/opensearch/opensearch Environment=OPENSEARCH_PATH_CONF=/data/opensearch/opensearch/config #Environment=OPENSEARCH_JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto #Environment=OPENSEARCH_JAVA_OPTS= #Environment=RESTART_ON_UPGRADE=true Environment=OPENSEARCH_STARTUP_SLEEP_TIME=5 Environment=OPENSEARCH_SD_NOTIFY=true Environment=PID_DIR=/run/opensearch WorkingDirectory=/data/opensearch/opensearch ExecStart=/data/opensearch/opensearch/bin/opensearch -p ${PID_DIR}/opensearch.pid --quiet StandardOutput=journal StandardError=inherit # Specifies the maximum file descriptor number that can be opened by this process LimitNOFILE=65535 # Specifies the maximum number of processes LimitNPROC=4096 # Specifies the maximum size of virtual memory LimitAS=infinity LimitMEMLOCK=infinity # Specifies the maximum file size LimitFSIZE=infinity # Disable timeout logic and wait until process is stopped TimeoutStopSec=0 # SIGTERM signal is used to stop the Java process KillSignal=SIGTERM # Send the signal only to the JVM rather than its control group KillMode=process # Java process is never killed SendSIGKILL=no # When a JVM receives a SIGTERM signal it exits with code 143 SuccessExitStatus=143 # Allow a slow startup before the systemd notifier module kicks in to extend the timeout TimeoutStartSec=75 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload
-
创建OpenSearch Dashboard启动Unit
cat > /lib/systemd/system/opensearch-dashboards.service <<-\EOF [Unit] Description=OpenSearch Dashboards Wants=network-online.target After=network-online.target [Service] Type=simple User=opensearch Group=opensearch Environment=KILL_ON_STOP_TIMEOUT=0 Environment=OSD_PATH_CONF="/data/opensearch-dashboards/opensearch-dashboards/config" WorkingDirectory=/data/opensearch-dashboards/opensearch-dashboards ExecStart=/data/opensearch-dashboards/opensearch-dashboards/bin/opensearch-dashboards Restart=always RestartSec=3 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload
-
创建OpenSearch performance-analyzer启动Unit
cat > /lib/systemd/system/opensearch-performance-analyzer.service <<-\EOF [Unit] Description=OpenSearch Performance Analyzer [Service] Type=simple nvironment=OPENSEARCH_HOME=/data/opensearch/opensearch Environment=OPENSEARCH_PATH_CONF=/data/opensearch/opensearch/config Environment=PID_DIR=/run/opensearch #Environment=OPENSEARCH_JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto #Environment=OPENSEARCH_JAVA_OPTS= #Environment=RESTART_ON_UPGRADE=true Environment=OPENSEARCH_STARTUP_SLEEP_TIME=5 Environment=OPENSEARCH_SD_NOTIFY=true ExecStart=/data/opensearch/opensearch/bin/opensearch-performance-analyzer/performance-analyzer-agent-cli Restart=on-failure User=opensearch Group=opensearch WorkingDirectory=/data/opensearch/opensearch [Install] WantedBy=multi-user.target EOF systemctl daemon-reload
3.2 证书
证书是安全插件所提供的功能,包放在/data/opensearch/opensearch/plugins/opensearch-security
下面,配置证书的位置是在主配置文件opensearch.yml里面配置。证书文件必须在config
目录下,使用相对路径指定。
单机启动的时候会创建一些证书,我们可以把这些证书拷贝到其他节点上直接使用。但是在生产系统中,我们可能要使用管理员提供的证书。
如果您无权访问您的组织的证书颁发机构 (CA),并且希望将 OpenSearch 用于非演示目的,您可以使用OpenSSL生成您自己的自签名证书。
您可能可以在您的操作系统的包管理器中找到 OpenSSL。
在 CentOS 上,使用 Yum:
sudo yum install openssl
在 macOS 上,使用Homebrew:
brew install openssl
在Debian/Ubuntu上,使用apt:
apt install openssl
官方提供了一个页面专门说自建证书。我们把主要步骤列在下面,需要注意的是,每个节点都需要创建自己的证书,然后使用公司的私钥去签一下。如果我们要使用公司的证书,需要把每台node的私钥生成的证书发给CA管理员去签署,而不是把域名丢给管理员,让管理员去签域名的证书。
证书一共有三组:
- admin证书: 是用来做授权的时候数据加密的
- node证书:是用来做数据同步时候数据加密的
- client证书:是用来做做客户端和服务端数据加密的
3.2.1 生成CA证书
生成CA私钥
openssl genrsa -out root-ca-key.pem 2048
生成CA证书
openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=公司名称/OU=业务线/CN=ROOT"
3.2.2 生成管理员证书
要生成管理员证书,首先创建一个新密钥:
openssl genrsa -out admin-key-temp.pem 2048
然后使用与 PKCS#12 兼容的算法 (3DES) 将该密钥转换为 PKCS#8 格式以便在 Java 中使用:
openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
接下来,创建证书签名请求 (CSR)。此文件充当 CA 的签名证书应用程序:
openssl req -new -key admin-key.pem -out admin.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=公司名称/OU=业务线/CN=ADMIN"
按照提示填写详细信息。您无需指定质询密码。如OpenSSL Cookbook中所述,“拥有质询密码不会以任何方式提高 CSR 的安全性。”
最后,生成证书本身:
openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 3650
就像根证书一样,使用-days
选项指定超过 30 天的到期日期。
3.2.3 生成节点和客户端证书(可选)
按照生成管理员证书中的步骤为每个节点生成新证书,并根据需要生成尽可能多的客户端证书。例如,您可以为 OpenSearch Dashboards 生成一个客户端证书,为 Python 客户端生成另一个。每个证书都应使用自己的私钥。
如果您生成节点证书并plugins.security.ssl.transport.enforce_hostname_verification
设置为true
(默认),请确保为证书指定与预期节点的主机名匹配的公用名 (CN)。如果要在所有节点上使用相同的节点证书(不推荐),请将主机名验证设置为false
. 有关详细信息,请参阅配置 TLS 证书。
3.2.3.1 生成节点证书
-
opensearch-node1
openssl genrsa -out opensearch-node1-key-temp.pem 2048 openssl pkcs8 -inform PEM -outform PEM -in opensearch-node1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out opensearch-node1-key.pem openssl req -new -key opensearch-node1-key.pem -subj "/C=CN/ST=Beijing/L=Beijing/O=公司名称/OU=业务线/CN=主机名" -out opensearch-node1.csr openssl x509 -req -in opensearch-node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out opensearch-node1.pem -days 3650
-
opensearch-node2
openssl genrsa -out opensearch-node2-key-temp.pem 2048 openssl pkcs8 -inform PEM -outform PEM -in opensearch-node2-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out opensearch-node2-key.pem openssl req -new -key opensearch-node2-key.pem -subj "/C=CN/ST=Beijing/L=Beijing/O=公司名称/OU=业务线/CN=主机名" -out opensearch-node2.csr openssl x509 -req -in opensearch-node2.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out opensearch-node2.pem -days 3650
-
opensearch-node3
openssl genrsa -out opensearch-node3-key-temp.pem 2048 openssl pkcs8 -inform PEM -outform PEM -in opensearch-node3-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out opensearch-node3-key.pem openssl req -new -key opensearch-node3-key.pem -subj "/C=CN/ST=Beijing/L=Beijing/O=公司名称/OU=业务线/CN=主机名" -out opensearch-node3.csr openssl x509 -req -in opensearch-node3.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out opensearch-node3.pem -days 3650
3.2.3.2 生成客户端证书
略……
3.2.3.3 清理不使用的文件
find ./ -type f -name "*.csr" -o -name "*temp*"|xargs rm -f
3.2.4 示例脚本
如果您已经知道证书详细信息并且不想以交互方式指定它们,请在您的和 CSR 命令中使用该-subj
选项。root-ca.pem
此脚本创建一个根证书、管理员证书、两个节点证书和一个客户端证书,所有证书的有效期均为两年(730 天):
#!/bin/sh
# Root CA
openssl genrsa -out root-ca-key.pem 2048
openssl req -new -x509 -sha256 -key root-ca-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=ROOT" -out root-ca.pem -days 730
# Admin cert
openssl genrsa -out admin-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
openssl req -new -key admin-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=ADMIN" -out admin.csr
openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 730
# Node cert 1
openssl genrsa -out node1-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in node1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node1-key.pem
openssl req -new -key node1-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=node1.example.com" -out node1.csr
openssl x509 -req -in node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node1.pem -days 730
# Node cert 2
openssl genrsa -out node2-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in node2-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node2-key.pem
openssl req -new -key node2-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=node2.example.com" -out node2.csr
openssl x509 -req -in node2.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node2.pem -days 730
# Client cert
openssl genrsa -out client-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in client-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out client-key.pem
openssl req -new -key client-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=CLIENT" -out client.csr
openssl x509 -req -in client.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out client.pem -days 730
# Cleanup
rm admin-key-temp.pem
rm admin.csr
rm node1-key-temp.pem
rm node1.csr
rm node2-key-temp.pem
rm node2.csr
rm client-key-temp.pem
rm client.csr
3.2.5 配置TLS证书
TLS 配置在opensearch.yml
. 有两个主要的配置部分:传输层和 REST 层。TLS 对于 REST 层是可选的,对于传输层是强制性的。
您可以在GitHub上找到包含所有选项的示例配置模板。
3.2.5.1 配置X.509 PEM证书
传输层TLS
plugins.security.ssl.transport.pemcert_filepath: certs/opensearch-node1.pem
plugins.security.ssl.transport.pemkey_filepath: certs/opensearch-node1-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: certs/root-ca.pem
- plugins.security.ssl.transport.pemcert_filepath: X.509 节点证书链(PEM 格式)的路径,必须在
config
目录下,使用相对路径指定。- plugins.security.ssl.transport.pemkey_filepath: 证书密钥文件 (PKCS #8) 的路径,该文件必须在
config
目录下,使用相对路径指定。- plugins.security.ssl.transport.pemtrustedcas_filepath: 根 CA(PEM 格式)的路径,必须在
config
目录下,使用相对路径指定。
REST层TLS
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: certs/opensearch-node1.pem
plugins.security.ssl.http.pemkey_filepath: certs/opensearch-node1-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: certs/root-ca.pem
- plugins.security.ssl.http.enabled: 是否在 REST 层启用 TLS。如果启用,则仅允许使用 HTTPS。
- plugins.security.ssl.http.pemcert_filepath: X.509 节点证书链(PEM 格式)的路径,必须在
config
目录下,使用相对路径指定。- plugins.security.ssl.http.pemkey_filepath: 证书密钥文件 (PKCS #8) 的路径,该文件必须在
config
目录下,使用相对路径指定。- plugins.security.ssl.http.pemtrustedcas_filepath: 根 CA(PEM 格式)的路径,必须在
config
目录下,使用相对路径指定。
3.2.5.1 配置节点证书
安全插件需要识别集群间请求(即节点之间的请求)。配置节点证书的最简单方法是在opensearch.yml
,所有 DN必须包含在所有节点上的opensearch.yml
中 。安全插件支持通配符和正则表达式:
使用如下命令获取正确的subject
openssl x509 -subject -nameopt RFC2253 -noout -in opensearch-node1.pem
然后将输出复制并粘贴到opensearch.yml
.
plugins.security.nodes_dn:
- 'CN=opensearch-node*,OU=业务线,O=公司名称,L=Beijing,ST=Beijing,C=CN'
示例:
plugins.security.nodes_dn: - 'CN=node.other.com,OU=SSL,O=Test,L=Test,C=DE' - 'CN=*.example.com,OU=SSL,O=Test,L=Test,C=DE' - 'CN=elk-devcluster*' - '/CN=.*regex/'
3.2.5.2 配置管理员证书
管理员证书是具有执行管理任务的提升权限的常规客户端证书。 您需要管理员证书才能使用 plugins/opensearch-security/tools/securityadmin.sh 或 REST API 更改安全插件配置。 管理员证书在 opensearch.yml 中通过说明其 DN 进行配置:
plugins.security.authcz.admin_dn:
- 'CN=ADMIN,OU=业务线,O=公司名称,L=Beijing,ST=Beijing,C=CN'
3.2.5.3 主机名验证和DNS查找
除了根据根 CA 和/或中间 CA 验证 TLS 证书之外,安全插件还可以在传输层上应用额外的检查。
enforce_hostname_verification
启用后,安全插件会验证通信伙伴的主机名是否与证书中的主机名匹配。主机名取自证书的subject
或SAN
条目。例如,如果您的节点的主机名是node-0.example.com
,那么 TLS 证书中的主机名也必须设置node-0.example.com
为 。否则,将引发错误:
[ERROR][c.a.o.s.s.t.opensearchSecuritySSLNettyTransport] [WX6omJY] SSL Problem No name matching <hostname> found
[ERROR][c.a.o.s.s.t.opensearchSecuritySSLNettyTransport] [WX6omJY] SSL Problem Received fatal alert: certificate_unknown
此外,resolve_hostnames
启用后,安全插件会根据您的 DNS 解析(已验证的)主机名。如果主机名未解析,则会引发错误:
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.ssl.transport.resolve_hostname: false
3.3 配置
3.3.1 OpenSearch
配置文件位置在/data/opensearch/opensearch/config
下面
├── jvm.options # 和Java的参数有关
├── jvm.options.d
├── log4j2.properties # 和log4j相关的配置
├── opensearch.keystore # 系统默认的密码文件
├── opensearch-observability # 和这个插件相关的配置
├── opensearch-reports-scheduler # 和这个插件相关的配置
├── opensearch.yml # opensearch的主配置文件
本次配置的每个节点具备了node,master和coordinate所有的功能,配置文件中的选项配置如下。如果我们要针对节点做分工,给他们不同的职责,请参考这里
cluster.name: stg-opensearch-cluster
node.name: opensearch-node1
#node.attr.rack: r1
#node.roles [ master, data, ingest ]
path.data: /data/opensearch/data
path.logs: /data/opensearch/logs
path.repo: ["/data/opensearch/snapshot"]
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.3", "10.0.0.4","10.0.0.5"]
cluster.initial_master_nodes: ["10.0.0.3", "10.0.0.4", "10.0.0.5"]
gateway.recover_after_nodes: 3
action.destructive_requires_name: true
node.max_local_storage_nodes: 3
- cluster.name: 集群名称
- node.name: 节点名称
- #node.attr.rack: 向节点添加自定义属性
- #node.roles: 设置节点属性
- path.data: 存储数据的目录路径(用逗号分隔多个位置)
- path.logs: 日志文件路径
- path.repo: 快照存储路径
- bootstrap.memory_lock: 启动时锁定内存
- network.host: 将绑定地址设置为特定 IP(IPv4 或 IPv6)
- http.port: 为 HTTP 设置自定义端口
- discovery.seed_hosts: 在此节点启动时传递一个初始主机列表以执行发现
- cluster.initial_master_nodes: 使用一组初始的符合主节点的节点引导集群:
- gateway.recover_after_nodes: 在完整集群重启后阻止初始恢复,直到启动 N 个节点
- action.destructive_requires_name: 删除索引时需要明确的名称
- node.max_local_storage_nodes:
一个node上完整的配置如下,例子中以opensearch-node1为例,其他节点请修改节点相应信息。
cluster.name: stg-opensearch-cluster
node.name: opensearch-node1
path.data: /data/opensearch/data
path.logs: /data/opensearch/logs
path.repo: ["/data/opensearch/snapshot"]
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.3", "10.0.0.4","10.0.0.5"]
cluster.initial_master_nodes: ["10.0.0.3", "10.0.0.4","10.0.0.5"]
gateway.recover_after_nodes: 3
action.destructive_requires_name: true
node.max_local_storage_nodes: 3
plugins.security.ssl.transport.pemcert_filepath: certs/opensearch-node1.pem
plugins.security.ssl.transport.pemkey_filepath: certs/opensearch-node1-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: certs/root-ca.pem
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.ssl.transport.resolve_hostname: false
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: certs/opensearch-node1.pem
plugins.security.ssl.http.pemkey_filepath: certs/opensearch-node1-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: certs/root-ca.pem
plugins.security.allow_default_init_securityindex: true
plugins.security.authcz.admin_dn:
- 'CN=ADMIN,OU=业务线,O=公司名称,L=Beijing,ST=Beijing,C=CN'
plugins.security.nodes_dn:
- 'CN=opensearch-node*,OU=业务线,O=公司名称,L=Beijing,ST=Beijing,C=CN'
plugins.security.audit.type: internal_opensearch
plugins.security.enable_snapshot_restore_privilege: true
plugins.security.check_snapshot_restore_write_privileges: true
plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
plugins.security.system_indices.enabled: true
plugins.security.system_indices.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*", ".replication-metadata-store"]
- plugins.security.allow_default_init_securityindex: 如果设置为 true,则 OpenSearch Security 将使用 config 目录中的文件自动初始化配置索引(如果索引不存在); 警告:这将使用众所周知的默认密码。仅在专用网络/环境中使用。
- plugins.security.audit.type: 审计日志事件的目的地
- plugins.security.enable_snapshot_restore_privilege: 默认情况下,普通用户可以恢复快照,如果他们有’cluster:admin/snapshot/restore’, ‘indices:admin/create’, 和’indices:data/write/index’的权限来恢复索引。为了禁止普通用户的快照恢复,设置’plugins.security.enable_snapshot_restore_privilege: false’。这使得只有由管理员 TLS 证书签署的快照恢复请求才被接受。只有当快照不包含全局状态并且不恢复’.opendistro_security’索引时,才能恢复快照。
- plugins.security.check_snapshot_restore_write_privileges: 如果设置了“plugins.security.check_snapshot_restore_write_privileges: false”,则省略额外的索引检查
- plugins.security.restapi.roles_enabled: 启用或禁用基于角色的对REST管理API的访问,默认不允许任何角色访问REST管理API。
- plugins.security.system_indices.enabled: 启用系统索引(系统索引类似于安全索引,只是内容没有加密。配置为系统索引的索引只能由超级管理员访问,任何角色都不会提供对这些索引的访问。)
- plugins.security.system_indices.indices: 指定要标记为系统的索引列表。这些索引仅对上述设置的成员可见/可变,此外还需要通过普通角色对索引进行许可。
启动集群
systemctl start opensearch.service
然后去logs文件看看集群的形成情况:
less /data/opensearch/logs/stg-opensearch-cluster.log
在任何节点上执行以下_cat
查询,以查看形成为集群状态:
curl --cacert /data/opensearch/opensearch/config/certs/root-ca.pem --cert /data/opensearch/opensearch/config/certs/admin.pem --key /data/opensearch/opensearch/config/certs/admin-key.pem https://opensearch-node1:9200/_cat/health?v
epoch timestamp cluster status node.total node.data discovered_master shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1652176632 09:57:12 stg-opensearch-cluster green 3 3 true 5 2 0 0 0 0 - 100.0%
在任何节点上执行以下_cat
查询,以查看形成为集群的所有节点:
curl --cacert /data/opensearch/opensearch/config/certs/root-ca.pem --cert /data/opensearch/opensearch/config/certs/admin.pem --key /data/opensearch/opensearch/config/certs/admin-key.pem https://opensearch-node1:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.0.0.3 2 55 1 0.00 0.09 0.07 dimr * opensearch-node1
10.0.0.5 1 59 1 0.02 0.08 0.05 dimr - opensearch-node3
10.0.0.4 2 58 1 0.00 0.08 0.06 dimr - opensearch-node2
为了更好地了解和监控您的集群,请使用cat API。
3.3.2 OpenSearch-Dashboard
OpenSearch Dashboard配置文件位置在/data/opensearch-dashboards/opensearch-dashboards/config
下面
opensearch.hosts:
- "https://opensearch-node1:9200"
- "https://opensearch-node2:9200"
- "https://opensearch-node3:9200"
opensearch.ssl.verificationMode: certificate
opensearch.username: kibanaserver
opensearch.password: kibanaserver
opensearch.requestHeadersWhitelist: [authorization, securitytenant]
opensearch.ssl.certificateAuthorities: [ "/data/opensearch-dashboards/opensearch-dashboards/config/certs/root-ca.pem" ]
opensearch_security.multitenancy.enabled: true
opensearch_security.multitenancy.tenants.enable_global: true
opensearch_security.multitenancy.tenants.enable_private: true
opensearch_security.multitenancy.tenants.preferred: [Private, Global]
opensearch_security.multitenancy.enable_filter: false
opensearch_security.readonly_mode.roles: [kibana_read_only]
opensearch_security.cookie.secure: false
path.data: /data/opensearch-dashboards/data
server.host: "0.0.0.0"
server.port: 5601
server.ssl.enabled: false
logging.dest: /data/opensearch-dashboards/logs/opensearch-dashboards.log
opensearch.hosts: 用于所查询的OpenSearch实例的URL。
opensearch.ssl.verificationMode: 这个设置用于 OpenSearch 和 OpenSearch Dashboards 之间的通信。有效值是 full, certificate, 或 none。如果你启用了 TLS,我们推荐使用 full,因为它可以进行主机名验证。certificate 只是检查证书,而不是主机名,none 不执行任何检查(适用于 HTTP)。默认值是full。
opensearch.username: 如果您的 OpenSearch 受到基本身份验证的保护,这些设置提供了 OpenSearch Dashboards 服务器在启动时用于对 OpenSearch Dashboards 索引执行维护的用户名和密码。 您的 OpenSearch Dashboards 用户仍需要通过 OpenSearch 进行身份验证,该服务通过 OpenSearch Dashboards 服务器代理。
opensearch.password: 见opensearch.username。
opensearch.requestHeadersWhitelist: OpenSearch Dashboards 要求您将它传递给 OpenSearch 的所有 HTTP 标头列入白名单。 多租户使用特定的标头 securitytenant,它必须与标准 Authorization 标头一起出现。 如果 securitytenant 标头未列入白名单,则 OpenSearch Dashboards 以红色状态启动。 要发送 no 客户端标头,请将此值设置为 [](一个空列表)。
opensearch.ssl.certificateAuthorities: 如果 opensearch.ssl.verificationMode 为 full 或 certificate,请指定一个或多个 CA 证书的完整路径,这些证书构成 OpenSearch 集群的可信链。 例如,如果您使用中间 CA 来颁发管理员、客户端和节点证书,则可能需要包含根 CA 和中间 CA。
opensearch_security.multitenancy.enabled: 在 OpenSearch 仪表板中启用或禁用多租户。默认为true。
opensearch_security.multitenancy.tenants.enable_global: 启用或禁用全局租户。默认为true。
opensearch_security.multitenancy.tenants.enable_private: 启用或禁用私有租户。默认为true。
opensearch_security.multitenancy.tenants.preferred: 允许您在 OpenSearch 仪表板的租户选项卡中更改顺序。 默认情况下,列表以全局和私有(如果启用)开头,然后按字母顺序进行。 您可以在此处添加租户以将其移至列表顶部。
opensearch_security.multitenancy.enable_filter: 如果您有很多租户,您可以在列表顶部添加一个搜索栏。默认为false。
opensearch_security.readonly_mode.roles:
opensearch_security.cookie.secure: 如果您为 OpenSearch 仪表板启用 TLS,请将此设置更改为 true。 对于 HTTP,将其设置为 false。
path.data: OpenSearch Dashboard数据目录。
server.host: OpenSearch监听地址,IP地址和主机名都是有效值。
server.port: OpenSearch监听端口。
server.ssl.enabled: 此设置用于 OpenSearch Dashboards 和 Web 浏览器之间的通信。 HTTPS 设置为 true,HTTP 设置为 false。
logging.dest: OpenSearch默认日志打印到stdout上,此配置使你能够指定一个文件,以便 OpenSearch Dashboards 存储日志输出。
OpenSearch-Dashboard如果想创建多个节点,就在每个服务器上启动一个opensearch-dashboards进程就好了,且配置文件一样,然后在前面创建一个负载均衡就可以了。
启动Dashboard
systemctl start opensearch-dashboards.service
在浏览器访问http://ip:5601以查看dashboard,用户名和密码为admin
或者kibanaserver
4. 企业安全配置
4.1 安全插件
OpenSearch 有自己的用于身份验证和访问控制的安全插件。该插件提供了许多功能来帮助您保护集群。
特征 | 描述 |
---|---|
Node-to-node encryption | 加密 OpenSearch 集群中节点之间的流量。 |
HTTP basic authentication | 一种简单的身份验证方法,包括作为 HTTP 请求的一部分的用户名和密码。 |
Support for Active Directory, LDAP, Kerberos, SAML, and OpenID Connect | 使用现有的行业标准基础架构对用户进行身份验证,或在内部用户数据库中创建新用户。 |
Role-based access control | 角色定义了用户可以执行的操作:他们可以读取的数据、他们可以修改的集群设置、他们可以写入的索引等等。角色可以跨用户重用,并且用户可以拥有多个角色。 |
Index-level, document-level, and field-level security | 限制对整个索引、索引中的某些documents或documents中的某些字段的访问。 |
Audit logging | 这些日志可让您跟踪对 OpenSearch 集群的访问,并且对于合规性目的或在意外数据暴露后很有用。 |
Cross-cluster search | 使用协调集群将搜索请求安全地发送到远程集群。 |
OpenSearch Dashboards multi-tenancy | 为visualizations和dashboards创建共享(或私有)空间。 |
我们常用的有
- Node-to-node encryption:这个就需要用到我们上面做证书时候的client certificate了,数据发送端在发送数据前需要用证书认证一下。
- HTTP basic authentication: 我们用call API的方式查看数据的时候需要带上用户名和密码。
- Support for Active Directory, LDAP, Kerberos, SAML, and OpenID Connect:用户登录的时候,去其他认证中心去认证后才能访问
- Audit logging:其实我们已经打开了审计功能,
plugins.security.audit.type: internal_opensearch
,其他的配置可以参考官方文档
4.2 认证流程
了解身份验证流程是开始配置安全插件的好方法。
-
为了识别想要访问集群的用户,安全插件需要用户的凭据。
这些凭据因您配置插件的方式而异。例如,如果您使用基本身份验证,则凭据是用户名和密码。如果您使用 JSON Web 令牌,则凭据存储在令牌本身中。如果您使用 TLS 证书,则凭据是证书的专有名称 (DN)。
-
安全插件针对后端验证用户的凭据:内部用户数据库、轻量级目录访问协议 (LDAP)、Active Directory、Kerberos 或 JSON Web 令牌。
该插件支持在 config/opensearch-security/config.yml 中链接后端。如果存在多个后端,插件会尝试按顺序对用户进行身份验证,直到一个成功。一个常见的用例是将安全插件的内部用户数据库与 LDAP/Active Directory 结合起来。
-
在后端验证用户的凭据后,插件会收集所有后端角色。这些角色可以是内部用户数据库中的任意字符串,但在大多数情况下,这些后端角色来自 LDAP/Active Directory。
-
在用户通过身份验证并检索到任何后端角色后,安全插件使用角色映射将安全角色分配给用户。
如果角色映射不包括用户(或用户的后端角色),则用户已成功通过身份验证,但没有权限。
-
用户现在可以执行映射的安全角色定义的操作。例如,用户可能映射到 kibana_user 角色,因此有权访问 OpenSearch Dashboards。
4.3 更改密码
官方文档:https://opensearch.org/docs/latest/security-plugin/configuration/security-admin/
默认集群的用户名和密码都为admin:admin或者kibanaserver:kibanaserver,在生产环境中我们需要修改为复杂密码。
所有的安全插件的配置,包括用户,角色和权限都存在OpenSearch集群中叫.opendistro_security
的index中。把这些配置都放在index中可以保证我们改变配置之后不需要重启集群并且防止我们在每个节点上重复修改配置。
想要初始化.opendistro_security
index,我们就需要运行plugins/opensearch-security/tools/securityadmin.sh
命令,这个脚本会加载我们的初始化配置到index当中,初始化配置文件在plugins/opensearch-security/securityconfig
当中。.opendistro_security
index初始化完毕,就可以使用OpenSearch-Dashboard或者使用REST API来管理用户,角色和权限。
用户密码配置文件在/data/opensearch/opensearch/plugins/opensearch-security/securityconfig/internal_users.yml
中定义,密码以加密后的形式配置在配置文件中。
-
生成admin用户和kibanaserver用户的hash密码
export OPENSEARCH_JAVA_HOME=/data/opensearch/opensearch/jdk chmod +x /data/opensearch/opensearch/plugins/opensearch-security/tools/hash.sh /data/opensearch/opensearch/plugins/opensearch-security/tools/hash.sh -p 密码
-
备份配置文件
cp /data/opensearch/opensearch/plugins/opensearch-security/securityconfig/internal_users.yml{,`date +%F`}
-
修改密码
vim /data/opensearch/opensearch/plugins/opensearch-security/securityconfig/internal_users.yml --- # This is the internal user database # The hash value is a bcrypt hash and can be generated with plugin/tools/hash.sh _meta: type: "internalusers" config_version: 2 # Define your internal users here ## Demo users admin: hash: "$2y$12$5hAjKteNJA$nubfcTFWsFpJRrpJqJ.7u9cJ3wwaRKyzv9LssaePah" reserved: true backend_roles: - "admin" description: "Demo admin user" kibanaserver: hash: "$2y$12$4V/icsAW4DAt/9ntT3vQN7VJhpNhLbjVihmj9YuZdbztJsEAnqLEu" reserved: true description: "Demo OpenSearch Dashboards user" #kibanaro: # hash: "$2a$12$JJSXNfTowz7Uu5ttXfeYpeYE0arACvcwlPBStB1F.MI7f0U9Z4DGC" # reserved: false # backend_roles: # - "kibanauser" # - "readall" # attributes: # attribute1: "value1" # attribute2: "value2" # attribute3: "value3" # description: "Demo OpenSearch Dashboards read only user" # #logstash: # hash: "$2a$12$u1ShR4l4uBS3Uv59Pa2y5.1uQuZBrZtmNfqB3iM/.jL0XoV9sghS2" # reserved: false # backend_roles: # - "logstash" # description: "Demo logstash user" # #readall: # hash: "$2a$12$ae4ycwzwvLtZxwZ82RmiEunBbIPiAmGZduBAjKN0TXdwQFtCwARz2" # reserved: false # backend_roles: # - "readall" # description: "Demo readall user" # #snapshotrestore: # hash: "$2y$12$DpwmetHKwgYnorbgdvORCenv4NAK8cPUg8AI6pxLCuWf/ALc0.v7W" # reserved: false # backend_roles: # - "snapshotrestore" # description: "Demo snapshotrestore user"
-
应用配置
export OPENSEARCH_JAVA_HOME=/data/opensearch/opensearch/jdk chmod +x /data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh /data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh \ -f /data/opensearch/opensearch/plugins/opensearch-security/securityconfig/internal_users.yml \ -t internalusers \ -icl \ -nhnv \ -cacert /data/opensearch/opensearch/config/certs/root-ca.pem \ -cert /data/opensearch/opensearch/config/certs/admin.pem \ -key /data/opensearch/opensearch/config/certs/admin-key.pem \ -h 10.0.0.3
-f
: 如果使用-f
参数而不是-cd
,则可以将单个 YAML 文件加载到索引中,而不是将 YAML 文件的整个目录加载到索引中。-cd
: 该选项指定可以找到安全插件配置文件的位置。例:-cd ../../../config/opensearch-security/
-t
: 文件类型。文件类型必须是如下类型之一:- config
- roles
- rolesmapping
- internalusers
- actiongroups
- (
-icl
)--ignore-clustername
: 选项告诉安全插件上传配置而不考虑集群名称。作为替代方案,您还可以使用-cn
(--clustername
) 选项指定集群名称。 -nhnv
: 因为演示证书是自签名的,所以此命令使用-nhnv
(--disable-host-name-verification
) 选项禁用主机名验证。-cacert
: 选项定义您的根 CA 证书、-cert
管理员证书的位置-key
管理员证书的私钥的位置。如果私钥有密码,请使用-keypass
选项指定它。-h
: OpenSearch 主机名。默认为localhost
。
-
验证
登出OpenSearch-Dashboard用新密码登录验证。
-
更新OpenSearch-Dashboard配置文件中的kibanaserver密码。
vim /data/opensearch-dashboards/opensearch-dashboards/config/opensearch_dashboards.yml --- opensearch.hosts: - "https://opensearch-node1:9200" - "https://opensearch-node2:9200" - "https://opensearch-node3:9200" opensearch.ssl.verificationMode: certificate opensearch.username: kibanaserver opensearch.password: 更改后的明文密码 opensearch.requestHeadersWhitelist: [authorization, securitytenant] opensearch.ssl.certificateAuthorities: [ "/data/opensearch-dashboards/opensearch-dashboards/config/certs/root-ca.pem" ] opensearch_security.multitenancy.enabled: true opensearch_security.multitenancy.tenants.enable_global: true opensearch_security.multitenancy.tenants.enable_private: true opensearch_security.multitenancy.tenants.preferred: [Private, Global] opensearch_security.multitenancy.enable_filter: false opensearch_security.readonly_mode.roles: [kibana_read_only] opensearch_security.cookie.secure: false path.data: /data/opensearch-dashboards/data server.host: "0.0.0.0" server.port: 5601 server.ssl.enabled: false logging.dest: /data/opensearch-dashboards/logs/opensearch-dashboards.log
-
重启OpenSearch-Dashboard,以加载新密码
systemctl restart opensearch-dashboards
4.4 AD认证
4.4.1 准备工作
使用ldapsearch命令验证LDAP是否可以正常联通
apt -y install ldap-utils
ldapsearch -x -H ldap://1.1.1.1:389 -b ou=xxxx,dc=xxxx -D "uid=xxxx,dc=xxxx" -w xxxx
如果对ldap认证进行了证书认证,需要我们把证书导入linux系统才能使用ldapsearch命令
# 把证书放到/etc/pki/ca-trust/source/anchors下,然后执行
update-ca-trust
4.4.2 配置
身份验证和授权后端的主要配置文件是config/opensearch-security/config.yml
. 它定义了安全插件如何检索用户凭据、如何验证这些凭据以及如何从后端系统获取其他角色(可选)。
config.yml
有三个主要部分:
opensearch_security:
dynamic:
http:
...
authc:
...
authz:
...
http: 匿名身份验证
authc: 该部分中的条目
authc
称为身份验证域。它指定从哪里获取用户凭据以及他们应该针对哪个后端进行身份验证。authz: 授权
要启用 LDAP 身份验证,请修改config/opensearch-security/config.yml
中authc的ladp部分
authc:
ldap:
description: "Authenticate via LDAP or Active Directory"
http_enabled: true
transport_enabled: false
order: 5
http_authenticator:
type: basic
challenge: false
authentication_backend:
# LDAP authentication backend (authenticate users against a LDAP or Active Directory)
type: ldap
config:
# enable ldaps
enable_ssl: false
# enable start tls, enable_ssl should be false
enable_start_tls: false
# send client certificate
enable_ssl_client_auth: false
# verify ldap hostname
verify_hostnames: false
hosts:
- 1.1.1.1:389
bind_dn: "uid=xxxx,dc=xxxx"
password: "xxxx"
userbase: "ou=xxxx,dc=xxxx"
# Filter to search for users (currently in the whole subtree beneath userbase)
# {0} is substituted with the username
usersearch: "(cn={0})"
# Use this attribute from the user as username (if not set then DN is used)
username_attribute: "cn"
http_enabled:
order: 认证顺序,这里写5表示第5个来这里认证。
verify_hostnames: 是否验证服务器的 TLS 证书的主机名。
hosts: 配置LDAP服务器的地址和端口。
bind_dn: 配置安全插件在向服务器发出查询时使用的
bind_dn
。password: 配置安全插件在向服务器发出查询时使用的
password。
userbase: 指定存储用户信息的目录中的子树。
usersearch: 尝试对用户进行身份验证时,安全插件执行的实际 LDAP 查询。变量 {0} 替换为用户名。
username_attribute: 安全插件使用目录条目的这个属性来查找用户名。如果设置为 null,则使用 DN(默认)。
生效配置
-
备份配置文件
export OPENSEARCH_JAVA_HOME=/data/opensearch/opensearch/jdk chmod +x /data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh /data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh \ -backup /data/opensearch/backup \ -icl \ -nhnv \ -cacert /data/opensearch/opensearch/config/certs/root-ca.pem \ -cert /data/opensearch/opensearch/config/certs/admin.pem \ -key /data/opensearch/opensearch/config/certs/admin-key.pem
-
加载config.yml配置文件
/data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh \ -f /data/opensearch/opensearch/plugins/opensearch-security/securityconfig/config.yml \ -t config \ -icl \ -nhnv \ -cacert /data/opensearch/opensearch/config/certs/root-ca.pem \ -cert /data/opensearch/opensearch/config/certs/admin.pem \ -key /data/opensearch/opensearch/config/certs/admin-key.pem \ -h 10.0.0.3
-
验证
使用LDAP用户登录OpenSearch-Dashboard验证是否可以成功登录。
4.5 访问控制
4.5.1 用户和角色
4.5.1.1 将用户映射到角色
接入LDAP后,默认所有用户都是普通用户的角色,我们需要对用户映射角色。
可以使用 OpenSearch Dashboards、roles_mapping.yml 或 REST API 创建角色映射。
-
OpenSearch-Dashboard
- 选择Secutiry,Roles,and a role.
- 选择Mapped users选项卡和Manage mapping.
- 指定用户或外部身份(也称为后端角色)
- 选择Map
-
roles_mapping.yml
请参阅YAML files.
-
REST API
请参阅创建角色映射。
这里我们选择使用roles_mapping.yaml进行用户角色的映射
角色映射的配置文件为config/opensearch-security/roles_mapping.yml
---
# In this file users, backendroles and hosts can be mapped to Security roles.
# Permissions for OpenSearch roles are configured in roles.yml
_meta:
type: "rolesmapping"
config_version: 2
# Define your roles mapping here
## Demo roles mapping
all_access:
reserved: false
backend_roles:
- "admin"
users:
- "san.zhang"
- "si.li"
description: "Maps admin to all_access"
own_index:
reserved: false
users:
- "*"
description: "Allow full access to an index named like the username"
logstash:
reserved: false
backend_roles:
- "logstash"
users:
- "fluentd"
kibana_user:
reserved: false
backend_roles:
- "kibanauser"
description: "Maps kibanauser to kibana_user"
readall:
reserved: false
backend_roles:
- "readall"
users:
- "*"
manage_snapshots:
reserved: false
backend_roles:
- "snapshotrestore"
kibana_server:
reserved: true
users:
- "kibanaserver"
生效配置:
-
备份
export OPENSEARCH_JAVA_HOME=/data/opensearch/opensearch/jdk chmod +x /data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh /data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh \ -backup /data/opensearch/backup \ -icl \ -nhnv \ -cacert /data/opensearch/opensearch/config/certs/root-ca.pem \ -cert /data/opensearch/opensearch/config/certs/admin.pem \ -key /data/opensearch/opensearch/config/certs/admin-key.pem
-
加载roles_mapping.yml配置文件
/data/opensearch/opensearch/plugins/opensearch-security/tools/securityadmin.sh \ -f /data/opensearch/opensearch/plugins/opensearch-security/securityconfig/roles_mapping.yml \ -t rolesmapping \ -icl \ -nhnv \ -cacert /data/opensearch/opensearch/config/certs/root-ca.pem \ -cert /data/opensearch/opensearch/config/certs/admin.pem \ -key /data/opensearch/opensearch/config/certs/admin-key.pem \ -h 10.0.0.3
-
验证
使用映射后的LDAP用户重新登录OpenSearch-Dashboard以验证权限是否生效。
本文章参考https://cloudnative365.github.io/keynotes_L4_architect_3_logging_11_opensearch_in_production.html
更多推荐
所有评论(0)