Bảo mật các lược đồ xác thực REST


228

Lý lịch:

Tôi đang thiết kế sơ đồ xác thực cho dịch vụ web REST. Điều này không "thực sự" cần phải được bảo mật (đó là một dự án cá nhân) nhưng tôi muốn làm cho nó an toàn nhất có thể như một trải nghiệm tập thể dục / học tập. Tôi không muốn sử dụng SSL vì tôi không muốn rắc rối và chủ yếu là chi phí thiết lập nó.

Những câu hỏi SO này đặc biệt hữu ích để giúp tôi bắt đầu:

Tôi đang nghĩ đến việc sử dụng phiên bản xác thực đơn giản của Amazon S3 (tôi thích OAuth nhưng có vẻ quá phức tạp đối với nhu cầu của tôi). Tôi đang thêm một nonce được tạo ngẫu nhiên , được cung cấp bởi máy chủ, vào yêu cầu, để ngăn chặn các cuộc tấn công phát lại.

Để có được câu hỏi:

Cả S3 và OAuth đều dựa vào việc ký URL yêu cầu cùng với một vài tiêu đề được chọn. Không ai trong số họ ký tên cơ quan yêu cầu cho các yêu cầu POST hoặc PUT. Đây không phải là dễ bị tấn công giữa chừng, mà giữ url và tiêu đề và thay thế cơ thể yêu cầu với bất kỳ dữ liệu nào kẻ tấn công muốn?

Có vẻ như tôi có thể bảo vệ chống lại điều này bằng cách đưa vào hàm băm của thân yêu cầu trong chuỗi được ký. Điều này có an toàn không?


6
Amazon S3 có thể bao gồm Content-MD5 như một phần của chuỗi tiêu đề để ngăn chặn cuộc tấn công MITM mà bạn mô tả.
laz

8
MD5 là một hàm băm rất yếu và việc sử dụng nó đã không được khuyến khích trong nhiều năm nay: en.wikipedia.org/wiki/MD5 . Sử dụng SHA2 ngày nay. MD5 là son môi trên một con lợn với một cuộc khủng hoảng danh tính.
Henrik

6
Startcom cung cấp chứng chỉ SSL miễn phí không đưa ra cảnh báo chứng chỉ trong các trình duyệt chính
Plato

