Могу ли я ограничить во время выполнения, какие папки мне разрешены в скрипте CGI? - PullRequest
0 голосов
/ 21 апреля 2019

Я пишу cgi-программы для своих сайтов (все они размещены на одном сервисе lighttpd).Программы читают каталоги и файлы в подпапках, в которых они находятся.Они запускаются с использованием идентификатора пользователя веб-сервера.

Я хотел бы убедиться, что не произойдет сбой, который может привести к чтению моих программ за пределами предполагаемого рабочего пространства.Я представляю, что добавляю строку где-то во время выполнения в верхней части моих cgi-программ, которая выглядит следующим образом:

restrict_io(".");

что-нибудь после этой строки может вызвать ошибки доступа, если они сделают что-то напуганное, например, попытаться запустить произвольные вещи из / usr/ bin или открытие файлов в ../other_website/stuff.

Есть ли простое решение?Я пролистал различные решения, но все они, кажется, нуждаются в больших вложениях с моей стороны, чтобы понять, могут ли они на самом деле делать то, что я хочу.

chroot (2) док говорит, что «это не предназначено дляиспользуется для любых целей безопасности, ни для полной изоляции процесса, ни для ограничения системных вызовов системы. «Также необходимы возможности или root, которых нет у веб-пользователя.Это также может быть слишком сложно, так как я подозреваю, что вам нужно тщательно подготовить новый "/".

seccomp (2) документ довольно длинный и утомительный для чтения.Звучит так, как будто это очень много, но неясно, может ли он делать то, что я хочу.

pledge (2) только для BSD, а мой сервер - разновидность Linux, и я хочу сохранить его такимпотому что я использую эту машину не только для веб-хостинга.Опять же, я не уверен, что залог тоже делает то, что я хочу.

LXC, еще не читал об этом.

Докер выглядит как продукт какой-то компании.Я не читал, если это бесплатно, с открытым исходным кодом.

Если вы еще не читали между строк, решение C было бы лучше, но если нет C, не стесняйтесь предоставить ответ тоже,Фрагмент кода стоит тысячи слов.

1 Ответ

0 голосов
/ 23 апреля 2019

Я обнаружил, что AppArmor (часть ядра Linux) делает именно то, что я хочу.

Вы называете aa_change_profile (профиль const char *) в своем коде.Профиль сначала регистрируется с помощью утилиты CLI apparmor_parser от имени пользователя root.Возможно, вам потребуется включить apparmor с параметрами ядра и запустить службу:

linux ... apparmor=1 security=apparmor

sudo systemctl enable apparmor

Пример cgi.armor:

profile restricted_cgi {
  deny network,
  /home/pi/website1/** r,
}

sudo apparmor_parser -a cgi.armor

Пример my_program.c, скомпилированного с -lapparmor:

#include <sys/apparmor.h>
...
int armor = aa_change_profile("restricted_cgi");
if(armor) {
  printf("Armor error: %s\n", strerror(errno));
  return 1;
}
...