使用 IP 过滤限制连接

编辑

您可以将 IP 过滤应用于应用程序客户端、节点客户端或传输客户端、远程集群客户端,以及尝试加入集群的其他节点。

如果节点的 IP 地址在拒绝列表中,Elasticsearch 安全功能允许连接到 Elasticsearch,但会立即断开连接,并且不会处理任何请求。

Elasticsearch 安装并非设计为可通过互联网公开访问。IP 过滤和 Elasticsearch 安全功能的其他功能不会改变这种情况。

启用 IP 过滤

编辑

Elasticsearch 安全功能包含一个访问控制功能,允许或拒绝主机、域或子网。如果启用了操作员权限功能,则只有操作员用户才能更新这些设置。

您可以通过在 elasticsearch.yml 中指定 xpack.security.transport.filter.allowxpack.security.transport.filter.deny 设置来配置 IP 过滤。允许规则优先于拒绝规则。

除非明确指定,否则 xpack.security.http.filter.*xpack.security.remote_cluster.filter.* 设置默认使用相应的 xpack.security.transport.filter.* 设置的值。

xpack.security.transport.filter.allow: "192.168.0.1"
xpack.security.transport.filter.deny: "192.168.0.0/24"

_all 关键字可用于拒绝所有未明确允许的连接。

xpack.security.transport.filter.allow: [ "192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4" ]
xpack.security.transport.filter.deny: _all

IP 过滤配置还支持 IPv6 地址。

xpack.security.transport.filter.allow: "2001:0db8:1234::/48"
xpack.security.transport.filter.deny: "1234:0db8:85a3:0000:0000:8a2e:0370:7334"

当 DNS 查找可用时,您还可以按主机名进行过滤。

xpack.security.transport.filter.allow: localhost
xpack.security.transport.filter.deny: '*.google.com'

禁用 IP 过滤

编辑

在某些情况下,禁用 IP 过滤可以略微提高性能。要完全禁用 IP 过滤,请将 elasticsearch.yml 配置文件中的 xpack.security.transport.filter.enabled 设置的值设置为 false

xpack.security.transport.filter.enabled: false

您还可以禁用传输协议的 IP 过滤,但仅为 HTTP 启用它。

xpack.security.transport.filter.enabled: false
xpack.security.http.filter.enabled: true

指定 TCP 传输配置文件

编辑

TCP 传输配置文件使 Elasticsearch 能够在多个主机上绑定。Elasticsearch 安全功能使您能够在不同的配置文件上应用不同的 IP 过滤。

xpack.security.transport.filter.allow: 172.16.0.0/24
xpack.security.transport.filter.deny: _all
transport.profiles.client.xpack.security.filter.allow: 192.168.0.0/24
transport.profiles.client.xpack.security.filter.deny: _all

如果您未指定配置文件,则会自动使用 default

HTTP 过滤

编辑

您可能希望为传输和 HTTP 协议使用不同的 IP 过滤。

xpack.security.transport.filter.allow: localhost
xpack.security.transport.filter.deny: '*.google.com'
xpack.security.http.filter.allow: 172.16.0.0/16
xpack.security.http.filter.deny: _all

远程集群(基于 API 密钥的模型)过滤

编辑

如果其他集群使用API 密钥身份验证进行跨集群搜索或跨集群复制,您可能希望为远程集群服务器接口使用不同的 IP 过滤。

xpack.security.remote_cluster.filter.allow: 192.168.1.0/8
xpack.security.remote_cluster.filter.deny: 192.168.0.0/16
xpack.security.transport.filter.allow: localhost
xpack.security.transport.filter.deny: '*.google.com'
xpack.security.http.filter.allow: 172.16.0.0/16
xpack.security.http.filter.deny: _all

是否启用远程集群的 IP 过滤也由 xpack.security.transport.filter.enabled 控制。这意味着必须同时启用或禁用远程集群和传输接口的过滤。但是,它们之间的确切允许和拒绝列表可以不同。

动态更新 IP 过滤设置

编辑

如果在诸如基于云的托管等具有高度动态 IP 地址的环境中运行,则在配置计算机时很难提前知道 IP 地址。您可以使用 _集群更新设置 API_,而不是更改配置文件并重新启动节点。例如

resp = client.cluster.put_settings(
    persistent={
        "xpack.security.transport.filter.allow": "172.16.0.0/24"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'xpack.security.transport.filter.allow' => '172.16.0.0/24'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "xpack.security.transport.filter.allow": "172.16.0.0/24",
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent" : {
    "xpack.security.transport.filter.allow" : "172.16.0.0/24"
  }
}

您还可以动态地完全禁用过滤

resp = client.cluster.put_settings(
    persistent={
        "xpack.security.transport.filter.enabled": False
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'xpack.security.transport.filter.enabled' => false
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "xpack.security.transport.filter.enabled": false,
  },
});
console.log(response);
PUT /_cluster/settings
{
  "persistent" : {
    "xpack.security.transport.filter.enabled" : false
  }
}

为了避免将自己锁定在集群之外,永远不会拒绝默认绑定的传输地址。这意味着您始终可以通过 SSH 进入系统并使用 curl 应用更改。