/ / Hiểu khả năng lập trình hệ thống Linux

Hiểu khả năng lập trình hệ thống Linux

Khả năng cho phép đánh giá một số đặc quyền hệ thống quan trọng trong một luồng riêng biệt khác với quy trình hiện tại. Bằng cách này, bạn không cần phải chạy một chương trình dưới dạng root để nó có thể truy cập vào các phần nhất định của hệ thống.

Như một giải pháp phát sinh từ nhu cầu, phần 25 của POSIX.1e nói về vấn đề này. Việc phát triển các đặc quyền được xác định trong phần đó và hơn thế nữa đã được hoàn thành với việc phát hành phiên bản hạt nhân Linux 2.6.26. Đây là mọi thứ bạn cần biết về các khả năng trong nhân Linux.


Hiểu Logic API Khả năng

Kiểm soát ủy quyền trong các hệ thống dựa trên Unix bao gồm hai bước:

  • Nếu chủ sở hữu hiện tại (ID người dùng hiệu quả, EUID) của ứng dụng đang chạy bằng 0, thì hệ thống không kiểm tra ủy quyền
  • Nếu giá trị EUID khác 0, hệ thống sẽ thực hiện quy trình kiểm soát phù hợp với sự ủy quyền của người dùng hiệu quả và nhóm của ứng dụng có liên quan

Một số ứng dụng cần có các đặc quyền rộng hơn (SUID, SGIT bit) trong khi chạy. Ví dụ điển hình nhất, bạn có thể nghĩ đến ứng dụng passwd. Với điều này, người dùng trong hệ thống có thể thay đổi mật khẩu của họ. Tuy nhiên, để viết thư cho / etc / shadow tệp, nơi lưu giữ các mật khẩu đã mã hóa, cần phải làm việc với quyền của người dùng root (tức là ID người dùng = 0).

LÀM VIDEO TRONG NGÀY

Để giải quyết vấn đề này, ứng dụng passwd có một bit SUID. Cho dù người dùng nào chạy ứng dụng này, thì chủ sở hữu đang hoạt động (EUID) sẽ luôn là người chủ:

ls -l /usr/bin/passwd


-rwsr-xr-x. 1 root root 32552 Jul 23 2021 /usr/bin/passwd

Khả năng chạy các ứng dụng SUID trong mô hình xác thực Unix truyền thống dường như đã giải quyết được vấn đề. Tuy nhiên, các lỗi nghiêm trọng trong các ứng dụng có bit SUID mở ra cánh cửa cho việc chạy các mã không mong muốn cho người dùng có toàn quyền trong hệ thống. Một ứng dụng lý tưởng sẽ có thể chạy mà không cần quyền của người dùng root nếu có thể.

Vấn đề không kết thúc chỉ với bit SUID. Bạn cũng phải có quyền người dùng gốc khi bạn muốn nghe trên cổng TCP hoặc UDP đặc quyền nhỏ hơn 1024 trên hệ thống dựa trên Unix. Ví dụ, để có thể nghe cổng TCP 80 của máy chủ web, bạn phải chạy ứng dụng với tư cách người dùng gốc.


Trong những năm qua, người ta đã hiểu việc chạy phần mềm cung cấp dịch vụ cho môi trường mạng với tài khoản người dùng được ủy quyền đầy đủ sẽ tàn phá như thế nào. Là một giải pháp tạm thời, nó đã được chấp nhận rằng chỉ một phần nhất định và nhỏ hơn của chương trình lắng nghe trên cổng đặc quyền với tư cách là người chủ, sau đó thay đổi ID người dùng đang hoạt động thành người dùng khác cho các quy trình tiếp theo (ví dụ: không ai là người dùng có quyền hạn chế) .

Hệ thống này, đã được sử dụng trong nhiều năm, đã hoạt động tốt với sự đơn giản của nó và vẫn được sử dụng hiệu quả. Tuy nhiên, ngày nay, có thể nhận được một số khả năng bổ sung, cụ thể cho ứng dụng, thông qua API khả năng của Linux, mà không cần quyền root, ngoài hệ thống nêu trên.

Giải thích về Mô hình Khả năng của Linux!

Bạn có thể tìm thấy cách triển khai toàn diện nhất của API khả năng trong nhân Linux. Các bản phân phối Linux hiện đại cũng cố gắng sử dụng hệ thống mô hình mới này càng nhiều càng tốt.

Ví dụ, để ứng dụng ping hoạt động, nó phải có khả năng mở các socket RAW, thường chỉ dành cho người dùng root. Trong các bản phân phối Linux cũ, vấn đề là cung cấp bit SUID cho ứng dụng để người dùng bình thường có thể sử dụng nó. Trong các phiên bản này, khi bạn xóa bit SUID khỏi ứng dụng và cố gắng chạy ứng dụng như một người dùng bình thường, bạn gặp lỗi sau:

ping 8.8.8.8


ping: icmp open socket: Operation not permitted

Trong khi trên các bản phân phối Linux hiện đại, ứng dụng ping có thể không có bit SUID:

ls -l /bin/ping 


-rwxr-xr-x. 1 root root 95232 Jul 25 2021 /bin/ping

Tuy nhiên, bạn có thể chạy ứng dụng thành công như một người dùng bình thường. Cơ chế thực hiện điều này là do ứng dụng ping có khả năng đặc biệt CAP_NET_RAW.

Bạn có thể tìm hiểu các khả năng bổ sung của ứng dụng với getcap lệnh như sau:

sudo getcap /bin/ping


/bin/ping cap_net_raw=ep

