Настройка безопасности на уровне поля и документа
Вы можете управлять доступом к данным в потоке данных или индексе, добавив разрешения на безопасность на уровне поля и документа к роли. Разрешения безопасности на уровне поля ограничивают доступ к определённым полям внутри документа. Разрешения безопасности на уровне документа ограничивают доступ к определённым документам.
Безопасность на уровне документа и поля в настоящее время предназначена для работы с учётными записями с правами только на чтение. Пользователи с включённой безопасностью на уровне документа и поля для потока данных или индекса не должны выполнять операции записи.
Роль может определять разрешения на уровне поля и документа на основе каждого индекса. Роль, которая не указывает разрешения на уровне поля, предоставляет доступ ко ВСЕМ полям. Аналогично, роль, которая не указывает разрешения на уровне документа, предоставляет доступ ко ВСЕМ документам в индексе.
При назначении пользователям нескольких ролей будьте внимательны, чтобы не предоставить несанкционированный доступ. Каждый пользователь имеет один набор разрешений на уровне поля и документа для каждого потока данных или индекса. См. Несколько ролей с безопасностью на уровне документа и поля.
Несколько ролей с безопасностью на уровне документа и поля
Пользователь может иметь много ролей, и каждая роль может определять разные разрешения для того же потока данных или индекса. Важно понимать поведение безопасности на уровне документа и поля в этом случае.
Безопасность на уровне документа учитывает каждую роль, имеющуюся у пользователя, и объединяет каждый запрос безопасности на уровне документа для данного потока данных или индекса с операцией «ИЛИ». Это означает, что для возврата документа должен соответствовать только один из запросов роли. Например, если роль предоставляет доступ к индексу без безопасности на уровне документа, а другая — с безопасностью на уровне документа, безопасность на уровне документа не применяется; пользователь с обеими ролями имеет доступ ко всем документам в индексе.
Безопасность на уровне поля учитывает каждую роль пользователя и объединяет все перечисленные поля в один набор для каждого потока данных или индекса. Например, если одна роль предоставляет доступ к индексу без безопасности на уровне поля, а другая — с безопасностью на уровне поля, безопасность на уровне поля не применяется для этого индекса; пользователь с обеими ролями имеет доступ ко всем полям в индексе.
Например, предположим, что role_a предоставляет доступ только к полю address документов в index1; она не указывает никаких ограничений на документы. И наоборот, role_b ограничивает доступ к подмножеству документов в index1; она не указывает никаких ограничений на поля. Если вы назначите пользователю обе роли, role_a предоставит пользователю доступ ко всем документам, а role_b предоставит пользователю доступ ко всем полям.
Если вам нужно ограничить доступ как к документам, так и к полям, рассмотрите возможность разделения документов по индексу.
Шаблонизация запроса роли
При создании роли вы можете указать запрос, который определяет разрешения безопасности на уровне документа. Вы можете по желанию использовать шаблоны Mustache в запросе роли, чтобы вставить имя пользователя текущего аутентифицированного пользователя в роль. Как и в других местах в Elasticsearch, поддерживающих шаблонирование или скрипты, вы можете указать встроенные, хранимые или основанные на файлах шаблоны и определить пользовательские параметры. Вы получаете доступ к данным текущего аутентифицированного пользователя через параметр _user.
Например, следующий запрос роли использует шаблон для вставки имени пользователя текущего аутентифицированного пользователя:
POST /_security/role/example1
{
"indices" : [
{
"names" : [ "my-index-000001" ],
"privileges" : [ "read" ],
"query" : {
"template" : {
"source" : {
"term" : { "acl.username" : "{{_user.username}}" }
}
}
}
}
]
} Вы можете получить доступ к следующей информации через переменную _user:
| Свойство | Описание |
|---|---|
| Имя пользователя текущего аутентифицированного пользователя. |
| Если указано, полное имя текущего аутентифицированного пользователя. |
| Если указано, адрес электронной почты текущего аутентифицированного пользователя. |
| Если привязано, список имён ролей текущего аутентифицированного пользователя. |
| Если указано, хэш, содержащий пользовательские метаданные текущего аутентифицированного пользователя. |
Вы также можете получить доступ к пользовательским метаданным. Например, если вы храните group_id в своих метаданных пользователя, вы можете применить безопасность на уровне документа, основываясь на поле group.id в своих документах:
POST /_security/role/example2
{
"indices" : [
{
"names" : [ "my-index-000001" ],
"privileges" : [ "read" ],
"query" : {
"template" : {
"source" : {
"term" : { "group.id" : "{{_user.metadata.group_id}}" }
}
}
}
}
]
} Если ваше поле метаданных содержит объект или массив, вы можете получить к нему доступ, используя функцию {{#toJson}}parameter{{/toJson}}.
POST /_security/role/example3
{
"indices" : [
{
"names" : [ "my-index-000001" ],
"privileges" : [ "read" ],
"query" : {
"template" : {
"source" : "{ \"terms\": { \"group.statuses\": {{#toJson}}_user.metadata.statuses{{/toJson}} }}"
}
}
}
]
} Предварительная обработка документов для добавления данных о безопасности
Чтобы гарантировать, что пользователь читает только свои собственные документы, имеет смысл настроить безопасность на уровне документа. В этом случае каждый документ должен содержать имя пользователя или имя роли, чтобы эта информация могла использоваться запросом роли для безопасности на уровне документа. Это ситуация, в которой процессор индексации Set Security User Processor может помочь.
Безопасность на уровне документа не применяется к API записи. Вы должны использовать уникальные идентификаторы для каждого пользователя, использующего один и тот же поток данных или индекс, иначе они могут перезаписать документы других пользователей. Процессор индексации просто добавляет свойства для текущего аутентифицированного пользователя к индексируемым документам.
Процессор Установка пользователя безопасности прикрепляет данные, связанные с пользователем (такие как username, roles, email, full_name и metadata) от текущего аутентифицированного пользователя к текущему документу путём предварительной обработки индексации. При индексировании данных с помощью конвейера индексации данные пользователя автоматически прикрепляются к документу. Если аутентифицирующий идентификатор — ключ API, API-ключ id, name и metadata (если он существует и не пуст) также прикрепляются к документу.
Дополнительную информацию см. в разделах Узел индексации и Процессор установки пользователя безопасности.
© 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/7.17/field-and-document-access-control.html