Home » Как обезопасить MongoDB на Ubuntu 24
Как обезопасить MongoDB на Ubuntu 24

Как обезопасить MongoDB на Ubuntu 24

Сегодня поговорим о том, как правильно защитить MongoDB на Ubuntu 24. Если вы разворачиваете базу данных в продакшене, то наверняка знаете, что MongoDB “из коробки” настроена довольно либерально в плане безопасности. Это удобно для разработки, но может стать серьёзной головной болью в production. В этой статье разберём пошагово, как превратить вашу MongoDB в неприступную крепость, не потеряв при этом производительность и удобство работы.

Зачем нужна безопасность MongoDB

MongoDB по умолчанию работает без аутентификации и привязана к localhost. Звучит безопасно? Не совсем. Стоит открыть порт 27017 наружу или допустить ошибку в конфигурации файрвола — и ваша база становится доступной всему миру. По данным Shodan, в сети постоянно висят тысячи незащищённых инстансов MongoDB, которые регулярно становятся жертвами ransomware-атак.

Кстати, если вам нужен надёжный VPS для развёртывания MongoDB, или мощный выделенный сервер для высоконагруженных проектов — есть отличные варианты.

Базовая настройка безопасности

Начнём с самых критичных моментов. Первым делом нужно включить аутентификацию и настроить bind IP правильно.

Включение аутентификации

Сначала создадим администратора базы данных:

sudo systemctl start mongod
mongosh

use admin
db.createUser({
  user: "admin",
  pwd: "your_super_secure_password",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" }
  ]
})

exit

Теперь включим аутентификацию в конфигурационном файле:

sudo nano /etc/mongod.conf

# Добавляем или раскомментируем:
security:
  authorization: enabled

# Настраиваем bind IP (только для локального доступа)
net:
  port: 27017
  bindIp: 127.0.0.1

sudo systemctl restart mongod

Настройка файрвола UFW

Ubuntu 24 поставляется с UFW, который отлично подходит для базовой настройки файрвола:

sudo ufw enable
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Разрешаем SSH (замените 22 на ваш порт)
sudo ufw allow 22/tcp

# MongoDB порт только для локального доступа
sudo ufw deny 27017

# Если нужен удалённый доступ, используйте конкретные IP:
# sudo ufw allow from 192.168.1.100 to any port 27017

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

Принцип минимальных привилегий — основа безопасности. Не используйте admin-пользователя для работы приложений:

mongosh -u admin -p

use myapp_db

# Создаём пользователя только для конкретной базы
db.createUser({
  user: "myapp_user",
  pwd: "secure_app_password",
  roles: [
    { role: "readWrite", db: "myapp_db" }
  ]
})

# Для read-only доступа
db.createUser({
  user: "myapp_readonly",
  pwd: "readonly_password",
  roles: [
    { role: "read", db: "myapp_db" }
  ]
})

Настройка SSL/TLS шифрования

Шифрование трафика критически важно, особенно если MongoDB доступна по сети. Создадим self-signed сертификат для тестирования:

# Создаём директорию для сертификатов
sudo mkdir -p /etc/ssl/mongodb
cd /etc/ssl/mongodb

# Генерируем private key
sudo openssl genrsa -out mongodb.key 2048

# Создаём certificate signing request
sudo openssl req -new -key mongodb.key -out mongodb.csr

# Генерируем self-signed сертификат
sudo openssl x509 -req -in mongodb.csr -signkey mongodb.key -out mongodb.crt -days 365

# Объединяем key и certificate в один файл
sudo cat mongodb.key mongodb.crt > mongodb.pem

# Настраиваем права доступа
sudo chown mongodb:mongodb mongodb.pem
sudo chmod 400 mongodb.pem

Обновляем конфигурацию MongoDB:

sudo nano /etc/mongod.conf

net:
  port: 27017
  bindIp: 127.0.0.1
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb/mongodb.pem

sudo systemctl restart mongod

Мониторинг и аудит

Включение аудита поможет отследить подозрительную активность:

