Thực tiễn tốt nhất để bảo vệ API REST / dịch vụ web [đã đóng]


828

Khi thiết kế API REST hoặc dịch vụ, có bất kỳ thực tiễn tốt nhất nào được thiết lập để xử lý bảo mật (Xác thực, Ủy quyền, Quản lý danh tính) không?

Khi xây dựng API SOAP, bạn có WS-Security làm hướng dẫn và có nhiều tài liệu về chủ đề này. Tôi đã tìm thấy ít thông tin hơn về việc bảo vệ các điểm cuối REST.

Mặc dù tôi hiểu REST cố ý không có các đặc tả tương tự như WS- * Tôi hy vọng các thực tiễn tốt nhất hoặc các mẫu được đề xuất đã xuất hiện.

Bất kỳ thảo luận hoặc liên kết đến các tài liệu liên quan sẽ được đánh giá rất cao. Nếu có vấn đề, chúng tôi sẽ sử dụng WCF với các thông báo được tuần tự hóa POX / JSON cho API / Dịch vụ của API được xây dựng bằng cách sử dụng phiên bản 3.5 của .NET Framework.


1
Bạn có biết bất kỳ ứng dụng thực tế đầy đủ nào sử dụng các mẫu và thực tiễn tốt với API REST và dịch vụ web trong github không?
PreguntonCojoneroCabrón

Câu trả lời:


298

Như đã nói, Amazon S3 là một mô hình tốt để làm việc. Chữ ký yêu cầu của họ có một số tính năng (chẳng hạn như kết hợp dấu thời gian) giúp bảo vệ chống lại cả yêu cầu vô tình và độc hại phát lại.

Điều thú vị về HTTP Basic là hầu như tất cả các thư viện HTTP đều hỗ trợ nó. Tất nhiên, bạn sẽ cần phải yêu cầu SSL trong trường hợp này bởi vì việc gửi mật khẩu văn bản gốc qua mạng gần như là một điều xấu. Basic thích hợp hơn với Digest khi sử dụng SSL vì ngay cả khi người gọi đã biết rằng thông tin đăng nhập là bắt buộc, Digest yêu cầu thêm một vòng để trao đổi giá trị nonce. Với Basic, người gọi chỉ cần gửi thông tin đăng nhập lần đầu tiên.

Khi danh tính của khách hàng được thiết lập, ủy quyền thực sự chỉ là một vấn đề thực hiện. Tuy nhiên, bạn có thể ủy quyền cho một số thành phần khác với mô hình ủy quyền hiện có. Một lần nữa, điều tuyệt vời về Basic ở đây là máy chủ của bạn kết thúc với một bản sao rõ ràng của mật khẩu của khách hàng mà bạn có thể chỉ cần chuyển sang một thành phần khác trong cơ sở hạ tầng của bạn khi cần.


3
SSL là một phần quan trọng của bảo mật, nhưng không phải tất cả các ứng dụng đều yêu cầu mức mã hóa đó. Nếu ai đó đánh cắp quá cảnh những gì bạn sẽ đăng công khai trên Twitter, đó có phải là một nhược điểm đáng kể không? Đối với phần lớn mã hóa SSL của API sẽ được ưu tiên. Các yêu cầu về cơ sở hạ tầng của SSL có phần cao hơn so với văn bản gốc và không có máy chủ bộ đệm trung gian (đọc ở đây cạnh) có thể tham gia vào bộ đệm của nội dung được truy cập nhiều lần. Coi chừng, khả năng mở rộng của bạn có thể bị ảnh hưởng nếu bạn hoàn toàn yêu cầu mã hóa được cung cấp.
Norman H

36
@NormanH: Đối số của bạn rất đặc biệt, bởi vì nếu ai đó có thể thấy toàn bộ giao dịch mà tôi sử dụng để đăng lên Twitter, thì họ có thể mạo danh tôi và đăng tin nhắn của họ dưới tên của tôi.
Greg Hewgill

