フィールドレベルのセキュリティ
フィールドレベルのセキュリティは、ユーザーが読み取ることができるフィールドを制限します。特に、ドキュメントベースの読み取りAPIからアクセスできるフィールドを制限します。
フィールドレベルのセキュリティを有効にするには、役割定義のインデックス権限の一部として、各役割がアクセスできるフィールドを指定します。したがって、フィールドレベルのセキュリティは、明確に定義されたデータストリームまたはインデックスのセット(および潜在的に一連の ドキュメント)にバインドされます。
次の役割定義は、すべての events-*
データストリームおよびインデックス内の category
、@timestamp
、および message
フィールドへの読み取りアクセスのみを付与します。
Python
resp = client.security.put_role(
name="test_role1",
indices=[
{
"names": [
"events-*"
],
"privileges": [
"read"
],
"field_security": {
"grant": [
"category",
"@timestamp",
"message"
]
}
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "test_role1",
indices: [
{
names: ["events-*"],
privileges: ["read"],
field_security: {
grant: ["category", "@timestamp", "message"],
},
},
],
});
console.log(response);
コンソール
POST /_security/role/test_role1
{
"indices": [
{
"names": [ "events-*" ],
"privileges": [ "read" ],
"field_security" : {
"grant" : [ "category", "@timestamp", "message" ]
}
}
]
}
次のメタデータフィールドへのアクセスは常に許可されます: _id
、_type
、_parent
、_routing
、_timestamp
、_ttl
、_size
および _index
。フィールドの空のリストを指定した場合、これらのメタデータフィールドのみがアクセス可能です。
フィールドエントリを省略すると、フィールドレベルのセキュリティが完全に無効になります。
フィールド式を指定することもできます。たとえば、次の例では、event_
プレフィックスで始まるすべてのフィールドへの読み取りアクセスを付与します:
Python
resp = client.security.put_role(
name="test_role2",
indices=[
{
"names": [
"*"
],
"privileges": [
"read"
],
"field_security": {
"grant": [
"event_*"
]
}
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "test_role2",
indices: [
{
names: ["*"],
privileges: ["read"],
field_security: {
grant: ["event_*"],
},
},
],
});
console.log(response);
コンソール
POST /_security/role/test_role2
{
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"grant" : [ "event_*" ]
}
}
]
}
より複雑なドキュメント内のネストされたフィールドを参照するには、ドット表記を使用します。たとえば、次のドキュメントを仮定します:
Js
{
"customer": {
"handle": "Jim",
"email": "[email protected]",
"phone": "555-555-5555"
}
}
次の役割定義は、顧客 handle
フィールドへの読み取りアクセスのみを有効にします:
Python
resp = client.security.put_role(
name="test_role3",
indices=[
{
"names": [
"*"
],
"privileges": [
"read"
],
"field_security": {
"grant": [
"customer.handle"
]
}
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "test_role3",
indices: [
{
names: ["*"],
privileges: ["read"],
field_security: {
grant: ["customer.handle"],
},
},
],
});
console.log(response);
コンソール
POST /_security/role/test_role3
{
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"grant" : [ "customer.handle" ]
}
}
]
}
ここでワイルドカードサポートが際立ちます。たとえば、customer.*
を使用して、customer
データへの読み取りアクセスのみを有効にします:
Python
resp = client.security.put_role(
name="test_role4",
indices=[
{
"names": [
"*"
],
"privileges": [
"read"
],
"field_security": {
"grant": [
"customer.*"
]
}
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "test_role4",
indices: [
{
names: ["*"],
privileges: ["read"],
field_security: {
grant: ["customer.*"],
},
},
],
});
console.log(response);
コンソール
POST /_security/role/test_role4
{
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"grant" : [ "customer.*" ]
}
}
]
}
次の構文を使用して、フィールドへのアクセスを拒否できます:
Python
resp = client.security.put_role(
name="test_role5",
indices=[
{
"names": [
"*"
],
"privileges": [
"read"
],
"field_security": {
"grant": [
"*"
],
"except": [
"customer.handle"
]
}
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "test_role5",
indices: [
{
names: ["*"],
privileges: ["read"],
field_security: {
grant: ["*"],
except: ["customer.handle"],
},
},
],
});
console.log(response);
コンソール
POST /_security/role/test_role5
{
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"grant" : [ "*"],
"except": [ "customer.handle" ]
}
}
]
}
次のルールが適用されます:
- 役割に
field_security
が存在しない場合は、* アクセスと同等です。 - 一部のフィールドに明示的に権限が付与されている場合、拒否されたフィールドを指定できます。拒否されたフィールドは、権限が付与されたフィールドのサブセットでなければなりません。
- 拒否されたフィールドと付与されたフィールドを定義することは、拒否されたフィールドのパターンに一致するフィールドを除いて、すべての付与されたフィールドへのアクセスを意味します。
たとえば:
Python
resp = client.security.put_role(
name="test_role6",
indices=[
{
"names": [
"*"
],
"privileges": [
"read"
],
"field_security": {
"except": [
"customer.handle"
],
"grant": [
"customer.*"
]
}
}
],
)
print(resp)
Js
const response = await client.security.putRole({
name: "test_role6",
indices: [
{
names: ["*"],
privileges: ["read"],
field_security: {
except: ["customer.handle"],
grant: ["customer.*"],
},
},
],
});
console.log(response);
コンソール
POST /_security/role/test_role6
{
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"except": [ "customer.handle" ],
"grant" : [ "customer.*" ]
}
}
]
}
上記の例では、ユーザーは「customer.」というプレフィックスを持つすべてのフィールドを読み取ることができますが、「customer.handle」だけは除外されます。
grant
の空の配列(たとえば、"grant" : []
)は、フィールドへのアクセスが付与されていないことを意味します。
ユーザーがフィールドレベルの権限を指定する複数の役割を持っている場合、データストリームまたはインデックスごとの結果のフィールドレベルの権限は、個々の役割の権限の和集合です。たとえば、これらの2つの役割が統合されると:
Python
resp = client.security.put_role(
name="test_role7",
indices=[
{
"names": [
"*"
],
"privileges": [
"read"
],
"field_security": {
"grant": [
"a.*"
],
"except": [
"a.b*"
]
}
}
],
)
print(resp)
resp1 = client.security.put_role(
name="test_role8",
indices=[
{
"names": [
"*"
],
"privileges": [
"read"
],
"field_security": {
"grant": [
"a.b*"
],
"except": [
"a.b.c*"
]
}
}
],
)
print(resp1)
Js
const response = await client.security.putRole({
name: "test_role7",
indices: [
{
names: ["*"],
privileges: ["read"],
field_security: {
grant: ["a.*"],
except: ["a.b*"],
},
},
],
});
console.log(response);
const response1 = await client.security.putRole({
name: "test_role8",
indices: [
{
names: ["*"],
privileges: ["read"],
field_security: {
grant: ["a.b*"],
except: ["a.b.c*"],
},
},
],
});
console.log(response1);
コンソール
POST /_security/role/test_role7
{
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"grant": [ "a.*" ],
"except" : [ "a.b*" ]
}
}
]
}
POST /_security/role/test_role8
{
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"grant": [ "a.b*" ],
"except" : [ "a.b.c*" ]
}
}
]
}
結果の権限は次のようになります:
Js
{
// role 1 + role 2
...
"indices" : [
{
"names" : [ "*" ],
"privileges" : [ "read" ],
"field_security" : {
"grant": [ "a.*" ],
"except" : [ "a.b.c*" ]
}
}
]
}
フィールドレベルのセキュリティは、alias
フィールドに設定すべきではありません。具体的なフィールドを保護するには、そのフィールド名を直接使用する必要があります。
詳細については、フィールドおよびドキュメントレベルのセキュリティの設定を参照してください。