Ana içeriğe geç

React & Nginx Docker Hardening ⚛️

React/Vue/Angular gibi SPA (Single Page Application) projelerini sunmak için Nginx kullanırız. Ancak standart Nginx imajı root çalışır. Bunu güvenli hale getirelim.

1. Güvenli Nginx Konfigürasyonu (nginx.conf) ⚙️

Önce projenizin kök dizinine nginx.conf dosyasını oluşturun. Bu ayarlar güvenliği artırır.

server {
    listen 8080; # Non-root port (80 yerine 8080)
    server_name localhost;

    root /usr/share/nginx/html;
    index index.html;

    # Güvenlik Headerları
    add_header X-Frame-Options "DENY";
    add_header X-CONTENT-TYPE-OPTIONS "nosniff";
    add_header Referrer-Policy "strict-origin-when-cross-origin";

    # Nginx sürümünü gizle
    server_tokens off;

    location / {
        try_files $uri $uri/ /index.html;
    }

    # Cache ayarları (Opsiyonel)
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 1y;
        add_header Cache-Control "public, no-transform";
    }
}

2. Multi-Stage Dockerfile 🏗️

# --- Stage 1: Build (Node.js) ---
FROM node:18-alpine AS builder
WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

# --- Stage 2: Serve (Nginx Unprivileged) ---
# Resmi "nginxinc/nginx-unprivileged" imajı root gerektirmez!
FROM nginxinc/nginx-unprivileged:alpine AS production

# Varsayılan user: nginx (UID 101)
# Varsayılan port: 8080

# Kendi config dosyamızı kopyalayalım
COPY nginx.conf /etc/nginx/conf.d/default.conf

# Build aldığımız React dosyalarını kopyalayalım
COPY --from=builder /app/dist /usr/share/nginx/html

# Portu aç (8080)
EXPOSE 8080

CMD ["nginx", "-g", "daemon off;"]

3. docker-compose.yml Hardening

services:
  frontend:
    image: my-react-app
    # Unprivileged image zaten UID 101 ile çalışır
    read_only: true

    # Nginx'in geçici dosyaları için izin ver
    tmpfs:
      - /tmp
      - /var/cache/nginx
      - /var/run

    deploy:
      resources:
        limits:
          cpus: "0.25"
          memory: 128M

    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true

Neden "nginx-unprivileged"?

Standart nginx:alpine imajı port 80'i dinlemek için root yetkisiyle başlar (sonra user değiştirse bile risklidir). nginxinc/nginx-unprivileged ise baştan itibaren yetkisiz başlar ve 8080 portunu kullanır. En güvenli yöntem budur.