1. Giới thiệu
1.1. Tổng quan về Tường lửa Ứng dụng Web (WAF)
Tường lửa ứng dụng web (WAF) là một giải pháp bảo mật giúp bảo vệ các ứng dụng web khỏi nhiều kiểu tấn công khác nhau, chẳng hạn như SQL injection, cross-site scripting (XSS) và bao gồm tệp từ xa (RFI). WAF phân tích và lọc lưu lượng truy cập HTTP/HTTPS đến, xác định và chặn các yêu cầu độc hại trước khi chúng đến được ứng dụng web.
1.2. Tầm quan trọng của WAF trong Node.js Express
Node.js Express là một khung ứng dụng web phổ biến để xây dựng các ứng dụng web nhanh, có thể mở rộng và linh hoạt. Do được sử dụng rộng rãi nên việc bảo mật các ứng dụng Express là rất quan trọng. Việc triển khai WAF trong Express có thể tăng cường đáng kể tính bảo mật cho các ứng dụng web của bạn, bảo vệ chúng khỏi các mối đe dọa mạng khác nhau.
2. Các thành phần tường lửa ứng dụng web
2.1. Bộ quy tắc
Bộ quy tắc là tập hợp các quy tắc mà WAF sử dụng để phân tích và lọc lưu lượng truy cập đến. Các quy tắc này có thể dựa trên Bộ quy tắc cốt lõi của Dự án bảo mật ứng dụng web mở (OWASP) (CRS), quy tắc tùy chỉnh hoặc kết hợp cả hai.
2.2. chính sách
Chính sách là các cấu hình xác định cách WAF xử lý các yêu cầu đến. Chúng bao gồm các cài đặt như lựa chọn bộ quy tắc, lọc yêu cầu và hành động được thực hiện khi quy tắc được kích hoạt.
2.3. Chế độ WAF
WAF có thể hoạt động ở hai chế độ:
- Chế độ giám sát: WAF phân tích và ghi lại lưu lượng truy cập mà không chặn bất kỳ yêu cầu nào. Chế độ này rất hữu ích để kiểm tra và tinh chỉnh các quy tắc.
- Chế độ chặn: WAF chủ động chặn các yêu cầu phù hợp với các quy tắc được xác định trong chính sách.
3. Thiết lập Ứng dụng Node.js Express
Trước khi triển khai WAF, hãy thiết lập một ứng dụng Node.js Express cơ bản.
3.1. Cài đặt phụ thuộc
Tạo một thư mục mới cho dự án của bạn và chạy lệnh sau để khởi tạo một dự án Node.js mới:
1 2 | <span class="token function">npm</span> init -y |
Cài đặt Express và các phụ thuộc cần thiết khác:
1 2 | <span class="token function">npm</span> <span class="token function">install</span> express body-parser helmet |
3.2. Tạo một ứng dụng nhanh cơ bản
Tạo một tệp mới có tên app.js trong thư mục dự án của bạn và thêm đoạn mã sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> bodyParser <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'body-parser'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> helmet <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'helmet'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">helmet</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> bodyParser <span class="token punctuation">.</span> <span class="token function">json</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> bodyParser <span class="token punctuation">.</span> <span class="token function">urlencoded</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> extended <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'Hello, World!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">PORT</span> <span class="token operator">=</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">PORT</span> <span class="token operator">||</span> <span class="token number">3000</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token constant">PORT</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">Server is running on port </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token constant">PORT</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
4. Triển khai WAF trong Node.js Express
Chúng tôi sẽ triển khai WAF trong ứng dụng Node.js Express của mình bằng gói express-waf, đây là một phần mềm trung gian dễ sử dụng.
4.1. Cài đặt gói express-waf
Chạy lệnh sau để cài đặt gói express-waf:
1 2 | <span class="token function">npm</span> <span class="token function">install</span> express-waf |
4.2. Cấu hình phần mềm trung gian express-waf
Thêm đoạn mã sau vào tệp app.js của bạn để định cấu hình phần mềm trung gian express-waf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token keyword">const</span> expressWaf <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express-waf'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Initialize express-waf with the desired configuration</span> <span class="token keyword">const</span> waf <span class="token operator">=</span> <span class="token function">expressWaf</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> mode <span class="token operator">:</span> <span class="token string">'blocking'</span> <span class="token punctuation">,</span> ruleSets <span class="token operator">:</span> <span class="token punctuation">{</span> owasp <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> custom <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> id <span class="token operator">:</span> <span class="token string">'1001'</span> <span class="token punctuation">,</span> message <span class="token operator">:</span> <span class="token string">'Custom rule: Block requestswith User-Agent "BadBot"'</span> <span class="token punctuation">,</span> regex <span class="token operator">:</span> <span class="token regex"><span class="token regex-delimiter">/</span> <span class="token regex-source language-regex">BadBot</span> <span class="token regex-delimiter">/</span> <span class="token regex-flags">i</span></span> <span class="token punctuation">,</span> target <span class="token operator">:</span> <span class="token string">'headers'</span> <span class="token punctuation">,</span> action <span class="token operator">:</span> <span class="token string">'block'</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Use express-waf middleware</span> app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> waf <span class="token punctuation">.</span> middleware <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Trong đoạn mã trên, chúng tôi:
- Nhập gói
express-waf
. - Khởi tạo phần mềm trung gian
express-waf
với cấu hình mong muốn. Chúng tôi đặt chế độ thành ‘chặn’, bật bộ quy tắc OWASP và thêm quy tắc tùy chỉnh để chặn các yêu cầu có tiêu đề Tác nhân người dùng chứa “BadBot”. - Thêm
waf.middleware
vào ứng dụng Express của chúng tôi.
4.3. Thử nghiệm WAF
Bây giờ chúng tôi đã triển khai WAF trong ứng dụng Express của mình, hãy kiểm tra nó bằng cách gửi yêu cầu có tiêu đề Tác nhân người dùng bị chặn:
- Bắt đầu ứng dụng Express của bạn:
1 2 | node app.js |
Sử dụng một công cụ như curl để gửi yêu cầu với tiêu đề Tác nhân người dùng bị chặn:
1 2 | <span class="token function">curl</span> -H <span class="token string">"User-Agent: BadBot"</span> http://localhost:3000 |
Bạn sẽ nhận được phản hồi cho biết rằng yêu cầu của bạn đã bị chặn:
1 2 | <span class="token punctuation">{</span> <span class="token property">"message"</span> <span class="token operator">:</span> <span class="token string">"Request blocked by Web Application Firewall"</span> <span class="token punctuation">}</span> |
5. Tinh chỉnh cấu hình WAF
5.1. Chuyển sang Chế độ Giám sát
Để chuyển WAF sang chế độ giám sát, hãy cập nhật cấu hình chế độ trong quá trình khởi tạo express-waf:
1 2 3 4 5 | <span class="token keyword">const</span> waf <span class="token operator">=</span> <span class="token function">expressWaf</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> mode <span class="token operator">:</span> <span class="token string">'monitoring'</span> <span class="token punctuation">,</span> <span class="token comment">// ...other configurations</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Ở chế độ giám sát, WAF sẽ ghi nhật ký các yêu cầu bị chặn thay vì chủ động chặn chúng. Điều này hữu ích để thử nghiệm và tinh chỉnh các bộ quy tắc của bạn.
5.2. Tùy chỉnh phản hồi bị chặn
Bạn có thể tùy chỉnh phản hồi được gửi tới máy khách khi yêu cầu bị chặn bằng cách cập nhật cấu hình blockResponse trong quá trình khởi tạo express-waf:
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> waf <span class="token operator">=</span> <span class="token function">expressWaf</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token comment">// ...other configurations</span> blockResponse <span class="token operator">:</span> <span class="token punctuation">{</span> status <span class="token operator">:</span> <span class="token number">403</span> <span class="token punctuation">,</span> message <span class="token operator">:</span> <span class="token string">'Access forbidden by Web Application Firewall'</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Trong ví dụ trên, chúng tôi đặt trạng thái phản hồi thành 403 và cập nhật thông báo thành ‘Truy cập bị cấm bởi Tường lửa ứng dụng web’.
Phần kết luận
Trong bài viết này, chúng ta đã thảo luận về tầm quan trọng của việc triển khai Tường lửa ứng dụng web (WAF) trong ứng dụng Node.js Express để tăng cường bảo mật. Chúng tôi đã tìm hiểu về các thành phần của WAF, chẳng hạn như bộ quy tắc, chính sách và chế độ. Sau đó, chúng tôi đã trình bày cách triển khai WAF trong ứng dụng Express bằng cách sử dụng phần mềm trung gian express-waf cũng như cách định cấu hình và tinh chỉnh cài đặt WAF.
Bằng cách kết hợp WAF vào các ứng dụng Node.js Express của bạn, bạn có thể cải thiện đáng kể tính bảo mật của chúng và bảo vệ chúng khỏi nhiều mối đe dọa trên mạng.
Và cuối cùng
Như mọi khi, tôi hy vọng bạn thích bài viết này và có một cái gì đó mới. Xin cảm ơn và hẹn gặp lại các bạn trong những bài viết tiếp theo!
Nếu các bạn thích bài viết này thì hãy cho mình 1 like và subscribe để ủng hộ mình nhé. Cảm ơn.