An ninh trên cơ sở năng lực tiềm tàng

Nguyên lý thiết kế

An ninh trên cơ sở năng lực tiềm tàng ám chỉ đến nguyên lý thiết kế những chương trình ứng dụng người dùng, sao cho chúng có thể trực tiếp phân hưởng năng lực tiềm tàng với nhau theo nguyên lý đặc quyền tối thiểu (principle of least privilege), và kiến trúc cơ sở hạ tầng của hệ điều hành cần phải có đế tạo điều kiện cho những giao dịch trên có hiệu quả và bảo đảm (secure).
Một phương pháp thay thế "an ninh trên cơ sở năng lực tiềm tàng" được dùng trong hầu hết các hệ điều hành trên thị trường là "an ninh trên cơ sở danh sách điều khiển truy cập", trong đó một tiến trình chiếm quyền truy cập vào các đối tượng bằng cách trình diện một tham chiếu không có đặc quyền (unprivileged reference) cho hệ điều hành, gây cho hệ điều hành phản ứng với việc xác định xem những quyền truy cập nào là những cái thích hợp đối với đối tượng đó, dựa trên cơ sở nhận dạng người dùng của tiến trình đã đặt ra yêu cầu. Trong hệ thống an ninh trên cơ sở năng lực tiềm tàng, các chương trình ứng dụng người dùng không đối phó với những tham chiếu không có đặc quyền, song nó đối phó với những năng lực có đặc quyền. Do những năng lực đã được công nhận là những con đường hợp pháp để truy cập đối tượng, bước xác nhận tính hợp lệ của yêu cầu truy cập dựa trên nhận dạng người dùng hoặc những nhân tố khác, là một bước không cần thiết.
Tuy đại bộ phận các hệ điều hành đều cho thực hiện một phương tiện tương tự như năng lực tiềm tàng, chúng thường không cung cấp sự hỗ trợ toàn phần để cho phép việc trao đổi các năng lực tiềm tàng giữa các thực thể đáng ngờ (mutually untrusting entities) trở thành những phương pháp cơ bản để cấp và phân bố các quyền truy cập trên toàn thể hệ thống. Ngược lại, một hệ thống an ninh trên cơ sở năng lực tiềm tàng, lại được dự kiến thiết kế chính vì mục đích đó.

Giới thiệu về an ninh trên cơ sở năng lực tiềm tàng

Một năng lực được định nghĩa là tham chiếu của một đối tượng bảo tồn, với tư cách là sở hữu của một tiến trình người dùng, ban cho tiến trình đó năng lực (cái tên là vì thế) để tương tác với một đối tượng đưới một số hình thức. Những hình thức tương tác này có thể bao gồm việc đọc dữ liệu liên quan của đối tượng, sửa đổi đối tượng, thi hành dữ liệu trong đối tượng như một tiến trình, cùng những quyền truy cập có thể hình dung được khác. Năng lực, theo tính hợp lý, có thể bao gồm một tham chiếu đơn nhất chỉ danh một đối tượng và thiết lập một hoặc nhiều quyền truy cập trên.
Giả dụ, trong phân khoảng bộ nhớ của tiến trình người dùng có một chuỗi ký tự sau:

    /etc/passwd
Tuy chuỗi ký tự trên độc nhất chỉ danh một đối tượng trong hệ thống, song nó lại không định rõ những quyền truy cập và do đó, nó không phải là một năng lực. Giả sử, thay thế vào đó, chúng ta có hai giá trị sau:

    /etc/passwd
    O_RDWR
Các giá trị trên vừa chỉ danh một đối tượng, vừa thiết lập những quyền truy cập (đọc và viết - ReaD/WRite). Tuy nhiên, nó vẫn không phải là một năng lực, bởi vì sở hữu của tiến trình người dùng (user process) đối với những giá trị trên chẳng nói lên một điều gì về tính hợp pháp của truy cập cả.
Bây giờ, giả sử chương trình ứng dụng người dùng thi hành thành công câu lệnh sau đây:

    int fd = open("/etc/passwd", O_RDWR);
