Cho đến nay, những gì tôi có thể thu thập là fakeroot được sử dụng để trao quyền sở hữu cho một tệp cần được root khi nó được giải nén / tar'ed. Câu hỏi của tôi, là tại sao bạn không thể làm điều đó với chown?
Bởi vì bạn không thể làm điều đó với chown
, ít nhất là không phải là người dùng không root. (Và nếu bạn đang chạy với quyền root, bạn không cần fakeroot
.) Đó là toàn bộ vấn đề fakeroot
: cho phép các chương trình được mong đợi chạy bằng root để chạy như một người dùng bình thường, trong khi giả vờ rằng các hoạt động yêu cầu root thành công.
Điều này thường được sử dụng khi xây dựng một gói, để quá trình cài đặt gói được cài đặt có thể tiến hành mà không gặp lỗi (ngay cả khi nó chạy chown root:root
, hoặc install -o root
, v.v.). fakeroot
nhớ quyền sở hữu giả mà nó giả vờ cung cấp cho các tệp, vì vậy các hoạt động tiếp theo nhìn vào quyền sở hữu sẽ thấy điều này thay vì quyền sở hữu thực sự; điều này cho phép các tar
lần chạy tiếp theo chẳng hạn để lưu trữ các tệp như sở hữu của root.
Làm thế nào để fakeroot ngăn chặn sự leo thang đặc quyền không mong muốn trên Linux? Nếu fakeroot có thể lừa tar để tạo một tập tin được sở hữu bởi root, tại sao không làm điều gì đó tương tự với SUID?
fakeroot
không lừa tar
làm bất cứ điều gì, nó bảo tồn các thay đổi mà bản dựng muốn thực hiện mà không để những thay đổi đó có hiệu lực trên hệ thống lưu trữ bản dựng. Bạn không cần fakeroot
phải tạo một tarball chứa tệp thuộc sở hữu của root và suid; nếu bạn có một tệp nhị phân evilbinary
, đang chạy tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
, như một người dùng thông thường, sẽ tạo ra một tarball chứa evilbinary
, được sở hữu bởi root và suid. Tuy nhiên, bạn sẽ không thể trích xuất tarball đó và duy trì các quyền đó trừ khi bạn làm như vậy với quyền root: không có sự leo thang đặc quyền nào ở đây. fakeroot
là một đặc ân decông cụ -escalation: nó cho phép bạn chạy một bản dựng như một người dùng thông thường, trong khi vẫn giữ được các hiệu ứng mà bản dựng sẽ có nếu nó được chạy dưới quyền root, cho phép các hiệu ứng đó được phát lại sau đó. Áp dụng các hiệu ứng mà người dùng thực sự luôn yêu cầu quyền root; fakeroot
không cung cấp bất kỳ phương pháp nào để có được chúng.
Để hiểu việc sử dụng fakeroot
chi tiết hơn, hãy xem xét rằng một bản dựng phân phối điển hình bao gồm các hoạt động sau (trong số nhiều hoạt động khác):
- cài đặt tập tin, thuộc sở hữu của root
- ...
- lưu trữ các tệp đó, vẫn thuộc sở hữu của root, để khi chúng được giải nén, chúng sẽ được sở hữu bởi root
Phần đầu tiên rõ ràng thất bại nếu bạn không root. Tuy nhiên, khi chạy dưới fakeroot
, như một người dùng bình thường, quá trình trở thành
- cài đặt các tệp, được sở hữu bởi root - điều này không thành công, nhưng
fakeroot
giả vờ nó thành công và ghi nhớ quyền sở hữu đã thay đổi
- ...
- lưu trữ các tệp đó, vẫn thuộc quyền sở hữu của root - khi
tar
(hoặc bất kỳ trình lưu trữ nào đang được sử dụng) hỏi hệ thống quyền sở hữu tệp là gì, fakeroot
thay đổi câu trả lời để phù hợp với quyền sở hữu được ghi lại trước đó
Do đó, bạn có thể chạy gói xây dựng mà không cần root, trong khi nhận được kết quả tương tự bạn nhận được nếu bạn thực sự chạy bằng root. Sử dụng fakeroot
sẽ an toàn hơn: hệ thống vẫn không thể làm bất cứ điều gì mà người dùng của bạn không thể làm, do đó, quá trình cài đặt giả mạo không thể làm hỏng hệ thống của bạn (ngoài việc chạm vào các tệp của bạn).
Trong Debian, các công cụ xây dựng đã được cải thiện để không yêu cầu điều này nữa và bạn có thể xây dựng các gói mà không cầnfakeroot
. Điều này được hỗ trợ bởi dpkg
trực tiếp với Rules-Requires-Root
chỉ thị (xem rootless-builds.txt
).
Để hiểu mục đích fakeroot
và các khía cạnh bảo mật của việc chạy như root hay không, có thể giúp xem xét mục đích của việc đóng gói. Khi bạn cài đặt một phần mềm từ nguồn, để sử dụng trên toàn hệ thống, bạn tiến hành như sau:
- xây dựng phần mềm (có thể được thực hiện mà không có đặc quyền)
- cài đặt phần mềm (cần được thực hiện dưới quyền root hoặc ít nhất là người dùng được phép ghi vào các vị trí hệ thống phù hợp)
Khi bạn đóng gói một phần mềm, bạn sẽ trì hoãn phần thứ hai; nhưng để thực hiện thành công, bạn vẫn cần cài đặt phần mềm, cài đặt phần mềm, thay vì vào hệ thống. Vì vậy, khi bạn đóng gói phần mềm, quy trình sẽ trở thành:
- xây dựng phần mềm (không có đặc quyền)
- giả vờ cài đặt phần mềm (một lần nữa không có đặc quyền)
- chụp cài đặt phần mềm dưới dạng gói (ditto)
- làm cho gói có sẵn (ditto)
Bây giờ người dùng hoàn tất quy trình bằng cách cài đặt gói, cần được thực hiện dưới quyền root (hoặc một lần nữa, người dùng có các đặc quyền phù hợp để ghi vào các vị trí thích hợp). Đây là nơi thực hiện quy trình đặc quyền bị trì hoãn và là phần duy nhất của quy trình cần các đặc quyền đặc biệt.
fakeroot
giúp với các bước 2 và 3 ở trên bằng cách cho phép chúng tôi chạy các quy trình cài đặt phần mềm và nắm bắt hành vi của chúng mà không cần chạy bằng root.