5
@SeanKAnderson (rant: Tôi thấy thật vô lý khi mọi người nói về 99.99999% s khi internet bị bao vây bởi các cơ quan gián điệp đã tự động RẤT NHIỀU cuộc tấn công vào năm 2008 - đó là một cách kỳ lạ để đối phó với một vấn đề thực sự - "Naaah, sẽ không thành vấn đề; vì bà tôi sẽ không thể hack được"
Henrik

2
@Plato Tôi muốn giới thiệu LetsEncrypt những ngày này cho các chương trình SSL miễn phí
đưa đón87

Câu trả lời:


168

Một câu trả lời trước đây chỉ đề cập đến SSL trong bối cảnh truyền dữ liệu và không thực sự bao gồm xác thực.

Bạn thực sự đang hỏi về việc xác thực an toàn các ứng dụng khách API REST. Trừ khi bạn đang sử dụng xác thực khách hàng TLS, SSL mình KHÔNG phải là một cơ chế xác thực khả thi cho một REST API. SSL không có máy khách authc chỉ xác thực máy chủ , điều này không liên quan đến hầu hết các API REST vì bạn thực sự muốn xác thực ứng dụng khách .

Nếu bạn không sử dụng xác thực ứng dụng khách TLS, bạn sẽ cần sử dụng một cái gì đó như sơ đồ xác thực dựa trên tiêu hóa (như lược đồ tùy chỉnh của Dịch vụ web của Amazon) hoặc xác thực OAuth 1.0a hoặc thậm chí HTTP (chỉ qua SSL).

Những kế hoạch này xác thực rằng yêu cầu đã được gửi bởi ai đó dự kiến. TLS (SSL) (không có xác thực ứng dụng khách) đảm bảo rằng dữ liệu được gửi qua dây vẫn không bị giả mạo. Chúng là riêng biệt - nhưng bổ sung - mối quan tâm.

Đối với những người quan tâm, tôi đã mở rộng câu hỏi SO về Lược đồ xác thực HTTP và cách chúng hoạt động .


16
Chính xác. Điều duy nhất SSL xác minh theo như API của bạn có liên quan là cuộc gọi mà nó xử lý đã không bị rối với lộ trình. API vẫn không biết ai đang nói chuyện với nó hay liệu họ có nên có quyền truy cập hay không.
Tim Gautier

1
Câu trả lời tốt. Tôi cũng khuyên bạn nên xem những tài nguyên tuyệt vời này .. owasp.org/index.php/Web_Service_Security_Cheat_Sheetowasp.org/index.php/REST_Security_Cheat_Sheet (DRAFT)
dodgy_coder

2
Chỉ là một điểm nhỏ, nhưng sử dụng SSL cũng có thêm lợi ích là ngăn chặn nghe lén và người đàn ông trong các cuộc tấn công ở giữa.
dodgy_coder

@Les Hazlewood Bạn có thể giải thích cách xác thực HTTP Basic qua Https có thể giúp xác định máy chủ biết ai đang nói chuyện với ai không?
Mùa xuân

@Les Hazlewood ở đây tôi đã hỏi nó trong một câu hỏi; tnx stackoverflow.com/questions/14043397/
Mùa xuân

60

REST có nghĩa là làm việc với các tiêu chuẩn của web và tiêu chuẩn để chuyển "an toàn" trên web là SSL. Bất cứ điều gì khác sẽ trở nên thú vị và đòi hỏi nỗ lực triển khai thêm cho khách hàng, sẽ phải có sẵn các thư viện mã hóa.

Khi bạn cam kết với SSL, về nguyên tắc thực sự không có gì cần thiết để xác thực. Bạn có thể một lần nữa đi với các tiêu chuẩn web và sử dụng HTTP Basic auth (tên người dùng và mã thông báo bí mật được gửi cùng với mỗi yêu cầu) vì nó đơn giản hơn nhiều so với giao thức ký phức tạp và vẫn hiệu quả trong bối cảnh kết nối an toàn. Bạn chỉ cần chắc chắn rằng mật khẩu không bao giờ đi qua văn bản đơn giản; vì vậy nếu mật khẩu được nhận qua kết nối văn bản đơn giản, bạn thậm chí có thể vô hiệu hóa mật khẩu và gửi thư cho nhà phát triển. Bạn cũng nên đảm bảo thông tin đăng nhập không được ghi lại ở bất cứ đâu khi nhận, giống như bạn sẽ không đăng nhập mật khẩu thông thường.

HTTP Digest là một cách tiếp cận an toàn hơn vì nó ngăn chặn mã thông báo bí mật được truyền qua; thay vào đó, nó là một hàm băm mà máy chủ có thể xác minh ở đầu bên kia. Mặc dù có thể quá mức cho các ứng dụng ít nhạy cảm hơn nếu bạn đã thực hiện các biện pháp phòng ngừa được đề cập ở trên. Rốt cuộc, mật khẩu của người dùng đã được truyền bằng văn bản thuần khi họ đăng nhập (trừ khi bạn thực hiện một số mã hóa JavaScript ưa thích trong trình duyệt) và tương tự như vậy cookie của họ theo từng yêu cầu.

Lưu ý rằng với API, khách hàng nên chuyển mã thông báo - các chuỗi được tạo ngẫu nhiên - thay vì mật khẩu mà nhà phát triển đăng nhập vào trang web. Vì vậy, nhà phát triển sẽ có thể đăng nhập vào trang web của bạn và tạo mã thông báo mới có thể được sử dụng để xác minh API.

Lý do chính để sử dụng mã thông báo là nó có thể được thay thế nếu nó bị xâm phạm, trong khi nếu mật khẩu bị xâm phạm, chủ sở hữu có thể đăng nhập vào tài khoản của nhà phát triển và làm bất cứ điều gì họ muốn với nó. Một lợi thế nữa của mã thông báo là bạn có thể phát hành nhiều mã thông báo cho cùng một nhà phát triển. Có lẽ vì họ có nhiều ứng dụng hoặc vì họ muốn mã thông báo với các cấp truy cập khác nhau.

(Được cập nhật để bao hàm ý nghĩa của việc tạo kết nối chỉ SSL.)


3
Tôi nghĩ bạn có thể nhận được chứng chỉ ssl GoDaddy với giá khoảng 30 đô la một năm. Tôi đã bị sốc khi thấy các gói SSL Verisign có giá bao nhiêu (600 đô la một năm hoặc một cái gì đó nếu tôi nhớ chính xác?) Nhưng tùy chọn GoDaddy là hoàn toàn khả thi.
Brian Armstrong

19
Trừ khi bạn đang sử dụng xác thực lẫn nhau SSL / TLS và chứng chỉ được sử dụng bởi người dùng / máy khách được máy chủ tin cậy, thì bạn chưa xác thực người dùng với máy chủ / ứng dụng. Bạn sẽ cần phải làm gì đó nhiều hơn để xác thực người dùng với máy chủ / ứng dụng.
Pauld

5
Ryan: Mã hóa SSL ngày nay chiếm một lượng công suất xử lý khá nhỏ so với những gì bạn sử dụng để tạo phản hồi với khung ứng dụng web như Django hoặc Rails, v.v.
Cameron Walsh

4
certs từ startcom là miễn phí và được công nhận rộng rãi. cacert.org là một thay thế mở với ít sự công nhận hơn
Dima Tisnek

17
Điều này không giải quyết câu hỏi, đó là về xác thực.
Sam Stainsby

8

Hoặc bạn có thể sử dụng giải pháp đã biết cho vấn đề này và sử dụng SSL. Certs tự ký là miễn phí và đó là một dự án cá nhân phải không?


2
Các certs tự ký là miễn phí, nhưng AFAIK bạn vẫn cần một IP tĩnh.
dF.

8
@dF không có yêu cầu phải có IP tĩnh ngoại trừ các yêu cầu cấp phép nhất định về thương mại phải trả cho chứng chỉ.
Chris Marisic

Nếu bạn có quyền kiểm soát các cửa hàng chứng chỉ ở cả hai đầu (máy khách & máy chủ) thì đây có thể là một lựa chọn khả thi nhưng ... quản lý và phân phối chứng chỉ có thể phức tạp hơn nhiều trong sản xuất so với trong môi trường phát triển. Hãy chắc chắn để hiểu sự phức tạp của sự thay thế này trước khi cam kết với nó.
bắt đầu

5

Nếu bạn yêu cầu hàm băm của cơ thể là một trong các tham số trong URL và URL đó được ký thông qua khóa riêng, thì một cuộc tấn công trung gian sẽ chỉ có thể thay thế nội dung bằng nội dung sẽ tạo ra nội dung cùng băm. Dễ dàng thực hiện với các giá trị băm MD5 ngay bây giờ ít nhất và khi SHA-1 bị hỏng, tốt, bạn sẽ có được hình ảnh.

Để bảo vệ cơ thể khỏi sự giả mạo, bạn sẽ cần phải có chữ ký của cơ thể, điều mà một cuộc tấn công giữa chừng sẽ ít có khả năng phá vỡ vì họ sẽ không biết khóa riêng tạo ra chữ ký .


9
Đến với một chuỗi sẽ tạo ra băm md5 giống như nội dung hợp lệ có thể dễ dàng hơn nhiều so với yêu cầu, nhưng việc đưa ra một phiên bản xấu của nội dung hợp lệ băm đến cùng một giá trị vẫn rất khó khăn. Đây là lý do tại sao md5 không được sử dụng để băm mật khẩu nữa, nhưng vẫn được sử dụng để xác minh tải xuống.
Tim Gautier


1

Hãy nhớ rằng các đề xuất của bạn làm cho khách hàng khó giao tiếp với máy chủ. Họ cần hiểu giải pháp sáng tạo của bạn và mã hóa dữ liệu phù hợp, mô hình này không tốt cho API công khai (trừ khi bạn là amazon \ yahoo \ google ..).

Dù sao, nếu bạn phải mã hóa nội dung cơ thể, tôi sẽ đề nghị bạn kiểm tra các tiêu chuẩn và giải pháp hiện có như:

Mã hóa XML (tiêu chuẩn W3C)

Bảo mật XML

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.