Enabling authentication in mongodb | Dustin John Pfister at github pages

Используйте управление доступом на основе ролей

Проверка подлинности клиента, которую вы настроили ранее, гарантирует, что ваш сервер MongoDB может проверить подлинность подключающегося клиента. Теперь нужно подумать, что собственно может делать этот самый клиент после подключения.

2 – enabling or disabling authentication via mongod.cfg

So far my preferred way of enabling or disabling authentication is by editing the mongod.cfg file. As you would expect this is a configuration file for mongodb that is stored in several different locations depending on the version of mongodb, the os, or the setup.

1 – Editing mongod.cfg, and restarting mongod in windows 10 with mongodb server 4

The mongo.conf file that I am using in a windows environment is located in the bin folder of the programFiles folder for mongodb.

Anyway it currently looks like this:

2.1 – Using one of these scripts

To use one of these scripts authentication must be disabled, and the script must be called with mongo, or from within the mongo shell with the load command.

2.2 – Using authentication

If authentication is enabled these scripts can still be used just by supplying an auth object to them, via the eval option, or by placing it in another javaScript file and running that first.

3.5 – The dropall.js file

I have made this script for the purpose of dropping the whole database if I want to in order to quickly start over.

4 – the conf.json file

The conf.json file that I have at the root of the project is used to provide login credentials to scripts that use the connect.js file. What I have in the conf.json file will be passed as an options object to connect.js, and will result in a connection string that uses the credentials defined here.

Похожее:  Быстрый, простой и рабочий способ обхода Captive Portal (hotspot с авторизацией на web-интерфейсе) -

Here I am using login credentials

This will result in a connection string that does not have login credentials

4 – using the project

So now I should cover how to use this project to point out some basic things about setting up authentication in mongodb.

Authorization in mongodb (role-based access control)

In MongoDB, you control who has access to what resources on a database and to which degree through a mechanism called Role-Based Access Control, often shortened as RBAC.

How mongodb controls access with role-based access control

Access control — also known as authorization — is a security technique that involves determining who can gain access to which resources.

Prerequisites

To follow along with this guide, you’ll need an account on a MongoDB server with the appropriate privileges.

Step 1 — outlining the example scenario and preparing the sample databases

To explain how Role-Based Access Control — RBAC, for short — works in practice, this guide follows an example scenario with an imaginary sales company called Sammy Sales that uses two databases.

The first database (called sales) will store data about customer orders in the company shop with two separate collections: customers for their customers’ personal data and orders for order details.

The second database (this one called reports) will store aggregated reports on monthly sales. This database will contain a single collection named reports.

Step 3 — testing authentication settings

To begin testing that the authentication requirements you added in the previous step are working correctly, start by connecting without specifying any credentials to verify that your actions are indeed restricted:

  1. mongo

Now that you’ve enabled authentication, none of the warnings you encountered previously will appear:

MongoDB shell version v4.4.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5d50ed96-f7e1-493a-b4da-076067b2d898") }
MongoDB server version: 4.4.0
> 

Confirm whether your access is restricted by running the show dbs command again:

  1. show dbs

Авторизация

MongoDB включает автоматическую авторизацию клиента, когда включена аутентификация участника (через файл-ключ или X.509). Если вы по какой-то причине решили не использовать внутреннюю аутентификацию участников, включите авторизацию явно:

security:
  authorization: enabled

Встроенные роли

Чтобы начать использовать RBAC, вашим пользователям MongoDB нужно назначить роли. Роль предоставляет разрешения на выполнение определенных действий (actions) с определенными ресурсами (resources).

Ресурс может быть коллекцией, базой данных или кластером (для действий, требующих разрешений на уровне кластера), а действия определяют операции, которые пользователь может выполнять с данным ресурсом.

MongoDB предоставляет целый ряд встроенных ролей, которые служат хорошей отправной точкой. Вы можете ознакомиться с полным списком встроенных ролей здесь но наиболее распространенными являются:

Эти роли доступны в каждой базе данных MongoDB и привязаны к конкретной базе данных.

Используйте teleport для безопасного доступа

