Настройка безопасности на уровне полей и документов
Вы можете управлять доступом к данным в потоке данных или индексе, добавив разрешения на уровне поля и документа к роли. Разрешения на уровне поля ограничивают доступ к определённым полям в документе. Разрешения на уровне документа ограничивают доступ к определённым документам.
Безопасность на уровне документа и поля в настоящее время предназначена для работы с учётными записями с правами только на чтение. Пользователи с включенной безопасностью на уровне документа и поля для потока данных или индекса не должны выполнять операции записи.
Роль может определять разрешения на уровне поля и документа для каждого индекса. Роль, не определяющая разрешения на уровне поля, предоставляет доступ ко ВСЕМ полям. Аналогично, роль, не определяющая разрешения на уровне документа, предоставляет доступ ко ВСЕМ документам в индексе.
При назначении пользователям нескольких ролей будьте внимательны, чтобы не предоставить им неоправданно расширенный доступ. Каждый пользователь имеет единственный набор разрешений на уровне поля и документа для каждого потока данных или индекса. См. Несколько ролей с безопасностью на уровне документа и поля.
Несколько ролей с безопасностью на уровне документа и поля
Пользователь может иметь много ролей, и каждая роль может определять разные разрешения на тот же поток данных или индекс. Важно понять поведение безопасности на уровне документа и поля в этой ситуации.
Безопасность на уровне документа учитывает каждую роль пользователя и объединяет каждый запрос безопасности на уровне документа для данного потока данных или индекса с оператором «ИЛИ». Это означает, что для возврата документа должен совпасть только один из запросов роли. Например, если роль предоставляет доступ к индексу без безопасности на уровне документа, а другая — с безопасностью на уровне документа, безопасность на уровне документа не применяется; пользователь с обеими ролями имеет доступ ко всем документам в индексе.
Безопасность на уровне поля учитывает каждую роль пользователя и объединяет все перечисленные поля в один набор для каждого потока данных или индекса. Например, если роль предоставляет доступ к индексу без безопасности на уровне поля, а другая — с безопасностью на уровне поля, безопасность на уровне поля не будет применяться для этого индекса; пользователь с обеими ролями имеет доступ ко всем полям в индексе.
Например, предположим, что role_a предоставляет доступ только к полю address документов в index1; никаких ограничений на документы не задано. И наоборот, role_b ограничивает доступ к подмножеству документов в index1; никаких ограничений на поля не задано. Если вы назначите пользователю обе роли, role_a даст пользователю доступ ко всем документам, а role_b даст пользователю доступ ко всем полям.
Если вам нужно ограничить доступ как к документам, так и к полям, рассмотрите возможность разделения документов по индексам.
Шаблонизация запроса роли
При создании роли вы можете указать запрос, который определяет разрешения на уровне документа. Вы можете использовать шаблоны Mustache в запросе роли, чтобы вставить имя пользователя текущего аутентифицированного пользователя в роль. Как и в других местах в Elasticsearch, поддерживающих шаблонизацию или скриптинг, вы можете указать встроенные, хранящиеся или основанные на файлах шаблоны и определить пользовательские параметры. Доступ к данным текущего аутентифицированного пользователя осуществляется через параметр _user.
Например, следующий запрос роли использует шаблон для вставки имени пользователя текущего аутентифицированного пользователя:
resp = client.security.put_role(
name="example1",
indices=[
{
"names": [
"my-index-000001"
],
"privileges": [
"read"
],
"query": {
"template": {
"source": {
"term": {
"acl.username": "{{_user.username}}"
}
}
}
}
}
],
)
print(resp) const response = await client.security.putRole({
name: "example1",
indices: [
{
names: ["my-index-000001"],
privileges: ["read"],
query: {
template: {
source: {
term: {
"acl.username": "{{_user.username}}",
},
},
},
},
},
],
});
console.log(response); POST /_security/role/example1
{
"indices" : [
{
"names" : [ "my-index-000001" ],
"privileges" : [ "read" ],
"query" : {
"template" : {
"source" : {
"term" : { "acl.username" : "{{_user.username}}" }
}
}
}
}
]
} Вы можете получить доступ к следующей информации через переменную _user:
| Свойство | Описание |
|---|---|
| Имя пользователя текущего аутентифицированного пользователя. |
| Если указано, полное имя текущего аутентифицированного пользователя. |
| Если указано, электронный адрес текущего аутентифицированного пользователя. |
| Если привязано, список имён ролей текущего аутентифицированного пользователя. |
| Если указано, хеш, содержащий пользовательские метаданные текущего аутентифицированного пользователя. |
Вы также можете получить доступ к пользовательским метаданным. Например, если вы храните group_id в пользовательских метаданных, вы можете применить безопасность на уровне документа на основе поля group.id в ваших документах:
resp = client.security.put_role(
name="example2",
indices=[
{
"names": [
"my-index-000001"
],
"privileges": [
"read"
],
"query": {
"template": {
"source": {
"term": {
"group.id": "{{_user.metadata.group_id}}"
}
}
}
}
}
],
)
print(resp) const response = await client.security.putRole({
name: "example2",
indices: [
{
names: ["my-index-000001"],
privileges: ["read"],
query: {
template: {
source: {
term: {
"group.id": "{{_user.metadata.group_id}}",
},
},
},
},
},
],
});
console.log(response); POST /_security/role/example2
{
"indices" : [
{
"names" : [ "my-index-000001" ],
"privileges" : [ "read" ],
"query" : {
"template" : {
"source" : {
"term" : { "group.id" : "{{_user.metadata.group_id}}" }
}
}
}
}
]
} Если ваше поле метаданных содержит объект или массив, вы можете получить к нему доступ, используя функцию {{#toJson}}parameter{{/toJson}}.
resp = client.security.put_role(
name="example3",
indices=[
{
"names": [
"my-index-000001"
],
"privileges": [
"read"
],
"query": {
"template": {
"source": "{ \"terms\": { \"group.statuses\": {{#toJson}}_user.metadata.statuses{{/toJson}} }}"
}
}
}
],
)
print(resp) const response = await client.security.putRole({
name: "example3",
indices: [
{
names: ["my-index-000001"],
privileges: ["read"],
query: {
template: {
source:
'{ "terms": { "group.statuses": {{#toJson}}_user.metadata.statuses{{/toJson}} }}',
},
},
},
],
});
console.log(response); POST /_security/role/example3
{
"indices" : [
{
"names" : [ "my-index-000001" ],
"privileges" : [ "read" ],
"query" : {
"template" : {
"source" : "{ \"terms\": { \"group.statuses\": {{#toJson}}_user.metadata.statuses{{/toJson}} }}"
}
}
}
]
} Предварительная обработка документов для добавления данных о безопасности
Чтобы гарантировать, что пользователь читает только свои собственные документы, имеет смысл настроить безопасность на уровне документа. В этом случае каждый документ должен содержать имя пользователя или имя роли, чтобы эта информация могла использоваться запросом роли для безопасности на уровне документа. Это ситуация, когда может помочь процессор ingest set security user.
Безопасность на уровне документа не применяется к API записи. Вы должны использовать уникальные идентификаторы для каждого пользователя, использующего один и тот же поток данных или индекс, в противном случае они могут перезаписывать документы других пользователей. Процессор ingest просто добавляет свойства для текущего аутентифицированного пользователя в индексируемые документы.
Процессор ingest set security user прикрепляет данные, связанные с пользователем (например, username, roles, email, full_name и metadata) от текущего аутентифицированного пользователя к текущему документу, предварительно обрабатывая ingest. Когда вы индексируете данные с помощью конвейера ingest, данные пользователя автоматически прикрепляются к документу. Если аутентифицирующий идентификатор — ключ API, ключ API id, name и metadata (если он существует и не пуст) также прикрепляются к документу.
Дополнительную информацию см. в разделах Конвейеры ingest и Настройка пользователя безопасности.
Безопасность на уровне поля и документа с ключами API между кластерами
Ключи API между кластерами могут использоваться для аутентификации запросов к удалённому кластеру. Параметр search определяет разрешения для межкластерного поиска. Параметр replication определяет разрешения для межкластерной репликации.
replication не поддерживает безопасность на уровне поля или документа. search поддерживает безопасность на уровне поля и документа.
По причинам, аналогичным описанным в Несколько ролей с безопасностью на уровне документа и поля, вы не можете создать один ключ API между кластерами с параметрами search и replication, если параметр search определяет безопасность на уровне документа или поля.
Если вам нужно использовать оба этих параметра и вам нужно определить безопасность на уровне документа или поля для параметра search, создайте два отдельных ключа API между кластерами, один с параметром search, а другой — с параметром replication. Вам также потребуется настроить две разные удалённые подключения к одному кластеру, причём каждое имя подключения будет использовать соответствующий ключ API между кластерами.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/field-and-document-access-control.html