Elasticsearch表达式
使用脚本,可以在Elasticsearch中评估自定义表达式。
例如可以使用脚本来返回“脚本字段”作为搜索请求的一部分,或评估查询的自定义分数。
“painless”为默认的脚本语言。painless、expression为Elasticsearch内置支持。
在Elasticsearch API中使用脚本都遵循相同的格式:
"script": {
# 指定脚本表达式的语言
"lang": "painless|expression|groovy|javascript|mustach|python|java",
# 加载脚本的方式:source源码,id已经存在的脚本,file存储在文件中的脚本
"source" | "id" | "file": ".....",
"params": { ..... }
}
painless和expression是默认内置的脚本表达式。painless是默认的脚本语言。查询示例:
curl -XGET localhost:9200/shakespeare/_search?pretty -d'
{
"script_fields": {
"my_field": {
"script": {
"lang": "painless",
"source": "doc.line_id.value * params.value",
"params": {
"value": 2
}
}
}
}
}'
已存储的脚本
使用_scripts RestAPI将脚本存储在集群中或者使用已经存储在集群中的脚本。
创建存储脚本
$ curl -XPOST localhost:9200/_scripts/my_score?pretty -d'
{
"script": {
"lang": "painless",
"source": "doc.line_id.value * params.value"
}
}'
$ curl -XGET localhost:9200/_scripts/my_score?pretty
$ curl -XGET localhost:9200/shakespeare/_search?pretty -d'
{
"script_fields": {
"my_field": {
"script": {
"id": "my_score",
"params": {
"value": 2
}
}
}
}
}'
删除存储脚本
$ curl -XDELETE localhost:9200/_scripts/calculate-score?pretty
- 默认情况下,所有脚本都是被缓存的,因此仅在更新时才需要重新编译它们,它没有过期时间。script.cache.expire
- 默认情况下,脚本没有超时期限,但是可以使用 script.cache.expire 设置更改此行为
- 默认情况下,脚本缓存大小为100。可以使用 script.cache.max_size 设置配置此缓存的大小。
脚本引擎
ScriptEngine是用于实现脚本语言的后端。它也可以用于编写需要使用脚本内部高级功能的脚本。例如,一个脚本希望在评分时使用词频。需要实现ScriptEngine,同时应实现ScriptPlugin接口并覆盖getScriptEngine方法。
Elasticsearch插件
Elastic SQL插件
Elasticsearch SQL是一个X-Pack组件,它允许针对Elasticsearch实时执行类似SQL的查询。无论使用REST接口,命令行还是JDBC,任何客户端都可以使用SQ搜索或聚合数据。可以将Elasticsearch SQL看作是一种翻译器,它可以将SQL解释成Elasticsearch可以理解的查询语言,并利用Elasticsearch完成大规模读取和处理数据。
安装插件
$ ./elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/5.6.16.0/elasticsearch-sql-5.6.16.0.zip
使用插件
6.2及以上版本,Elastic SQL被集成到X-Pack中。
$ curl -XGET -u elastic:abcd_123 localhost:9200/_xpack/_sql -d'
{
"query":"select * from shakespeare"
}'
6.2以下,Elastic SQL需要单独安装。
$ curl -XGET -u elastic:abcd_123 localhost:9200/_sql \
-H'Content-Type:application/json' -d'select * from shakespeare'
$ curl -XGET -u elastic:abcd_123 localhost:9200/_sql/_explain \
-H'Content-Type:application/json' -d'select * from shakespeare'
X-Pack插件
X-Pack是一个Elastic Stack扩展,将安全性,警报,监控,报告,机器学习和图形功能捆绑到一个易于安装的软件包中。要使用X-Pack,必须在Elasticsearch中安装与Elasticsearch版本相匹配的X-Pack。如果在群集上首次安装X-Pack,则必须执行完整群集重新启动。安装X-Pack后,必须在群集中的所有节点上启用安全性和安全性才能使群集正常运行。
在线安装
$ ./elasticsearh-plugin install x-pack
离线安装
# 下载离线安装包
$ wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.6.16.zip
# 安装离线安装包
$ ./elasticsearh-plugin install file:///path/to/x-pack-5.6.16.zip
Elasticsearch,Kibana和Logstash的X-Pack插件包含在同一zip文件中。如果已经下载该文件,想在其他产品上安装X-Pack,可以重复使用该文件。
配置插件
1. 安全设置
配置xpack.security可以进行启用匿名访问和执行查询的身份验证,设置文档和字段级安全性,配置领域以及使用SSL加密通信等设置。
属性 | 作用描述 |
---|---|
xpack.security.enabled | 设置为true(默认值)在节点上启用X-Pack安全设置 |
xpack.security.authc.accept_default_password | 设置为false可禁用对默认密码“ changeme”的支持 |
xpack.security.authc.anonymous.username | 匿名用户的用户名。默认为_es_anonymous_user |
xpack.security.authc.anonymous.roles | 与匿名用户关联的角色。必须 |
xpack.security.authc.anonymous.authz_exception | 设置为true,如果匿名用户没有适当权限返回HTTP 403。设置为false时,将返回HTTP 401。默认为true |
xpack.security.dls_fls.enabled | 设置为false表示阻止文档和字段级别的访问控制。默认是true |
xpack.security.authc.token.enabled | 设置为false表示禁用token服务。默认true |
xpack.security.authc.token.passphrase | 每个节点上必须相同且长度超过8个字符的密码短语。该密码短语用于导出加密密钥,使用该密钥将对令牌进行加密和认证 |
xpack.security.authc.token.timeout | 令牌有效的时间。默认值为20m。最大值为1小时 |
2.审核设置
属性 | 作用描述 |
---|---|
xpack.security.audit.enabled | 设置为true在节点上启用审核。默认值为false |
xpack.security.audit.outputs | 指定输出审核日志的位置。例如:[索引,日志文件]。缺省值为logfile,审核事件会放入节点上专用的 |
xpack.security.audit.logfile.events.include | 指定要包含在审核输出中的事件。默认值为:access_denied,access_granted,anonymous_access_denied,authentication_failed,connection_denied,tampered_request,run_as_denied,run_as_granted |
xpack.security.audit.logfile.events.exclude | 从输出中排除指定的事件。默认不排除任何事件 |
xpack.security.audit.logfile.events.emit_request_body | 是否在某些事件类型上(如authentication_failed)包括REST请求的Body。默认值为false |
xpack.security.audit.index.bulk_size | 将多个审核事件分配到一个写入中。默认值为1000 |
xpack.security.audit.index.flush_interval | 被缓冲的事件刷新到索引的频率。默认值为1s |
xpack.security.audit.index.rollover | 控制滚动索引的频率:小时,天,周或月。默认值为日 |
xpack.security.audit.index.events.include | 指定要增加索引的审计事件。默认值是anonymous_access_denied,authentication_failed,realm_authentication_failed,access_granted,access_denied,tampered_request,connection_granted,connection_denied,run_as_granted,run_as_denied |
xpack.security.audit.index.events.exclude | 从索引中排除指定的审核事件。默认不排除任何事件 |
xpack.security.audit.index.events.emit_request_body | 是否在某些事件类型上(如authentication_failed)包括REST请求的主体。默认值为false。 |
xpack.security.audit.index.settings | 用于存储事件的索引的设置。如:将审计索引的分片和副本数设置为1。 |
3.监控设置
默认情况下,X-Pack监控被启用,但是数据收集被禁用,高级监控设置使你能够控制收集数据的频率、配置超时以及为本地存储的监控索引设置保留期,还可以调整监控数据的显示方式。
属性 | 作用描述 |
---|---|
xpack.monitoring.enabled | 设置为false可禁用Elasticsearch对节点上的监控 |
xpack.monitoring.collection.cluster.state.timeout | 收集集群状态的超时时间。默认为10秒 |
xpack.monitoring.collection.cluster.stats.timeout | 收集集群统计信息的超时时间。默认为10秒。 |
xpack.monitoring.collection.indices | 设定监控从哪个索引收集数据。默认为所有索引。多个索引以逗号分隔,如:test1,test2,test3;可以使用通配符,如:test ;可以在索引名前面加上+表示包括某个索引,或在索引名之前加上-表示排除某个索引,如:+test,-test3。 |
xpack.monitoring.collection.index.stats.timeout | 收集索引统计信息的超时时间。默认为10秒。 |
xpack.monitoring.collection.index.recovery.active_only | 控制是否收集所有恢复。设置为true仅收集活动的恢复。默认为false。 |
xpack.monitoring.collection.index.recovery.timeout | 收集恢复信息的超时时间。默认为10秒。 |
xpack.monitoring.collection.interval | 控制收集数据的频率。默认为10秒。如果修改收集间隔,也需要将kibana.yml中的xpack.monitoring.min_interval_seconds选项设为相同的值。设置为-1可暂时禁用数据收集。 |
xpack.monitoring.history.duration | 收集的数据保留期限,超过该期限将自动删除。默认为7天。 |
xpack.monitoring.exporters | |
配置存储监视数据的代理。默认情况下,代理使用本地导出程序,该导出程序在本地群集上的建立数据索引。使用HTTP导出器将数据发送到单独的监视集群。 |
使用插件
安装X-Pack后,插件提供了三个默认账户:
- elastic/changeme
- kibana/changeme
- logstash/changeme
$ curl -XGET -u elastic:changeme localhost:9200/_xpack/license?pretty
$ curl -XGET -u kibana:changeme localhost:9200/_xpack/license?pretty
$ curl -XGET -u logstash_system:changeme localhost:9200/_xpack/license?pretty
用户管理
# 创建用户
$ curl -XPOST -u elastic:abcd_123 localhost:9200/_xpack/security/user/yunxi -d'
{
"password": "abcd_123",
"roles": ["admin", "other_role1"],
"full_name": "yunxi",
"email": "[email protected]"
}'
# 查看用户
$ curl -XGET -u elastic:abcd_123 localhost:9200/_xpack/security/user?pretty
# 禁用用户
$ curl -XPOST -u elastic:abcd_123 localhost:9200/_xpack/security/user/yunxi/_disabled
# 启用用户
$ curl -XPOST -u elastic:abcd_123 localhost:9200/_xpack/security/user/yunxi/_enabled
# 删除用户
$ curl -XDELETE -u elastic:abcd_123 localhost:9200/_xpack/security/user/yunxi
- password 用户密码,最少6个字符。必填。
- roles 用户所属的一组角色。必填。
- full_name
- metadata 用户元数据。
角色管理
使用角色映射API,可以添加,删除和检索角色映射。要使用此API,必须至少拥有manage_security权限。
# 创建角色
$ curl -XPOST -u elastic:changeme localhost:9200/_xpack/security/role/my_role -d'
{
"cluster": ["all"],
"indices": [{
"names": [ "news", "blog" ],
"privileges": ["all"],
"field_security" : {
"grant" : [ "title", "body" ]
},
"query": "{\"match\": {\"title\": \"foo\"} }"
}],
"run_as": [ "other_user" ],
"metadata" : {
"version" : 1
}
}'
# 查看角色
$ curl -XGET -u elastic:abcd_123 localhost:9200/_xpack/security/role?pretty
$ curl -XGET -u elastic:abcd_123 localhost:9200/_xpack/security/role/my_role,ingest_admin?pretty
$ curl -XGET -u elastic:abcd_123 localhost:9200/_xpack/security/role?pretty
权限管理
has_privileges可以确定登录的用户具有的特权列表。所有用户都可以使用此API,但只能查看自己的特权。
curl -XPOST -u elastic:abcd_123 localhost:9200/_xpack/security/role_mapping/administrator -d '
{
"roles": ["user", "admin"],
"enabled": true,
"rules": {
"field": { "username": ["admin01", "admin02"] }
}
}'
$ curl -XGET -u elastic:abcd_123 localhost:9200/_xpack/security/role_mapping/administrator?pretty
$ curl -XGET -u elastic:abcd_123 localhost:9200/_xpack/security/role_mapping?pretty
集群权限
属性 | 作用描述 |
---|---|
all | 所有集群管理操作,如快照,节点关闭/重新启动,设置更新,重新路由或管理用户和角色 |
monitor | 所有集群只读操作,如集群运行状况,热线程,节点信息,节点和集群统计信息,快照/恢复状态,等待集群任务 |
monitor_ml | 所有只读机器学习操作,例如获取有关数据传输,作业,模型快照或结果的信息 |
monitor_watcher | 所有只读操作,例如获取watch和watcher统计信息 |
manage | 构建monitor并添加更改集群中值的集群操作。这包括快照,更新设置和重新路由。此特权不包括管理安全性的能力 |
manage_index_templates | 索引模板上的所有操作 |
manage_ml | 所有机器学习操作,例如创建和删除数据传输,作业和模型快照。数据处理以具有提升特权的系统用户身份运行,包括读取所有索引的权限 |
manage_pipeline | 摄取管道的所有操作 |
manage_security | 所有与安全相关的操作,例如对用户和角色的CRUD操作以及缓存清除 |
manage_watcher | 所有观察者操作,例如放置watches,执行,激活或确认。Watches作为具有提升特权的系统用户运行,包括读取和写入所有索引的权限。Watches作为具有提升特权的系统用户运行,包括读取和写入所有索引的权限 |
transport_client | |
传输客户端连接所需的所有权限。远程群集需要启用跨级群搜索 |
索引权限
属性 | 作用描述 |
---|---|
all | 索引上的所有操作 |
monitor | 监控所有操作(恢复,细分信息,索引统计信息和状态) |
manage | 所有monitor权限加索引管理(别名,分析,缓存清除,关闭,删除,存在,刷新,映射,打开,强制合并,刷新,设置,搜索分片,模板,验证) |
view_index_metadata | 对索引元数据(别名,别名存在,获取索引,存在,字段映射,映射,搜索分片,类型存在,验证,warmers,设置)进行只读访问。此权限主要供Kibana用户使用 |
read | 只读操作(计数,解释,获取,mget,获取索引脚本,更多像这样,多渗透/搜索/ termvector,渗透,滚动,clear_scroll,搜索,建议,tv) |
read_cross_cluster | 对来自远程集群的搜索操作提供只读访问 |
index | 索引和更新文件。还授予对更新映射操作的访问权限 |
create | 索引文件。还授予对更新映射操作的访问权限 |
delete | 删除文件 |
write | 对文档执行所有写入操作的权限,包括索引,更新和删除文档以及执行批量操作的权限。还授予对更新映射操作的访问权限 |
delete_index | 删除索引 |
create_index | 创建索引。创建索引请求可能包含在创建索引时添加到索引的别名。在这种情况下,该请求最好有manage权限,同时设置索引和别名 |
字段和文档级安全
可以通过向角色添加字段和文档级别的安全权限来控制对索引内数据的访问。字段级别的安全权限将限制对文档中特定字段的访问。文档级安全权限限制了对索引中特定文档的访问。角色可以基于每个索引的字段和文档级别设定权限,未指定字段级别权限的角色将授予对所有字段的访问权限。同样,不指定文档级别权限的角色将授予对索引中所有文档的访问权限。
"indices": [{
"names": [ "news-*" ],
"privileges": [ "read" ],
"field_security" : {
"grant" : [ "title", "@timestamp", "body" ]
}
}]
"indices": [{
"names": [ "*" ],
"privileges": [ "read" ],
"field_security" : {
"grant" : [ "title-*" ]
}
}]
"indices": [{
"names": [ "*" ],
"privileges": [ "read" ],
"field_security" : {
"grant" : [ "*" ],
"except": [ "news.*" ]
}
}]