Có thể chạy một tập lệnh bash trong một loại hộp cát?


13

Sản phẩm của chúng tôi có nhu cầu thực thi một tập lệnh bash không xác định trên một máy chủ tinh vi để đạt được một mục tiêu nhất định. Kịch bản bash này là do người dùng cung cấp. Chúng tôi quan tâm đến việc đảm bảo rằng chỉ các lệnh cụ thể được cho phép, còn tất cả các lệnh khác thì không. Hơn nữa, chúng ta cần thay thế một số lệnh bằng những lệnh khác.

Vì vậy, ví dụ, chúng tôi muốn thực thi tập lệnh và cho phép các lệnh sau: echo cat awk

Nhưng không cho phép bất kỳ lệnh nào khác (chúng tôi không muốn cung cấp một danh sách cụ thể ở đây).

Hơn nữa, nếu tập lệnh chứa lệnh cp, chúng tôi muốn nắm bắt nó và chuyển hướng đến một lệnh khác (có thể được thực hiện bằng bí danh).

Bất cứ ý tưởng làm thế nào điều này được thực hiện?

Câu trả lời:


9

Cách dễ nhất là sử dụng một chroot jail chỉ chứa các lệnh bạn muốn tập lệnh có thể chạy. Sau đó, bạn chạy tập lệnh thông qua một trình bao bọc gọi chrootvào thư mục và sau đó thực thi tập lệnh.


17

Không có sự an toàn 100% khi chạy tập lệnh bên trong một máy ảo, điều này có lẽ sẽ ngăn tập lệnh đạt được mục tiêu của nó. Nhưng có hai tính năng có thể giúp bạn. Nếu bạn lo lắng rằng tập lệnh được viết bởi một kẻ độc hại, thì các tính năng này là không đủ; nhưng nếu bạn chỉ lo lắng rằng tập lệnh có thể làm điều xấu cho hệ thống của bạn bởi vì nó được viết bởi một lập trình viên bất cẩn hoặc với các mục tiêu khác nhau, một trong hai tính năng này cung cấp một môi trường hộp cát tốt.

  • Bạn có thể chạy shell bị hạn chế bằng cách gọi bash là bash -r. Tôi giới thiệu bạn đến hướng dẫn sử dụng bash để mô tả chi tiết; ý tưởng cơ bản là tập lệnh không thể gọi các lệnh không trong $PATH, không thể thay đổi $PATH, không thể chuyển hướng đến hoặc từ một tệp và một vài hạn chế nữa. Điều này khá đơn giản để thiết lập, nhưng nếu tập lệnh không xác định quá phức tạp để bạn xem xét, thì có khả năng sử dụng rất nhiều thứ bị cấm trong trình bao bị hạn chế.

  • Bạn có thể thiết lập một nhà tù chroot . Ý tưởng là thiết lập một cây thư mục /some/rootvà chạy tập lệnh trong một môi trường tin rằng đó /some/rootlà toàn bộ hệ thống tập tin ( chrootviết tắt của root thay đổi). Khi cây thư mục được thiết lập, hãy chạy tập lệnh (được sao chép /some/root/myscript) thành chroot /some/root /bin/bash /myscript. Ví dụ: bạn sẽ thiết lập một thư mục /some/root/binvới các lệnh bạn muốn cho phép và chương trình chroot sẽ xem thư mục này là /bin. Bạn sẽ cần sao chép mọi thứ cần thiết để thực hiện chương trình bên trong chroot: thư viện, tệp dữ liệu bash, tập lệnh, v.v. Kịch bản có thể cần /procđược gắn bên trong chroot; bạn có thể làm điều này với một lệnh như mount -t proc proc /proc.

    Nếu bạn cần làm cho toàn bộ cây thư mục có sẵn cho tập lệnh, giả sử /var/example, bạn có một số lựa chọn. Bạn có thể tạo một bản sao dưới /some/root. Bạn có thể tạo các liên kết cứng (nếu chúng hoạt động cho ứng dụng của bạn và chroot nằm trong cùng một hệ thống tệp). Trên Linux, bạn có thể thực hiện mount --bind /var/example /some/root/var/exampleđể cài đặt phần mềm ghép hình /var/examplebên trong chroot. Lưu ý rằng một liên kết tượng trưng không thể hoạt động vì mục tiêu của liên kết được xác định bên trong chroot.

    Lưu ý rằng chroot không cung cấp bảo mật tuyệt đối, đặc biệt là đối với các quy trình đang chạy bằng root. Ví dụ, một quá trình root có thể tạo một tệp thiết bị bên trong chroot và truy cập toàn bộ đĩa thông qua nó. Quá trình chroot vẫn có thể tạo kết nối mạng (bạn có thể cấm điều này bằng cách không bao gồm bất kỳ chương trình mạng nào bên trong chroot đảm bảo rằng chương trình không tin cậy có thể tạo tệp và làm cho nó có thể thực thi hoặc ghi đè lên một tệp thực thi hiện có).


Bạn sẽ cần sao chép mọi thứ cần thiết , tôi có thể tạo các liên kết tượng trưng hoặc cứng hơn là sao chép không?
kyb

1
@kyb Liên kết cứng: có. Liên kết tượng trưng: không, một liên kết tượng trưng chỉ có thể trỏ đến một tệp mà bạn có thể thấy, nó không cho phép bạn thoát khỏi một chroot. Các liên kết cứng rất khó sử dụng cho việc này và khó hiểu: chúng bị hỏng nếu bạn thay thế tệp, chúng để lộ bản gốc trong trường hợp nó có thể ghi được bên trong chroot. Nếu bạn muốn làm cho toàn bộ cây có sẵn, hãy sao chép nó hoặc thực hiện gắn kết liên kết chỉ đọc.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi cần phải thực hiện lệnh phổ biến sẵn như grep, awk, unitsvv Tôi có cần phải sao chép tất cả các tập tin bin và tất cả dependancies bằng tay hoặc có một số hack tiện dụng để nói một cách rõ ràng những gì utils nên làm việc trong chroot?
kyb
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.