Nếu lệnh getcap trả về một phản hồi trống, bạn có thể đặt giá trị này theo cách thủ công bằng:

sudo setcap cap_net_raw+ep /bin/ping

Mô hình khả năng xử lý

Trong triển khai Linux, các khả năng của mỗi quy trình được nhóm lại theo ba tiêu đề:

Năng lực Tuyên bố
được phép Trong cụm này, có một danh sách các khả năng bổ sung được phép cho quy trình liên quan. Việc cấp quyền không có nghĩa là nó có thể được sử dụng tích cực tại thời điểm đó. Có thể bao gồm các ủy quyền ở đây trong bộ khả năng hiệu quả với một hành động bổ sung.
có hiệu lực Nó hiển thị danh sách khả năng hiện đang hoạt động của quá trình liên quan. Với các chức năng phụ trợ quy định hệ thống kỹ năng, có thể bỏ hoặc hồi một kỹ năng. Tuy nhiên, trong mọi trường hợp, điều này chỉ có thể được thực hiện trong số những người đã được ủy quyền trong nhóm được phép.
có thể kế thừa Khi một ứng dụng bắt đầu một quy trình mới, quy trình mới bắt đầu sẽ hiển thị danh sách các khả năng mà nó sẽ kế thừa từ danh sách được phép.

Danh sách các khả năng được phép, hiệu quả và có thể kế thừa để chạy các quy trình bất kỳ lúc nào được hiển thị dưới dạng bitmask trên các dòng CapPrm, CapEffCapInh Trong tập tin / proc / / trạng thái. Ngoài ra, CapBnd dòng chứa mặt nạ bit được sử dụng trong hoạt động kiểm soát ranh giới khả năng.

Ví dụ: hãy thử đọc các giá trị của ứng dụng shell đang chạy của bạn từ / proc / self / status tập tin:

cat /proc/self/status | grep Cap


CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

Mô hình khả năng tệp trong Linux

Hoạt động của hệ thống khả năng đối với tệp phụ thuộc vào điều kiện tiên quyết là các thuộc tính này có thể được lưu trữ trong lớp hệ thống tệp ảo (VFS). Tương tự như mô hình quy trình, các khả năng dành cho tệp nằm dưới ba tiêu đề:

1. Được phép

Hệ thống xác định các khả năng được phép của quá trình khi tệp thực thi tương ứng chạy trong cụm này.

2. Hiệu quả

Không giống như mô hình khả năng xử lý, tiêu đề này chỉ lưu trữ một bit: hoạt động hoặc không hoạt động. Nếu bit đang hoạt động, các khả năng được xác định trong danh sách cho phép của tệp sẽ tự động được chuyển sang danh sách khả năng hiệu quả của quy trình liên quan khi tệp này được chạy và một quy trình được tạo. Nếu bit không hoạt động, việc chuyển tự động các khả năng được phép trên tệp sang tiến trình đang chạy sẽ không được thực hiện.

Tuy nhiên, nếu mã của ứng dụng có liên quan được tích hợp với hệ thống khả năng, nó có thể kích hoạt các quyền trong nhóm tệp được phép bằng các lệnh gọi hệ thống. Mục đích chính của hành vi này là để đảm bảo rằng các ứng dụng cũ không bao gồm mã dành riêng cho hệ thống khả năng, phát triển ở cấp mã phần mềm có thể hoạt động với hệ thống khả năng mà không cần bất kỳ thay đổi mã nguồn nào.

Bạn có thể nghĩ rằng các ứng dụng được viết tốt hơn sẽ chỉ sử dụng các khả năng khi cần thiết. Nếu bit đang hoạt động, tất cả các khả năng trong danh sách được phép sẽ hoạt động khi ứng dụng khởi động.

3. Kế thừa

Như trong mô hình quy trình, tệp liên quan chạy và một quy trình xảy ra. Nếu một ứng dụng khác chạy từ bên trong quy trình sau đó, ứng dụng đó sẽ được đưa vào danh sách được phép của quy trình mới. Tóm lại, nó chỉ ra một danh sách các khả năng sẽ kế thừa.

Vai trò của Khả năng trong Hệ thống Linux

Khi bạn chạy một quy trình nhất định với tư cách là người dùng bình thường, bạn không có bất kỳ đặc quyền nào. Do đó, bạn chỉ có thể truy cập vào các phân vùng mà hệ thống cho phép đối với người dùng bình thường. Lý do chính đằng sau điều này là để thắt chặt an ninh hệ thống và thực hiện các biện pháp như vậy.

Cho phép tất cả người dùng truy cập vào tất cả các tài nguyên có thể tạo ra một lỗ hổng bảo mật nghiêm trọng. Sẽ rất dễ dàng cho những người sử dụng hệ thống với mục đích xấu để khai thác các lỗ hổng của hệ thống. Các khả năng của Linux rất hữu ích trong những vấn đề như vậy. Bạn có thể dễ dàng tăng cường bảo mật cho các ứng dụng của mình với API khả năng được cung cấp bởi hạt nhân.

Khả năng của Linux chỉ là một trong những vấn đề cần được suy nghĩ để thực hiện các phương pháp rất mạnh mẽ như phân chia quyền của người dùng root, gán các quyền khác nhau cho người dùng không có đặc quyền và thực hiện các biện pháp phòng ngừa khác nhau về các cổng mở trong dịch vụ internet với máy chủ Linux.


Mã có nền không gian

Cải thiện bảo mật máy chủ Linux của bạn với 7 bước tăng cường này

Đọc tiếp


Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *