Плагин MongoDB ищет базы данных и коллекции и управляет политиками доступа в терминах самого MongoDB: чтение, потоки изменений, вставка, обновление и удаление, индексы, параметры коллекции, обход проверки документов и удаление — по коллекциям; создание коллекций и удаление базы — по базам данных; просмотр списка всех баз и мониторинг — для развёртывания в целом. Идентификатор плагина и тип сервиса — mongodb. Сервисный плагин работает на сервере GrantForge; агент MongoDB, работающий рядом с развёртыванием, применяет политики собственными ролями MongoDB.
Интеграционные тесты Testcontainers в репозитории охватывают наборы реплик MongoDB 6.0, 7.0, 8.0 и 9.0, а также Kerberos на Percona Server for MongoDB 8.0. Это не сертифицирует все остальные версии.
Установка
Дистрибутив включает плагин в plugins/mongodb. Убедитесь, что mongodb включён в Управление платформой → Плагины; после обновления каталога плагинов выполните повторное сканирование. Плагин общается с MongoDB через официальный Java-драйвер MongoDB в собственном загрузчике классов.
Добавление сервиса данных
- Откройте Права на данные → Сервисы данных, добавьте сервис и выберите MongoDB (
mongodb). - Укажите строку подключения к развёртыванию в том виде, в каком её принимает любой клиент MongoDB.
- Укажите, как входит пользователь для поиска, проверьте подключение и сохраните сервис. Проверка выполняет вход и описывает развёртывание: версию MongoDB, набор реплик это, шардированный кластер или один сервер, кто вошёл и сколько баз данных видит этот пользователь.
Пользователь для поиска позволяет GrantForge находить ресурсы и не является пользователем, который читает или записывает. Успешная проверка подключения не означает, что доступ уже следует политикам.
| Параметр | Назначение |
|---|---|
mongodb.uri |
Обязательно: строка подключения, например mongodb://db1.example.com:27017,db2.example.com:27017/?replicaSet=rs0 или mongodb+srv://cluster.example.com/. Параметры вроде tls=true указываются здесь; учётные данные — нет, строка с ними отклоняется |
auth.mechanism |
SCRAM-SHA-256 (по умолчанию) или SCRAM-SHA-1 для пользователей с паролем, MONGODB-X509 для клиентского сертификата, PLAIN для LDAP, GSSAPI для Kerberos |
username |
Пользователь для поиска. При GSSAPI — принципал; при MONGODB-X509 пустое значение берёт его из сертификата |
password |
Пароль пользователя для поиска, хранится в зашифрованном виде |
auth.source |
SCRAM: база данных, в которой определён пользователь, по умолчанию admin. Остальные механизмы используют $external |
tls.ca.file |
При tls=true: путь на сервере GrantForge к PEM-сертификатам ЦС, по которым проверяются серверы. Пустое значение использует сертификаты JVM |
tls.certificate.key.file |
При tls=true: путь на сервере GrantForge к одному PEM-файлу с клиентским сертификатом и его ключом, как его принимает mongosh |
tls.certificate.key.password |
Пароль зашифрованного ключа, хранится в зашифрованном виде |
kerberos.keytab |
GSSAPI: путь на сервере GrantForge к keytab принципала. Пустое значение использует пароль |
kerberos.kdc |
GSSAPI: KDC области через запятую. Пустое значение использует krb5.conf сервера |
kerberos.service.name |
GSSAPI: имя службы принципала серверов, по умолчанию mongodb |
timeout |
Сколько могут занимать поиск сервера, подключение и одна команда, по умолчанию 30000, в диапазоне 1..600000 миллисекунд |
Отклонённый вход, пользователь для поиска без нужной привилегии и недоступное развёртывание сообщаются как таковые.
Что видит пользователь для поиска
MongoDB перечисляет базы данных и коллекции, на которые у пользователя есть хоть какая-то привилегия, поэтому поиск показывает то, что может видеть пользователь для поиска. Дайте ему read на то, для чего пишутся политики, или readAnyDatabase на всё. Собственные базы MongoDB admin, config и local и системные коллекции не показываются: политики их не решают.
Ресурсы и типы доступа
| Уровень | Сопоставление | Типы доступа |
|---|---|---|
deployment |
Подстановочные знаки, с учётом регистра. Имя набора реплик, sharded для шардированного кластера, standalone для одного сервера |
list_databases, monitor |
database |
Подстановочные знаки, с учётом регистра | create, drop_database |
collection |
Подстановочные знаки, с учётом регистра. Коллекция или представление базы данных | read, change_stream, insert, update, remove, create_index, drop_index, alter, bypass_validation, drop |
| Тип доступа | Действия MongoDB |
|---|---|
read |
find, listIndexes, collStats, killCursors; на всей базе данных также listCollections и dbStats |
change_stream |
changeStream; чтобы открыть поток, MongoDB требует ещё и find |
insert, update, remove |
insert, update, remove |
create_index, drop_index |
createIndex, dropIndex |
alter |
collMod, validate, convertToCapped |
bypass_validation |
bypassDocumentValidation |
drop |
dropCollection |
create |
createCollection на базе данных: создание коллекций и представлений |
drop_database |
dropDatabase |
list_databases |
listDatabases: имя каждой базы данных, а не только тех, на которые у пользователя есть привилегия |
monitor |
serverStatus, top, replSetGetStatus, connPoolStats, hostInfo, inprog |
В значениях политик * соответствует любому тексту, а ? — одному символу. Редактор политик предлагает развёртывание, базы данных и коллекции баз, названных в политике.
Привилегия MongoDB на удаление базы данных — это привилегия на удаление каждой её коллекции, поэтому агент выдаёт drop_database только там, где политики разрешают и удаление каждой коллекции. Иначе он не выдаёт привилегию и сообщает об этом, вместо того чтобы дать больше, чем разрешают политики. Администрирование пользователей и ролей не является типом доступа, и никакая политика его не даёт.
Строки и поля
MongoDB не фильтрует строки и не маскирует поля по ролям, поэтому этот тип сервиса не предлагает ни того, ни другого. Представление даёт ограниченное чтение: MongoDB проверяет читателя представления только по самому представлению, так что политика, разрешающая read на представление и ничего на его источник, показывает пользователю то, что показывает представление, и не больше.
db.getSiblingDB("sales").createView("orders_public", "orders", [{ $project: { card: 0 } }])Пример политик
Допустим, в развёртывании есть базы данных sales и hr. Создайте в одном сервисе данных такие включённые политики:
| Ресурс | Правило |
|---|---|
database=sales, collection=* |
Разрешить read группе analysts |
database=sales, collection=orders_public |
Разрешить read пользователю support |
database=sales, collection=orders |
Разрешить insert и update пользователю ingest; запретить read группе contractors |
database=team_* |
Разрешить create группе data-team |
database=team_*, collection=* |
Разрешить read, insert, update, remove, create_index и drop группе data-team |
deployment=* |
Разрешить monitor пользователю dashboards |
Когда агент применит снимок, участники analysts будут читать весь sales, включая коллекции, созданные позже; support будет читать представление без его источника; ingest будет записывать в orders, не читая его; участники data-team будут свободно работать в базах team_; а dashboards будет видеть состояние сервера и никаких данных.
Применение политик
Сервисный плагин управляет политиками и ищет ресурсы. Для их применения нужен один агент MongoDB на развёртывание; развёртывание и проверки описаны в разделе Агент MongoDB.
