Dynmap là một tiện ích bản đồ web thời gian thực phổ biến dành cho máy chủ Minecraft, cho phép người chơi xem bản đồ thế giới và vị trí người chơi trực tiếp qua trình duyệt. Tuy nhiên, việc mở rộng khả năng truy cập này đi kèm với rủi ro bảo mật đáng kể — từ lộ thông tin cấu trúc server đến lạm dụng dữ liệu vị trí và kênh trò chuyện. Dưới đây là hướng dẫn cấu hình an toàn được tái thiết kế kỹ lưỡng nhằm giảm thiểu các lỗ hổng tiềm ẩn mà vẫn giữ nguyên chức năng cốt lõi.
1. Kích hoạt xác thực bắt buộc
Mặc định, Dynmap không yêu cầu xác thực — bất kỳ ai có URL đều có thể xem bản đồ. Để khắc phục, chỉnh sửa tệp configuration.txt (hoặc configuration.yml nếu dùng phiên bản mới hơn) như sau:
authentication:
enabled: true
required-for-map-access: true
method: 'permissions' # hoặc 'simple' nếu dùng tài khoản nội bộ
Khi bật, hệ thống sẽ từ chối mọi yêu cầu GET tới trang web trừ khi người dùng đã đăng nhập và có quyền dynmap.webview. Phương thức permissions tích hợp liền mạch với plugin quản lý quyền như LuckPerms.
2. Kiểm soát mức độ hiển thị người chơi
Thông tin vị trí người chơi trên bản đồ cần được kiểm soát chặt chẽ để tránh theo dõi trái phép. Thêm hoặc cập nhật khối cấu hình sau trong phần markers:
player-markers:
visibility-policy: 'self-only'
hide-in-spectator: true
conceal-under-potion-effects:
- 'INVISIBILITY'
- 'BLINDNESS'
Giá trị self-only đảm bảo mỗi người chơi chỉ thấy vị trí của chính mình — ngoại trừ những người có quyền dynmap.playermarkers.seeall. Danh sách hiệu ứng phép thuật được liệt kê giúp tự động loại bỏ biểu tượng người chơi khi họ đang vô hình hoặc bị mù.
3. Bảo vệ kênh trò chuyện web
Chức năng chat web dễ bị khai thác để gửi spam hoặc lệnh độc hại. Cấu hình dưới đây vô hiệu hóa gửi tin nhắn từ khách chưa đăng nhập và áp đặt kiểm soát phân quyền:
webchat:
require-authentication: true
permission-based: true
max-message-length: 192
block-muted-players: true
rate-limit:
messages-per-minute: 10
burst-capacity: 3
Hệ thống sẽ từ chối tin nhắn nếu người gửi vượt ngưỡng tốc độ hoặc không sở hữu quyền dynmap.webchat. Người bị tắt tiếng (muted) cũng bị loại khỏi kênh chat tự động.
4. Lọc địa chỉ IP và xử lý proxy đáng tin cậy
Nếu máy chủ nằm sau reverse proxy (ví dụ: Nginx hoặc Cloudflare), cần cấu hình đúng để tránh giả mạo IP:
http-server:
trusted-proxies:
- '192.168.1.100' # Địa chỉ IP của Nginx
- '2001:db8::1'
ban-check-enabled: true
ban-file: 'banned-ips.txt'
Khi trusted-proxies được thiết lập, Dynmap sẽ đọc tiêu đề X-Forwarded-For thay vì Remote-Addr, từ đó áp dụng danh sách cấm chính xác. Tệp banned-ips.txt được kiểm tra mỗi lần kết nối HTTP.
5. Bảo mật lưu trữ bản đồ dạng cơ sở dữ liệu
Nếu sử dụng MySQL/PostgreSQL để lưu tilemap, hãy đảm bảo kết nối được mã hóa và tài khoản cơ sở dữ liệu có đặc quyền tối thiểu:
storage:
type: 'mysql'
hostname: 'db.internal.lan'
port: 3307
database: 'mc_dynmap_prod'
username: 'dynmap_app'
password: '${DB_PASSWORD}' # Sử dụng biến môi trường
use-ssl: true
verify-server-certificate: true
table-prefix: 'dmp_'
Không lưu mật khẩu trực tiếp trong cấu hình. Thay vào đó, dùng biến môi trường hoặc vault (như HashiCorp Vault) để cấp giá trị runtime. Đồng thời, cấp cho tài khoản dynmap_app chỉ quyền SELECT, INSERT, UPDATE trên các bảng liên quan — tuyệt đối không dùng GRANT ALL.
6. Giám sát và cập nhật định kỳ
Phiên bản Dynmap cũ thường chứa lỗ hổng CVE đã được vá. Thực hiện kiểm tra cập nhật hàng tháng bằng lệnh:
curl -s https://api.github.com/repos/webbukkit/dynmap/releases/latest | grep tag_name | cut -d '"' -f4
Kết hợp với giám sát log qua công cụ như journalctl -u dynmap --since "2 hours ago" để phát hiện các mẫu truy cập bất thường như: yêu cầu lặp lại tới /tiles/, lỗi 401 tăng đột biến, hoặc chuỗi ký tự lạ trong tham số marker.