Knowledge Base

MinIO Console открыта публично (порт 9001)

MinIO Console открыта публично

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

MinIO Console открыта публично

Угроза

MinIO — S3-совместимое объектное хранилище. Публичная Console (порт 9001) или API (порт 9000) позволяет просматривать и скачивать содержимое bucket'ов.

При дефолтных или слабых учётных данных — **полная утечка всех хранимых объектов**: резервные копии БД, пользовательские файлы, медиа-контент, конфиги.

API-порт 9000 (S3 API)

Публичный порт 9000 с дефолтным `MINIO_ROOT_USER/MINIO_ROOT_PASSWORD` даёт:

# AWS CLI с MinIO credentials
aws s3 ls --endpoint-url http://<IP>:9000 s3://
aws s3 cp s3://backups/db.sql . --endpoint-url http://<IP>:9000

Исправление

1. Закрыть оба порта файрволом

ufw deny 9000
ufw deny 9001
ufw allow from 127.0.0.1 to any port 9000
ufw allow from 127.0.0.1 to any port 9001
ufw reload

2. Docker Compose — привязать к localhost

services:
  minio:
    image: minio/minio
    command: server /data --console-address ":9001"
    ports:
      - "127.0.0.1:9000:9000"   # Только локально
      - "127.0.0.1:9001:9001"   # Console только локально
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: StrongPassword123!

3. Сменить дефолтные credentials

# В .env или docker-compose.yml:
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=<минимум 16 символов, upper+lower+digit+special>

4. Nginx reverse proxy с TLS (если нужен внешний доступ)

# Только S3 API через HTTPS с подходящим ACL
server {
    listen 443 ssl;
    server_name minio.example.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        # Дополнительно: ограничить по IP allowlist
    }
}

5. Настроить Bucket Policies

# Все bucket'ы должны быть private по умолчанию
mc alias set myminio http://127.0.0.1:9000 admin password
mc anonymous set none myminio/mybucket

Проверка

# Должно вернуть Connection refused
curl -I http://<PUBLIC_IP>:9001/
curl -I http://<PUBLIC_IP>:9000/

# Список bucket'ов без credentials — не должен работать
curl http://<PUBLIC_IP>:9000/
# Ожидаемо: AccessDenied или Connection refused

Связанные статьи