GeoIPプロセッサ
[](#geoip-automatic-updates)デフォルトでは、プロセッサは[MaxMind](http://dev.maxmind.com/geoip/geoip2/geolite2/)からのGeoLite2 City、GeoLite2 Country、およびGeoLite2 ASN IP地理位置データベースを使用し、CC BY-SA 4.0ライセンスの下で共有されています。ノードが`````storage.googleapis.com`````ドメインに接続できる場合、次のいずれかの条件が満たされると、これらのデータベースは自動的にダウンロードされます:
- `````ingest.geoip.downloader.eager.download`````がtrueに設定されている
- クラスターに`````geoip`````プロセッサを持つパイプラインが少なくとも1つある
Elasticsearchは、Elastic GeoIPエンドポイントからこれらのデータベースの更新を自動的にダウンロードします:[https://geoip.elastic.co/v1/database](https://geoip.elastic.co/v1/database?elastic_geoip_service_tos=agree)。これらの更新のダウンロード統計を取得するには、[GeoIP stats API](/read/elasticsearch-8-15/08a98111509bbe8e.md)を使用してください。
クラスターがElastic GeoIPエンドポイントに接続できない場合や、自分で更新を管理したい場合は、[自分のIP地理位置データベースの更新を管理する](043d393090f955dd.md#manage-geoip-database-updates)を参照してください。
ElasticsearchがMaxmindから提供されたライセンスキーを使用してデータベースファイルを直接ダウンロードするようにしたい場合は、[GeoIPデータベース構成の作成または更新](/read/elasticsearch-8-15/b30edf5fb53439e4.md)を参照してください。
Elasticsearchが30日間エンドポイントに接続できない場合、すべての更新されたデータベースは無効になります。Elasticsearchはドキュメントのgeoipデータの強化を停止し、`````tags: ["_geoip_expired_database"]`````フィールドを代わりに追加します。
## パイプラインでのgeoipプロセッサの使用
[](#ingest-geoip-options)
**表22. `````geoip`````オプション**
| 名前 | 必須 | デフォルト | 説明 |
| :-- | :-- | :-- | :-- |
| `````field````` | はい | - | 地理的ルックアップのためにIPアドレスを取得するフィールド。 |
| `````target_field````` | いいえ | geoip | MaxMindデータベースから取得した地理情報を保持するフィールド。 |
| `````database_file````` | いいえ | GeoLite2-City.mmdb | 自動的にダウンロードされたGeoLite2データベースのいずれかを参照するデータベースファイル名(GeoLite2-City.mmdb、GeoLite2-Country.mmdb、またはGeoLite2-ASN.mmdb)、または`````ingest-geoip`````構成ディレクトリ内のサポートされているデータベースファイルの名前、または[構成されたデータベース](/read/elasticsearch-8-15/c459c7b077f0803c.md "Get geoip database configuration API")の名前(`````.mmdb`````サフィックスが追加されます)。 |
| `````properties````` | いいえ | \[`````continent_name`````, `````country_iso_code`````, `````country_name`````, `````region_iso_code`````, `````region_name`````, `````city_name`````, `````location`````\] \* | geoipルックアップに基づいて`````target_field`````に追加されるプロパティを制御します。 |
| `````ignore_missing````` | いいえ | `````false````` | `````true`````および`````field`````が存在しない場合、プロセッサは静かに終了し、ドキュメントを変更しません |
| `````first_only````` | いいえ | `````true````` | `````true`````がある場合、最初に見つかったgeoipデータのみが返されます。`````field`````が配列を含んでいても。 |
| `````download_database_on_pipeline_creation````` | いいえ | `````true````` | `````true`````がある場合(および`````ingest.geoip.downloader.eager.download`````が`````false`````の場合)、パイプラインが作成されるときに欠落しているデータベースがダウンロードされます。そうでない場合、ダウンロードは`````default_pipeline`````または`````final_pipeline`````としてインデックスで使用されるときにトリガーされます。 |
*`````database_file`````に何が利用可能かによります:
- GeoLite2 CityまたはGeoIP2 Cityデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、`````country_iso_code`````、`````country_name`````、`````continent_code`````、`````continent_name`````、`````region_iso_code`````、`````region_name`````、`````city_name`````、`````timezone`````、`````location`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
- GeoLite2 CountryまたはGeoIP2 Countryデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、`````country_iso_code`````、`````country_name`````、`````continent_code`````、`````continent_name`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
- GeoLite2 ASNデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、`````asn`````、`````organization_name`````および`````network`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
- GeoIP2 Anonymous IPデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、`````hosting_provider`````、`````tor_exit_node`````、`````anonymous_vpn`````、`````anonymous`````、`````public_proxy`````、および`````residential_proxy`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
- GeoIP2 Connection Typeデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、および`````connection_type`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
- GeoIP2 Domainデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、および`````domain`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
- GeoIP2 ISPデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、`````asn`````、`````organization_name`````、`````network`````、`````isp`````、`````isp_organization_name`````、`````mobile_country_code`````、および`````mobile_network_code`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
- GeoIP2 Enterpriseデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、`````country_iso_code`````、`````country_name`````、`````continent_code`````、`````continent_name`````、`````region_iso_code`````、`````region_name`````、`````city_name`````、`````timezone`````、`````location`````、`````asn`````、`````organization_name`````、`````network`````、`````hosting_provider`````、`````tor_exit_node`````、`````anonymous_vpn`````、`````anonymous`````、`````public_proxy`````、`````residential_proxy`````、`````domain`````、`````isp`````、`````isp_organization_name`````、`````mobile_country_code`````、`````mobile_network_code`````、`````user_type`````、`````connection_type`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
GeoIP2 Anonymous IP、GeoIP2 Connection Type、GeoIP2 Domain、GeoIP2 ISP、およびGeoIP2 Enterpriseデータベースを本番環境で使用しないでください。この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。
以下は、デフォルトの都市データベースを使用し、`````ip`````フィールドに基づいて`````geoip`````フィールドに地理情報を追加する例です:
#### Python
``````python
resp = client.ingest.put_pipeline(
id="geoip",
description="Add geoip info",
processors=[
{
"geoip": {
"field": "ip"
}
}
],
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="my_id",
pipeline="geoip",
document={
"ip": "89.160.20.128"
},
)
print(resp1)
resp2 = client.get(
index="my-index-000001",
id="my_id",
)
print(resp2)
`
Ruby
response = client.ingest.put_pipeline(
id: 'geoip',
body: {
description: 'Add geoip info',
processors: [
{
geoip: {
field: 'ip'
}
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'my_id',
pipeline: 'geoip',
body: {
ip: '89.160.20.128'
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 'my_id'
)
puts response
Js
const response = await client.ingest.putPipeline({
id: "geoip",
description: "Add geoip info",
processors: [
{
geoip: {
field: "ip",
},
},
],
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: "my_id",
pipeline: "geoip",
document: {
ip: "89.160.20.128",
},
});
console.log(response1);
const response2 = await client.get({
index: "my-index-000001",
id: "my_id",
});
console.log(response2);
コンソール
PUT _ingest/pipeline/geoip
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip"
}
}
]
}
PUT my-index-000001/_doc/my_id?pipeline=geoip
{
"ip": "89.160.20.128"
}
GET my-index-000001/_doc/my_id
コンソール-結果
{
"found": true,
"_index": "my-index-000001",
"_id": "my_id",
"_version": 1,
"_seq_no": 55,
"_primary_term": 1,
"_source": {
"ip": "89.160.20.128",
"geoip": {
"continent_name": "Europe",
"country_name": "Sweden",
"country_iso_code": "SE",
"city_name" : "Linköping",
"region_iso_code" : "SE-E",
"region_name" : "Östergötland County",
"location": { "lat": 58.4167, "lon": 15.6167 }
}
}
}
以下は、デフォルトの国データベースを使用し、ip
フィールドに基づいてgeo
フィールドに地理情報を追加する例です。このデータベースは自動的にダウンロードされることに注意してください。したがって、これ:
Python
resp = client.ingest.put_pipeline(
id="geoip",
description="Add geoip info",
processors=[
{
"geoip": {
"field": "ip",
"target_field": "geo",
"database_file": "GeoLite2-Country.mmdb"
}
}
],
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="my_id",
pipeline="geoip",
document={
"ip": "89.160.20.128"
},
)
print(resp1)
resp2 = client.get(
index="my-index-000001",
id="my_id",
)
print(resp2)
Ruby
response = client.ingest.put_pipeline(
id: 'geoip',
body: {
description: 'Add geoip info',
processors: [
{
geoip: {
field: 'ip',
target_field: 'geo',
database_file: 'GeoLite2-Country.mmdb'
}
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'my_id',
pipeline: 'geoip',
body: {
ip: '89.160.20.128'
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 'my_id'
)
puts response
Js
const response = await client.ingest.putPipeline({
id: "geoip",
description: "Add geoip info",
processors: [
{
geoip: {
field: "ip",
target_field: "geo",
database_file: "GeoLite2-Country.mmdb",
},
},
],
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: "my_id",
pipeline: "geoip",
document: {
ip: "89.160.20.128",
},
});
console.log(response1);
const response2 = await client.get({
index: "my-index-000001",
id: "my_id",
});
console.log(response2);
コンソール
PUT _ingest/pipeline/geoip
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip",
"target_field" : "geo",
"database_file" : "GeoLite2-Country.mmdb"
}
}
]
}
PUT my-index-000001/_doc/my_id?pipeline=geoip
{
"ip": "89.160.20.128"
}
GET my-index-000001/_doc/my_id
コンソール-結果
{
"found": true,
"_index": "my-index-000001",
"_id": "my_id",
"_version": 1,
"_seq_no": 65,
"_primary_term": 1,
"_source": {
"ip": "89.160.20.128",
"geo": {
"continent_name": "Europe",
"country_name": "Sweden",
"country_iso_code": "SE"
}
}
}
すべてのIPアドレスがデータベースから地理情報を見つけるわけではありません。この場合、target_field
はドキュメントに挿入されません。
以下は、情報が見つからない場合にインデックスされるドキュメントの例です:”80.231.5.0”
Python
resp = client.ingest.put_pipeline(
id="geoip",
description="Add geoip info",
processors=[
{
"geoip": {
"field": "ip"
}
}
],
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="my_id",
pipeline="geoip",
document={
"ip": "80.231.5.0"
},
)
print(resp1)
resp2 = client.get(
index="my-index-000001",
id="my_id",
)
print(resp2)
Ruby
response = client.ingest.put_pipeline(
id: 'geoip',
body: {
description: 'Add geoip info',
processors: [
{
geoip: {
field: 'ip'
}
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'my_id',
pipeline: 'geoip',
body: {
ip: '80.231.5.0'
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 'my_id'
)
puts response
Js
const response = await client.ingest.putPipeline({
id: "geoip",
description: "Add geoip info",
processors: [
{
geoip: {
field: "ip",
},
},
],
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: "my_id",
pipeline: "geoip",
document: {
ip: "80.231.5.0",
},
});
console.log(response1);
const response2 = await client.get({
index: "my-index-000001",
id: "my_id",
});
console.log(response2);
コンソール
PUT _ingest/pipeline/geoip
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip"
}
}
]
}
PUT my-index-000001/_doc/my_id?pipeline=geoip
{
"ip": "80.231.5.0"
}
GET my-index-000001/_doc/my_id
コンソール-結果
{
"_index" : "my-index-000001",
"_id" : "my_id",
"_version" : 1,
"_seq_no" : 71,
"_primary_term": 1,
"found" : true,
"_source" : {
"ip" : "80.231.5.0"
}
}
位置をジオポイントとして認識する
このプロセッサは、IPアドレスの推定緯度と経度を含むlocation
フィールドでドキュメントを強化しますが、このフィールドはマッピングで明示的に定義しない限り、Elasticsearchでgeo_point
タイプとしてインデックスされません。
上記の例のインデックスに対して、次のマッピングを使用できます:
Python
resp = client.indices.create(
index="my_ip_locations",
mappings={
"properties": {
"geoip": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my_ip_locations',
body: {
mappings: {
properties: {
geoip: {
properties: {
location: {
type: 'geo_point'
}
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my_ip_locations",
mappings: {
properties: {
geoip: {
properties: {
location: {
type: "geo_point",
},
},
},
},
},
});
console.log(response);
コンソール
PUT my_ip_locations
{
"mappings": {
"properties": {
"geoip": {
"properties": {
"location": { "type": "geo_point" }
}
}
}
}
}
自分のIP地理位置データベースの更新を管理する
ElasticエンドポイントからIP地理位置データベースを自動的に更新できない場合、いくつかの他のオプションがあります:
Elastic GeoIPエンドポイントに直接接続できない場合は、安全なプロキシを設定することを検討してください。次に、各ノードのelasticsearch.yml
ファイルのingest.geoip.downloader.endpoint
設定にプロキシエンドポイントのURLを指定できます。
厳格な設定では、次のドメインを許可されたドメインリストに追加する必要がある場合があります:
geoip.elastic.co
storage.googleapis.com
Elastic GeoIPエンドポイントを模倣するサービスを作成できます。次に、このサービスから自動更新を取得できます。
- 1. MaxMindサイトから
.mmdb
データベースファイルをダウンロードします。 - 2. データベースファイルを1つのディレクトリにコピーします。
- 3. Elasticsearchディレクトリから、次のコマンドを実行します:
./bin/elasticsearch-geoip -s my/source/dir [-t target/directory]
- 4. ディレクトリから静的データベースファイルを提供します。たとえば、Dockerを使用してnginxサーバーからファイルを提供できます:
docker run -v my/source/dir:/usr/share/nginx/html:ro nginx
- 5. 各ノードの
elasticsearch.yml
ファイルのingest.geoip.downloader.endpoint
設定にサービスのエンドポイントURLを指定します。
デフォルトでは、Elasticsearchは3日ごとにエンドポイントを更新の確認を行います。別のポーリング間隔を使用するには、クラスタ更新設定APIを使用してingest.geoip.downloader.poll.interval
を設定します。
- 1. クラスタ更新設定APIを使用して
ingest.geoip.downloader.enabled
をfalse
に設定します。これにより、データベースの変更を上書きする可能性のある自動更新が無効になります。また、すべてのダウンロードされたデータベースが削除されます。 - 2. MaxMindサイトから
.mmdb
データベースファイルをダウンロードします。
カスタムの都市、国、およびASN.mmdb
ファイルも使用できます。これらのファイルは解凍されている必要があります。タイプ(都市、国、またはASN)はファイルメタデータから取得されるため、ファイル名は重要ではありません。 - 3. Elasticsearch Serviceのデプロイメントでは、カスタムバンドルを使用してデータベースをアップロードします。
- 4. 自己管理のデプロイメントでは、データベースファイルを
$ES_CONFIG/ingest-geoip
にコピーします。 - 5.
geoip
プロセッサで、database_file
パラメータをカスタムデータベースファイルを使用するように構成します。
ノード設定
- `````ingest.geoip.cache_size
- キャッシュすべき最大結果数。デフォルトは
1000
です。
これらの設定はノード設定であり、すべてのgeoip
プロセッサに適用されることに注意してください。つまり、すべての定義されたgeoip
プロセッサに対して1つのキャッシュがあります。
クラスター設定
ingest.geoip.downloader.enabled
(動的、Boolean)
true
の場合、Elasticsearchは自動的にIP地理位置データベースの更新をingest.geoip.downloader.endpoint
からダウンロードして管理します。false
の場合、Elasticsearchは更新をダウンロードせず、すべてのダウンロードされたデータベースを削除します。デフォルトはtrue
です。ingest.geoip.downloader.eager.download
(動的、Boolean)
true
の場合、Elasticsearchはgeoipプロセッサを持つパイプラインが存在するかどうかに関係なく、IP地理位置データベースを即座にダウンロードします。false
の場合、Elasticsearchはgeoipプロセッサを持つパイプラインが存在するか追加されるまでデータベースのダウンロードを開始しません。デフォルトはfalse
です。ingest.geoip.downloader.endpoint
- (静的、string) IP地理位置データベースの更新をダウンロードするために使用されるエンドポイントURL。たとえば、
https://myDomain.com/overview.json
。デフォルトはhttps://geoip.elastic.co/v1/database
です。Elasticsearchは、各ノードの一時ディレクトリに$ES_TMPDIR/geoip-databases/<node_id>
でダウンロードされたデータベースファイルを保存します。Elasticsearchは${ingest.geoip.downloader.endpoint}?elastic_geoip_service_tos=agree
にGETリクエストを行い、通常overview.json
に見られるデータベースに関するメタデータのリストを期待します。
GeoIPダウンローダーはJDKの組み込みcacertsを使用します。カスタムエンドポイントを使用している場合は、カスタムhttpsエンドポイントcacertをJDKのトラストストアに追加してください。