Có ổn không khi có lớp xác nhận trước khi lớp kiểm soát truy cập


24

Tôi đang tạo một ứng dụng web được phân loại API và trong ứng dụng này, chúng tôi có các lớp khác nhau đang thực hiện công việc của riêng mình.

Lớp đầu tiên là lớp Xác thực , xác thực đầu vào của người dùng và nếu nó vượt qua xác thực, chúng tôi sẽ chuyển lớp đó sang lớp thứ hai (đó là lớp Điều khiển truy cập ) nếu không sẽ trả về thông báo lỗi

Lớp thứ hai là Access Control để kiểm tra xem người dùng có được phép thực hiện tác vụ mà nó muốn thực hiện hay không, Nếu người dùng có quyền, nó sẽ chuyển yêu cầu sang lớp tiếp theo nếu không sẽ trả về thông báo lỗi

Lớp thứ ba là Lớp điều khiển nơi chúng ta có logic ứng dụng

Câu hỏi của tôi là có ổn để có lớp xác nhận trước khi kiểm soát truy cập không? Điều gì xảy ra nếu người dùng đang cố thực hiện một tác vụ mà người dùng không có quyền và chúng tôi đang gửi lại thông báo lỗi xác thực? Người dùng sẽ gửi yêu cầu đến điểm cuối và nói chuyện với lớp xác thực và một khi nó chỉ vượt qua xác thực thì anh ta sẽ thấy thông báoYou can't access this!

Nó cảm thấy lạ đối với tôi vì vậy nó ổn như thế này hay những lựa chọn khác của tôi trong cơ sở hạ tầng này là gì?


10
Điều đáng nói là các xác nhận thường phải tiếp cận với cơ sở dữ liệu để thực hiện công việc của họ hoặc lưu trữ tệp. Nếu bạn làm điều này trước khi kiểm tra vi phạm kiểm soát truy cập, về cơ bản, bạn cho phép kẻ tấn công DDoS cơ sở dữ liệu hoặc hệ thống tệp của bạn bằng cách ném một lượng lớn lưu lượng truy cập vào URL cụ thể đó.
Greg Burghardt

Trong trường hợp của tôi cũng vậy đối với Access Control Middleware, nó kiểm tra tài nguyên và xem người dùng có thể truy cập loại tài nguyên đó hay không, nếu có thể truy cập được thì tôi cho phép truy cập nếu không
Muhammad

Đung. Trong một DDoS, lớp đó sẽ vẫn lưu trữ dữ liệu của bạn. Với việc chạy lớp đó trước tiên, bạn sẽ không truy cập vào kho lưu trữ dữ liệu của mình để xác thực VÀ kiểm soát truy cập - bạn sẽ chỉ nhấn nó để kiểm soát truy cập. Nó làm giảm kích thước của sóng thần, nhưng không ngăn được nó rơi xuống bãi biển. Nó cho bạn hoặc nhóm máy chủ của bạn cơ hội chiến đấu để đáp trả một cuộc tấn công trước khi toàn bộ hệ thống bị sa lầy.
Greg Burghardt

5
Từ quan điểm thực tế, dù sao đi nữa, kiểm soát truy cập phải đến trước khi xác thực - bạn sẽ xác thực tính chính xác của yêu cầu của người dùng như thế nào nếu họ không thể truy cập yêu cầu ở nơi đầu tiên?
Zibbobz

Xác thực @Zibbobz đơn giản như kiểm tra xem người dùng có gửi đúng lược đồ hay không, giống như tham số nên là số nguyên hoặc số khác
Muhammad

Câu trả lời:


57

Nó phụ thuộc vào việc biết tính hợp lệ của một số đầu vào cho một nhiệm vụ mà bạn không được phép thực hiện có phải là rò rỉ bảo mật hay không. Nếu có, bạn thực sự nên làm theo cách khác.

Phản hồi an toàn duy nhất cho người dùng trái phép là "truy cập bị từ chối". Nếu đôi khi phản hồi là "yêu cầu xấu" và lần khác "truy cập bị từ chối", bạn đang gửi thông tin cho người dùng trái phép.

Ví dụ, bạn có thể kiểm tra xác thực tác vụ "xóa tài liệu" mà tài liệu có tên tồn tại. Một người không có quyền sẽ có thể nhận ra liệu có thứ gì đó tồn tại hay không bằng cách cố gắng xóa nó và so sánh lỗi nào họ nhận lại. Kẻ tấn công đặc biệt quyết tâm có thể liệt kê tất cả các tên tài liệu (dưới một độ dài nhất định), để xem cái nào tồn tại.


7
+1, hoàn toàn. Nếu dữ liệu của bạn theo bất kỳ cách nào có thể nhận dạng cá nhân hoặc nhạy cảm theo bất kỳ cách nào khác, thì ý nghĩa bảo mật sẽ nghiêm trọng hơn nhiều so với ý nghĩa về khả năng sử dụng.
Kilian Foth

