目录
配置文件
配置文件位置
配置文件格式
环境变量替代
群集和节点设置类型
设置JVM选项
安全设置
可重新加载的安全设置
审核安全设置
一般审核设置
审核事件设置
本地节点信息设置
审核日志文件事件忽略策略
配置文件
Elasticsearch提供了良好的默认值,只需要很少的配置。大多数设置都可以使用集群更新设置API在正在运行的集群上更改。
配置文件应包含特定于节点的设置(如node.name和path),或节点加入群集所需的设置,如cluster.name和network.host。
配置文件位置
Elasticsearch有三个配置文件:
- elasticsearch.yml 用于配置Elasticsearch
- jvm.options 用于配置Elasticsearch JVM设置
- log4j2.properties 用于配置Elasticsearch日志
这些文件位于config目录中,其默认位置取决于安装是否来自压缩文件(tar.gz或zip)或包发行版(Debian或RPM包)。
对于压缩文件,config目录位置默认为$ES_HOME/config。config目录的位置可以通过ES_PATH_CONF环境变量更改,如下所示:
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch
或者,可以通过命令行或shell概要文件导出ES_PATH_CONF环境变量。
对于包发行版,config目录位置默认为/etc/elasticsearch。config目录的位置也可以通过ES_PATH_CONF环境变量进行更改,但是请注意,在shell中设置这个它是不行的。相反,这个变量来自/etc/default/elasticsearch(对于Debian包)和/etc/sysconfig/elasticsearch(对于RPM包)。我们需要相应地编辑其中一个文件中的ES_PATH_CONF=/etc/elasticsearch条目来更改配置目录位置。
配置文件格式
配置格式为YAML。以下是改变 数据和日志目录路径的示例:
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
设置也可以按如下方式展开:
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
在YAML中,可以将非标量值格式化为序列:
discovery.seed_hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
虽然不太常见,但也可以将非标量值格式化为数组:
discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11", "seeds.mydomain.com"]
环境变量替代
配置文件中用${…}符号引用的环境变量将替换为环境变量的值。例如:
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}
环境变量的值必须是简单字符串。使用逗号分隔的字符串提供Elasticsearch将解析为列表的值。例如,Elasticsearch将以下字符串拆分为${HOSTNAME}环境变量的值列表:
export HOSTNAME=“host1,host2"
群集和节点设置类型
群集和节点设置可以根据配置方式进行分类:
动态:
我们可以使用集群更新设置 API在正在运行的集群上配置和更新动态设置。我们还可以使用elasticsearch.yml在未启动或关闭的节点上本地配置动态设置。
使用集群更新设置API进行的更新可以是持久的,适用于集群重启,也可以是临时的,在集群重启后重置。我们还可以通过使用API分配它们一个null的值来重置临时或持久设置。
如果使用多个方法配置同一设置,Elasticsearch将按以下优先顺序应用设置:
1、临时设置
2、持久性设置
3、elasticsearch.yml设置
4、默认的设置
例如,我们可以使用临时设置来覆盖持久设置或elasticsearch.yml设置。但是,对elasticsearch.yml设置的更改不会覆盖已定义的临时或持久设置。
最好使用集群更新设置 API设置集群范围的动态设置,并仅对本地配置使用elasticsearch.yml。使用集群更新设置API可确保所有节点上的设置相同。如果我们不小心在elasticsearch.yml的不同节点上配置了不同的设置,可能很难注意到差异。
静态:
只能使用elasticsearch.yml在未启动或关闭的节点上配置静态设置。
必须在群集中的每个相关节点上设置静态设置。
设置JVM选项
我们应该很少需要更改Java虚拟机(JVM)选项。Elasticsearch包含默认的JVM选项,适用于大多数生产环境。如果需要,可以使用jvm.options文件或ES_JAVA_OPTS环境变量覆盖这些默认选项。
设置或覆盖JVM选项的首选方法是通过JVM选项文件。从tar或zip发行版安装时,根jvm.options配置文件为config/jvm.options,可以将自定义jvm options文件添加到config/jvm.options.d/。
从Debian或RPM软件包安装时,根jvm.options配置文件是/etc/elasticsearch/jvm.options,自定义的jvm选项文件可以添加到/etc/elasticsearch/jvm.options.d/。
使用Elasticsearch的Docker发行版时,可以将自定义JVM选项文件绑定到/usr/share/Elasticsearch/config/JVM.options.d/中。我们不应该需要修改根jvm.options文件,而应该使用自定义jvm选项文件。自定义JVM选项的处理顺序是字典式的。
JVM选项文件必须具有后缀.options,并包含一个以行分隔的JVM参数列表,该列表遵循特殊语法:
- 只包含空格的行将被忽略
- 以#开头的行被视为注释,将被忽略
# this is a comment
- 以-开头的行被视为独立于JVM版本应用的JVM选项
-Xmx2g
- 以数字开头,后跟:和-的行被视为JVM选项,仅当JVM的版本与该数字匹配时才适用
8:-Xmx2g
- 以数字开头,后跟一个 - 和后跟一个 : 的行被视为JVM选项,仅当JVM的版本大于或等于该数字时才适用
8-:-Xmx2g
- 以数字后跟一个-后跟数字后跟 :开头的行被视为JVM选项,仅当JVM的版本在这两个数字的范围内时才适用
8-9:-Xmx2g
- 拒绝所有其他行
设置Java虚拟机选项的另一种机制是通过ES_Java_OPTS环境变量。例如:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch
当使用RPM或Debian包时,可以在系统配置文件中指定ES_JAVA_OPTS。
JVM有一个内置的机制来观察JAVA_TOOL_OPTIONS环境变量。我们故意在打包脚本中忽略这个环境变量。主要原因是,在某些操作系统(如Ubuntu)上,默认情况下通过此环境变量安装了代理,我们不希望干扰Elasticsearch。
此外,其他一些Java程序支持Java_OPTS环境变量。这不是JVM中内置的机制,而是生态系统中的约定。但是,我们不支持此环境变量,而是支持通过JVM.options文件或如上所述的环境变量ES_ JAVA_OPTS设置JVM选项。
安全设置
有些设置是敏感的,仅仅依靠文件系统权限来保护它们的值是不够的。对于这个用例,Elasticsearch提供了一个keystore和elasticsearch-keystore tool来管理keystore中的设置。
只有一些设置被设计为从密钥库中读取。但是,密钥库没有阻止不支持的设置的验证。将不支持的设置添加到密钥库会导致Elasticsearch无法启动。要查看keystore中是否支持设置,请在设置引用中查找“Secure”限定符。
对密钥库的所有修改只有在重新启动Elasticsearch后才生效。
这些设置,就像elasticsearch.yml配置文件中的常规设置一样,需要在集群中的每个节点上指定。当前,所有安全设置都是特定于节点的设置,每个节点上的值必须相同。
可重新加载的安全设置
就像elasticsearch.yml中的设置值一样,对密钥库内容的更改不会自动应用于正在运行的elasticsearch节点。重新读取设置需要重新启动节点。但是,某些安全设置被标记为可重新加载。这些设置可以重新读取并应用于正在运行的节点。
所有安全设置的值(无论是否可重新加载)在所有群集节点上都必须相同。更改所需的安全设置后,使用bin/elasticsearch keystore add命令调用:
POST _nodes/reload_secure_settings
{
"secure_settings_password": "keystore-password"
}
这个密码是Elasticsearch密钥库加密使用的密码。
这个API解密并重新读取每个集群节点上的整个密钥库,但只应用可重新加载的安全设置。对其他设置的更改在下次重新启动之前不会生效。一旦调用返回,重新加载就完成了,这意味着依赖于这些设置的所有内部数据结构都已更改。一切都应该看起来好像设置从一开始就有了新的值。
更改多个可重新加载的安全设置时,请修改每个群集节点上的所有设置,然后在每次修改后发出一个 reload_secure_settings 调用,而不是每次修改后重新加载。
可重新加载的安全设置如下:
- The Azure repository plugin
- The EC2 discovery plugin
- The GCS repository plugin
- The S3 repository plugin
- Monitoring settings
- Watcher settings
审核安全设置
我们可以使用审核日志记录与安全相关的事件,例如身份验证失败、拒绝连接和数据访问事件。此外,还记录通过API对安全配置的更改,例如创建、更新和删除本机和内置用户、角色、角色映射和API密钥。
审核日志仅在某些订阅级别上可用。有关详细信息,请参阅https://www.elastic.co/subscriptions.
一般审核设置
xpack.security.audit.enabled
(静态)设置为true以在节点上启用审核。默认值为false。这会将审核事件放在每个节点上名为<clustername>_audit.json的专用文件中。
如果启用,则必须在群集中所有节点的elasticsearch.yml中配置此设置。
审核事件设置
可以使用以下设置来控制事件和有关记录内容的其他信息:
xpack.security.audit.logfile.events.include
(动态)指定要在审核输出中打印的事件类型。此外,可以使用_all彻底地审核所有事件,但这通常是不鼓励的,因为它会变得非常冗长。默认列表值包含:access_denied, access_granted, anonymous_access_denied, authentication_failed, connection_denied, tampered_request, run_as_denied, run_as_granted, security_config_change
xpack.security.audit.logfile.events.exclude
(动态)从包含列表中排除指定类型的事件。这在events.include设置包含特殊值_all的情况下非常有用。默认值为空列表。
xpack.security.audit.logfile.events.emit_request_body
(Dynamic)指定是否将REST请求的完整请求体作为某些类型的审核事件的属性。此设置可用于审核搜索查询。
默认值为false,因此不打印请求正文。
请注意,在审核事件中包含请求主体时,敏感数据可以纯文本形式进行审核,即使所有的安全api,比如那些更改用户密码的api,在审核时都会过滤掉凭据。
本地节点信息设置
xpack.security.audit.logfile.emit_node_name
(动态)指定是否将节点名称作为字段包含在每个审核事件中。默认值为false
xpack.security.audit.logfile.emit_node_host_address
(动态)指定是否将节点的IP地址作为字段包含在每个审核事件中。默认值为false。
xpack.security.audit.logfile.emit_node_host_name
(动态)指定是否将节点的主机名作为字段包含在每个审核事件中。默认值为false。
xpack.security.audit.logfile.emit_node_id
(动态)指定是否将节点id作为字段包含在每个审核事件中。与node name不同,如果管理员更改配置文件中的设置,node name的值可能会更改,而node id将在集群重新启动时保持不变,管理员无法更改它。默认值为true。
审核日志文件事件忽略策略
以下设置会影响启用细粒度控制的忽略策略,这些策略可以控制哪些审核事件打印到日志文件。具有相同策略名称的所有设置组合在一起形成一个策略。如果某个事件符合任何策略的所有条件,则忽略该事件而不打印。大多数审核事件都受忽略策略的约束。唯一的例外是security_config_change类型的事件,除非完全排除,否则无法将其过滤掉。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.users
(动态)用户名或通配符的列表。指定的策略不会打印与这些值匹配的用户的审核事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.realms
(动态)身份验证领域名称或通配符的列表。指定的策略不会为这些领域中的用户打印审核事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.roles
(动态)角色名或通配符的列表。指定的策略不会为具有这些角色的用户打印审核事件。如果用户有多个角色,其中一些角色不在策略范围内,则策略将不包括此事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.indices
(动态)索引名或通配符的列表。当事件中的所有索引与这些值匹配时,指定的策略将不打印审核事件。如果事件涉及多个索引,其中一些索引不在策略的范围内,则策略将不包括此事件。