После прохождения приключения Развертывание кластера Mongodb высокой доступности на Docker И разделяя его публично, я решил дополнить этот учебник с некоторыми проблемами безопасности и советами.
В этом посте вы узнаете несколько подробностей о уязвимах развертывания MongoDB и механизма безопасности. И что более важно, как на самом деле защитить ваши данные с этими функциями.
Цели
- понять аспекты базы данных безопасности.
- Найдите способы реализации аутентификации, авторизации и бухгалтерского учета ( AAA ).
- Узнайте, как включить функции безопасности MongoDB.
До реквизиты
Любой управляющий экземпляр MongoDB, на котором у вас будет полный доступ. Автономный или реплика набор, контейнеров или нет. Мы также упомянем некоторые детали на экземплярах Mongodb Docker, но мы будем держать подсказки для обеспечения безопасности Docker для другого поста.
Список быстрых побед
Доступ к данным в базе данных имеет несколько этапов. Мы посмотрим на эти этапы и найдем способы укрепления их, чтобы получить совокупный эффект безопасности в конце. Каждый из этих этапов будет, большую часть времени, имеет возможность блокировать следующую (например, вам нужно иметь доступ к сети, чтобы добраться до части аутентификации).
1. Доступ к сети
Порт по умолчанию Mongodb составляет 27017 (TCP). Выбор другого порта для эксплуатации может запутать некоторые хакеры, но это все еще является незначительным действием безопасности из-за сканирования порта, поэтому вы не получите его многое.
Предполагая, что мы выбираем порт по умолчанию для нашего сервиса, мы откроем этот порт в брандмауэре сервера базы данных. Мы не хотим разоблачать трафик из этого порта в Интернет. Существует два подхода для решения того, что и оба могут быть использованы одновременно. Один ограничивает ваш трафик к вашим доверенным серверам через конфигурацию брандмауэра.
Есть функция Mongodb, которую вы можете использовать для этого: IP-привязка Отказ Вы проходите --bind_ip
Аргумент в команде запуска Mongodb, чтобы включить его. Допустим, ваш App1
Сервер должен получить доступ к серверу MongoDB для данных. Чтобы ограничить трафик для этого конкретного сервера, вы запускаете свой сервер как:
mongod --bind_ip localhost,app1
Если вы используете Docker, вы можете избежать этого риска, используя связь Docker между вашей базой данных и вашим клиентским приложением.
Вы можете добавить еще один слой сетевой безопасности, создавая выделенный сегмент сети для баз данных, в котором вы применяете ACL (список доступа) в конфигурации маршрутизатора и/или переключения.
2. Доступ к системе
Второй A в AAA означает авторизацию. Мы знаем, что привилегированная раковина требуется во время установки базы данных. При заключении установки блокировка системы корневого доступа корня является частью сверла.
Аналитики данных необходимо прочитать данные базы данных, а приложения также необходимо прочитать и (почти всегда) записи данных. Как это можно решить с помощью аутентификации базы данных (подробнее об этом на 4. Авторизация ) Обязательно ограничивайте root и другие раковины доступа к людям, которые не могут выполнять свою работу без него. Разрешить только для базы данных и системных администраторов.
Кроме того, запущенные процессы MongoDB с выделенной учетной записью операционной системы является хорошей практикой. Убедитесь, что эта учетная запись имеет разрешение на доступ к данным, но без ненужных разрешений.
3. Аутентификация
Аутентификация — первая А в ААА. Мудрый аутентификация, Mongodb поддерживает 4 механизма:
- Скрамс (по умолчанию)
- X.509 Аутентификация сертификата
- Прокси аутентификация прокси
- Аутентификация Kerberos
Если вы используете Mongodb Enterprise Server Затем вы можете воспользоваться поддержкой LDAP и Kerberos. Интеграция вашей компании Identity и инструмент управления доступом будет делать AAA 3RD Реализация (бухгалтерская) проще, поскольку у каждого пользователя будет выделенная учетная запись, связанная со своими записями.
Монгодб имеет его собственные реализации схватки : Scrum_sha1 Для версий ниже 4.0 и Scrum_sha256. на 4,0 и выше. Вы можете думать о SHA-256 как преемник SHA-1 Так что выберите последнее, если доступно в вашей версии базы данных.
Наборы реплики ключевые файлы Также используйте механизм аутентификации SCRAM, в котором эти кейсы содержит общий пароль между элементами реплики. Другой механизм внутреннего аутентификации, поддерживаемый в наборах реплик, это X.509. Вы можете прочитать больше на наборах реплик и как генерировать ключевые файлы в нашем предыдущем Блог пост Отказ
Чтобы иметь возможность использовать механизм аутентификации сертификатов X.509, есть некоторые Требования относительно атрибутов сертификата Отказ Чтобы включить аутентификацию X.509, добавить --tlsmode
, --tlscertificatekeyfile
и --tlscafile.
(В случае, если сертификат имеет центр сертификата). Для выполнения удаленных подключений к базе данных укажите --bind_ip
Отказ
mongod --tlsMode requireTLS --tlsCertificateKeyFile--tlsCAFile --bind_ip
Чтобы генерировать эти сертификаты, вы можете использовать openssl
Библиотека на Linux или эквивалент по другим операционным системам.
openssl x509 -in-inform PEM -subject -nameopt RFC2253
Команда возвращает строку темы, а также сертификат:
subject= CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry -----BEGIN CERTIFICATE----- # ... -----END CERTIFICATE-----
Далее добавьте пользователя на $ внешний База данных с использованием полученных Тема строка, как в примере ниже:
db.getSiblingDB("$external").runCommand( { createUser: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", roles: [ { role: "readWrite", db: "test" }, { role: "userAdminAnyDatabase", db: "admin" } ], writeConcern: { w: "majority" , wtimeout: 5000 } } )
Наконец, подключитесь к базе данных с аргументами для TLS, местоположение сертификатов, местоположение файлов CA, базу данных аутентификации и механизма аутентификации.
mongo --tls --tlsCertificateKeyFile--tlsCAFile --authenticationDatabase '$external' --authenticationMechanism MONGODB-X509
Теперь вы успешно подключены к вашей базе данных, используя механизм аутентификации X.509.
4. Авторизация
Для не тестирующих сред (например, производство) явно не рекомендуется иметь Контроль доступа Отключено, так как это дает все привилегии на любой успешный доступ к базе данных. Чтобы включить аутентификацию, следуйте процедуре ниже.
# start MongoDB without access control mongod # connect to the instance mongo
// create the user administrator use admin db.createUser( { user: "myUserAdmin", pwd: passwordPrompt(), // or cleartext password roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] } ) // shutdown mongod instance db.adminCommand( { shutdown: 1 } )
# start MongoDB with access control mongo --auth
Если вы используете Монгодб на доке , вы можете создать администратор через Mongo_initdb_root_username.
и Mongo_initdb_root_password
Переменные среды ( -e
Аргумент). Вот так:
docker run -d -e MONGO_INITDB_ROOT_USERNAME=-e MONGO_INITDB_ROOT_PASSWORD= mongo:4.4
Не пренебрегайте удобством использования человека. Убедитесь, что все Пароли сильные Подходите политику пароля вашей компании, и сохранены безопасно.
Монгодб имеет набор Встроенные роли и позволяет нам создать новые Отказ Используйте роли, чтобы помочь при предоставлении привилегий при применении Принцип наименее привилегии на учетных записях пользователей и избегайте злоупотребления учетной записью пользователя.
5. Зашифрованные соединения
Давайте теперь посмотрим, как настроить зашифрованные соединения, чтобы защитить вас от нюхательные атаки .
Если вы думаете об интернет-браузерах, вы замечаете, как они продолжают нажимать для пользователей для навигации на сайтах, которые поддерживают HTTP Over TLS, также известный как Https Отказ Это исполнение существует по причине: чувствительная защита данных, как для клиента, так и для сервера. Поэтому TLS защищает эти чувствительные данные во время связи с клиент-сервером, двунаправленно.
Мы объяснили, как использовать сертификаты TLS на 4 Аутентификация И теперь мы увидим, как зашифровать нашу связь между сервером базы данных и клиентским приложением через конфигурацию TLS на драйвере Mongodb приложения.
Во-первых, чтобы настроить сервер MongoDB для требуния нашего сертификата TLS, добавьте --tlsmode
и --tlscertificatekeyfile
Аргументы:
mongod --tlsMode requireTLS --tlsCertificateKeyFile
Чтобы проверить соединение с оболочкой Mongo, введите:
mongo --tls --host--tlsCertificateKeyFile
Затем добавьте параметры TLS в соединение с базой данных на вашем приложении. Вот фрагмент приложения Nodejs, используя официальный драйвер MongoDB. Вы можете найти больше этих вариантов шифрования на Документация водителя Отказ
const MongoClient = require('mongodb').MongoClient; const fs = require('fs'); // Read the certificate authority const ca = [fs.readFileSync(__dirname + "/ssl/ca.pem")]; const client = new MongoClient('mongodb://localhost:27017?ssl=true', { sslValidate:true, sslCA:ca }); // Connect validating the returned certificates from the server client.connect(function(err) { client.close(); });
6. Шифрование в отдохну
Mongodb Enterprise Server поставляется с Шифрование в покое особенность. С помощью системы мастера и базы данных это позволяет хранить наши данные в зашифрованном состоянии, настроив поле, как зашифровано на отдыхе. Вы можете узнать больше о поддерживаемых стандартах и шифровании/расшифровании клавиш на Монгодб Документация Отказ
С другой стороны, если вы будете придерживаться Сообщество MongoDB на V4.2 Mongodb начал поддерживать Шифрование уровня полевого поля клиента Отказ Вот как это работает: вы генерируете необходимые ключи и загрузите их в свой Драйвер базы данных (E.G. Nodejs Mongodb Driver). Затем вы сможете зашифровать ваши данные, прежде чем хранить его в базе данных и расшифровать его для вашего приложения, чтобы прочитать его.
Ниже вы можете найти фрагмент JavaScript код, показывающий шифрование данных и дешифрование, происходящее на драйвере NODEJS MongoDB с помощью пакета NPM Монгодб-клиент-шифрование Отказ
const unencryptedClient = new MongoClient(URL, { useUnifiedTopology: true }); try { await unencryptedClient.connect(); const clientEncryption = new ClientEncryption(unencryptedClient, { kmsProviders, keyVaultNamespace }); async function encryptMyData(value) { const keyId = await clientEncryption.createDataKey('local'); console.log("keyId", keyId); return clientEncryption.encrypt(value, { keyId, algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' }); } async function decryptMyValue(value) { return clientEncryption.decrypt(value); } const data2 = await encryptMyData("sensitive_data"); const mKey = key + 1; const collection = unencryptedClient.db("test").collection('coll'); await collection.insertOne({ name: data2, key: mKey }); const a = await collection.findOne({ key: mKey }); console.log("encrypted:", a.name); const decrypteddata = await decryptMyValue(a.name); console.log("decrypted:", decrypteddata); } finally { await unencryptedClient.close(); }
Вывод
Хотя этот пост пытается покрыть некоторые из самых важных быстрых побед, вы можете добиться, чтобы обеспечить ваши экземпляры MongoDB, намного больше для безопасности MongoDB гораздо больше.
Часто обновляя базу данных и версии драйверов часто, подключение инструмента мониторинга, а также отслеживание доступа к базе данных и конфигурации также являются хорошими идеями для повышения безопасности.
Тем не менее, даже если система была теоретически полностью закреплена, она всегда склонна к человеческим ошибкам. Убедитесь, что люди, работающие с тобой, осознают важность сохранения данных — должным образом защищать систему, всегда условно для всех пользователей, принимающих безопасность серьезно.
Безопасность — это ваша работа. Как и в тандеме каяков, он имеет смысл, только если все вместе в том же направлении, со всеми усилиями, способствующими одной и той же целью.
Наконец, хотя этот пост сосредоточился на безопасности базы данных, также целесообразно, что вы защищаете исходный код JavaScript вашего веб-сайтов и мобильных приложений. Смотрите наши учебные пособия по защите Реагировать , Угловой С Vue , Реагировать на родной , Ionic и NativeScript .
Оригинал: «https://dev.to/jscrambler/the-6-aspects-you-must-secure-on-your-mongodb-instances-38d8»