Knowledge Base

MongoDB открыт в интернет (порт 27017)

MongoDB публично доступен — порт 27017

Категория: Server Hardening · Риск: critical

MongoDB публично доступен — порт 27017

Критическая угроза

MongoDB по умолчанию **не требует аутентификации** и слушает `0.0.0.0:27017`. Тысячи серверов с открытым MongoDB были атакованы — злоумышленники удалили данные и оставили записку с требованием выкупа (MongoDB Ransomware Campaign, 2017–2023).

# Проверка из внешней сети
nc -zv <IP> 27017

# Или mongosh без пароля:
mongosh --host <IP> --port 27017
> show dbs    # видит все базы данных
> use myapp
> db.users.find()  # полный доступ ко всем данным

Немедленное исправление

1. Закрыть порт файрволом (первый шаг)

# ufw
ufw deny 27017
ufw allow from 127.0.0.1 to any port 27017

# iptables
iptables -A INPUT -p tcp --dport 27017 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP

2. Привязать к localhost

# /etc/mongod.conf
net:
  port: 27017
  bindIp: 127.0.0.1   # Только локальные подключения
systemctl restart mongod

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

# /etc/mongod.conf
security:
  authorization: enabled
# Создать admin-пользователя (до включения auth)
mongosh --eval '
use admin
db.createUser({
  user: "admin",
  pwd: "<strong-password>",
  roles: [{role: "userAdminAnyDatabase", db: "admin"}, "readWriteAnyDatabase"]
})'

4. Docker Compose — убрать проброс порта

# НЕПРАВИЛЬНО — порт открыт публично:
services:
  mongodb:
    image: mongo
    ports:
      - "27017:27017"  # ← УБРАТЬ

# ПРАВИЛЬНО — только внутри Docker сети:
services:
  mongodb:
    image: mongo
    expose:
      - "27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: <strong-password>

Проверка после исправления

# Должно вернуть "Connection refused" или timeout
nc -zv <PUBLIC_IP> 27017

# Локальное подключение должно требовать пароль
mongosh --host 127.0.0.1 --eval "db.adminCommand({listDatabases: 1})"
# MongoServerError: Command listDatabases requires authentication

Связанные проверки