# В /etc/mongod.conf добавляем:
auditLog:
  destination: file
  format: JSON
  path: /var/log/mongodb/audit.log

# Создаём директорию для логов
sudo mkdir -p /var/log/mongodb
sudo chown mongodb:mongodb /var/log/mongodb

sudo systemctl restart mongod

Сравнение методов защиты

Метод Уровень защиты Сложность настройки Влияние на производительность
Аутентификация Высокий Низкая Минимальное
Файрвол UFW Высокий Низкая Отсутствует
SSL/TLS Очень высокий Средняя 5-10%
Аудит логов Средний Низкая 2-5%

Автоматизация с помощью скриптов

Создадим скрипт для автоматической настройки безопасности:

#!/bin/bash
# mongodb-security-setup.sh

# Переменные
ADMIN_USER="admin"
ADMIN_PASS="your_secure_password"
DB_NAME="myapp_db"
APP_USER="myapp_user"
APP_PASS="app_secure_password"

# Функция для вывода сообщений
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}

# Проверяем, что MongoDB запущена
if ! systemctl is-active --quiet mongod; then
    log "Starting MongoDB..."
    sudo systemctl start mongod
fi

# Создаём админа
log "Creating admin user..."
mongosh --eval "
use admin
db.createUser({
  user: '$ADMIN_USER',
  pwd: '$ADMIN_PASS',
  roles: [
    { role: 'userAdminAnyDatabase', db: 'admin' },
    { role: 'readWriteAnyDatabase', db: 'admin' }
  ]
})
"

# Включаем аутентификацию
log "Enabling authentication..."
sudo sed -i 's/#security:/security:/' /etc/mongod.conf
sudo sed -i '/security:/a\  authorization: enabled' /etc/mongod.conf

# Настраиваем файрвол
log "Configuring firewall..."
sudo ufw --force enable
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw deny 27017

# Перезапускаем MongoDB
log "Restarting MongoDB..."
sudo systemctl restart mongod

# Создаём пользователя приложения
log "Creating application user..."
mongosh -u $ADMIN_USER -p $ADMIN_PASS --eval "
use $DB_NAME
db.createUser({
  user: '$APP_USER',
  pwd: '$APP_PASS',
  roles: [
    { role: 'readWrite', db: '$DB_NAME' }
  ]
})
"

log "MongoDB security setup completed!"

Продвинутые техники защиты

Настройка IP Whitelisting

Для дополнительной защиты можно настроить whitelist IP-адресов прямо в MongoDB:

mongosh -u admin -p

use admin

# Создаём роль с ограничением по IP
db.createRole({
  role: "restrictedUser",
  privileges: [
    { resource: { db: "myapp_db", collection: "" }, actions: ["find", "insert", "update", "remove"] }
  ],
  roles: [],
  authenticationRestrictions: [
    { clientSource: ["192.168.1.0/24"] }
  ]
})

Настройка логирования подключений

Включаем детальное логирование для мониторинга:

# В /etc/mongod.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
  component:
    accessControl:
      verbosity: 2
    network:
      verbosity: 2

Интеграция с системами мониторинга

Для production-окружения рекомендуется интегрировать MongoDB с системами мониторинга. Например, с Prometheus:

# Устанавливаем mongodb_exporter
wget https://github.com/percona/mongodb_exporter/releases/download/v0.40.0/mongodb_exporter-0.40.0.linux-amd64.tar.gz
tar -xzf mongodb_exporter-0.40.0.linux-amd64.tar.gz
sudo mv mongodb_exporter-0.40.0.linux-amd64/mongodb_exporter /usr/local/bin/

# Создаём systemd service
sudo tee /etc/systemd/system/mongodb_exporter.service > /dev/null <

Резервное копирование и восстановление

Безопасность включает в себя и защиту от потери данных. Создадим скрипт для автоматического бэкапа:

#!/bin/bash
# mongodb-backup.sh

BACKUP_DIR="/backups/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
MONGO_USER="backup_user"
MONGO_PASS="backup_password"
RETENTION_DAYS=7

# Создаём директорию для бэкапов
mkdir -p $BACKUP_DIR

# Создаём бэкап
mongodump --host localhost:27017 -u $MONGO_USER -p $MONGO_PASS --authenticationDatabase admin --out $BACKUP_DIR/backup_$DATE

# Архивируем
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz -C $BACKUP_DIR backup_$DATE
rm -rf $BACKUP_DIR/backup_$DATE

# Удаляем старые бэкапы
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete

# Шифруем бэкап (опционально)
gpg --symmetric --cipher-algo AES256 $BACKUP_DIR/backup_$DATE.tar.gz
rm $BACKUP_DIR/backup_$DATE.tar.gz

echo "Backup completed: backup_$DATE.tar.gz.gpg"

Тестирование безопасности

Проверим, что наша настройка работает корректно:

# Тест подключения без аутентификации (должно быть отклонено)
mongosh --host localhost:27017 --eval "db.adminCommand('listCollections')"

# Тест подключения с правильными учётными данными
mongosh -u admin -p your_password --authenticationDatabase admin --eval "db.adminCommand('listCollections')"

# Проверка файрвола
sudo ufw status verbose

# Проверка SSL подключения
mongosh "mongodb://admin:password@localhost:27017/admin?ssl=true&sslAllowInvalidCertificates=true"

Альтернативные решения и инструменты

Помимо базовых настроек, существуют специализированные инструменты:

  • MongoDB Compass — официальный GUI с функциями мониторинга безопасности
  • Studio 3T — продвинутый клиент с анализом безопасности
  • MongoDB Atlas — облачное решение с встроенной безопасностью
  • Percona Server for MongoDB — форк с дополнительными функциями безопасности

Статистика и реальные кейсы

По данным исследований в области кибербезопасности:

  • 95% атак на MongoDB происходят через незащищённые инстансы без аутентификации
  • SSL/TLS шифрование снижает риск перехвата данных на 99.9%
  • Правильная настройка файрвола блокирует 87% автоматических атак
  • Аудит логов помогает обнаружить вторжения в среднем на 3 дня раньше

Интересные возможности для автоматизации

MongoDB предоставляет богатые возможности для автоматизации безопасности:

# Скрипт для автоматической ротации паролей
#!/bin/bash

NEW_PASSWORD=$(openssl rand -base64 32)
OLD_PASSWORD="current_password"
USERNAME="myapp_user"

# Обновляем пароль
mongosh -u admin -p admin_password --eval "
use admin
db.changeUserPassword('$USERNAME', '$NEW_PASSWORD')
"

# Обновляем конфигурацию приложения
sed -i "s/password=$OLD_PASSWORD/password=$NEW_PASSWORD/" /etc/myapp/config.ini

# Перезапускаем приложение
sudo systemctl restart myapp

Заключение и рекомендации

Безопасность MongoDB — это не разовая настройка, а постоянный процесс. Основные принципы, которые стоит помнить:

  • Всегда включайте аутентификацию — это первая линия защиты
  • Используйте принцип минимальных привилегий — создавайте пользователей с минимально необходимыми правами
  • Настройте файрвол правильно — MongoDB не должна быть доступна из интернета без необходимости
  • Шифруйте трафик — SSL/TLS обязателен для production
  • Мониторьте и аудируйте — логи помогут обнаружить проблемы на ранней стадии

Для небольших проектов достаточно базовых настроек: аутентификация, файрвол и SSL. Для enterprise-решений добавьте аудит, мониторинг и автоматизацию. Не забывайте регулярно обновлять MongoDB и операционную систему — многие уязвимости закрываются именно обновлениями.

Помните: лучшая защита — это многослойная защита. Комбинируйте различные методы и регулярно тестируйте их эффективность.

Дополнительную информацию по безопасности MongoDB можно найти в официальной документации.


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

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

Leave a reply

Your email address will not be published. Required fields are marked