На прошлой неделе в парижском MUG я немного поболтал о безопасности и MongoDB, и я решил создать этот пост, в котором объясняется, как настроить безопасность из коробки, доступную в MongoDB.
Вы можете найти всю информацию о MongoDB Security в следующей главе документации:
В этом посте я не буду вдаваться в подробности о том, как развернуть вашу базу данных в защищенной среде (DMZ / Сеть / IP / Местоположение /…). Я сосредоточусь на аутентификации и авторизации и предоставлю вам шаги для обеспечения безопасности доступа. в вашу базу данных и данные. Я должен упомянуть, что по умолчанию при установке и запуске MongoDB безопасность не включена. Просто чтобы было легче работать. Первая часть безопасности — Аутентификация , у вас есть несколько вариантов, задокументированных здесь . Давайте сосредоточимся на механизме «MONGODB-CR».
Вторая часть — это Авторизация, чтобы выбрать, что пользователь может делать или нет, когда он подключен к базе данных. Документация по авторизации доступна здесь .
Давайте теперь документируем, как:
- Создать пользователя-администратора
- Создать приложение Пользователи
Для каждого типа пользователей я покажу, как предоставлять определенные разрешения.
1. Запустите MongoDB
Как я уже говорил, по умолчанию безопасность не включена при запуске MongoDB; поэтому первое, что нужно сделать, это включить его с помощью
Параметр --auth .
|
1
2
3
4
5
6
7
8
|
> mkdir /data/db> mongod --auth........2015-02-04T06:56:37.875+0100 [conn1] note: no users configured in admin.system.users, allowing localhost access... |
MongoDB запускается, и до тех пор, пока вы не создадите пользователя, вы можете подключиться с локального хоста для создания некоторых пользователей (особенно администратора). Это то, что называется исключением localhost .
Примечание: я здесь документирую безопасность в простой конфигурации, я приглашаю вас посмотреть документацию при развертывании кластера Sharded .
Теперь, когда мы запустили MongoDB, мы можем создавать пользователей.
2. Создайте пользователя-администратора
Прежде всего, нужно создать пользователя-администратора, который также может создавать пользователей, поэтому мы должны:
- перейти к оболочке монго
- подключиться к базе данных `admin ‘
- создать пользователя и назначить ему роль userAdminAnyDatabase
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
use adminvar user = { "user" : "admin", "pwd" : "manager", roles : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ]}db.createUser(user);exit |
Теперь, когда вы создали пользователя в MongoDB, работающем с --auth , анонимные соединения не смогут ничего сделать с базой данных.
Например, вы можете проверить выполнение db.coll.insert({'x':0}) show dbs или db.coll.insert({'x':0}) , вы увидите ошибки авторизации.
Связаться с пользователем Admnistrator
Теперь, когда у нас есть пользователь-администратор, вы можете подключиться к базе данных с этим пользователем:
|
1
|
> mongo admin -u admin -p |
Наш администратор имеет роль userAdminAnyDatabase . С этой ролью вы можете управлять пользователем; но эта роль не может читать / записывать данные из баз данных / коллекций приложений.
Теперь нам нужно создать нового пользователя для нашего приложения eCommerce.
3. Создать пользователя приложения
Теперь мы создадим новый пользовательский сайт , отвечающий за базу данных электронной коммерции.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
> mongo admin -u admin -puse ecommercevar user = { "user" : "website", "pwd" : "abc123", roles : [ { "role" : "readWrite", "db" : "ecommerce" } ]}db.createUser(user);exit |
Этот пользователь сможет читать / писать в базе данных электронной коммерции
Связаться с пользователем приложения
Используя оболочку Монго, вы можете подключаться и создавать / запрашивать данные
|
1
2
3
4
5
6
7
|
> mongo ecommerce -u website -pdb.products.insert({ "title" : "MongoDB in Action" });db.products.findOne();db.products.update({}, {"$set" : { "type" : "book" } }) |
Как видите, этот пользователь имеет идеальный профиль для вашего приложения. Обратите внимание, что если вы попытаетесь запросить или изменить другую базу данных с этим пользователем, вы получите исключения авторизации.
Создать пользователя для отчетов (только для чтения)
В вашем приложении может потребоваться пользователь, который может только читать данные, скажем, во всех базах данных. Для этого вам просто нужно назначить роль
readAnyDatabase .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
> mongo admin -u admin -pvar user = { "user" : "reporting", "pwd" : "abc123", roles : [ { "role" : "readAnyDatabase", "db" : "admin" } ]}db.createUser(user);exit |
Этот пользователь сможет запрашивать все базы данных и коллекции, включая команду show dbs .
Давайте свяжемся с сообщающим пользователем:
|
1
2
3
4
5
6
7
|
> mongo admin -u reporting -pshow dbsuse ecommercedb.products.find(); |
Если вы попытаетесь вставить / обновить / удалить документ, вы получите исключение.
Добавить новую роль пользователю
Давайте теперь посмотрим, как добавить новую роль для пользователя. Например, я хочу дать администратору возможность читать и записывать любую базу данных. Для этого мне просто нужно добавить роль readWriteAnyDatabase для администратора.
|
1
2
3
4
5
6
7
8
|
> mongo admin -u admin -pdb.grantRolesToUser( "admin", [{ "role" : "readWriteAnyDatabase", "db" : "admin" }])db.getUser("admin"); |
С помощью команды db.grantRolesToUser я добавил эту роль пользователю admin, а с помощью db.getUser я могу просмотреть профиль пользователя.
Теперь администратор должен иметь возможность создавать новые базы данных, коллекции и документы, давайте попробуем:
|
1
2
3
4
5
6
7
|
use hrdb.employees.insert({ "name":"John Doe", "hire_date" : new Date() });db.organization.insert({ "name" : "Development" });db.employees.findOne(); |
Создание и использование пользовательских ролей
Другая функция, которая часто используется в сфере безопасности, связана с ролями. В некоторых случаях вы хотите предоставить пользователю несколько ролей, например:
- все разрешения на базу данных электронной коммерции
- прочитать коллекцию сотрудников в базе данных хр
Для этого вы можете создать роль, которая предоставит все разрешения и назначит ее пользователям. Давайте сделаем это с помощью администратора.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
use adminvar role = { "role" : "webSiteManagerRole", privileges : [ { "resource": {"db" : "hr", "collection" : "employees"}, "actions": ["find"] } ], "roles" : [ { "role" : "readWrite", "db" : "ecommerce" } ]}db.createRole( role );var user = { "user" : "master", "pwd" : "abc123", roles : [ { "role" : "webSiteManagerRole", "db" : "admin" } ]}db.createUser(user);exit |
Если вы подключитесь сейчас с пользователем «master», вы увидите, что пользователь:
- можете делать все что угодно в базе данных электронной коммерции
- может прочитать коллекцию «hr.employees», только на этом
- больше ничего не могу сделать.
Роли и привилегии
Как вы видели в предыдущем разделе, вы можете создавать роли и назначать привилегии этим ролям. Это очень мощный инструмент, и вы действительно можете контролировать каждое действие в базе данных. Я приглашаю вас подробно ознакомиться со встроенными ролями и привилегиями, это поможет вам во многом выбрать подходящие для вашего приложения:
Вывод
В этом посте я быстро объяснил, как:
- Использовать аутентификацию MongoDB
- Создать пользователей
- Назначьте роли и привилегии для пользователей.
Интересно знать, что все, что я вам показал в оболочке, можно сделать из пользовательского интерфейса в MMS
| Ссылка: | Введение в безопасность MongoDB от нашего партнера JCG Тугдуала Граля в блоге Tug’s Blog . |
