Nếu các hành động cần được chạy với quyền root có thể được tách thành các quy trình/tập lệnh riêng biệt, thì bạn có thể chạy các quy trình này với quyền root setuid. Nó là một công cụ rất tiện dụng mà theo ý kiến cá nhân của tôi thì nó rất hiếm khi được sử dụng.
quy trình setuid là gì? Hãy tìm ví dụ tại mật khẩu
chỉ huy. Nó có thể được chạy bởi bất kỳ người dùng nào, nhưng nó cần được chạy với quyền root, vì nó cần sửa đổi mật khẩu được lưu trữ trong một tệp mà chỉ root mới có thể truy cập (/etc/shadow
).
Nó được thực hiện như thế nào? Nhìn vào các quyền của /usr/bin/passwd
nhị phân:
-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd
Chữ "s" thay vì "x" trong trường chủ sở hữu cho biết rằng tệp nhị phân này sẽ được chạy với quyền của chủ sở hữu - đó là quyền root.
Bằng cách này mỗi nhị phân có thể được tạo để chạy với quyền root (hoặc bất kỳ người dùng nào khác), không phụ thuộc vào người gọi nó.
Tuy nhiên, trên kịch bản bit setuid bị bỏ qua vì lý do bảo mật. Vì vậy, để chạy một kịch bản với quyền root, bạn cần sử dụng một trình bao bọc nhị phân điều đó sẽ gọi tập lệnh từ bên trong. Bạn có thể sử dụng chương trình C đơn giản sau để tạo một trình bao bọc như vậy:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int chính ()
{
intrc;
thiết lập( 0 );
rc=WEXITSTATUS(system( "/path/to/your/script" ));
thoát (rc);
}
Biên dịch chương trình và tạo gốc setuid có thể thực thi được (giả sử tệp thực thi được gọi là vỏ bánh
, làm sudo chown root: trình bao bọc gốc
theo dõi bởi Trình bao bọc Sudo chmod o+s
).
BTW. Tập lệnh được chạy từ bên trong trình bao bọc không cần phải thiết lập; chỉ trình bao bọc cần.
Chỉnh sửa: từ lời giải thích của bạn trong các nhận xét, có vẻ như bạn muốn chạy một ứng dụng cụ thể rm -rf/một số/đường dẫn
lệnh với quyền root và quan tâm đến việc không vô tình xóa bất kỳ thứ gì khác. Trong trường hợp đó, tôi đề nghị chỉ cần thay thế /đường dẫn/đến/của bạn/tập lệnh
tham gia vào chương trình bao bọc ở trên bằng chính lệnh này rm -rf/một số/đường dẫn
, và chỉ cần chạy vỏ bánh
nhị phân từ tập lệnh của bạn ở nơi bạn sẽ chạy rm -rf/một số/đường dẫn
chỉ huy. Đây dường như là cách tiếp cận an toàn nhất.