На прошлой неделе в парижском 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": newDate() });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 . | 
