Nodejs có an toàn không?

Tạo nút của bạn. js an toàn là một phần thiết yếu trong quá trình phát triển Node. js mô-đun và ứng dụng. Các biện pháp bảo mật áp dụng cho cả bản thân mã và quy trình phát triển phần mềm của bạn. Phần này của Node đang diễn ra. js Reference Architecture tập trung vào một số yếu tố bảo mật chính mà các nhà phát triển JavaScript nên giải quyết

Đọc bộ truyện cho đến nay

  • Phần 1. Tổng quan về nút. kiến trúc tham chiếu js
  • Phần 2. Đăng nhập vào nút. js
  • Phần 3. Tính nhất quán của mã trong Node. js
  • Phần 4. GraphQL trong nút. js
  • Phần 5. Xây dựng container tốt
  • Phần 6. Lựa chọn khung web
  • Phần 7. Mã số bảo hiểm
  • Phần 8. bản đánh máy
  • Phần 9. Nút bảo mật. ứng dụng js
  • Phần 10. khả năng tiếp cận

Bài viết này đề cập đến tám yếu tố chính của việc xây dựng tính bảo mật trong quy trình phát triển phần mềm của bạn để làm cho Node của bạn. các ứng dụng và mô-đun js mạnh mẽ

  1. Lựa chọn phụ thuộc
  2. Quản lý quyền truy cập và nội dung của các kho lưu trữ dữ liệu công khai và riêng tư như npm và GitHub
  3. Viết mã phòng thủ
  4. Giới hạn các đặc quyền thực thi bắt buộc
  5. Hỗ trợ đăng nhập và giám sát
  6. bí mật bên ngoài
  7. Duy trì nền tảng an toàn và cập nhật cho các ứng dụng đã triển khai
  8. Duy trì các mô-đun riêng lẻ

Mặc dù đây không nhất thiết phải là một danh sách đầy đủ, nhưng đây thường là trọng tâm của các nhóm Red Hat và IBM

1. Chọn phụ thuộc của bên thứ ba

Hầu hết các nút. các ứng dụng và mô-đun js có phần phụ thuộc của bên thứ ba, nhiều trong số đó chứa các lỗ hổng bảo mật. Mặc dù các nhóm nguồn mở thường khắc phục các lỗ hổng ngay sau khi phát hiện, nhưng vẫn có những khoảng thời gian trước khi nhà phát triển ứng dụng tìm hiểu về lỗ hổng và đưa thư viện đã sửa vào sản xuất. Những kẻ tấn công có thể khai thác chương trình bị xâm nhập trong thời gian đó. Vì vậy, điều quan trọng là chọn các phụ thuộc cẩn thận và thường xuyên đánh giá xem chúng có còn là lựa chọn phù hợp với bạn không

Một vài lời khuyên hữu ích trong lĩnh vực này là

  • Xác định rằng một phần phụ thuộc là cần thiết trước khi tích hợp phần phụ thuộc đó vào ứng dụng của bạn. Việc sử dụng các mô-đun thay vì mã của bạn có tiết kiệm thời gian phát triển và bảo trì không?
  • Tránh code one-liners
  • Nếu bạn có lựa chọn phụ thuộc, hãy sử dụng phụ thuộc chỉ có một vài hoặc không có phụ thuộc nào
  • Chọn các phần phụ thuộc đã có mức độ sử dụng cao dựa trên số liệu thống kê, chẳng hạn như sao GitHub và npm. Chúng có xu hướng được duy trì tốt

Tìm thêm hướng dẫn chuyên sâu về cách quản lý các thành phần phụ thuộc trong phần lựa chọn và kiểm tra các thành phần phụ thuộc của kiến trúc tham chiếu

2. Quản lý quyền truy cập và nội dung của kho lưu trữ dữ liệu công khai và riêng tư

Các luồng phát triển hiện đại thường sử dụng kho lưu trữ dữ liệu công khai và riêng tư, bao gồm npm và GitHub. Chúng tôi đề xuất các phương pháp quản lý sau

  • Bật xác thực hai yếu tố (2FA) để đảm bảo tính toàn vẹn của mã đã cam kết và nội dung đã xuất bản. Chẳng hạn, GitHub hiện yêu cầu nhà phát triển đăng nhập để xác minh danh tính của họ thông qua mã được gửi đến thiết bị của họ
  • Sử dụng các tệp như .npmignore.gitignore để tránh vô tình xuất bản bí mật. Đây là các tệp ẩn được tham khảo bởi các chương trình (tương ứng là npm và Git). Nếu bạn liệt kê một tệp chứa bí mật của mình vào một trong những tệp ẩn này, npm và Git sẽ không bao giờ kiểm tra tệp đó trong kho lưu trữ nguồn. Tất nhiên, bạn phải có một quy trình riêng biệt để quản lý các bí mật. Có rất nhiều dịch vụ có sẵn để giúp bạn

Tệp .npmrc thường cần thiết để cài đặt npm, đặc biệt nếu bạn có các mô-đun riêng. Tránh rò rỉ thông tin trong tệp .npmrc khi xây dựng vùng chứa bằng cách sử dụng một trong các tùy chọn này

  • Sử dụng các bản dựng hai giai đoạn, trong đó bạn tạo một hình ảnh với tất cả các công cụ cho ứng dụng và một hình ảnh thứ hai để tạo một hình ảnh rút gọn. Ngoài việc tiết kiệm dung lượng bộ nhớ và ổ đĩa, bản dựng hai giai đoạn cho phép bạn bỏ qua tệp .npmrc khỏi hình ảnh cuối cùng được đưa vào sản xuất
  • Tránh thêm bí mật vào bất kỳ hình ảnh nào trong quá trình xây dựng. Thay vào đó, bạn có thể gắn bí mật vào vùng chứa một cách an toàn trong quá trình xây dựng, như được giải thích trong bài viết Cách giấu bí mật vào vùng chứa của bạn. Đặc biệt, Buildah có các chức năng tích hợp giúp dễ dàng gắn các tệp có bí mật hơn
  • Phương pháp ít được ưu tiên nhất. Xóa tệp .npmrc khỏi hình ảnh cuối cùng và nén hình ảnh để làm phẳng các lớp

3. Viết mã phòng thủ

Mã hóa an toàn thường yêu cầu đào tạo đặc biệt và không thể tóm tắt trong các nguyên tắc đơn giản. Tuy nhiên, bạn có thể loại bỏ nhiều lỗ hổng phổ biến bằng cách làm theo các khuyến nghị trong phần này. Có một danh sách mở rộng hơn trong phần Quy trình phát triển an toàn của kiến ​​trúc tham chiếu

Tránh trạng thái toàn cầu

Sử dụng các biến toàn cục khiến thông tin giữa các yêu cầu vô tình bị rò rỉ dễ dàng. Với các biến toàn cục, dữ liệu từ một khách truy cập web có thể nằm trong bộ nhớ khi một khách truy cập thứ hai gửi yêu cầu. Các tác động tiềm ẩn bao gồm làm hỏng yêu cầu hoặc tiết lộ thông tin cá nhân cho khách truy cập khác

Mỗi yêu cầu nên đóng gói dữ liệu của nó. Nếu bạn cần dữ liệu toàn cầu, chẳng hạn như số liệu thống kê về lưu lượng bạn đang xử lý, hãy lưu trữ dữ liệu đó trong cơ sở dữ liệu bên ngoài. Giải pháp này thích hợp hơn với các biến toàn cục vì dữ liệu trong cơ sở dữ liệu là liên tục

Đặt biến môi trường NODE_ENV thành sản xuất

Một số gói tham khảo biến môi trường NODE_ENV để quyết định xem chúng có cần khóa mọi thứ hay chia sẻ ít thông tin hơn không. Do đó, đặt biến thành production là cài đặt an toàn nhất và nên được sử dụng mọi lúc. Nhà phát triển ứng dụng, không phải gói, nên xác định thông tin nào sẽ hiển thị

Xác thực đầu vào của người dùng

Đầu vào không hợp lệ có thể dẫn đến các cuộc tấn công như chèn lệnh, chèn SQL và từ chối dịch vụ, làm gián đoạn dịch vụ của bạn và làm hỏng dữ liệu. Luôn xác thực đầu vào của người dùng trước khi triển khai nó trong mã ứng dụng của bạn. Đảm bảo rằng bạn xác thực đầu vào trên máy chủ ngay cả khi bạn xác thực ở phía máy khách (trình duyệt hoặc ứng dụng di động) vì kẻ tấn công có thể gửi yêu cầu trực tiếp đến API mà không cần sử dụng máy khách

Bao gồm xử lý ngoại lệ tốt

Thực tiễn cơ bản để xử lý các ngoại lệ bao gồm

  • Kiểm tra ở mức cao để tìm các trường hợp ngoại lệ bị bỏ lỡ và xử lý chúng một cách khéo léo. Đảm bảo có trình xử lý mặc định cho Express và các khung web khác để tránh hiển thị lỗi với dấu vết ngăn xếp cho khách truy cập
  • Lắng nghe lỗi khi sử dụng EventEmitters
  • Kiểm tra lỗi được chuyển vào cuộc gọi không đồng bộ

Tránh các biểu thức chính quy phức tạp

Cụm từ thông dụng giúp thực hiện các tác vụ phân tích cú pháp văn bản, chẳng hạn như đảm bảo rằng khách truy cập đã gửi địa chỉ email hoặc số điện thoại của họ ở định dạng có thể chấp nhận được hoặc kiểm tra đầu vào để tìm các ký tự đáng ngờ có thể báo hiệu một cuộc tấn công. Thật không may, nếu một biểu thức chính quy phức tạp, có thể mất nhiều thời gian để chạy. Trên thực tế, một số regex về cơ bản chạy mãi mãi trên một số loại văn bản

Tệ hơn nữa, mặc dù biểu thức chính quy của bạn có thể hoạt động hợp lý dưới hầu hết đầu vào, nhưng kẻ tấn công ác ý có thể cung cấp nội dung kích hoạt quá trình chạy vô tận. Bài viết Từ chối dịch vụ biểu thức chính quy - ReDoS giải thích loại lỗ hổng này

Điều rút ra là hãy cẩn thận về độ phức tạp của bất kỳ biểu thức chính quy nào bạn sử dụng. Khi kiểm tra kiểu nhập văn bản, hãy tránh các cụm từ thông dụng hoặc chỉ sử dụng các cụm từ đơn giản để kiểm tra các vấn đề như ký tự không hợp lệ

Hạn chế bề mặt tấn công

Một số cách hữu ích để hạn chế bề mặt tấn công có sẵn là

  • Chỉ hiển thị các API cần thiết để hỗ trợ các hoạt động dự định. Ví dụ: khi sử dụng Express, hãy xóa mọi tuyến đường không cần thiết
  • Nhóm tất cả các điểm cuối bên ngoài dưới một tiền tố (i. e. , /api). Điều này giúp việc chỉ hiển thị các API dành cho bên ngoài trong cấu hình đầu vào dễ dàng hơn
  • Đừng viết lại đường dẫn đến thư mục gốc (______8)
  • Sử dụng xác thực để giới hạn quyền truy cập. Khi có thể, hãy tích hợp một nhà cung cấp kiểm soát truy cập và nhận dạng tổ chức thay vì triển khai của riêng bạn

4. Giới hạn các đặc quyền thực thi bắt buộc

Thiết kế các ứng dụng của bạn để chạy với các đặc quyền tối thiểu được yêu cầu. Đảm bảo rằng các ứng dụng của bạn có thể chạy với tư cách là người dùng không phải root, đặc biệt là khi được triển khai trong các vùng chứa. Người dùng và nhóm mà ứng dụng chạy theo đó chỉ có quyền truy cập vào một tập hợp tệp và tài nguyên tối thiểu. Để biết thêm các đề xuất về vùng chứa, hãy xem phần năm của loạt bài này. Xây dựng container tốt

5. Hỗ trợ đăng nhập và giám sát

Ghi nhật ký các hành động nhạy cảm hoặc đáng ngờ sẽ giúp các công cụ giám sát thu thập và phân tích dữ liệu dễ dàng hơn. Xem phần ghi nhật ký của cấu trúc tham chiếu để biết các gói giám sát được đề xuất

6. bí mật bên ngoài

Bí mật (tôi. e. , mật khẩu) phải được xác định bên ngoài và cung cấp cho ứng dụng trong thời gian chạy thông qua các phương tiện bảo mật. Đảm bảo rằng bạn không chuyển giao bí mật trong kho mã hoặc xây dựng chúng thành hình ảnh vùng chứa

Bài viết quản lý bí mật GitOps cung cấp tổng quan tốt về các kỹ thuật và thành phần được sử dụng để quản lý bí mật bên ngoài. Bài viết còn đề cập đến các bài viết khác về chủ đề

Cụ thể hơn cho Node. js, hãy cân nhắc sử dụng gói dotenv, gói phổ biến trong nhóm của chúng tôi. Chúng tôi cũng đóng góp cho các ràng buộc dịch vụ kube để hỗ trợ Đặc tả ràng buộc dịch vụ cho Kubernetes

Một trong những công cụ hàng đầu để quản lý các bí mật bên ngoài là node-vault. Các nhóm tham gia vào quá trình triển khai với đám mây của IBM sẽ tìm Nút Trình quản lý bí mật của đám mây IBM. js SDK hữu ích

7. Duy trì nền tảng an toàn và cập nhật cho các ứng dụng đã triển khai

một nút. ứng dụng js nằm trên một số thành phần. Bạn phải giữ nền tảng này an toàn và cập nhật trong suốt vòng đời của ứng dụng, ngay cả khi không có mã nào thay đổi trong ứng dụng của bạn

Các yếu tố chính bao gồm an toàn và cập nhật

  • hình ảnh thùng chứa cơ sở
  • Nút. thời gian chạy js
  • phụ thuộc

Dựa trên kinh nghiệm của nhóm, đây là một số mẹo được đề xuất

  • Tận dụng các container image đi kèm với Node. js đã được đóng gói trong. Những người bảo trì thường phát hành bản cập nhật sau khi sửa CVE được báo cáo đối với Node. js hoặc bất kỳ thành phần nào khác trong vùng chứa. Đây là một trong những lý do các thành viên trong nhóm thường sử dụng hình ảnh bộ chứa ubi/nodejs
  • Nếu bạn xây dựng Nút. js thành một hình ảnh cơ sở, hãy đăng ký và đọc danh sách gửi thư của nodejs-sec. Danh sách gửi thư có khối lượng thấp này cung cấp thông báo trước về các bản phát hành bảo mật và sẽ cung cấp cho bạn cảnh báo sớm nhất để cập nhật Nút của bạn. phiên bản js
  • Nếu bạn sử dụng các phần phụ thuộc phổ biến trong nhiều dự án, hãy tạo một hình ảnh phụ thuộc để mỗi dự án đọc. Mặc dù việc tập trung hóa này phù hợp với thời gian xây dựng, như được nêu trong phần hình ảnh phụ thuộc của kiến ​​trúc tham chiếu, nhưng nó cũng giúp giảm tổng công việc cần thiết cho các bản cập nhật phụ thuộc khi được chia sẻ trên nhiều dự án

Để biết danh sách mẹo đầy đủ hơn, hãy xem phần Quy trình phát triển an toàn của kiến ​​trúc tham chiếu

8. Duy trì các mô-đun riêng lẻ

Khi bạn duy trì các mô-đun trong GitHub, hãy bật tích hợp Snyk và xem xét các yêu cầu kéo mà nó tạo ra

Việc kiểm tra và đảm bảo mô-đun chạy và vượt qua các bài kiểm tra trên phiên bản Hỗ trợ dài hạn (LTS) mới nhất của Node cũng rất quan trọng. js. Kiểm thử tự động giảm thiểu rủi ro khi Node. bản phát hành bảo mật js yêu cầu cập nhật

Kế tiếp

Chúng tôi dự định đề cập đến các chủ đề mới thường xuyên như một phần của Node. loạt kiến ​​trúc tham khảo js. Cho đến phần tiếp theo, chúng tôi mời bạn ghé thăm Node. js trên GitHub, nơi bạn sẽ thấy công việc chúng tôi đã thực hiện và mong chờ các chủ đề trong tương lai

Nút JS có an toàn hơn PHP không?

Nút. js nhanh và nhẹ. Nó an toàn hơn PHP .

Nút JS có an toàn hơn Java không?

Mặc dù Java vượt trội về tính hiệu quả và bảo mật của ứng dụng , nhưng Node. js thích hợp hơn để lập trình dễ dàng. Các nhà phát triển sử dụng Java để tạo ra nhiều ứng dụng thành công.

Phần phụ trợ của nút JS có an toàn không?

Nút. js là một trong những công nghệ mà các nhà phát triển sử dụng để phát triển ứng dụng web. Nó được thiết kế để hoàn toàn bảo mật .

Nhược điểm của nút JS là gì?

Nút. js Nhược điểm. nút là gì. js không tốt cho .
Giảm hiệu suất khi xử lý các tác vụ điện toán nặng
Nút. js mời rất nhiều thay đổi mã do API không ổn định
Nút. js Mô hình lập trình không đồng bộ gây khó khăn cho việc duy trì mã
Chọn một cách khôn ngoan – Thiếu hỗ trợ thư viện có thể gây nguy hiểm cho mã của bạn