3
Trích dẫn từ wikipedia về xác thực Digest, "Xác thực truy cập Digest là một trong những phương thức được thỏa thuận mà máy chủ web có thể sử dụng để đàm phán thông tin đăng nhập với trình duyệt web của người dùng. Nó áp dụng hàm băm cho mật khẩu trước khi gửi qua mạng, đó là an toàn hơn xác thực truy cập cơ bản, sẽ gửi bản rõ. " đó sẽ là một cách tiêu chuẩn để hoàn thành những gì tôi đã nói ở trên. (Xem en.wikipedia.org/wiki/Digest_access_authentication để biết chi tiết)
Norman H

5
"sending plaintext passwords over the net is almost universally a bad thing"- Bạn có thể giải thích về "gần như"? Khi nào nó không phải là một ý tưởng tồi?
toniedzwiedz

2
@GregHewgill ngay cả trong một mạng riêng, tôi sẽ không muốn người dùng của mình có thể chặn mật khẩu của nhau. Tình huống duy nhất tôi có thể nghĩ đến, trong đó việc gửi mật khẩu qua mạng là ổn khi người dùng ở một mình trong mạng. Thực tế là những điều như vậy xảy ra ở nơi khác hầu như không phải là một lý do để cho phép nó.
toniedzwiedz

115

Không có tiêu chuẩn nào cho REST ngoài HTTP. Có những dịch vụ REST được thiết lập ngoài kia. Tôi đề nghị bạn hãy xem qua chúng và cảm nhận về cách chúng hoạt động.

Ví dụ: chúng tôi đã mượn rất nhiều ý tưởng từ dịch vụ S3 REST của Amazon khi phát triển riêng của chúng tôi. Nhưng chúng tôi đã chọn không sử dụng mô hình bảo mật tiên tiến hơn dựa trên chữ ký yêu cầu. Cách tiếp cận đơn giản hơn là HTTP Basic auth qua SSL. Bạn phải quyết định những gì làm việc tốt nhất trong tình huống của bạn.

Ngoài ra, tôi đánh giá cao cuốn sách Dịch vụ web RESTful từ O'reilly. Nó giải thích các khái niệm cốt lõi và cung cấp một số thực tiễn tốt nhất. Nói chung, bạn có thể lấy mô hình họ cung cấp và ánh xạ nó tới ứng dụng của riêng bạn.


6
Dịch vụ Web RESTful chắc chắn là một cuốn sách tuyệt vời. A phải đọc trong lĩnh vực này. Đó là cảm hứng hết sức.
EdgarVerona

6
Làm thế nào mà @aehlke đã nhận được rất nhiều sự ủng hộ cho nhận xét đó khi xem xét (1) không có gì giống như đặc tả REST và (2) Luận án Fielding về Phong cách kiến ​​trúc và Thiết kế Kiến trúc phần mềm dựa trên mạng đề cập rõ ràng đến REST và HTTP trong 6.3: REST Áp dụng cho HTTP.

20
HTTP không phải là một yêu cầu cho REST.
chiến lược

1
Cuốn sách Dịch vụ web RESTful có sẵn miễn phí từ trang web của họ: crummy.com/wr/RESTful-Web-Service
icc97

Tôi đã định đọc cuốn sách và sau đó tôi nhận ra nó chủ yếu được nhắm mục tiêu cho định dạng XML. Tôi có nên sử dụng cuốn sách này xem xét mức độ phổ biến của JSON? Hoặc nó không phụ thuộc vào Định dạng trao đổi dữ liệu. Cần hướng dẫn.
Bhargav Jhaveri

72

Bạn cũng có thể muốn xem OAuth , một giao thức mở mới nổi cho ủy quyền dựa trên mã thông báo cụ thể nhắm mục tiêu http apis.

