ubfox: cho phép người dùng chạy tập lệnh có quyền root


9

Tôi có Ubuntu 8.04 và tôi muốn viết một tập lệnh bash chạy như rootmọi người dùng có thể chạy.

Bản thân tôi có thể làm sudo.

Làm thế nào để làm điều đó?

XÁC NHẬN : Tôi không muốn làm điều đó với sudo, vì sau đó người dùng sẽ phải nhập mật khẩu của họ. Tôi chỉ muốn họ chạy script như root, có lẽ là thứ gì đó setuid, dunno.

Câu trả lời:


23

Nếu đây là một nhị phân bình thường, bạn có thể setuid bằng cách chạy

# chmod u+s /path/to/binary

Thật không may, các kịch bản không thể được thiết lập. (Vâng, bạn có thể, nhưng nó bị bỏ qua). Lý do cho điều này là dòng đầu tiên của tập lệnh cho hệ điều hành biết trình thông dịch nào để chạy tập lệnh bên dưới. Ví dụ: nếu bạn có một tập lệnh với:

#!/bin/bash

Bạn thực sự sẽ chạy

/bin/bash /path/to/script

Rõ ràng, bạn cần trình thông dịch là setuid, điều đó có nghĩa là tất cả các tập lệnh sẽ được setuid. Điều này sẽ là xấu.

Bạn có thể làm điều này với sudo bằng cách đặt phần sau vào tệp / etc / sudoers bằng cách chạy visudo.

ALL ALL=NOPASSWD: /path/to/script

Và bây giờ bất kỳ người dùng nào cũng có thể chạy

$ sudo /path/to/script

Điều này cho phép họ chạy tập lệnh mà không cần nhập mật khẩu.

Có một giải pháp thay thế không yêu cầu sudo trong lệnh, yêu cầu tạo một tệp nhị phân nhỏ được thiết lập để thực thi tập lệnh của bạn, nhưng mỗi nhị phân setuid bổ sung sẽ thêm một vấn đề bảo mật tiềm năng khác.


Tôi nghĩ rằng đây là câu trả lời tôi đang tìm kiếm. Tôi không thể thiết lập một tập lệnh bash, chỉ là một nhị phân? (Tất nhiên, tôi sẽ thực hiện các biện pháp để làm cho nó không thể di chuyển được)
flybywire

Không, bạn không thể tạo một tập lệnh setuid.
wfaulk

wfaulk: Bạn đã từng có thể, nhưng hầu hết các bản phân phối Linux gần đây không cho phép nó nữa. Bạn có thể sử dụng một công cụ như shc để 'biên dịch' tập lệnh và sau đó làm cho nó thành setuid.
Kyle Brandt

wfaulk: Tất nhiên, điều đó sẽ không theo cách của bạn để làm điều gì đó bị vô hiệu hóa có chủ ý, vì vậy đây có thể là một ý tưởng tồi :-)
Kyle Brandt

Thay thế thuật ngữ ALLbằng tên người dùng để chỉ cho phép một sudoer có thể chạy mà không cần nhập mật khẩu.
hdave

3

Tôi cần phải chèn dòng đó vào HẾT CUỐI / etc / sudoers: ALL ALL = NOPASSWD: <filename> Rõ ràng, việc %admin ALL=(ALL) ALLghi đè sau này yêu cầu mật khẩu cho người dùng quản trị viên.

Không có vấn đề bảo mật nào cho phép tập lệnh được chạy bằng root miễn là tập lệnh thực hiện một hành động được xác định rõ ràng, vô hại, được phép và, nếu các giá trị cho bất kỳ tham số nào có thể khiến tập lệnh hoạt động sai.

Nhưng có một ...

Luôn sử dụng đường dẫn đầy đủ trong tên lệnh và tệp. Nếu bạn viết một cái gì đó giống như echo Hello world!trong myrootscript, ai đó có thể viết một ~/bin/echo scriptmyrootscriptsẽ thực thi như root bất cứ điều gì trong đó.

/bin/echo "Hoping this will keep you safe" :-)


nếu người dùng không phải root trên máy có thể chỉnh sửa tập lệnh đó thì người dùng đó có thể tiếp quản máy. Nếu cùng một người dùng có mật khẩu yếu thì không có gì khiến máy của bạn không bị xâm phạm hoàn toàn.
hdave

2

Theo mặc định, các thành viên của wheelnhóm được phép sử dụng sudobất kỳ lệnh nào root. Đây có lẽ là cách bạn đang sử dụng sudocho đến nay.

Để cho phép người dùng khác, bạn sẽ cần tạo sudoersquy tắc. Ví dụ:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Sẽ cho phép người dùng mickey.mousechạy lệnh /usr/local/bin/test.shnhư rootkhông cần yêu cầu thêm mật khẩu.

Bạn nên đọc tài liệu này để biết thêm thông tin.


Debian / Ubuntu sử dụng nhóm quản trị viên thay vì bánh xe. Nó có thể là một tên chính xác hơn một chút.
David Pashley

Gọi tôi là lỗi thời, nhưng ..;)
Dan Carley

1
lỗi thời: P
David Pashley

0

Sử dụng chmod +s <filename>để se bit suid. Điều này có nghĩa là khi tệp được thực thi, nó sẽ chạy với sự cho phép của chủ sở hữu tệp (vì vậy hãy chọn nó để root để làm cho nó chạy như vậy).

Tuy nhiên, điều này có thể RẤT nguy hiểm với một cái gì đó giống như tập lệnh bash, bởi vì người dùng tìm cách thay đổi nó, họ có thể dễ dàng lấy được vỏ gốc. Hãy chắc chắn rằng nó không thể được viết cho bất kỳ ai trừ root.

Linux không cho phép bạn thiết lập các tập lệnh, để làm điều này, bạn phải biên dịch nó thành một chương trình. Thay vào đó, bạn có thể sử dụng tệp sudoers (/ etc / sudoers) và thêm một dòng như thế này.

<username> ALL = NOPASSWD: /path/to/script


0

Một cách khác: bạn có thể thực hiện một trình bao bọc C nhỏ setuid xung quanh tập lệnh đó

  • kiểm tra mọi giới hạn bạn có thể muốn thực thi (danh sách người dùng, thời gian, tải hệ thống, ...)
  • ghi nhật ký / kiểm toán thực hiện nếu muốn
  • thực thi kịch bản

Kiểu như tập hợp con của riêng bạn trong nhiều khả năng của sudo.

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.