Hướng dẫn cài và sữ dụng bunkerweb

Nếu bạn đang muốn cài BunkerWeb để đứng trước Laravel/WordPress/Nginx như một WAF + reverse proxy, mình khuyên đi theo Docker Compose trước. Cách này dễ rollback, dễ nâng cấp và không làm rối Nginx hiện tại.



BunkerWeb về bản chất sẽ đứng ở phía trước:

Internet
   │
   ▼
BunkerWeb
(WAF / Rate limit / Bot protection / TLS)
   │
   ▼
Nginx / Laravel / WordPress / App

BunkerWeb được thiết kế để bảo vệ các web application thông qua reverse proxy và có các integration cho Docker, Kubernetes, Linux..

1. Cài Docker

Nếu server Ubuntu/Debian đã có Docker thì kiểm tra:

docker --version
docker compose version

Ví dụ:

Docker version 28.x
Docker Compose version v2.x

Nếu chưa có Docker, có thể cài Docker trước.

2. Mô hình mình khuyên dùng

Ví dụ bạn có Laravel:

Internet
    ↓
:80 / :443
    ↓
BunkerWeb
    ↓
Laravel container
    ↓
PHP-FPM
    ↓
MySQL

Ta tạo một network riêng:

docker network create bw-services

BunkerWeb và app Laravel cùng nằm trong network này.

Điểm quan trọng là không expose port của Laravel ra Internet.

Ví dụ:

ports:
  - "127.0.0.1:8000:80"

thậm chí tốt hơn là không ports luôn, chỉ:

networks:
  - bw-services

BunkerWeb sẽ truy cập app bằng tên container.

3. Cài BunkerWeb bằng Docker Compose

Tạo thư mục:

mkdir -p ~/bunkerweb
cd ~/bunkerweb

Tạo:

nano docker-compose.yml

Bản đơn giản:

services:

  bunkerweb:
    image: bunkerity/bunkerweb:1.6.15
    container_name: bunkerweb
    restart: unless-stopped

    ports:
      - "80:8080"
      - "443:8443"
      - "443:8443/udp"

    volumes:
      - bw-data:/data

    networks:
      - bw-services

    environment:
      SERVER_NAME: example.com
      USE_REVERSE_PROXY: "yes"
      REVERSE_PROXY_URL: /
      REVERSE_PROXY_HOST: http://app

volumes:
  bw-data:

networks:
  bw-services:
    external: true

BunkerWeb hiện có image Docker chính thức và tài liệu quickstart cũng sử dụng mô hình container + Docker network + reverse proxy như trên

Lưu ý: tag 1.6.15 là phiên bản stable được trang tài liệu hiện tại hiển thị trong ví dụ AIO. Nếu triển khai production, mình sẽ kiểm tra release stable hiện tại rồi pin đúng version thay vì dùng latest.

4. App Laravel

Ví dụ app của bạn tên:

app

và app chạy port:

80

Compose có thể là:

services:

  app:
    image: nginx:alpine
    container_name: app

    networks:
      - bw-services

  bunkerweb:
    image: bunkerity/bunkerweb:1.6.15
    container_name: bunkerweb
    restart: unless-stopped

    ports:
      - "80:8080"
      - "443:8443"
      - "443:8443/udp"

    volumes:
      - bw-data:/data

    networks:
      - bw-services

    environment:
      SERVER_NAME: example.com
      USE_REVERSE_PROXY: "yes"
      REVERSE_PROXY_URL: /
      REVERSE_PROXY_HOST: http://app

volumes:
  bw-data:

networks:
  bw-services:
    external: true

Sau đó:

docker compose up -d

Kiểm tra:

docker ps

và:

docker logs bunkerweb

5. DNS

Giả sử domain:

example.com

DNS:

example.com
    ↓
SERVER_IP

Ví dụ:

A
example.com
123.123.123.123

Lúc này:

https://example.com
        ↓
Server :443
        ↓
BunkerWeb :8443
        ↓
app

BunkerWeb mặc định trong Docker nhận HTTP ở 8080 và HTTPS ở 8443,

vì vậy ta map ra 80/443 của host

6. HTTPS / SSL

Đây là một phần rất đáng dùng BunkerWeb.

BunkerWeb có thể quản lý HTTPS/Let's Encrypt thay vì bạn phải tự cấu hình certificate thủ công trong Nginx.