Teleport Database Access — это продукт с открытым исходным кодом, который реализует многие из лучших практик, обсуждаемых в этой статье, и может использоваться для безопасного доступа к вашим кластерам MongoDB.

В частности, Database Access был разработан с учетом следующих принципов безопасности:

Начать работу с Database Access можно, изучив документацию и руководство для MongoDB.

Используйте x.509 аутентификацию клиентов

Сертификат подлинности клиента позволяет серверу подтвердить подлинность подключающихся клиентов посредством проверки, что X.509 сертификат, представленный клиентом, подписан доверенным центром сертификации.

Как и в случае с серверным TLS, сначала создайте CA для клиентских сертификатов и подпишите им сертификат пользователя, которого мы для примера назовем Элис (Alice).

Создайте самоподписанный клиентский CA:

openssl req -sha256 -new -x509 -days 365 -nodes 
    -out client-ca.crt 
    -keyout client-ca.key

Сгенерируйте клиентский CSR. Поле «Subject» идентифицирует вашего пользователя MongoDB:

openssl req -sha256 -new -nodes 
    -subj "/CN=alice" 
    -out alice.csr 
    -keyout alice.key

Подпишите сертификат клиента:

openssl x509 -req -sha256 -days 365 
    -in alice.csr 
    -CA client-ca.crt 
    -CAkey client-ca.key 
    -CAcreateserial 
    -out alice.crt

Как и для сервера, объедините сертификат и ключ Элис в PEM-файл:

cat alice.crt alice.key > alice.pem

Обратите внимание, что при использовании X.509 аутентификации MongoDB считает именем пользователя все поле Subject сертификата клиента, поэтому созданный выше сертификат будет идентифицировать пользователя MongoDB как CN=alice (а не просто alice).

Используйте x.509 аутентификацию сервера

Теперь же, когда мы прошлись по основным способам защиты сетевого периметра вашего сервера MongoDB, давайте более подробно рассмотрим, как сделать вашу клиент-серверную (и сервер-серверную в случае использования наборов реплик) связь более защищенной.

Когда-то давным-давно дистрибутивы MongoDB не поддерживали TLS по умолчанию, поэтому вам пришлось бы самостоятельно скомпилировать сервер с openssl, чтобы получить ее. К счастью, те времена давно прошли, и любая более-менее актуальная версия MongoDB может похвастаться встроенной поддержкой TLS.

Настройка TLS-аутентификации сервера позволяет подключенным клиентам проверять подлинность сервера. Для начала вам нужно получить сертификат TLS, который ваш сервер будет предоставлять клиентам, и сертификат CA (Certification Authority — удостоверяющий центр), который клиенты будут использовать для проверки того, что представленный сертификат подписан доверенным центром.

Используйте x.509 аутентификацию участников

 Участники в наборах реплик или шардированные кластеры (sharded clusters) также могут аутентифицировать друг-друга с помощью клиентских сертификатов, что является лучшей альтернативой использования файлов-ключей.

MongoDB накладывает несколько ограничений на сертификаты, которые могут использоваться для аутентификации участников:

Сертификаты, которые вы сгенерировали для аутентификации сервера выше, удовлетворяют этим требованиям, поэтому все, что вам нужно сделать, это включить X.509 аутентификацию участников в конфигурации:

security:
  clusterAuthMode: x509

Чтобы проверить, что она работает, поищите сообщения об аутентификации участников в логах MongoDB, которые будут выглядеть примерно так:

Используйте обратное ssh-туннелирование

Обратное туннелирование, также известное как переадресация удаленного порта (remote port forward), — еще одна возможность SSH, которая может пригодиться при ограничении сетевого доступа к серверу базы данных.

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

Следующая команда, запущенная с сервера MongoDB, создаст обратный туннель к клиентскому хосту и начнет переадресацию порта 27017 клиентского хоста на локальный порт 38128:

Используйте переадресацию портов ssh

Конфигурацию файрвола можно изолировать еще больше, разрешив только один входящий порт SSH, если вы используете возможность протокола SSH перебрасывать порты (port forwarding).

