Siết chặt truy cập server và đặt WAF trước ứng dụng của bạn
Ngay từ lần triển khai đầu tiên,
erpc worker chỉ cho phép SSH từ địa chỉ của bạn và loại bỏ mọi kết nối đến khác. Một bảng [waf] đặt một proxy lọc phía trước API của bạn.Trang này mô tả ERPC CLI
v0.1.0-rc.4, một bản pre-release.Tường lửa
Một lần triển khai cấu hình tường lửa của server trước khi ứng dụng khởi động lần đầu:
- SSH chỉ được phép từ
firewall.ssh_allowvà từ địa chỉ thực hiện lần triển khai; - mọi kết nối đến khác đều bị loại bỏ, trừ
run.porttừfirewall.app_allow; với ứng dụng đứng sau WAF thì cổng của WAF thay cho cổng đó, và chỉ khi WAF trên server đang chạy sẵn các quy tắc mà[waf]hiện tạo ra (bên dưới).
Mỗi thay đổi chạy dưới một bộ hẹn giờ rollback 120 giây và chỉ được giữ lại khi một kết nối mới vào được, nên một thay đổi sai không thể khiến bạn bị khóa ở ngoài.
Tuy vậy, allowlist tồn tại lâu hơn địa chỉ đã được dùng để tạo ra nó: nếu địa chỉ nhà của bạn thay đổi, cách để vào lại là bộ phận hỗ trợ ERPC đối với server của ERPC, hoặc console của nhà cung cấp đối với server của riêng bạn. Hãy thêm một địa chỉ thứ hai mà bạn có thể truy cập server từ đó (văn phòng, điểm ra của VPN) vào
firewall.ssh_allow trước khi tin cậy một địa chỉ nhà.Nếu địa chỉ của bạn thay đổi, hãy thêm mọi địa chỉ cố định mà các quản trị viên của bạn sử dụng:
bash
Đặt WAF trước ứng dụng của bạn
Thêm một bảng vào
erpc.toml:toml
Sau đó
erpc worker deploy chạy một HTTP reverse proxy trên server, trong một unit systemd riêng (erpc-waf-<app>-<env>): một dynamic user không có đặc quyền, không có khóa, không có secret và không có gì của worker, bị giới hạn ở 1 GiB bộ nhớ. Proxy lắng nghe trên waf.port, đọc từng request trước ứng dụng, từ chối những gì các quy tắc của nó chỉ định, và chuyển tiếp phần còn lại tới ứng dụng tại 127.0.0.1:<run.port>.-
Ứng dụng vẫn ở trên loopback. Cổng riêng của ứng dụng không bao giờ được mở ra bên ngoài.
erpc worker apivà health check truy cập ứng dụng trên loopback, không đi qua WAF. -
Ai được kết nối vẫn do danh sách của tường lửa quyết định, và cổng của WAF là nơi duy nhất mà danh sách đó có thể cho phép tất cả mọi người:shKhi danh sách không có ai, WAF vẫn lắng nghe nhưng không ai được vào, và lần triển khai sẽ báo điều đó.
-
Cổng chỉ được mở khi WAF đã lắng nghe trên đó, không bao giờ trước đó. Một lần triển khai mà WAF không khởi động được sẽ thất bại và cho biết lý do, trong khi ứng dụng vẫn chạy.
-
Khi bạn thay đổi
[waf], cổng sẽ không được mở cho bất kỳ ai mới cho đến khi một lần triển khai đã đưa các quy tắc mới vào hoạt động. -
Gỡ
[waf]khỏierpc.tomlrồi triển khai sẽ xóa WAF khỏi server.
Thiết lập WAF
Chỉ
port là bắt buộc. Mọi khóa cấu hình, kèm giá trị mặc định:toml
rate, max_connections_per_address, ban và new_connections được tắt bằng false (ban = false), và một khóa không được ghi sẽ lấy giá trị mặc định. erpc worker check cho biết bảng [waf] sẽ làm gì, và bảng đó sai ở đâu, trước bất kỳ lần triển khai nào.Những gì WAF làm mà không cần thiết lập
- Một request không đọc được như một request HTTP/1 duy nhất và không mơ hồ sẽ nhận 400, và một path không ở dạng chuẩn cũng vậy.
- Một request đổi giao thức (
Upgrade) nhận 501. - Mọi lần từ chối đều được tính cho việc cấm địa chỉ, và mỗi lần từ chối sẽ kết thúc kết nối của nó.
- Một địa chỉ là một địa chỉ IPv4, hoặc một
/64IPv6. - WAF không chuyển tiếp các header thuộc về kết nối giữa client và proxy (
Connectionvà các header mà nó nêu tên,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Proxy-Connection,TE,Trailer),Expect, các header có tên chứa dấu gạch dưới, hay các headerForwarded,X-Real-IPvàX-Forwarded-Protodo chính client gửi. WAF đặtX-Real-IPbằng địa chỉ mà kết nối đến từ đó và thêm địa chỉ đó vào cuốiX-Forwarded-For; chỉ có mục cuối cùng củaX-Forwarded-Forlà do proxy ghi.
Xem WAF làm gì
Một request được chuyển tiếp không để lại dòng log nào, và header hay body không bao giờ được ghi log; query của một request bị chặn thì có, trong phạm vi 200 byte đó. Những gì client gửi không thể ghi lên terminal của bạn: WAF ghi journal của nó dưới dạng ASCII in được.
Những gì WAF không làm
- Không có TLS. WAF dùng HTTP/1.1 thuần trên cổng của mình.
- Không có HTTP/2: WAF trả lời 400 cho nó.
- Không có WebSocket, cũng không có bất kỳ
Upgradenào khác: 501. - Không xem bên trong body. Body được đo kích thước, không bao giờ được đọc. Danh sách probe ngắn và chỉ là bộ lọc nhiễu, không phải một sự bảo đảm: ứng dụng vẫn tự kiểm tra đầu vào của mình.
- Không xác thực. Ai được gọi ứng dụng là do ứng dụng quyết định, cùng với danh sách của tường lửa.
- Một địa chỉ là một client. Các client đứng sau cùng một NAT, proxy hoặc CDN dùng chung một giới hạn tốc độ và một lệnh cấm; một client có nhiều địa chỉ thì có bấy nhiêu giới hạn tốc độ.
- Lệnh cấm và các số đếm bị quên khi WAF khởi động lại.
- WAF ghi nhớ tối đa 8192 địa chỉ và giữ tối đa 1024 kết nối cùng lúc.
- WAF chỉ lắng nghe trên IPv4, nên một mục IPv6 trong
app_allowhiện chưa truy cập được gì. - Path được so sánh theo các byte mà nó giải mã ra. Một ứng dụng đọc path lỏng lẻo hơn (bỏ qua chữ hoa chữ thường, tham số
;, giải mã hai lần) có thể bị truy cập dưới một tên màdeny_pathskhông bao phủ.allow_pathskhông có lỗ hổng như vậy: những gì không được liệt kê sẽ không được chuyển tiếp. - Client đọc chậm vẫn được phục vụ đến hết. Một client vẫn tiếp tục nhận câu trả lời, dù chậm đến đâu, sẽ được phục vụ đến cuối.
- Một đợt flood có thể cắt ngang một lần upload lớn. WAF chạy trên một luồng, nên một đợt flood có thể cắt ngang một lần upload lớn bằng 408. Ứng dụng nhận body lớn thì tăng
body_timeout_secscùng vớimax_body_bytes.
Hướng dẫn worker có mọi quy tắc, bao gồm cả khi nào một thay đổi đối với
app_allow được giữ lại cho đến lần triển khai tiếp theo.