Biến fd lúc này giữ chỉ mục (index) của một mô tả tập tin (file descriptor) trong bảng mô tả tập tin của tiến trình. Mô tả tập tin này chính là một năng lực. Sự tồn tại của nó trong bảng mô tả tập tin của tiến trình đủ để cho chúng ta nhận thức rằng tiến trình, quả thực, có quyền truy cập đối tượng một cách hợp pháp. Chúng ta nên lưu ý đến một đặc trưng chủ trốt của sự bố trí trên, ở chỗ, bảng mô tả tập tin nằm trong bộ nhớ của bộ điều hành trung tâm (kernel) và chương trình người dùng không thể điều khiển nó một cách trực tiếp được. Để bảo toàn tính trọn vẹn của chính sách an ninh, hệ điều hành phải đảm bảo rằng chỉ những hoạt động nhất thiết mới xảy ra đối với các năng lực trong hệ thống mà thôi.
Trong các hệ điều hành truyền thống, các chương trình ứng dụng thường giao thông liên lạc với nhau và với bộ lưu trữ dữ liệu (storage) bằng các tham chiếu, tương tự như những cái trong hai ví dụ đầu. Các tên đường dẫn (path names) thường được cung cấp trên hình thức các tham số của dòng lệnh (command-line parameters), được gửi qua các ổ cắm (socket), và được lưu trữ trên đĩa. Những tham chiếu này không phải là những năng lực, và nhất định phải được phê chuẩn (validated) trước khi chúng được sử dụng. Đối với những hệ thống này, câu hỏi trung tâm thường là "dưới quyền lực của ai mà một tham chiếu cho trước có thể được đánh giá (evaluated)?" Câu hỏi này trở thành một vấn đề nghiêm trọng đặc biệt đối với những tiến trình cần phải vận hành đại điện cho hai thực thể liên quan đến quyền lực (two authority-bearing entities) khác nhau. Chúng trở nên dễ bị ảnh hưởng bởi các lỗi trong lập trình, vẫn thường được gọi là Vấn đề đại diện lộn xộn ( Confused deputy problem), và rất thường xuyên gây nên hậu quả một lỗ hổng trong an ninh (security hole).
Trong hệ thống dựa trên cơ sở năng lực tiềm tàng, bản thân các năng lực được truyền tay giữa các tiến trình và bộ lưu trữ, dùng một cơ cấu mà hệ điều hành biết trước, để bảo tồn tính toàn vẹn của các năng lực.

Năng lực

