Tôi có thể tạo một kịch bản luôn luôn thực thi như root không?


27

Làm thế nào để tạo một tập lệnh thực thi với quyền root, bất kể ai thực thi nó?

Tôi đã đọc về setuid nhưng tôi không biết phải làm thế nào.

Tôi đang sử dụng Linux, Ubuntu 12.04 LTS.


Bạn đang phân phối Linux nào? Hoặc Unix, thậm chí?
slhck

@slhck Linux, Ubuntu 12
Nhà phát triển HappyDevelop

3
setuidsẽ không hoạt động trên các tập lệnh - nó bị vô hiệu hóa vì lý do bảo mật trên hầu hết các bản phân phối * nix hiện nay. Bạn có thể đặt nó, nhưng nó sẽ bị bỏ qua. Có lẽ bạn có thể giải thích thêm về vấn đề thực tế của bạn để chúng tôi có thể giúp bạn giải quyết vấn đề này? Kịch bản đó là gì? Tại sao bạn cần nó để được thực thi như root? Là sử dụng sudomột thay thế?
slhck

Bạn đã thử sudo -schưa
Nam Phụng

Câu trả lời:


29

Hãy thực sự cẩn thận: các kịch bản kết hợp với setuid rất nguy hiểm!

Trước tiên, xin vui lòng xem câu hỏi / câu trả lời này , đặc biệt là câu trả lời và cảnh báo bảo mật này .

Nếu bạn vẫn muốn thực thi tập lệnh của mình bằng setuidset, thì bạn có thể viết chương trình C ngắn làm trình bao bọc và đặt setuidbit trên tệp nhị phân đã biên dịch.

Ví dụ trình bao bọc:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Một giải pháp khác sử dụng sudo(được đề cập ở đây ):

  1. Với quyền root, ngăn không cho quyền ghi (và có thể khác) vào tập lệnh của bạn:

    gốc chown /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Xác minh rằng không ai ngoại trừ root có thể thay thế tập lệnh , ví dụ: bằng cách sửa đổi quyền truy cập của thư mục mẹ:

    gốc chown / tuyệt đối / đường dẫn / đến / của bạn /
    chmod 755 / tuyệt đối / đường dẫn / đến / của bạn /
    
  3. Sửa sudo quyền truy cập vào /etc/sudoersvới visudo:

    TẤT CẢ TẤT CẢ = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    Thông tin chi tiết về các cài đặt (ví dụ: hạn chế quyền truy cập vào người dùng hoặc nhóm cụ thể) có thể được tìm thấy trong trang web của sudoers.

Sau đó, tất cả người dùng có thể chạy tập lệnh dưới dạng root mà không cần mật khẩu:

sudo /absolute/path/to/your/script.sh

Điều này tương tự với việc sử dụng giải pháp bao bọc / setuid ở trên.


3
Những mối nguy hiểm cụ thể không rõ ràng lắm, nhưng chúng xoay quanh môi trường. Không giống như hầu hết các chương trình, hành vi của tập lệnh shell có thể được thay đổi đáng kể bởi hàng tá biến môi trường, đủ để không có biện pháp bảo vệ mở rộng, tập lệnh như vậy có thể dễ dàng bị lừa khi thực thi mã tùy ý.
Stephanie

1
Bạn nên thêm một cuộc gọi để Clearenv () trước khi hệ thống gọi trong trình bao bọc đó, thổi bay hoàn toàn môi trường để không có cài đặt xấu nào xung quanh để thao tác tập lệnh. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie

@Stephanie Tôi phải làm điều gì đó sai, bởi vì tất cả điều này có vẻ quá điên rồ cho một nhiệm vụ chung. Đây là những gì tôi đang cố gắng thực hiện: serverfault.com/questions/401405/ từ
HappyDeveloper

@HappyDeveloper Không quá điên rồ đối với một tập lệnh setuid, vì một tập lệnh được bảo mật kém là một đường dẫn đến root cho bất cứ ai quản lý để chạy nó.
Stephanie

4
sudocó thể được sử dụng để cung cấp cho tất cả người dùng quyền truy cập vào một chương trình (hoặc tập lệnh) cụ thể. Theo nghĩa đó, nó hoạt động như một trình bao bọc setuid lạ mắt. Có vẻ như đó thường là một lựa chọn tốt hơn so với việc viết trình bao bọc setuid của riêng bạn.
jjlin

4

Cách dễ nhất và an toàn nhất là sử dụng các bit SETUID trong các quyền của tệp. theo cách đó, quyền của lệnh sẽ được nâng lên thành quyền của chủ sở hữu tệp.

để ngăn tập lệnh từ phiên bản không đặt ghi cho mọi người bit.


0

Tôi không biết điều này có hữu ích không, nhưng để làm cho tập lệnh chỉ chạy dưới quyền root, bạn có thể sử dụng shebang này trên dòng đầu tiên của tập lệnh:

#!/bin/su root
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.