Чи можна запустити скрипт bash у якусь пісочну скриньку?


13

У нашому продукті є необхідність виконати невідомий скрипт bash на делікатному сервері, щоб досягти певної мети. Цей скрипт bash надається користувачем. Ми зацікавлені в тому, щоб дозволено використовувати лише певні команди, а всі інші - ні. Крім того, нам потрібно замінити деякі команди на інші.

Так, наприклад, ми хотіли б виконати сценарій і дозволити наступні команди: echo cat awk

Але не дозвольте жодної іншої команди (ми не хочемо тут надавати конкретний список).

Крім того, якщо скрипт містить команду cp, ми хотіли б його захопити і перенаправити на іншу команду (що можна зробити за допомогою псевдоніма).

Будь-яка ідея, як це робиться?

Відповіді:


9

Найпростіший спосіб - використовувати в'язницю chroot, що містить лише команди, які ви хочете, щоб сценарій міг запускатися. Потім ви запускаєте скрипт через обгортку, яка викликає chrootв каталог, а потім виконує сценарій.


17

Немає 100% безпечного браку сценарію у віртуальній машині, що, імовірно, не дозволить скрипту досягти своєї мети. Але є дві функції, які можуть вам допомогти. Якщо ви переживаєте, що сценарій написав зловмисник, цих функцій недостатньо; але якщо ви стурбовані лише тим, що сценарій може зробити погані речі вашій системі, оскільки його написав недбалий програміст або маючи на увазі різні цілі, будь-яка з цих двох функцій забезпечує гідне середовище для пісочниці.

  • Ви можете запустити обмежену оболонку , викликавши bash як bash -r. Я посилаюсь на посібник з bash для детального опису; основна ідея полягає в тому, що скрипт не може викликати команди, які не знаходяться, не $PATHможуть змінюватись $PATH, не можуть перенаправляти файли або з них та ще кілька обмежень. Це досить просто в налаштуванні, але якщо невідомий сценарій занадто складний для перегляду, ви, ймовірно, буде використовувати багато речей, заборонених у обмеженій оболонці.

  • Ви можете встановити в'язницю Chroot . Ідея полягає у створенні дерева каталогів /some/rootта запуску сценарію в середовищі, яке вважає, що /some/rootце вся файлова система ( chrootкоротка для кореня зміни). Після того, як дерево каталогів налаштоване, запустіть сценарій (скопійований у /some/root/myscript) як chroot /some/root /bin/bash /myscript. Наприклад, ви створили б каталог /some/root/binз командами, які ви хочете дозволити, і програма, що увімкнулася, побачила б цей каталог як /bin. Вам потрібно буде скопіювати все, що потрібно для виконання програми всередині chroot: бібліотеки, файли даних bash,, сам скрипт тощо. Сценарій може знадобитися /procвстановити всередині chroot; ви можете зробити це за допомогою такої команди mount -t proc proc /proc.

    Якщо вам потрібно зробити ціле дерево каталогів доступним для сценарію, скажімо /var/example, у вас є кілька варіантів. Ви можете зробити копію під /some/root. Ви можете зробити жорсткі посилання (якщо вони працюють для вашої програми та chroot знаходиться в одній файловій системі). В Linux ви можете зробити mount --bind /var/example /some/root/var/example«прищеплення» /var/exampleвсередині хротону. Зауважте, що символічне посилання не може працювати, оскільки мета посилання визначається всередині chroot.

    Зауважте, що chroot не забезпечує абсолютної безпеки, особливо проти процесів, що працюють як root. Наприклад, кореневий процес може створити файл пристрою всередині chroot і отримати доступ до всього диска через нього. Хротований процес все ще може здійснювати з'єднання з мережею (ви можете заборонити це, не включаючи будь-яку мережну програму всередині chroot і гарантуючи, що ненадійна програма не може створити файл і зробити його виконуваним або перезаписати наявний виконуваний файл).


Вам потрібно буде скопіювати все необхідне , чи можу я робити символічні чи жорсткі посилання, а не копіювати?
киб

1
@kyb Тверде посилання: так. Символічне посилання: ні, символічне посилання може вказувати лише на файл, який ви можете бачити, але це не дозволяє вам уникнути Chroot. Для цього важко використати жорсткі посилання і химерно: вони порушуються, якщо ви заміните файл, вони відкриють оригінальну копію на випадок, якщо вона записується всередині chroot. Якщо ви хочете зробити доступним ціле дерево, скопіюйте його або зробіть кріплення прив’язки лише для читання.
Жил "ТАК - перестань бути злим"

Мені потрібно , щоб зробити доступні команди загальних , як grep, awk, unitsі т.д. Чи потрібен мені скопіювати кожен бін файл і все вручну або залежно є деякі корисні хак сказати явно , що утиліти повинні працювати в Chroot?
kyb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.