Năng lực (capability) (trong một số hệ thống còn được gọi là chìa khóa) là một khái niệm chủ trốt trong an ninh máy tính. Nó ám chỉ đến một giá trị dùng để tham chiếu một đối tượng cùng với một tập hợp các quyền truy cập liên quan. Chương trình ứng dụng trong một hệ thống dựa trên cơ sở năng lực tiềm tàng nhất định phải sử dụng một năng lực để truy cập một đối tượng. Năng lực là một biểu hiện quyền lực có thể truyền giao (communicable token of authority).
Một năng lực thường được thực hiện như một cấu trúc dữ liệu có đặc quyền, trong đó bao gồm một bộ phận chỉ định những quyền truy cập nhất định, và một bộ phận chỉ danh đối tượng đơn nhất, cho phép người ta truy cập đối tượng. Trên thực tế, trong các hệ điều hành truyền thống, năng lực được dùng tương tự như một mô tả tập tin (file descriptor), song lại được dùng để truy cập tất cả các đối tượng trong hệ thống. Nó thường được hệ điều hành lưu trữ trong một danh sách, cùng với một số cơ cấu bên trong, ngăn chặn chương trình ứng dụng sửa đổi nội dung của năng lực một cách trực tiếp (như để giả mạo quyền truy cập hoặc để thay đổi đối tượng mà nó đang hướng vào).
Chương trình ứng dụng sở hữu các năng lực có thể thao tác các chức năng (functions) đối với chúng, chẳng hạn như truyền chúng sang cho các chương trình ứng dụng khác, đổi chúng xuống thành một cái có đặc quyền kém hơn, hoặc xóa bỏ chúng.
Năng lực tiềm tàng đạt được mục tiêu nâng cấp an ninh trong hệ thống của chúng, bằng cách nó được sử dụng để thay vào chỗ những tham chiếu có thể bị giả mạo. Một tham chiếu có thể bị giả mạo (lấy ví dụ, một tên đường dẫn (path name)) chỉ danh một đối tượng, song không xác định rõ quyền truy cập thích hợp đối với đối tượng, và chương trình ứng dụng người dùng hiện đang giữ các tham chiếu ấy. Hậu quả là, bất cứ một cố gắng nào truy cập đối tượng được tham chiếu, đều nhất định phải được hệ điều hành phê chuẩn, thông thường phải thông qua việc sử dụng một danh sách điều khiển truy cập (access control list - ACL). Ngược lại, trong một hệ thống dựa trên cơ sở năng lực thuần chủng (pure capability-based system), người ta chỉ cần chương trình ứng dụng người dùng sở hữu các năng lực đó là nó đã có quyền sử dụng đối tượng đang được tham chiếu, chiểu theo những quyền mà năng lực đã xác định trước. Trên lý thuyết, một hệ thống dựa trên cơ sở năng lực thuần chủng loại trừ được nhu cầu về danh sách điều khiển truy cập, hoặc những cơ chế tương tự, bằng cách ban cho các thực thể, tất cả và chỉ những năng lực, mà chúng thực sự cần phải có mà thôi.
Tuy nhiều hệ điều hành cho thực thi những phương tiện tương tự với các năng lực, bằng cách sử dụng các mô tả tập tin hoặc các chi điều khiển tập tin (file handles) — lấy ví dụ, trong BSD UNIX, các mô tả tập tin có thể bị hủy bỏ (bị khép lại), có thể được thừa kế bởi các tiến trình con (child processes), hoặc có thể được truyền gửi sang các tiến trình khác thông qua các ổ cắm (sockets) — hiện có một số trở ngại ngăn cản tất cả các lợi ích của một hệ thống dựa trên cơ sở năng lực thuần chủng được chấp nhận trong môi trường của hệ điều hành truyền thống. Trở ngại chủ yếu ở đây chính là thực trạng các thực thể tuy có thể có sở hữu những năng lực (như các tiến trình và các tập tin), song không thể trở thành các chủ thể bền bỉ (persistent entities) theo một phương thức làm cho nó có thể duy trì tính toàn vẹn (integrity) của các thông tin bảo an (secure information) mà năng lực đại diện. Hệ điều hành không thể đặt lòng tin vào một chương trình ứng dụng người dùng đọc lại cho nó biết một năng lực mà không xáo trộn (tamper with) tham chiếu của đối tượng hoặc các quyền truy cập. Hậu quả là, khi một chương trình ứng dụng muốn chiếm lại truy cập vào một đối tượng đang được tham chiếu trên đĩa, hệ điều hành nhất định phải có một phương cách nào đó để phê chuẩn yêu cầu truy cập, và do đó, một danh sách điều khiển truy cập hoặc một cơ chế tương tự nào đó là những cái bắt buộc phải có (mandated).
Một tiếp cận mới lạ để giải quyết vấn đề này là việc sử dụng một hệ điều hành trực giao bền bỉ (orthogonally persistent operating system). (Việc này đã được thực hiện trong máy Flex). Xem thêm trong bài Ten15). Trong một hệ thống như vậy, người ta không cần phải hủy bỏ các thực thể và cũng không cần phải hủy bỏ hiệu lực của các năng lực, do đó nó cần phải có một cơ chế tương tự như danh sách điều khiển truy cập, để phục hồi lại các năng lực tại một thời điểm khác, sau đó. Trong bất kỳ tình huống nào, hệ điều hành cũng sẽ quản lý tính toàn vẹn, cũng như tính bảo an, của các năng lực được bao gồm trong tất cả các bộ lưu trữ (contained within all storage), cả những cái linh động (volatile) lẫn những cái bất linh động (nonvolatile); một phần, bằng cách tự thi hành tất cả các nhiệm vụ sắp xếp thứ tự (serialization), thay vì đòi hỏi chương trình người dùng làm việc đó, như trong trường hợp của đại bộ phận các hệ điều hành. Do chương trình người dùng không phải gánh vác trách nhiệm này nữa, chúng ta vừa không cần phải đặt lòng tin vào nó tái sinh năng lực tiềm tàng hợp pháp, vừa không phải phê chuẩn những yêu cầu đối với việc truy cập dùng một cơ chế điều khiển truy cập.
Chớ nhầm lẫn giữa quan niệm năng lực tiềm tàng được bàn luận trong bài này với "Năng lực tiềm tàng" trong POSIX 1e/2c, vì năng lực tiềm tàng trong POSIX 1e/2c chỉ là những đặc quyền chưa được trau chuốt (coarse-grained privileges), không thể truyền giao giữa các tiến trình được.