Ví dụ cấu hình HTTPS/Let's Encrypt sẽ dựa trên các setting của BunkerWeb.

Bạn có thể cấu hình:

SERVER_NAME=example.com

và bật Let's Encrypt.

Khi đó flow sẽ là:

Client
  │
  │ HTTPS
  ▼
BunkerWeb
  │
  │ HTTP nội bộ
  ▼
Laravel

Certificate nằm ở tầng BunkerWeb.

7. BunkerWeb bảo vệ được những gì?

Đây mới là phần đáng quan tâm.

BunkerWeb không chỉ là reverse proxy.

Nó có thể dùng để:

WAF

Ví dụ request:

GET /index.php?id=' OR 1=1 --

BunkerWeb có thể phát hiện request có dấu hiệu SQL injection.


XSS

Ví dụ:

<script>alert(1)</script>

request có thể bị WAF kiểm tra.


Rate limiting

Ví dụ API:

/api/login

Bạn có thể giới hạn:

100 requests / phút / IP

để giảm brute-force.


Bot protection

Có thể thiết lập các cơ chế kiểm soát bot/request đáng ngờ.

IP restrictions

Ví dụ:

/admin

chỉ cho phép:

1.2.3.4
5.6.7.8

Security headers

Có thể cấu hình những header như:

X-Frame-Options
X-Content-Type-Options
Content-Security-Policy
Strict-Transport-Security

8. Một cấu hình rất đáng dùng cho Laravel

Ví dụ:

example.com

Website:

/

API:

/api/*

Admin:

/admin/*

Mình sẽ chia bảo vệ:

                  BunkerWeb
                     │
          ┌──────────┼──────────┐
          │          │          │
          ▼          ▼          ▼
         /         /api       /admin
          │          │          │
       Laravel    Laravel    Laravel

Ví dụ /login:

Internet
   ↓
BunkerWeb
   ↓
WAF
   ↓
Rate limit
   ↓
Laravel

Như vậy nếu bot spam:

POST /login
POST /login
POST /login
...

thì BunkerWeb có thể chặn/giới hạn trước khi request đến PHP/Laravel.

9. Nếu bạn có nhiều website

Đây là chỗ BunkerWeb rất tiện.

Ví dụ server có:

site1.com
site2.com
api.example.com
admin.example.com

Có thể:

                    BunkerWeb
                        │
        ┌───────────────┼────────────────┐
        │               │                │
        ▼               ▼                ▼
    site1.com       site2.com       api.example.com
        │               │                │
      app1            app2             api

BunkerWeb hỗ trợ multisite, với SERVER_NAME có thể khai báo nhiều virtual hosts

10. Có Web UI

BunkerWeb cũng có Web UI để quản lý cấu hình.

Tài liệu hiện tại có hướng dẫn Web UI riêng; với Docker,

UI và các service có thể được triển khai trong stack của BunkerWeb

Điều này tiện hơn việc phải nhớ hàng đống environment variable.

11. Một điểm rất quan trọng: đừng expose app

Ví dụ không nên:

app:
  ports:
    - "80:80"

nếu BunkerWeb đã đứng trước. Vì lúc đó attacker có thể:

Internet
   │
   ├────────→ BunkerWeb ──→ Laravel
   │
   └────────→ Laravel trực tiếp ❌

WAF bị bypass.

Nên:

app:
  networks:
    - bw-services

và:

bunkerweb:
  ports:
    - "80:8080"
    - "443:8443"

Flow sẽ thành:

Internet
    │
    ▼
BunkerWeb
    │
    ▼
Docker network
    │
    ▼
Laravel

12. Với hệ thống của bạn

Nếu bạn đang làm Laravel/PHP, mình nghĩ cách học BunkerWeb hiệu quả nhất

không phải cài một đống tính năng ngay.


Nên đi theo 4 bước:

Bước 1
BunkerWeb
   ↓
Laravel

Sau khi chạy được:

Bước 2
HTTPS
   +
Let's Encrypt

Sau đó:

Bước 3
WAF
   +
ModSecurity / CRS

Cuối cùng:

Bước 4
Rate limit
   +
Bot protection
   +
IP rules
   +
Security headers

Đặc biệt nếu hệ thống của bạn có API/login/admin thì bước 4 rất đáng làm.

BunkerWeb cũng khuyến nghị bật global CRS trong một số môi trường production/ít

RAM để giảm footprint của CRS rules


Post a Comment

Previous Post Next Post