Статьи

Введение в безопасность MongoDB

На прошлой неделе в парижском MUG я немного поболтал о безопасности и MongoDB, и я решил создать этот пост, в котором объясняется, как настроить безопасность из коробки, доступную в MongoDB.

Вы можете найти всю информацию о MongoDB Security в следующей главе документации:

пароль

В этом посте я не буду вдаваться в подробности о том, как развернуть вашу базу данных в защищенной среде (DMZ / Сеть / IP / Местоположение /…). Я сосредоточусь на аутентификации и авторизации и предоставлю вам шаги для обеспечения безопасности доступа. в вашу базу данных и данные. Я должен упомянуть, что по умолчанию при установке и запуске MongoDB безопасность не включена. Просто чтобы было легче работать. Первая часть безопасности — Аутентификация , у вас есть несколько вариантов, задокументированных здесь . Давайте сосредоточимся на механизме «MONGODB-CR».

Вторая часть — это Авторизация, чтобы выбрать, что пользователь может делать или нет, когда он подключен к базе данных. Документация по авторизации доступна здесь .

Давайте теперь документируем, как:

  1. Создать пользователя-администратора
  2. Создать приложение Пользователи

Для каждого типа пользователей я покажу, как предоставлять определенные разрешения.

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. Создайте пользователя-администратора

Прежде всего, нужно создать пользователя-администратора, который также может создавать пользователей, поэтому мы должны:

  1. перейти к оболочке монго
  2. подключиться к базе данных `admin ‘
  3. создать пользователя и назначить ему роль userAdminAnyDatabase
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
use admin
 
var 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 -p
 
use ecommerce
 
var 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 -p
 
db.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 -p
 
var 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 -p
 
show dbs
 
use ecommerce
 
db.products.find();

Если вы попытаетесь вставить / обновить / удалить документ, вы получите исключение.

Добавить новую роль пользователю

Давайте теперь посмотрим, как добавить новую роль для пользователя. Например, я хочу дать администратору возможность читать и записывать любую базу данных. Для этого мне просто нужно добавить роль readWriteAnyDatabase для администратора.

1
2
3
4
5
6
7
8
> mongo admin -u admin -p
 
db.grantRolesToUser(
    "admin",
    [{ "role" : "readWriteAnyDatabase", "db" : "admin" }]
)
 
db.getUser("admin");

С помощью команды db.grantRolesToUser я добавил эту роль пользователю admin, а с помощью db.getUser я могу просмотреть профиль пользователя.

Теперь администратор должен иметь возможность создавать новые базы данных, коллекции и документы, давайте попробуем:

1
2
3
4
5
6
7
use hr
 
db.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 admin
 
var 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 .