Tôi đã không chọn từ ngữ nhận xét ban đầu theo cách nó được diễn đạt, nhưng nó xác định một vấn đề có thể hợp pháp.
Cụ thể, mối quan tâm rằng bảo đảm tách là xác thực so với ủy quyền .
Xác thực đề cập đến quá trình đăng nhập và nhận dạng. Đó là cách các hệ thống biết bạn là ai và được sử dụng cho những việc như cá nhân hóa, quyền sở hữu đối tượng, v.v.
Ủy quyền đề cập đến những gì bạn được phép làm và điều này (nói chung) không được xác định bởi bạn là ai . Thay vào đó, nó được xác định bởi một số chính sách bảo mật như vai trò hoặc quyền, không quan tâm đến những thứ như tên hoặc địa chỉ email của bạn.
Hai cái này có thể thay đổi trực giao với nhau. Ví dụ: bạn có thể thay đổi mô hình xác thực bằng cách thêm các nhà cung cấp OpenID / OpenAuth. Và bạn có thể thay đổi chính sách bảo mật bằng cách thêm vai trò mới hoặc thay đổi từ RBAC sang ABAC.
Nếu tất cả điều này đi vào một lớp hoặc trừu tượng, thì mã bảo mật của bạn, một trong những công cụ quan trọng nhất để giảm thiểu rủi ro , trở thành rủi ro cao , trớ trêu thay.
Tôi đã làm việc với các hệ thống trong đó xác thực và ủy quyền được kết nối quá chặt chẽ. Trong một hệ thống, có hai cơ sở dữ liệu người dùng song song, mỗi cơ sở cho một loại "vai trò". Người hoặc nhóm đã thiết kế nó dường như chưa bao giờ nghĩ rằng một người dùng vật lý duy nhất có thể ở cả hai vai trò hoặc có thể có một số hành động chung cho nhiều vai trò hoặc có thể có vấn đề với va chạm ID người dùng. Đây là một ví dụ cực kỳ thừa nhận, nhưng nó đã / cực kỳ đau đớn khi làm việc với.
Microsoft và Sun / Oracle (Java) đề cập đến tổng hợp thông tin xác thực và ủy quyền là Hiệu trưởng Bảo mật . Nó không hoàn hảo, nhưng nó hoạt động khá tốt. Ví dụ, trong .NET, bạn có IPrincipal
, đóng gói đối tượng IIdentity
- trước đây là đối tượng chính sách (ủy quyền) trong khi đối tượng sau là danh tính (xác thực). Bạn có thể đặt câu hỏi một cách hợp lý về quyết định đặt cái này vào cái kia, nhưng điều quan trọng là hầu hết các mã bạn viết sẽ chỉ dành cho một trong những trừu tượng có nghĩa là nó dễ dàng kiểm tra và cấu trúc lại.
Không có gì sai với một User.IsAdmin
lĩnh vực ... trừ khi đó cũng là một User.Name
lĩnh vực. Điều này sẽ chỉ ra rằng khái niệm "Người dùng" không được xác định đúng và thật đáng buồn, đây là một lỗi rất phổ biến ở các nhà phát triển, những người hơi ướt sau tai khi nói đến bảo mật. Thông thường, thứ duy nhất nên được chia sẻ bởi danh tính và chính sách là ID người dùng, không phải ngẫu nhiên, chính xác là cách nó được triển khai trong cả hai mô hình bảo mật Windows và * nix.
Hoàn toàn có thể chấp nhận để tạo các đối tượng trình bao bọc cả danh tính và chính sách. Ví dụ: nó sẽ tạo điều kiện cho việc tạo màn hình bảng điều khiển nơi bạn cần hiển thị thông báo "xin chào" bên cạnh các tiện ích hoặc liên kết khác nhau mà người dùng hiện tại được phép truy cập. Miễn là trình bao bọc này chỉ bao bọc thông tin nhận dạng và chính sách và không yêu cầu sở hữu nó. Nói cách khác, miễn là nó không được trình bày dưới dạng gốc tổng hợp .
Một mô hình bảo mật đơn giản luôn có vẻ là một ý tưởng hay khi bạn lần đầu tiên thiết kế một ứng dụng mới, vì YAGNI và tất cả những thứ đó, nhưng nó hầu như luôn luôn quay trở lại để cắn bạn sau đó, bởi vì, bất ngờ, các tính năng mới được thêm vào!
Vì vậy, nếu bạn biết những gì tốt nhất cho mình, bạn sẽ tách riêng thông tin xác thực và ủy quyền. Ngay cả khi "ủy quyền" ngay bây giờ đơn giản như cờ "IsAdmin", bạn vẫn sẽ tốt hơn nếu đó không phải là một phần của cùng một lớp hoặc bảng như thông tin xác thực, do đó, nếu và khi chính sách bảo mật của bạn cần thay đổi, bạn không cần phải phẫu thuật tái tạo trên các hệ thống xác thực đã hoạt động tốt.