Query API key information API
APIキーに関する情報を取得します。これは、Query DSLを使用して、ページネーション形式で行われます。
Request
GET /_security/_query/api_key
POST /_security/_query/api_key
Prerequisites
- このAPIを使用するには、少なくとも
manage_own_api_key
またはread_security
のクラスター権限が必要です。 manage_own_api_key
権限のみを持っている場合、このAPIはあなたが所有するAPIキーのみを返します。read_security
、manage_api_key
、またはそれ以上の権限(manage_security
を含む)を持っている場合、このAPIは所有権に関係なくすべてのAPIキーを返します。
Description
このAPIを使用して、create API key APIで作成されたAPIキーをページネーション形式で取得します。オプションで、クエリを使用して結果をフィルタリングできます。
Path parameters
with_limited_by
- (オプション、ブール値)APIキーに関連付けられた所有者ユーザーのロール記述子のスナップショットを返すためのブールフラグ。APIキーの実際の権限は、その割り当てられたロール記述子と所有者ユーザーのロール記述子の交差点です(実質的にそれによって制限されます)。APIキーは、
manage_api_key
またはそれ以上の権限を持っていない限り、他のAPIキーの制限されたロール記述子(自身を含む)を取得できません。 with_profile_uid
- (オプション、ブール値)APIキーの所有者ユーザーのユーザープロファイル
uid
も取得するかどうかを決定します。存在する場合、プロファイルのUIDは各APIキーのprofile_uid
応答フィールドに返されます。デフォルトはfalse
です。 typed_keys
- (オプション、ブール値)
true
の場合、応答内の集約名はそれぞれのタイプによってプレフィックスされます。デフォルトはfalse
です。
Request body
リクエストボディに次のパラメータを指定できます:
query
- (オプション、オブジェクト)返すAPIキーをフィルタリングするためのクエリ。クエリパラメータが欠落している場合、それは
match_all
クエリと同等です。クエリは、match_all
、bool
、term
、terms
、match
、ids
、prefix
、wildcard
、exists
、range
、およびsimple query string
を含むクエリタイプのサブセットをサポートします。
APIキーに関連付けられた次の公開値をクエリできます。
APIキーに関連付けられたクエリ可能な文字列値は、内部的にkeywords
としてマッピングされています。したがって、analyzer
パラメータがmatch
クエリに指定されていない場合、提供されたマッチクエリ文字列は単一のキーワード値として解釈されます。そのため、match
クエリはterm
クエリと同等です。- `````id
- APIキーのID。注意:
id
はids
クエリでクエリする必要があります。 type
- APIキーは、Create API keyまたはGrant API key APIを介して作成された場合は
rest
タイプ、またはCreate Cross-Cluster API key APIを介して作成された場合はcross_cluster
タイプです。 name
- APIキーの名前。
creation
- APIキーの作成時間(ミリ秒)。
expiration
- APIキーの有効期限(ミリ秒)。これは、キーが期限切れに設定されていない場合は
null
です。 invalidated
- APIキーが無効化されているかどうかを示します。
true
の場合、キーは無効化されます。デフォルトはfalse
です。 invalidation
- APIキーの無効化時間(ミリ秒)。このフィールドは、無効化されたAPIキーにのみ設定されます。
username
- APIキー所有者のユーザー名。
realm
- APIキー所有者のレルム名。
metadata
- APIキーに関連付けられたメタデータフィールド(例:
metadata.my_field
)。メタデータは、内部的にフラット化されたフィールドタイプとしてインデックスされます。これは、すべてのフィールドがクエリおよびソート時にkeyword
フィールドのように機能することを意味します。ワイルドカードパターンを使用してメタデータフィールドのサブセットを参照することはできません(例:metadata.field*
)、フィールド名パターンをサポートするクエリタイプに対しても同様です。最後に、すべてのメタデータフィールドは、metadata
(ドットとサブフィールド名が続かない)を単に言及することで一緒に検索できます。
APIキーのロール記述子をクエリすることはできません。
aggs
またはaggregations
- (オプション、オブジェクト)返されたAPIキーのコーパスに対して実行する集約。集約とクエリは一緒に機能します。集約は、クエリに一致するAPIキーのみに対して計算されます。これは、terms、range、date range、missing、cardinality、value count、composite、filter、およびfiltersを含む集約タイプのサブセットのみをサポートします。さらに、集約は
query
が機能するのと同じフィールドのサブセットに対してのみ実行されます。 from
- (オプション、整数)開始ドキュメントオフセット。非負である必要があり、デフォルトは
0
です。
デフォルトでは、from
およびsize
パラメータを使用して10,000件を超えるヒットをページングすることはできません。より多くのヒットをページングするには、search_after
パラメータを使用します。 size
- (オプション、整数)返すヒットの数。負であってはならず、デフォルトは
10
です。size
パラメータを0
に設定することができ、その場合、APIキーの一致は返されず、集約結果のみが返されます。
デフォルトでは、from
およびsize
パラメータを使用して10,000件を超えるヒットをページングすることはできません。より多くのヒットをページングするには、search_after
パラメータを使用します。 sort
- (オプション、オブジェクト)ソート定義。
id
を除いて、APIキーのすべての公開フィールドはソートの対象となります。さらに、インデックス順でソートするために_doc
フィールドにもソートを適用できます。 search_after
- (オプション、配列)Search after定義。
Response body
このAPIは次のトップレベルフィールドを返します:
total
- 見つかったAPIキーの総数。
count
- 応答で返されたAPIキーの数。
api_keys
- APIキー情報のリスト。
Examples
次のリクエストは、manage_api_key
権限を持っていると仮定して、すべてのAPIキーをリストします:
Python
resp = client.security.query_api_keys()
print(resp)
Js
const response = await client.security.queryApiKeys();
console.log(response);
Console
GET /_security/_query/api_key
成功した呼び出しは、1つ以上のAPIキーから取得した情報を含むJSON構造を返します:
Js
{
"total": 3,
"count": 3,
"api_keys": [
{
"id": "nkvrGXsB8w290t56q3Rg",
"name": "my-api-key-1",
"creation": 1628227480421,
"expiration": 1629091480421,
"invalidated": false,
"username": "elastic",
"realm": "reserved",
"realm_type": "reserved",
"metadata": {
"letter": "a"
},
"role_descriptors": {
"role-a": {
"cluster": [
"monitor"
],
"indices": [
{
"names": [
"index-a"
],
"privileges": [
"read"
],
"allow_restricted_indices": false
}
],
"applications": [ ],
"run_as": [ ],
"metadata": { },
"transient_metadata": {
"enabled": true
}
}
}
},
{
"id": "oEvrGXsB8w290t5683TI",
"name": "my-api-key-2",
"creation": 1628227498953,
"expiration": 1628313898953,
"invalidated": false,
"username": "elastic",
"realm": "reserved",
"metadata": {
"letter": "b"
},
"role_descriptors": { }
}
]
}
このリクエストのために取得されたAPIキーのリスト | |
作成時にこのAPIキーに割り当てられたロール記述子。APIキーの有効な権限は、割り当てられた権限と所有者ユーザーの権限の時点でのスナップショットの交差点です。 | |
空のロール記述子は、APIキーが所有者ユーザーの権限を継承していることを意味します。 |
次の詳細でAPIキーを作成した場合:
Python
resp = client.security.create_api_key(
name="application-key-1",
metadata={
"application": "my-application"
},
)
print(resp)
Js
const response = await client.security.createApiKey({
name: "application-key-1",
metadata: {
application: "my-application",
},
});
console.log(response);
Console
POST /_security/api_key
{
"name": "application-key-1",
"metadata": { "application": "my-application"}
}
成功した呼び出しは、APIキー情報を提供するJSON構造を返します。例えば:
Console-Result
{
"id": "VuaCfGcBCdbkQm-e5aOx",
"name": "application-key-1",
"api_key": "ui2lp2axTNmsyakw9tvNnw",
"encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
}
応答からの情報を使用して、IDでAPIキーを取得します:
Python
resp = client.security.query_api_keys(
with_limited_by=True,
query={
"ids": {
"values": [
"VuaCfGcBCdbkQm-e5aOx"
]
}
},
)
print(resp)
Js
const response = await client.security.queryApiKeys({
with_limited_by: "true",
query: {
ids: {
values: ["VuaCfGcBCdbkQm-e5aOx"],
},
},
});
console.log(response);
Console
GET /_security/_query/api_key?with_limited_by=true
{
"query": {
"ids": {
"values": [
"VuaCfGcBCdbkQm-e5aOx"
]
}
}
}
成功した呼び出しは、制限されたロール記述子を含むAPIキー情報のJSON構造を返します:
Js
{
"api_keys": [
{
"id": "VuaCfGcBCdbkQm-e5aOx",
"name": "application-key-1",
"creation": 1548550550158,
"expiration": 1548551550158,
"invalidated": false,
"username": "myuser",
"realm": "native1",
"realm_type": "native",
"metadata": {
"application": "my-application"
},
"role_descriptors": { },
"limited_by": [
{
"role-power-user": {
"cluster": [
"monitor"
],
"indices": [
{
"names": [
"*"
],
"privileges": [
"read"
],
"allow_restricted_indices": false
}
],
"applications": [ ],
"run_as": [ ],
"metadata": { },
"transient_metadata": {
"enabled": true
}
}
}
]
}
]
}
APIキーに関連付けられた所有者ユーザーの権限。 それは作成時にキャプチャされた時点でのスナップショットであり、 その後の更新です。APIキーの有効な権限は、割り当てられた権限と 所有者ユーザーの権限の交差点です。 |
APIキーを名前で取得することもできます:
Python
resp = client.security.query_api_keys(
query={
"term": {
"name": {
"value": "application-key-1"
}
}
},
)
print(resp)
Js
const response = await client.security.queryApiKeys({
query: {
term: {
name: {
value: "application-key-1",
},
},
},
});
console.log(response);
Console
GET /_security/_query/api_key
{
"query": {
"term": {
"name": {
"value": "application-key-1"
}
}
}
}
#### Js
``````js
GET /_security/_query/api_key
{
"query": {
"bool": {
"must": [
{
"prefix": {
"name": "app1-key-"
}
},
{
"term": {
"invalidated": "false"
}
}
],
"must_not": [
{
"term": {
"name": "app1-key-01"
}
}
],
"filter": [
{
"wildcard": {
"username": "org-*-user"
}
},
{
"term": {
"metadata.environment": "production"
}
}
]
}
},
"from": 20,
"size": 10,
"sort": [
{ "creation": { "order": "desc", "format": "date_time" } },
"name"
]
}
`
APIキー名はapp1-key- で始まる必要があります |
|
APIキーはまだ有効である必要があります | |
APIキー名はapp1-key-01 であってはなりません |
|
APIキーは、ワイルドカードパターンorg-*-user のユーザー名によって所有されている必要があります |
|
APIキーは、environment のメタデータフィールドを持ち、その値がproduction である必要があります |
|
検索結果のオフセットは20番目(ゼロベースのインデックス)APIキーです | |
応答のページサイズは10 APIキーです | |
結果は最初にcreation 日付で降順にソートされ、その後名前で昇順にソートされます |
応答には、一致したAPIキーのリストとそのソート値が含まれます:
Js
{
"total": 100,
"count": 10,
"api_keys": [
{
"id": "CLXgVnsBOGkf8IyjcXU7",
"name": "app1-key-79",
"creation": 1629250154811,
"invalidated": false,
"username": "org-admin-user",
"realm": "native1",
"metadata": {
"environment": "production"
},
"role_descriptors": { },
"_sort": [
"2021-08-18T01:29:14.811Z",
"app1-key-79"
]
},
{
"id": "BrXgVnsBOGkf8IyjbXVB",
"name": "app1-key-78",
"creation": 1629250153794,
"invalidated": false,
"username": "org-admin-user",
"realm": "native1",
"metadata": {
"environment": "production"
},
"role_descriptors": { },
"_sort": [
"2021-08-18T01:29:13.794Z",
"app1-key-78"
]
},
...
]
}
最初のソート値は作成時間で、リクエストで定義されたdate_time 形式で表示されます |
|
2番目のソート値はAPIキー名です |
Aggregations Example
例えば、2人のユーザー「june」と「king」がそれぞれ3つのAPIキーを所有しているとします:
- 期限切れにならないもの(ユーザー「king」のために無効化された)
- 10日後に期限切れになるもの
- 100日後に期限切れになるもの(ユーザー「june」のために無効化された)
次のリクエストは、すぐに期限切れになる(30日後)有効なAPIキーの名前を、所有者のユーザー名でグループ化して返します。
Request
Python
resp = client.security.query_api_keys(
size=0,
query={
"bool": {
"must": {
"term": {
"invalidated": False
}
},
"should": [
{
"range": {
"expiration": {
"gte": "now"
}
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "expiration"
}
}
}
}
],
"minimum_should_match": 1
}
},
aggs={
"keys_by_username": {
"composite": {
"sources": [
{
"usernames": {
"terms": {
"field": "username"
}
}
}
]
},
"aggs": {
"expires_soon": {
"filter": {
"range": {
"expiration": {
"lte": "now+30d/d"
}
}
},
"aggs": {
"key_names": {
"terms": {
"field": "name"
}
}
}
}
}
}
},
)
print(resp)
Js
const response = await client.security.queryApiKeys({
size: 0,
query: {
bool: {
must: {
term: {
invalidated: false,
},
},
should: [
{
range: {
expiration: {
gte: "now",
},
},
},
{
bool: {
must_not: {
exists: {
field: "expiration",
},
},
},
},
],
minimum_should_match: 1,
},
},
aggs: {
keys_by_username: {
composite: {
sources: [
{
usernames: {
terms: {
field: "username",
},
},
},
],
},
aggs: {
expires_soon: {
filter: {
range: {
expiration: {
lte: "now+30d/d",
},
},
},
aggs: {
key_names: {
terms: {
field: "name",
},
},
},
},
},
},
},
});
console.log(response);
Console
POST /_security/_query/api_key
{
"size": 0,
"query": {
"bool": {
"must": {
"term": {
"invalidated": false
}
},
"should": [
{
"range": { "expiration": { "gte": "now" } }
},
{
"bool": { "must_not": { "exists": { "field": "expiration" } } }
}
],
"minimum_should_match": 1
}
},
"aggs": {
"keys_by_username": {
"composite": {
"sources": [ { "usernames": { "terms": { "field": "username" } } } ]
},
"aggs": {
"expires_soon": {
"filter": {
"range": { "expiration": { "lte": "now+30d/d" } }
},
"aggs": {
"key_names": { "terms": { "field": "name" } }
}
}
}
}
}
}
一致するAPIキーは無効化されてはなりません | |
一致するAPIキーは、期限切れでないか、期限切れの日付を持たない必要があります | |
一致するすべてのキー(すなわち、すべての有効なキー)を所有者のユーザー名で集約します | |
各ユーザー名の有効なキーをすぐに期限切れになるバケットにさらに集約します |
Response
Console-Result
{
"total" : 4,
"count" : 0,
"api_keys" : [ ],
"aggregations" : {
"keys_by_username" : {
"after_key" : {
"usernames" : "king"
},
"buckets" : [
{
"key" : {
"usernames" : "june"
},
"doc_count" : 2,
"expires_soon" : {
"doc_count" : 1,
"key_names" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "june-key-10",
"doc_count" : 1
}
]
}
}
},
{
"key" : {
"usernames" : "king"
},
"doc_count" : 2,
"expires_soon" : {
"doc_count" : 1,
"key_names" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "king-key-10",
"doc_count" : 1
}
]
}
}
}
]
}
}
}
有効なAPIキーの総数(各ユーザーに対して2) | |
ユーザー「june」の有効なAPIキーの数 | |
ユーザー「king」のすぐに期限切れになる有効なAPIキーの数 | |
ユーザー「king」のすぐに期限切れになるAPIキーの名前 |
無効化された(ただしまだ削除されていない)APIキーを、所有者のユーザー名とAPIキー名でグループ化して取得するには、次のリクエストを発行します:
Request
Python
resp = client.security.query_api_keys(
size=0,
query={
"bool": {
"filter": {
"term": {
"invalidated": True
}
}
}
},
aggs={
"invalidated_keys": {
"composite": {
"sources": [
{
"username": {
"terms": {
"field": "username"
}
}
},
{
"key_name": {
"terms": {
"field": "name"
}
}
}
]
}
}
},
)
print(resp)
Js
const response = await client.security.queryApiKeys({
size: 0,
query: {
bool: {
filter: {
term: {
invalidated: true,
},
},
},
},
aggs: {
invalidated_keys: {
composite: {
sources: [
{
username: {
terms: {
field: "username",
},
},
},
{
key_name: {
terms: {
field: "name",
},
},
},
],
},
},
},
});
console.log(response);
Console
POST /_security/_query/api_key
{
"size": 0,
"query": {
"bool": {
"filter": {
"term": {
"invalidated": true
}
}
}
},
"aggs": {
"invalidated_keys": {
"composite": {
"sources": [
{ "username": { "terms": { "field": "username" } } },
{ "key_name": { "terms": { "field": "name" } } }
]
}
}
}
}
Response
Console-Result
{
"total" : 2,
"count" : 0,
"api_keys" : [ ],
"aggregations" : {
"invalidated_keys" : {
"after_key" : {
"username" : "king",
"key_name" : "king-key-no-expire"
},
"buckets" : [
{
"key" : {
"username" : "june",
"key_name" : "june-key-100"
},
"doc_count" : 1
},
{
"key" : {
"username" : "king",
"key_name" : "king-key-no-expire"
},
"doc_count" : 1
}
]
}
}
}