Ủy quyền — ai được phép làm gì và cách bạn chứng minh điều đó
Control Center trả lời hai câu hỏi về ủy quyền, và chúng thực sự khác nhau. “Người này có được phép gọi thao tác này không?” là về con người, vai trò và kho mã. “Agent này có được phép gây ra hiệu ứng này không?” là về hành động, đối số và phạm vi tác động — câu hỏi đó thuộc về Rào chắn.
Trang này bàn về câu hỏi thứ nhất, cùng với hồ sơ mà cả hai câu hỏi để lại.
Một điểm ra quyết định
Phần tiêu đề “Một điểm ra quyết định”Mọi quyết định ủy quyền phía con người đều được giải quyết qua một hàm duy nhất:
can(principal, permission, resource) → allow | deny + whyMột quyền có dạng <domain>:<tier> — tickets:write,
members:administer, repos:read. Danh mục này được suy ra, chứ không
viết tay: nó được tính từ chính bề mặt thao tác (tiền tố tên của thao tác cho
ra miền, còn vai trò tối thiểu mà thao tác vốn đã thực thi cho ra bậc), nên cả
~550 thao tác đều có một quyền mà không ai phải gõ tay.
Cách suy ra đó chính là đặc tính đáng bảo vệ. Nó có nghĩa là một thao tác MỚI mặc định đều được kiểm soát qua cổng — kiểu hỏng của mô hình chú thích bằng tay là có người quên gắn, và thứ họ quên chính là cái cổng. Một bài kiểm thử ratchet ghim tập miền kết quả lại, nên việc thêm một thao tác dưới tiền tố mới là quyết định đặt tên do con người chủ động đưa ra chứ không xảy ra tình cờ.
Bốn bậc khớp chính xác với các vai trò tích hợp sẵn:
| Bậc | Vai trò tối thiểu | Ví dụ |
|---|---|---|
read |
Khách | tickets:read |
write |
Thành viên | tickets:write |
administer |
Quản trị viên | members:administer |
own |
Chủ sở hữu | workspace:own |
Vai trò
Phần tiêu đề “Vai trò”Năm vai trò tích hợp sẵn — Chủ sở hữu, Quản trị viên, Thành viên, Người xem, Khách — là các preset dựa trên danh mục đó. Quyền sở hữu là một ghế duy nhất cho mỗi không gian làm việc, được chuyển giao tường minh bằng Chuyển quyền sở hữu (nếu không thì một chủ sở hữu rời đi sẽ không thể bị gỡ bỏ: việc hủy cấp phát qua SCIM từ chối mọi chủ sở hữu không gian làm việc — hãy chuyển giao trước).
Vai trò tùy chỉnh mang tính trừ dần. Một vai trò tùy chỉnh chỉ định một
preset gốc (admin, member, viewer hoặc guest — không bao giờ là
owner) và một tập quyền BỊ GỠ khỏi preset đó — “admin, nhưng không quản lý
được thành viên”. Nó không bao giờ cấp được nhiều hơn preset gốc, và chính
điều đó khiến chúng an toàn khi đưa vào một bản cài đặt đang vận hành: mọi
kiểm tra hiện có vẫn là một giới hạn trên đúng đắn. Thành viên giữ chúng dưới
dạng custom:<id>, và một client quá cũ để hiểu giá trị đó sẽ quay về Khách
thay vì đoán mò.
Bên dưới vai trò là các cấp quyền theo từng kho mã (none / read /
review / write): tư cách thành viên không gian làm việc không bao giờ âm
thầm vượt quyền trên máy chủ mã. Mọi bề mặt phơi ra mã đều kiểm tra chúng — kể
cả những bề mặt chạm tới mã theo đường vòng, như terminal hay phiên trình soạn
thảo mở trên worktree của một space.
Thẩm quyền máy chủ
Phần tiêu đề “Thẩm quyền máy chủ”Một số thao tác hoàn toàn không liên quan đến không gian làm việc: cấu hình áp dụng cho toàn bản cài đặt, cấu hình SSO, thông tin xác thực của nhà cung cấp, quản lý mô hình, sao lưu toàn bộ bản cài đặt. Những thao tác này khai báo thẩm quyền máy chủ và bị từ chối với tất cả mọi người trừ người vận hành của bản cài đặt (chủ sở hữu máy chủ đã được ghi nhận). Ở đây cố ý chỉ có một danh tính người vận hành và một định nghĩa duy nhất về nó.
Dấu vết kiểm toán
Phần tiêu đề “Dấu vết kiểm toán”Mọi quyết định ủy quyền — cho phép lẫn từ chối — đều được ghi nối tiếp vào dấu vết kiểm toán nối chuỗi hash của từng không gian làm việc.
Một nhật ký chỉ ghi từ chối trả lời được câu “chúng ta đã chặn những gì?” nhưng không trả lời được “agent này thực sự đã làm gì, và ai đã ủy quyền cho nó?”, vốn là câu hỏi mà một cuộc điều tra sự cố bắt đầu từ đó. Vì vậy mỗi mục ghi lại toàn bộ chuỗi quy kết: chủ thể hành động, con người mà nó hành động thay, ủy thác mà nó đến qua, hành động cùng các đối số (dưới dạng digest), quyết định, và quy tắc đã đưa ra quyết định.
Các mục được nối chuỗi: hash của mỗi mục bao trùm hash của mục trước, nên việc sửa, xóa hay sắp xếp lại bất kỳ dòng nào đều phá vỡ mọi hash phía sau nó. Xác minh chuỗi tính lại toàn bộ chuỗi và chỉ ra mắt xích đầu tiên không hợp lệ. Một nhật ký kiểm toán bạn không thể kiểm tra thì chỉ là nhật ký; một nhật ký bạn có thể tính lại mới là bằng chứng.
Hai hệ quả đáng lưu ý:
- Bảng kiểm toán được miễn trừ khỏi việc cắt tỉa theo thời gian. Không thể cắt bỏ phần giữa của một chuỗi hash. Việc lưu giữ diễn ra theo trình tự xuất rồi cắt, và thao tác cắt để lại một checkpoint mang hash cuối của đoạn bị bỏ, nên phần còn lại vẫn xác minh ngược về tận đầu chuỗi.
- Nó nằm bên cạnh dòng thời gian hoạt động, chứ không nằm trên đó. Dòng thời gian là những gì con người đã làm; còn đây là những gì đã được cho phép và bị từ chối. Một correlation id dùng chung giúp đọc xuyên suốt cả hai cho một lần gọi.
Nó xuất ra dưới dạng JSON phân tách bằng dòng mới và có thể truyền trực tiếp tới một SIEM (Splunk, Elastic, Sentinel — một endpoint HTTP kèm bearer token). Việc truyền được thiết kế theo kiểu nỗ lực tối đa: một SIEM chết không bao giờ được phép chặn lời gọi công cụ của agent, và dù thế nào thì bản sao bền vững, có thể xác minh vẫn nằm trên đĩa.
Phiên
Phần tiêu đề “Phiên”Một bản cài đặt có thể đặt tuổi thọ phiên tối đa và thời gian chờ khi không hoạt động. Cả hai đều được thực thi tại điểm kiểm tra thông tin xác thực thiết bị mà mọi luồng đã xác thực đều đi qua — một phiên mà client có thể phớt lờ thì chỉ trả lời được bảng hỏi, chứ không chặn được kẻ tấn công. Bản cài đặt cũng có thể yêu cầu SSO, điều này vô hiệu hóa việc ghép nối thủ công cho thiết bị mới (kèm một biện pháp chống tự khóa: nó từ chối khi chưa có kết nối SSO nào hoạt động).
Đây không phải là gì
Phần tiêu đề “Đây không phải là gì”- Không phải ACL theo từng đối tượng. Cố ý không có quyền riêng cho từng phiếu hay từng tin nhắn. Phân tách ở cấp kho mã mới là thứ các đội thực sự cần và nó đã tồn tại; chia sẻ theo từng đối tượng là một bề mặt tổ hợp với nhu cầu chưa được chứng minh ở đây.
- Không phải một công cụ chính sách mà bạn cấu hình bằng DSL. Từ vựng được đóng lại một cách có chủ đích, nhờ đó toàn bộ chính sách có thể được hiển thị, giải thích và liệt kê.
- Không được thực thi ở đâu ngoài máy chủ. Các kiểm tra phía client chỉ tồn tại để tránh đưa ra một điều khiển sẽ bị từ chối. Quyết định có thẩm quyền luôn thuộc về máy chủ.