Khi quá trình website không ngừng phát triển thì việc đảm bảo tính bảo mật cho hệ thống cũng phải bắt kịp so với sự phát triển đó. Hiện tại có rất nhiều công cụ, giải pháp bảo mật từ Network, Database, Backend, Frontend, Infrastructure…Ở bài viết này Sunteco xin chia sẻ 1 số kỹ thuật cơ bản để nâng cao bảo mật khi triển khai Nodejs. Các bạn cùng xem và đóng góp thêm nếu như có chỗ nào thiếu sót nhé.
Docker và root user – nguy cơ tiềm ẩn
Hiện nay khi nhà nhà đều sử dụng docker để triển khai các ứng dụng thì cũng là thời điểm mà các hacker khai thác các lỗ hổng từ đây.
Dưới đây là 1 ví dụ về Dockerfile cơ bản mà các bạn có tham khảo ở rất nhiều nơi trên internet:
Với dockerfile như trên thì không hề sai, chúng ta vẫn sẽ build được image và chạy container bình thường. Tuy nhiên do không chỉ định 1 user nào nên mặc định container sẽ được chạy với quyền root user. Nếu như hacker có thể khai thác lỗ hổng và kiểm soát được container đó thì đồng thời hacker cũng đang có quyền root user. Lúc này hàng loạt mối nguy hiểm tiềm tàng sẽ hiện ra như: Tự do truy tập/xóa các tệp dữ liệu, thay đổi cấu hình config, tấn công các dịch vụ khác trên máy chủ hoặc thậm chí toàn bộ hệ thống hạ tầng, đặc biệt nếu container đang chạy trên một máy chủ không được bảo mật tốt.
Để tăng cường bảo mật thì các bạn có thể sử dụng `addgroup` và `adduser` để tạo user và groupuser trong Dockerfile cho một ứng dụng Node.js cụ thể. Việc chạy ứng dụng với user không phải là root giúp cải thiện bảo mật và giảm thiểu rủi ro khi ứng dụng gặp sự cố. Bằng cách này, bạn có thể đảm bảo rằng ứng dụng của mình hoạt động trong một môi trường an toàn hơn.
Npm audit
Có 1 thói quen mà các dev hay truyền tai nhau đó là:
“Code đang chạy thì đừng động vào”.
Vâng, từ lúc đi thực tập đến 7 năm kinh nghiệm mình cũng đang áp dụng công thức này. Để công thức chạy 1 cách triệt để thì mình thường fix version cho các library để chúng không tự động cập nhật tránh làm sai mã nguồn dự án:
“axios”: “0.22.0”
Tuy nhiên điều này cũng đồng thời với việc chúng ta sẽ sống chung với các lỗ hổng bảo mật tiềm tàng, trong khi ngoài kia các hacker thì luôn khai thác lỗ hổng từ các phiên bản cũ, lỗi thời. Để nâng cao tính bảo mật thì sau 1 thời gian chúng ta cần kiểm tra các báo cáo chi tiết về các lỗ hổng bảo mật của các library đang được tích hợp vào dự án thông qua câu lệnh:
“npm audit”
Trong ảnh trên, npm audit sẽ quét tất cả các gói phụ thuộc trong dự án (bao gồm cả các gói phụ thuộc của các gói khác) để tìm kiếm các lỗ hổng bảo mật mà nó tìm thấy, bao gồm:
- Mô tả về lỗ hổng.
- Mức độ nghiêm trọng (thấp, trung bình, cao, nghiêm trọng).
- Đường dẫn đến gói bị ảnh hưởng.
- Các phiên bản an toàn mà bạn có thể nâng cấp để khắc phục lỗ hổng.
- Chạy lệnh npm audit là một bước quan trọng trong quy trình phát triển phần mềm, giúp đảm bảo rằng các ứng dụng Node.js không chỉ hoạt động tốt mà còn an toàn trước các mối đe dọa bảo mật.
Rate limit
DDoS (Distributed Denial of Service) có lẽ là 1 loại tấn công cơ bản nhất mà các hacker sẽ lựa chọn khi muốn thử sức với 1 hệ thống hoặc đơn giản đây là 1 công cụ mà đa số các hacker mới vào nghề sẽ lựa chọn để học tập.
Tuy phổ biến là vậy nhưng đa số các hệ thống vừa và nhỏ thì lại ít khi có phương án chống đỡ.
Cách hoạt động cơ bản của hình thức tấn công này là gửi hàng trăm nghìn, có khi tới hàng triệu request tới 1 địa chỉ làm cho hệ thống đó bị tắc nghẽn, quá tải và dẫn đến không thể truy cập được.
Rate limiting là một kỹ thuật bảo mật quan trọng được sử dụng để kiểm soát số lượng request mà một người dùng hoặc một địa chỉ IP có thể gửi đến một địa chỉ trong một khoảng thời gian nhất định.
Trong Node.js có thể sử dụng thư viện express-rate-limit để triển khai kỹ thuật này.
const rateLimit = require(‘express-rate-limit’);
const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 100, });
app.use(limiter);
Với đoạn code trên thì mỗi địa chỉ IP chỉ có thể gửi tối đa 100 request trong khoảng thời gian 15 phút. Nếu một địa chỉ IP vượt quá giới hạn này, các request tiếp theo sẽ bị từ chối cho đến khi khoảng thời gian 15 phút kết thúc.
Tuy nhiên khi triển khai rate limit, các bạn cần đưa ra 1 con số phù hợp với hệ thống để tránh truy cập của người dùng bị dán đoạn.
CORS
CORS (Cross-Origin Resource Sharing) là một cơ chế bảo mật được sử dụng trong các trình duyệt web để cho phép hoặc ngăn chặn các yêu cầu giữa các nguồn khác nhau. CORS cho phép một trang web truy cập tài nguyên từ một miền khác, điều này rất quan trọng trong việc phát triển các ứng dụng web hiện đại.
CORS giúp ngăn chặn các cuộc tấn công Cross-Site Scripting (XSS) và Cross-Site Request Forgery (CSRF). Nếu không có CORS, bất kỳ trang web nào cũng có thể gửi yêu cầu đến API của bạn, dẫn đến việc lạm dụng dữ liệu và thông tin nhạy cảm.
Có thể hiểu đơn giản: CORS sẽ ngăn chặn việc dùng script ở site A lấy data ở site B nếu site A và B không chung origin.
Dưới đây là ví dụ triển khai CORS cơ bản trong Nodejs:
Iframe
Điều cuối cùng mình nhắc đến trong bài viết này có lẽ ít người quan tâm nhưng nó cũng đóng vai trò bảo mật thông tin quan trọng đó chính là Iframe.
Vậy iframe là gì và hoạt động như thế nào ?
Iframe (viết tắt của “inline frame”) là một phần tử HTML cho phép nhúng một tài liệu HTML khác vào trong một trang web. Nó tạo ra một khung (frame) bên trong trang web hiện tại, cho phép hiển thị nội dung từ một nguồn khác mà không cần phải chuyển hướng người dùng ra khỏi trang hiện tại.
Các nguy cơ tiềm ẩn với Iframe:
- Tấn công Clickjacking: Kẻ tấn công sử dụng iframe để chồng lên một trang web hợp pháp. Khi người dùng nhấp vào một nút hoặc liên kết trên trang giả mạo, họ thực sự đang nhấp vào một phần tử ẩn trên trang web khác. Điều này có thể dẫn đến việc người dùng thực hiện các hành động không mong muốn, như gửi thông tin cá nhân hoặc thực hiện giao dịch tài chính.
- Nội dung không kiểm soát: Nếu một trang web khác nhúng nội dung từ trang của bạn, bạn không thể kiểm soát nội dung đó. Nếu trang đó chứa mã độc hoặc nội dung không phù hợp, điều này có thể ảnh hưởng đến uy tín và gây hại cho người dùng
- Ảnh hưởng đến SEO: Khi trang của bạn được nhúng trên các trang khác, Googlebot có thể nhận diện và liên kết đến trang gốc thay vì trang của bạn. Điều này có thể làm giảm lưu lượng truy cập và thứ hạng SEO của trang web của bạn.
- Hình ảnh, thương hiệu bị lợi dụng: Nếu không có biện pháp bảo mật thích hợp, bất kỳ ai cũng có thể nhúng trang của bạn vào trang web của họ, dẫn đến việc lạm dụng nội dung hoặc thương hiệu của bạn.
Biện pháp khắc phục:

Lưu ý: X-Frame-Options đã được thay thế dần bởi Content-Security-Policy (CSP) với directive frame-ancestors, vì CSP cung cấp nhiều tính năng hơn và khả năng kiểm soát tốt hơn. Do đó, nếu bạn đang phát triển một ứng dụng mới, bạn nên xem xét việc sử dụng CSP thay vì X-Frame-Options.
Trên đây là 1 số kỹ thuật bảo mật cơ bản để tăng cường an toàn thông tin cho hệ thống. Nếu có thiếu sót nào các bạn có thể đóng góp thêm tại bình luận bên dưới nhé.