Nó rất giống với cách tiếp cận được thực hiện bởi flickrghi nhớ apis "rest" sữa (không nhất thiết là ví dụ tốt về apis nghỉ ngơi, nhưng ví dụ hay về cách tiếp cận dựa trên mã thông báo).


3
Nhưng có vẻ như oAuth 2 chân, mà tôi nghĩ là những gì cần thiết ở đây, không được bảo hiểm (thiếu thông tin) nhiều như 3 chân.
redben

4
OAuth là về ủy quyền, tức là tôi là chủ sở hữu thông tin / tài khoản, hãy để dịch vụ A tương tác với dữ liệu của tôi trên dịch vụ B (ví dụ: tôi để Twitter viết trên facebook của mình). Đó không phải là ủy quyền theo nghĩa rộng hơn là kiểm soát những gì người dùng có thể làm đối với tài nguyên (dữ liệu, thông tin, dịch vụ ...). Đây là nơi XACML bước vào. XACML cho phép bạn xác định các chính sách ủy quyền về người có thể làm gì.
David Brossard

60

Có một danh sách kiểm tra tuyệt vời được tìm thấy trên Github :

Xác thực

  • Không phát minh lại bánh xe trong Xác thực, tạo mã thông báo, lưu trữ mật khẩu. Sử dụng các tiêu chuẩn.

  • Sử dụng Max Retryvà bỏ tù các tính năng trong Đăng nhập.

  • Sử dụng mã hóa trên tất cả các dữ liệu nhạy cảm.

JWT (Mã thông báo web JSON)

  • Sử dụng một khóa phức tạp ngẫu nhiên (Bí mật JWT) để tạo ra vũ lực buộc mã thông báo rất khó khăn.

  • Đừng trích xuất thuật toán từ tải trọng. Buộc thuật toán trong phần phụ trợ (HS256 hoặc RS256).

  • Làm cho mã thông báo hết hạn ( TTL, RTTL) càng ngắn càng tốt.

  • Không lưu trữ dữ liệu nhạy cảm trong JWTtải trọng, nó có thể được giải mã dễ dàng.

Ôi

  • Luôn xác thực redirect_uriphía máy chủ để chỉ cho phép các URL được liệt kê trong danh sách trắng.

  • Luôn cố gắng trao đổi mã và không mã thông báo (không cho phép response_type=token).

  • Sử dụng tham số trạng thái với một hash ngẫu nhiên để ngăn chặn CSRFtrên OAuthquá trình xác thực.

  • Xác định phạm vi mặc định và xác thực các tham số phạm vi cho từng ứng dụng.

Truy cập

  • Giới hạn các yêu cầu (Throttling) để tránh các cuộc tấn công DDoS / brute-force.

  • Sử dụng HTTPS ở phía máy chủ để tránh MITM (Man In The Middle Attack)

  • Sử dụng HSTStiêu đề với SSL để tránh tấn công Dải SSL.

Đầu vào

  • Sử dụng phương thức HTTP phù hợp theo thao tác: GET(đọc), POST(tạo), PUT/PATCH(thay thế / cập nhật) và DELETE(để xóa một bản ghi) và trả lời 405 Method Not Allowednếu phương thức được yêu cầu không phù hợp với tài nguyên được yêu cầu.

  • Validate content-type theo yêu cầu Accepttiêu đề (Nội dung đàm phán) chỉ cho phép định dạng của bạn được hỗ trợ (ví dụ như application/xml, application/json, vv) và đáp ứng với 406 Not Acceptablephản ứng nếu không phù hợp.

  • Validate content-typecủa posted dữ liệu như bạn chấp nhận (ví dụ application/x-www-form-urlencoded, multipart/form-data, application/json, vv).

  • Xác thực đầu vào của Người dùng để tránh các lỗ hổng phổ biến (ví dụ XSS, SQL-Injection, Thực thi mã từ xa, v.v.).

  • Không sử dụng bất kỳ dữ liệu nhạy cảm nào (thông tin đăng nhập, Mật khẩu, mã thông báo bảo mật hoặc khóa API) trong URL, nhưng sử dụng tiêu Authorizationđề chuẩn .

  • Sử dụng dịch vụ Cổng API để bật bộ đệm, Rate Limitchính sách (ví dụ: Hạn ngạch, Bắt giữ tăng đột biến, Giới hạn tỷ lệ đồng thời) và triển khai tài nguyên API một cách linh hoạt.

Chế biến

  • Kiểm tra xem tất cả các điểm cuối được bảo vệ đằng sau xác thực để tránh quá trình xác thực bị hỏng.

  • ID tài nguyên của người dùng nên tránh. Sử dụng / tôi / đơn hàng thay vì / người dùng / 654321 / đơn hàng.

  • Không tự động tăng ID. Sử dụng UUID thay thế.

  • Nếu bạn đang phân tích tệp XML, hãy đảm bảo phân tích cú pháp thực thể không được bật để tránh XXE (tấn công thực thể bên ngoài XML).

  • Nếu bạn đang phân tích tệp XML, hãy đảm bảo mở rộng thực thể không được bật để tránh bom Tỷ tỷ cười / XML thông qua tấn công mở rộng thực thể theo cấp số nhân.

  • Sử dụng CDN để tải lên tập tin.

  • Nếu bạn đang xử lý lượng dữ liệu khổng lồ, hãy sử dụng Công nhân và Hàng đợi để xử lý càng nhiều càng tốt trong nền và trả về phản hồi nhanh để tránh Chặn HTTP.

  • Đừng quên tắt chế độ DEBUG .

Đầu ra

  • Gửi X-Content-Type-Options: nosnifftiêu đề.

  • Gửi X-Frame-Options: denytiêu đề.

  • Gửi Content-Security-Policy: default-src 'none'tiêu đề.

  • Hủy bỏ OS fingerprinting tiêu đề - X-Powered-By, Server, X-AspNet-Version, vv

  • Buộc content-typecho phản hồi của bạn, nếu bạn quay lại application/jsonthì loại nội dung phản hồi của bạn là application/json.

  • Không trả lại dữ liệu nhạy cảm như thông tin đăng nhập, Mật khẩu, mã thông báo bảo mật.

  • Trả về mã trạng thái phù hợp theo các hoạt động hoàn thành. (ví dụ như 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, vv).


1
Danh sách đẹp, mặc dù có một chút ý kiến ​​- và nó bắt đầu bằng một imho vô nghĩa: "Đừng sử dụng Auth cơ bản Sử dụng xác thực tiêu chuẩn (ví dụ JWT, OAuth)." Bạn không thể có được nhiều tiêu chuẩn hơn so với Basic Auth và nó có vị trí của nó, đặc biệt là đối với các API mà máy khách không phải là trình duyệt (đối với trình duyệt JWT thường phù hợp hơn). Mặt khác, OAuth đang sử dụng một loạt các thỏa hiệp khác để xác thực và không thực sự có thể so sánh với Basic Auth và JWT.
johndodo

Bạn nói đúng, BasicAuth với HTTPS là phổ biến, nhưng nó đang được tranh luận sôi nổi - security.stackexchange.com/questions/988/ trên . Tôi sẽ loại bỏ điểm này nào.
Andrejs

43

Tôi hơi ngạc nhiên về SSL với chứng chỉ ứng dụng khách chưa được đề cập. Cấp, cách tiếp cận này chỉ thực sự hữu ích nếu bạn có thể tin tưởng vào cộng đồng người dùng được xác định bằng chứng chỉ. Nhưng một số chính phủ / công ty phát hành chúng cho người dùng của họ. Người dùng không phải lo lắng về việc tạo thêm một kết hợp tên người dùng / mật khẩu khác và danh tính được thiết lập trên mỗi kết nối để giao tiếp với máy chủ có thể hoàn toàn không trạng thái, không cần phiên người dùng. (Không ngụ ý rằng bất kỳ / tất cả các giải pháp khác được đề cập đều yêu cầu phiên)


Chúng tôi thực sự sử dụng điều này cho một số tích hợp cũng như các đường hầm vpn được mã hóa để hỗ trợ các hệ thống cũ hơn mà chúng tôi không kiểm soát mà không thể giao tiếp qua https.
Casey

Máy khách có thể gây rắc rối khi bạn cần cân bằng tải ... có thể được thực hiện, nhưng nó ít đơn giản hơn.
Jeremy Logan

2
@fiXedd - Điều ngược lại là kinh nghiệm của tôi với các khách hàng vì họ thực sự không quốc tịch. Các kết nối được chứng thực của máy khách có thể được cân bằng tải với bộ cân bằng tải câm mà không liên quan đến độ dính kết nối vì chúng yêu cầu trạng thái chia sẻ hoàn toàn bằng không giữa máy khách và máy chủ.
stinkymatt

4
Ồ, bạn có thể làm điều đó .... bạn chỉ có thể có bộ cân bằng tải chuyển tiếp lưu lượng TCP, nhưng chẳng hạn, bạn không thể có bộ cân bằng tải là điểm kết thúc cho SSL.
Jeremy Logan

Nó vẫn an toàn nếu chứng chỉ ứng dụng khách và quyền hạn gốc của nó được tự ký? Cơ quan gốc sẽ được nhập vào cơ quan cấp chứng chỉ gốc đáng tin cậy của khách hàng.
Joyce

38

Mọi người trong những câu trả lời này đã bỏ qua kiểm soát truy cập / ủy quyền thực sự.

Ví dụ: nếu API / dịch vụ web REST của bạn là về BÀI ĐĂNG / NHẬN hồ sơ y tế, bạn có thể muốn xác định chính sách kiểm soát truy cập về người có thể truy cập dữ liệu và trong trường hợp nào. Ví dụ:

  • các bác sĩ có thể NHẬN hồ sơ bệnh án của một bệnh nhân mà họ có mối quan hệ chăm sóc
  • không ai có thể POST dữ liệu y tế ngoài giờ thực hành (ví dụ 9 đến 5)
  • người dùng cuối có thể NHẬN hồ sơ y tế mà họ sở hữu hoặc hồ sơ bệnh án của bệnh nhân mà họ là người giám hộ
  • y tá có thể CẬP NHẬT hồ sơ bệnh án của một bệnh nhân thuộc cùng đơn vị với y tá.

Để xác định và triển khai các ủy quyền chi tiết đó, bạn sẽ cần sử dụng ngôn ngữ kiểm soát truy cập dựa trên thuộc tính được gọi là XACML, Ngôn ngữ đánh dấu kiểm soát truy cập eXtensible.

Các tiêu chuẩn khác ở đây là dành cho:

  • OAuth: id. Liên đoàn và ủy quyền, ví dụ: để một dịch vụ thay mặt tôi thực hiện dịch vụ khác (Facebook có thể đăng lên Twitter của tôi)
  • SAML: liên kết danh tính / SSO web. SAML nói rất nhiều về người dùng.
  • Các tiêu chuẩn WS-Security / WS- *: chúng tập trung vào giao tiếp giữa các dịch vụ SOAP. Chúng đặc trưng cho định dạng nhắn tin cấp ứng dụng (SOAP) và chúng xử lý các khía cạnh của nhắn tin, ví dụ như độ tin cậy, bảo mật, bảo mật, tính toàn vẹn, tính nguyên tử, sự kiện ... Không có kiểm soát truy cập nào và tất cả đều cụ thể đối với SOAP.

XACML là bất khả tri về công nghệ. Nó có thể được áp dụng cho các ứng dụng java, .NET, Python, Ruby ... các dịch vụ web, API REST, v.v.

Sau đây là các tài nguyên thú vị:


2
Tôi không hiểu tại sao bạn không thể triển khai hệ thống mã thông báo sẽ có được người dùng và quyền của anh ta về cơ bản là giống nhau?
Stan

Bạn có thể thực hiện một cách tiếp cận dựa trên mã thông báo. Điều đó cũng hoạt động tốt nhưng bạn vẫn cần logic xác định quyền mà người dùng nhận được, nói cách khác, quyền nào được chèn bên trong mã thông báo. Đó là những gì XACML có thể giúp bạn đạt được. Nó cũng tránh phình token.
David Brossard

2
Là một bình luận phụ, "9 đến 5" đóng góp gì cho bảo mật? Như thể những kẻ tấn công chỉ hoạt động vào ban đêm? Không nói về ý nghĩa sử dụng nghiêm trọng, như thể các bác sĩ chỉ làm việc "9 đến 5".
Roland

Đó là một yêu cầu chung trong các tình huống chăm sóc sức khỏe. Kiểm tra HL7 chẳng hạn. Cũng có những kịch bản phá vỡ trong trường hợp bác sĩ không cần truy cập ngoài giờ. Đối với tin tặc, một khi tất cả các cược đã tắt
David Brossard

1
Một số đồng nghiệp của tôi đang điều tra thực sự đó. Cảm ơn @SimplyG.
David Brossard

25

Tôi đã sử dụng OAuth một vài lần và cũng đã sử dụng một số phương pháp khác (BASIC / DIGEST). Tôi hết lòng đề nghị OAuth. Liên kết sau đây là hướng dẫn tốt nhất tôi từng thấy khi sử dụng OAuth:

http://hueniverse.com/oauth/guide/


Mặc dù đây là một câu trả lời rất cũ liên quan đến OAuth 1.0, nhưng đáng chú ý là tác giả của liên kết mà bạn trích dẫn đã nói điều này về OAuth 2.0 : "Tôi đã đi đến kết luận rằng OAuth 2.0 là một giao thức tồi ... Khi so sánh với OAuth 1.0, đặc tả 2.0 phức tạp hơn, ít tương tác hơn, ít hữu ích hơn, không đầy đủ hơn và quan trọng nhất là kém an toàn hơn. " . Để rõ ràng, bình luận tôi đang trích dẫn đã được thực hiện vài năm sau khi bạn đăng câu trả lời của bạn.
skomisa

17

Một trong những bài viết hay nhất tôi từng gặp về Bảo mật vì nó liên quan đến REST đã kết thúc tại 1 RainDrop . API sử dụng OAuth của API cũng để bảo mật và bạn có toàn quyền truy cập vào các kênh tùy chỉnh của họ trong mã RestChess, điều mà tôi đã khám phá rất nhiều. Đây là bản demo tại Mix và bạn có thể tìm thấy bài đăng ở đây .


Cảm ơn liên kết (1 RainDrop) - cuộc thảo luận rất thú vị về bảo mật vì nó liên quan đến SOAP v REST
Nathan

15

Cảm ơn lời khuyên tuyệt vời. Chúng tôi đã kết thúc bằng cách sử dụng tiêu đề HTTP tùy chỉnh để chuyển mã thông báo nhận dạng từ máy khách sang dịch vụ, để chuẩn bị tích hợp API RESTful của chúng tôi với khung Nhận dạng Zermatt sắp tới từ Microsoft. Tôi đã mô tả vấn đề ở đây và giải pháp của chúng tôi ở đây . Tôi cũng đã nghe lời khuyên của tinh chỉnh và mua Dịch vụ web RESTful - một cuốn sách rất hay nếu bạn đang xây dựng API RESTful dưới bất kỳ hình thức nào.


1
Cách tiếp cận này nghe có vẻ tanh với tôi. Điều gì ngăn kẻ tấn công sử dụng mã thông báo nhận dạng để giả trang cho khách hàng? HTTPS không bảo vệ URL hoặc các tiêu đề trong lần cuối cùng tôi kiểm tra ...
Gili

2
Hmmm ... không chắc bạn đúng về điều đó. Tôi tin rằng ngoại trừ một vài tiêu đề cần thiết để hiểu loại mã hóa nào là bắt buộc, tất cả các tiêu đề khác đều được mã hóa.
Nathan

51
Điều đó là sai. HTTPS bảo vệ MỌI THỨ. Nó hoạt động: Bắt tay TCP ... Bắt tay TLS ... <ENCRYPTED> GET / foo 200 OK ... xé </ ENCRYPTED>.
Đánh dấu Renouf

1
Lưu ý rằng bạn cũng có thể chuyển mã thông báo dưới dạng cookie (thay vì tiêu đề tùy chỉnh). Điều này hoạt động tốt trong các trình duyệt vì nó sử dụng tiêu đề HTTP với các hành vi tiêu chuẩn trong hầu hết các bộ công cụ và ứng dụng. Về phía dịch vụ, cookie không phải liên quan đến phiên, bạn có thể sử dụng nó để liên lạc với bất kỳ mã thông báo nào bạn muốn.
Bruce Alderson

11
Wayback Machine là một điều tuyệt vời: mô tả vấn đềgiải pháp
cjc343

14

OWASP (Dự án bảo mật ứng dụng web mở) có một số bảng cheat bao gồm tất cả các khía cạnh của phát triển Ứng dụng Web. Dự án này là một nguồn thông tin rất có giá trị và đáng tin cậy. Về các dịch vụ REST, bạn có thể kiểm tra điều này: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet


7

Tôi muốn giới thiệu OAuth 2/3. Bạn có thể tìm thêm thông tin tại http://oauth.net/2/


8
Quan tâm để giải thích tại sao bạn muốn giới thiệu phiên bản 2 khi nó vẫn chưa hoàn thành? IMHO, phiên bản 1.0a vẫn là một giải pháp vững chắc cho hầu hết các ứng dụng.
Butifarra

6

Tôi đã tìm kiếm rất nhiều về bảo mật ws yên tĩnh và chúng tôi cũng đã kết thúc bằng việc sử dụng mã thông báo qua cookie từ máy khách đến máy chủ để xác thực các yêu cầu. Tôi đã sử dụng bảo mật mùa xuân để ủy quyền các yêu cầu trong dịch vụ vì tôi phải xác thực và ủy quyền từng yêu cầu dựa trên các chính sách bảo mật được chỉ định đã có trong DB.


6

Việc thế giới SOAP được bảo vệ khá tốt với các tiêu chuẩn bảo mật không có nghĩa là nó được bảo mật theo mặc định. Ở nơi đầu tiên, các tiêu chuẩn rất phức tạp. Sự phức tạp không phải là một người bạn rất tốt về các lỗ hổng bảo mật và triển khai, chẳng hạn như các cuộc tấn công gói chữ ký XML là đặc hữu ở đây.

Đối với môi trường .NET tôi sẽ không giúp được gì nhiều, nhưng Xây dựng các dịch vụ web với Java, (một viên gạch có ~ 10 tác giả) đã giúp tôi rất nhiều trong việc hiểu kiến ​​trúc bảo mật WS- * và đặc biệt là các yêu cầu của nó.


4

Bản thân REST không cung cấp các tiêu chuẩn bảo mật, nhưng những thứ như OAuth và SAML đang nhanh chóng trở thành tiêu chuẩn trong không gian này. Tuy nhiên, xác thực và ủy quyền chỉ là một phần nhỏ trong những gì bạn cần xem xét. Nhiều lỗ hổng đã biết liên quan đến các ứng dụng web áp dụng rất nhiều cho apis REST. Bạn phải xem xét xác nhận đầu vào, bẻ khóa phiên, thông báo lỗi không phù hợp, lỗ hổng nhân viên nội bộ, v.v. Đây là một chủ đề lớn.


4

Tôi muốn thêm (phù hợp với stinkeymatt), giải pháp đơn giản nhất là thêm chứng chỉ SSL vào trang web của bạn. Nói cách khác, đảm bảo url của bạn là HTTPS: //. Điều đó sẽ bao gồm an ninh vận tải của bạn (bang for the buck). Với url của RESTful, ý tưởng là giữ cho nó đơn giản (không giống như WS * security / SAML), bạn có thể sử dụng kết nối oAuth2 / openID hoặc thậm chí là Auth cơ bản (trong trường hợp đơn giản). Nhưng bạn vẫn sẽ cần SSL / HTTPS. Vui lòng kiểm tra bảo mật ASP.NET Web API 2 tại đây: http://www.asp.net/web-api/overview/security (Bài viết và Video)


3

Vì @Nathan đã kết thúc với tiêu đề HTTP đơn giản và một số người đã nói chứng chỉ SSL phía máy khách và OAuth2. Ý chính của nó là ... API REST của bạn không cần phải xử lý bảo mật vì điều đó thực sự nằm ngoài phạm vi của API.

Thay vào đó, một lớp bảo mật nên được đặt lên trên nó, cho dù đó là HTTP Header đằng sau proxy web (một cách tiếp cận phổ biến như SiteMinder, Zermatt hoặc thậm chí Apache HTTPd), hoặc phức tạp như OAuth 2.

Điều quan trọng là các yêu cầu sẽ hoạt động mà không có bất kỳ tương tác của người dùng cuối. Tất cả những gì cần thiết là để đảm bảo rằng kết nối với API REST được xác thực. Trong Java EE, chúng ta có khái niệm về một userPrincipalcái có thể thu được trên một HttpServletRequest. Nó cũng được quản lý trong bộ mô tả triển khai rằng một mẫu URL có thể được bảo mật để mã API REST không cần phải kiểm tra nữa.

Trong thế giới WCF, tôi sẽ sử dụng ServiceSecurityContext.Currentđể có được bối cảnh bảo mật hiện tại. Bạn cần cấu hình ứng dụng của bạn để yêu cầu xác thực.

Có một ngoại lệ đối với tuyên bố tôi đã nêu ở trên và đó là việc sử dụng một nonce để ngăn chặn phát lại (có thể là các cuộc tấn công hoặc ai đó chỉ gửi cùng một dữ liệu hai lần). Phần đó chỉ có thể được xử lý trong lớp ứng dụng.


3

Để bảo mật ứng dụng web, bạn nên xem OWASP ( https://www.owasp.org/index.php/Main_Page ) cung cấp các cheatheets cho các cuộc tấn công bảo mật khác nhau. Bạn có thể kết hợp càng nhiều biện pháp càng tốt để bảo mật Ứng dụng của mình. Liên quan đến bảo mật API (ủy quyền, xác thực, quản lý danh tính), có nhiều cách như đã đề cập (Cơ bản, Tiêu hóa và OAuth). Có các lỗ lặp trong OAuth1.0, vì vậy bạn có thể sử dụng OAuth1.0a (OAuth2.0 không được áp dụng rộng rãi do lo ngại về đặc tả)


2

Đã được một lúc nhưng câu hỏi vẫn có liên quan, mặc dù câu trả lời có thể đã thay đổi một chút.

API Gateway sẽ là một giải pháp linh hoạt và có cấu hình cao. Tôi đã thử nghiệm và sử dụng KONG khá nhiều và thực sự thích những gì tôi thấy. KONG cung cấp API REST của quản trị viên mà bạn có thể sử dụng để quản lý người dùng.

Express-gateway.io gần đây hơn và cũng là Cổng API.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.