4
@caleth thực sự nó sẽ không cho bạn biết nếu một tài liệu nào đó có trong hệ thống hay không, loại thông tin này chỉ được cung cấp khi bạn đến lớp điều khiển. Xác thực chỉ cần kiểm tra lược đồ, nó không truy cập cơ sở dữ liệu - chỉ kiểm soát truy cập và các lớp sâu hơn thực hiện truy cập cơ sở dữ liệu. Ngoài ra, lớp kiểm soát truy cập chỉ hiển thị cho bạn cùng một nội dung trong khi tài nguyên tồn tại hoặc không. Điều duy nhất thỏa hiệp là lược đồ mà tôi đang nghĩ liệu có ổn hay không
Muhammad

@Caleth Bạn có thể giải thích về bình luận cuối cùng của bạn? Tôi không thấy trường hợp đó được đưa ra bình luận của OP. Dường như trong mọi trường hợp, thông tin duy nhất được gửi lại là thông tin không có đặc quyền nếu lược đồ được ghi lại công khai.
Rotem

11
@Rotem Về cơ bản không thể xác định trước những thông tin mà kẻ tấn công có thể lợi dụng. Chỉ vì bạn chưa tìm được cách học thứ gì đó mà bạn không nên, không có nghĩa là không có cách đó. Như một ví dụ cực đoan, có thể không có bất kỳ lỗ hổng hiện nay , nhưng trong tương lai ai đó có thể thêm vào một tấm séc đến lớp xác nhận rằng không thông tin bị rò rỉ bởi vì họ không biết nó đã không được bảo vệ.
Kamil Drakari

4
@KamilDrakari đó không phải là một ví dụ cực đoan, đó là một ví dụ hoàn toàn hợp lý. Nói cách khác - nếu bạn thực hiện xác nhận trước khi kiểm soát truy cập, bất cứ khi nào nhà phát triển muốn thêm bước xác thực, họ phải đưa ra quyết định về việc xác thực đó có phơi bày bất kỳ điều gì nhạy cảm hay không. Cơ hội của mọi nhà phát triển nhận được cuộc gọi đó có vẻ nhỏ.
mfrankli

24

Vâng, có nhiều loại xác nhận:

  1. Kiểm tra vệ sinh cơ bản giá rẻ, xác minh rằng yêu cầu rõ ràng không phải là không đúng.

    Điều này thường ít nhất là trùng lặp một phần phía khách hàng, để tránh các chuyến đi khứ hồi vô ích.

    Dù sao, nó nên được thực hiện trước khi kiểm soát truy cập để làm cho mọi thứ dễ dàng hơn và ít bị lỗi hơn, vì nó không có nguy cơ rò rỉ thông tin.

  2. Xác nhận đắt hơn mà vẫn không phụ thuộc vào bất kỳ dữ liệu ứng dụng được bảo vệ nào.

    Nếu có xác nhận thêm như vậy, có thể sau khi kiểm soát truy cập không phải để tránh rò rỉ dữ liệu, mà để cản trở các cuộc tấn công của DOS.
    Đôi khi chỉ cần thực hiện yêu cầu thực hiện một số xác nhận đó hoàn toàn giảm hoặc không mất chi phí, vì vậy nó có thể bị bỏ lại ở đây.

    Nếu tất cả xác thực của bước đầu tiên được sao chép, thì cũng có thể có ý nghĩa đối với các phần trùng lặp của phía máy khách này.

  3. Xác nhận bổ sung tùy thuộc vào dữ liệu ứng dụng được bảo vệ.

    Làm điều đó trước khi kiểm soát truy cập rõ ràng có nguy cơ rò rỉ thông tin. Vì vậy, đầu tiên làm kiểm soát truy cập.


3
Sẽ là lý tưởng để thực hiện kiểm soát truy cập tại một điểm thực thi chính sách trong cơ sở hạ tầng của bạn ngay cả trước khi tiếp cận API của bạn. Một bộ xác thực tĩnh cơ bản (Ví dụ: OpenAPI) sẽ là đầu tiên, tiếp theo là xác thực doanh nghiệp sâu hơn. Ngay cả một số xác nhận tĩnh có khả năng có thể có tác động đến tính khả dụng của các cuộc tấn công ReDOS của ứng dụng của bạn .
felickz

@felickz: Có, các cuộc tấn công DOS là một lý do hợp lệ để trì hoãn xác nhận cho đến khi được ủy quyền. Đó là một hành động cân bằng. Dù sao, tôi đã chia điểm đầu tiên của mình để tính đến điều đó.
Ded repeatator

Thực hiện xác nhận đắt tiền trước khi kiểm soát truy cập cũng có nguy cơ rò rỉ thông tin do các cuộc tấn công thời gian. Nếu hệ thống của bạn mất nhiều thời gian hơn hoặc lâu hơn tùy thuộc vào tài nguyên, thì kẻ tấn công có thể suy ra các khía cạnh của tài nguyên được yêu cầu.
Lie Ryan

@LieRyan: Đó là lý do tất cả xác thực có khả năng trước khi kiểm soát truy cập hoàn toàn không phụ thuộc vào dữ liệu ứng dụng được bảo vệ.
Ded repeatator

13

Phải có một số xác nhận trước khi kiểm soát truy cập. Giả sử API của SO có "câu trả lời chỉnh sửa" điểm cuối, sau đó người dùng có thể chỉnh sửa câu trả lời cụ thể hay không tùy thuộc vào câu trả lời (dưới danh tiếng nhất định, người dùng chỉ có thể chỉnh sửa câu trả lời của mình). Vì vậy, tham số "ID câu trả lời" được định dạng tốt phải được xác minh trước khi lớp điều khiển truy cập phát huy tác dụng; cũng có thể là câu trả lời tồn tại

OTOH, như Caleth và Greg đề cập, việc xác nhận rộng rãi hơn trước khi kiểm soát truy cập là một rủi ro bảo mật tiềm ẩn.

Vì vậy, các quy tắc cứng là

  1. Bạn không được tiết lộ bất kỳ thông tin nào thông qua xác nhận rằng người dùng không được phép tìm hiểu.
  2. Bạn phải xác thực dữ liệu trước khi kiểm soát truy cập có thể sử dụng nó đến mức mà kiểm soát truy cập cần nó.

Theo cả hai quy tắc này có thể có nghĩa là bạn phải có một số xác nhận trước và một số sau khi kiểm soát truy cập.


3
Đây là câu trả lời thực tế. Nếu nó đơn giản, xác thực cấu trúc dữ liệu đầu vào thẳng, thì không cần phải đặt nó lên hàng đầu. Nó thậm chí còn bảo vệ lớp điều khiển Access khỏi các đầu vào / gói được thiết kế đặc biệt. Việc xác nhận thực sự đòi hỏi rò rỉ thông tin an toàn hoặc đoán, phải được đặt sau khi kiểm tra truy cập.
SD

Đó là giả định câu trả lời là công khai. Tôi dám nói rất nhiều API thậm chí sẽ không hiển thị cho bạn dữ liệu mà không cần xác thực.
TomTom

6

Ngoài sự thất vọng có thể nhận được 'quyền truy cập bị từ chối' sau khi xác thực đầu vào; cũng lưu ý rằng lớp Xác thực , trừ khi nó là một lớp rất đơn giản, luôn có thể cần thông tin từ Bộ điều khiển . Hãy ghi nhớ điều này, tôi tin rằng Xác thực định vị đằng sau Kiểm soát truy cập , gần hơn với Trình điều khiển có ý nghĩa hơn.


2

Điều đó phụ thuộc vào ý nghĩa của lớp xác thực - nếu bạn chỉ muốn kiểm tra cú pháp của yêu cầu, điều đó có an toàn không và bạn phải làm gì. Nếu 'xác thực' của bạn sử dụng bất kỳ thông tin nào mà người dùng không có đặc quyền không có quyền truy cập, thì nó không còn an toàn nữa.

Bạn chắc chắn nên có một trình kiểm tra vệ sinh trước khi thử kiểm soát truy cập, nhưng bạn nên cẩn thận liên lạc rất rõ ràng với tất cả các nhà bảo trì (hiện tại và tương lai) rằng phần này không được sử dụng thông tin đặc quyền; Bất kỳ kiểm tra như vậy nên được thực hiện trong một bước xác nhận riêng sau khi xác thực.

Khi kiểm tra độ tỉnh táo cho trình kiểm tra độ tỉnh táo, nó thực sự không có bất kỳ phụ thuộc mã nào vào bất kỳ phần nào trong mã của bạn ở dưới đường ống và nên được tách thành gói riêng có thể xuất bản công khai mà không gặp sự cố nào (ngoài các vấn đề pháp lý có thể xảy ra) . Nếu bạn không thể làm điều đó, 'lớp xác thực' của bạn sẽ hoạt động quá nhiều (hoặc cơ sở mã của bạn là một mớ hỗn độn).


1

Không. Không ổn.

Nếu bạn có một lỗi trong lớp xác nhận, nó có thể bỏ qua lớp bảo mật.

Đó là một lỗi phổ biến để coi bảo mật là một phần của yêu cầu kinh doanh. "Chỉ những người dùng có vai trò bán hàng, mới có thể thấy các số liệu hàng quý" có vẻ như là một quy tắc kinh doanh.

Nhưng nếu bạn muốn bảo mật, bạn phải đọc quy tắc như "chỉ người dùng trong vai trò bán hàng, mới có thể chạy mã trên điểm cuối này" Bạn phải đảm bảo rằng máy chủ của bạn luôn trả về "quyền truy cập bị từ chối" trước khi được bất kỳ loại mã nào bạn đã viết hoặc tệp trên máy chủ.

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.