Чтобы сделать это, установите перенаправление локального порта перед подключением к серверу MongoDB:

Используйте сокеты домена unix

Если ваши клиенты все-таки подключаются с того же узла, в Unix-подобных системах можно полностью отключить прослушивание TCP-сокетов и перевести клиентов на подключение через сокеты домена Unix.

Чтобы это сделать, задайте путь к сокету в bindIp и настройте права доступа к сокету, чтобы разрешить вашим клиентам к нему подключаться:

net:
  bindIp: /tmp/mongodb-27017.sock
  unixDomainSocket:
    filePermissions: 0660

Вы можете использовать команду netstat, чтобы убедиться, что сервер MongoDB не прослушивает никаких интерфейсов с этой конфигурацией:

sudo netstat -lpten | grep mongo

Как работает авторизация в mongo?

Здраствуйте.

На сервере имеется установленная монго версии 2.4.9.

По-умолчанию в конфиге строка auth=true закоментирована.

В монго созданы пользователи:

> use admin
switched to db admin
> show users
{
	"_id" : ObjectId("55631c4ced1bdfc880fda8e0"),
	"user" : "admin",
	"pwd" : "f306c561a12b1be8478e4cc3b460433a",
	"roles" : [
		"userAdminAnyDatabase",
		"dbAdminAnyDatabase",
		"readWriteAnyDatabase"
	]
}
{
	"_id" : ObjectId("5563371cb7537b3e14bdfb4b"),
	"user" : "rUser",
	"pwd" : "eee18df57c91293310dbf78649955a84",
	"roles" : [
		"readAnyDatabase"
	]
}

Когда в конфиге убираю решетку у строки “#auth=true” и остается “auth=true”, то при вызове команды “mongo” вхожу в косоль монго, но базы данных само собой не вижу (на команду “show dbs” получаю ошибку “…listDatabases failed:{ “ok” : 0, “errmsg” : “unauthorized” }…”).

Но почему возникает эта ошибка:

> use admin
switched to db admin
> db.auth('admin', 'password')
1
> show dbs
Tue May 26 19:48:05.074 listDatabases failed:{ "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/mongo.js:46

Ограничьте ip участников

Помимо включения X.509 аутентификации участников, вы также можете ограничить соединения до участников только из авторизованных сетей.

Параметр security.clusterIpSourceWhitelist позволяет указать IP и диапазоны CIDR для приема подключений от участников набора реплик или шардированных кластеров:

security:
  clusterIpSourceWhitelist:
    - 127.0.0.1
    - ::1
    - 192.168.0.0/24

Если IP подключающегося участника (mongod или mongos) отсутствует в списке или диапазоне CIDR, он не будет аутентифицирован.

Ограничьте доступ к сети с помощью файрвола

Однако чаще всего вашим клиентам необходимо подключаться к серверам MongoDB по сети. После изменения порта по умолчанию и ограничения адресов прослушивания, следующий уровень защиты, который вы можете (и должны) использовать, — это защита доступа к сети.

В Linux вы можете использовать утилиту iptables, чтобы заблокировать на машине, на которой работает ваш сервер MongoDB, все порты кроме тех, которые требуются вашим клиентам, и разрешить соединения только с доверенных IP-адресов:

# Сохраняем установленные соединения.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Открываем порт SSH для локальной подсети.
# Стоит также переместить SSH с его дефолтного порта 22 - это распространенная практика.
iptables -A INPUT -p tcp -m state --state NEW --dport 42422 -s 192.168.0.0/24 -j ACCEPT

# Открываем порт MongoDB для локальной подсети.
iptables -A INPUT -p tcp -m state --state NEW --dport 38128 -s 192.168.0.0/24 -j ACCEPT

# Разрешаем весь исходящий трафик, и отбрасывать весь остальной входящий.
iptables -A OUTPUT -j ACCEPT
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP

Используйте DROP вместо REJECT для всего остального входящего трафика — это усложнит работу злоумышленника, если он решит просканировать порты на вашем сервере, чтобы увидеть, какое программное обеспечение на нем работает.

Также, когда вам приходится иметь дело с iptables, вместо того чтобы перезагружать цепочки напрямую лучше использовать инструмент iptables-apply, чтобы не заблокировать себя в случае ошибки в правилах.

Ограничьте прослушиваемые интерфейсы

Начиная с версии 3.6, MongoDB по умолчанию привязывается к localhost. Эту настройку по умолчанию, вероятнее всего, вам придется изменить, если только все ваши клиенты не подключаются с того же узла.

Используйте параметр конфигурации net.bindIp, чтобы указать IP-адрес(-а), которые ваши клиенты будут использовать для подключения к серверу, или DNS-имена, которые сделают конфигурацию устойчивой к изменениям IP и пригодятся для создания наборов реплик и сегментированных кластеров:

net:
  bindIp: localhost,192.168.0.1,mongo-1.internal

Не используйте параметр net.bindIpAll и 0.0.0.0 в качестве IP привязки — это заставит сервер прослушивать все доступные интерфейсы.

Подключайтесь с хоста-бастиона

Использование бастиона или jump-сервера — это обычная практика для ограничения доступа к вашей внутренней инфраструктуре. Бастион действует как клиентский хост – вы никогда не подключаетесь к своему серверу MongoDB (или любому другому) напрямую со своего компьютера.

В сочетании с переадресацией локального порта SSH, хост-бастион может использоваться без шифрования соединения, поэтому вам даже не нужен SSH при подключении к нему:

Реализуйте логирование доступа и жрунал запросов

Ведение подробного контрольного журнала является неотъемлемой частью усиления безопасности любой системы. К сожалению, MongoDB не предоставляет встроенного функционала логирования в своей версии с открытым исходным кодом. 

Система логирования MongoDB является компонентной. В целях безопасности вас больше всего интересуют следующие компоненты:

Включите это в конфигурацию:

systemLog:
  component:
    accessControl:
      verbosity: 1
    network:
      verbosity: 1
    command:
      verbosity: 1
    query:
      verbosity: 1
    write:
      verbosity: 1

Журналы MongoDB представляют собой структурированные JSON-документы, поэтому вы также можете отправлять их во внешнюю систему, такую ​​как Elasticsearch, для индексации и анализа с помощью таких инструментов, как Logstash.

Роли пользователей

Иногда вам может потребоваться немного большей гибкости; например, для создания более детализированных ролей или расширения одной из встроенных ролей парой-тройкой дополнительных разрешений. Для подобных ситуаций MongoDB поддерживает определяемые пользователем роли.

Чтобы создать свою собственную роль, определите, какие действия она разрешит и над какими ресурсами. Как обсуждалось выше, ресурс – это база данных, коллекция или кластер:

// Задает коллекцию "metrics" в базе данных "example".
{ db: "example", collection: "metrics" }

// Определяет все несистемные коллекции в базе данных "example".
{ db: "example", collection: "" }

// Определяет коллекции "metrics" для всех баз данных.
{ db: "", collection: "metrics" }

// Определяет все несистемные коллекции во всех базах данных.
{ db: "", collection: "" }

// Определяет разрешения для всего кластера.
{ cluster: true }

Смените порт по умолчанию

Начнем с самого простого. Как и любая другая база данных, по умолчанию MongoDB прослушивает клиентские подключения на порту 27017, что ни для кого не является секретом. Сканирование портов (port scanning) — излюбленная техника хакеров (и к тому же достаточно простая), поэтому замена порта прослушивания по умолчанию на какой-либо другой — всегда хорошая идея.

Изменить этот порт можно в параметре конфигурации net.port:

net:
  port: 38128

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

Заключение

Простота использования MongoDB делает его популярным выбором среди команд любого размера, которым требуется какое-нибудь NoSQL решение, и привлекательной целью для злоумышленников.

В этой статье мы рассмотрели некоторые из лучших практик и методов усиления защиты кластера MongoDB, от защиты периметра сети до использования аутентификации и авторизации для управления доступом к базе данных.

Мы надеемся, что обсуждаемые темы помогут вам сделать ваши развертки MongoDB более защищенными.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *