Difference between revisions of "Изоляция недоверенных процессов в контейнерах"
(Created page with "Навигация: Главная страница/Система ejudge/Использование/Изоляция недоверенных проц...") |
(...) |
||
Line 1: | Line 1: | ||
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Изоляция недоверенных процессов в контейнерах]] | Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Изоляция недоверенных процессов в контейнерах]] | ||
+ | |||
+ | Изоляция компиляции и выполнения программ в контейнерах доступна с версии [[Изменения в версии 3.9.0|3.9.0]]. | ||
+ | |||
+ | Это — руководство по настройке компиляции и запуска программ в контейнерах. | ||
+ | |||
+ | Контейнеры решают следующие проблемы предыдущих версий: | ||
+ | |||
+ | * Больше не требуется компиляция и инсталляция модифицированной версии ядра Linux. | ||
+ | * Поддерживается безопасное выполнение программ на языках программирования, которые ранее были "небезопасными", например, C#. | ||
+ | * Поддерживается безопасная компиляция программ на C/C++ (includebin хак не работает). | ||
+ | |||
+ | === Конфигурирование ejudge === | ||
+ | |||
+ | При конфигурировании укажите опции для задания пользователей для компиляции и выполнения. | ||
+ | |||
+ | ./configure --with-primary-user=ejudge --with-exec-user=ejexec --with-compile-user=ejcompile ... | ||
+ | |||
+ | Здесь основной пользователь, под которым работает система — <code>ejudge</code>, | ||
+ | пользователь для исполнения — <code>ejexec</code>, | ||
+ | пользователь для компиляции — <code>ejcompile</code>. | ||
+ | |||
+ | Создайте этих пользователей (если они еще не созданы). | ||
+ | |||
+ | adduser -c 'ejudge executor' -d / -M -s /sbin/nologin ejexec | ||
+ | adduser -c 'ejudge executor 1' -d / -M -s /sbin/nologin ejexec1 | ||
+ | adduser -c 'ejudge executor 2' -d / -M -s /sbin/nologin ejexec2 | ||
+ | adduser -c 'ejudge executor 3' -d / -M -s /sbin/nologin ejexec3 | ||
+ | adduser -c 'ejudge compiler' -d /home/judges/compile -M -s /sbin/nologin ejcompile | ||
+ | |||
+ | Пользователи ejexec1, ejexec2, ejexec3 потребуются, если на одном хосте будет запускаться паралельная | ||
+ | проверка. | ||
+ | |||
+ | Скомпилируйте ejudge. | ||
+ | |||
+ | === Инсталляция ejudge === | ||
+ | |||
+ | Установка выполняется с помощью команды | ||
+ | |||
+ | make install | ||
+ | |||
+ | Однако эта команда не устанавливает правильные права доступа на привилегированные программы, в частности, ej-suid-container. | ||
+ | Поэтому под пользователем root выполните команду | ||
+ | |||
+ | /opt/ejudge/bin/ejudge-suid-setup | ||
+ | |||
+ | Если ejudge установлен в другое место, измените путь соответствующим образом. | ||
+ | |||
+ | Затем под обычным пользователем ejudge обновите конфигурацию языков программирования с помощью | ||
+ | |||
+ | /opt/ejudge/bin/ejudge-configure-compilers | ||
+ | |||
+ | После чего под обычным пользователем ejudge выполните команду | ||
+ | |||
+ | /opt/ejudge/libexec/ejudge/bin/ej-suid-update-scripts all | ||
+ | |||
+ | если программа ej-suid-update-scripts не найдена, запускайте ее из | ||
+ | |||
+ | /opt/ejudge/bin/ej-suid-update-scripts all | ||
+ | |||
+ | TODO: запускать из ejudge-configure-compilers автоматически | ||
+ | |||
+ | === Подготовка образов системных каталогов === | ||
+ | |||
+ | На этом шаге нужно подготовить каталоги, которые будут отображаться в контейнеры вместо системных каталогов. | ||
+ | Все операции выполняйте пользователем root. Дальнейшие действия выполняются в предположении, | ||
+ | что ejudge проинсталлирован в /opt/ejudge. Если ejudge проинсталлирован в другой каталог, измените | ||
+ | пути соответствующим образом. | ||
+ | |||
+ | 1. Создайте каталог /opt/ejudge/share/ejudge/container: | ||
+ | |||
+ | mkdir -p /opt/ejudge/share/ejudge/container | ||
+ | |||
+ | 2. Перейдите в него | ||
+ | |||
+ | cd /opt/ejudge/share/ejudge/container | ||
+ | |||
+ | 3. Создайте пустой каталог empty | ||
+ | |||
+ | mkdir empty | ||
+ | |||
+ | 4. Создайте необходимые каталоги для подмены /home: | ||
+ | |||
+ | mkdir -p home/judges/compile | ||
+ | |||
+ | 5. Создайте копии системных каталогов /dev, /etc, /root, /var | ||
+ | |||
+ | tar cf - /etc | tar xf - | ||
+ | tar cf - /dev | tar xf - | ||
+ | tar cf - /root | tar xf - | ||
+ | tar cf - /var | tar xf - | ||
+ | |||
+ | 6. Теперь почистите эти каталоги, удалив из них каталоги и файлы, которые не должны быть доступны | ||
+ | запускаемой программе. Отредактируйте файлы etc/passwd, etc/shadow, etc/group, etc/gshadow, | ||
+ | чтобы оставить минимальное количество пользователей. | ||
+ | |||
+ | === Настройка конфигурационных файлов ejudge === | ||
+ | |||
+ | Для компиляции программ в контейнерах добавьте атрибут <code>enable_compile_container</code> в элемент <code>config</code> | ||
+ | файла ejudge.xml. | ||
+ | |||
+ | <config enable_compile_container="yes" ... > | ||
+ | |||
+ | Чтобы включить выполнение программ в контейнерах для всех турниров принудительно добавьте атрибут <code>force_container</code> | ||
+ | в элемент <code>config</code> файла ejudge.xml. | ||
+ | |||
+ | <config force_container="yes" ... > | ||
+ | |||
+ | Скорее всего, потребуется добавить и первый, и второй атрибут. | ||
+ | |||
+ | Если атрибут <code>force_container</code> установлен, то запуск программ в контейнерах нельзя отключить | ||
+ | в турнирах. | ||
+ | |||
+ | Если <code>force_container</code> не установлен, то в турнирах в конфигурационных параметрах задач | ||
+ | добавьте параметр <code>[[serve.cfg:problem:enable_container|enable_container]]</code>. | ||
+ | |||
+ | Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки. | ||
+ | Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции | ||
+ | исполнения в контейнерах с помощью <code>[[serve.cfg:problem:container_options|container_options]]</code>. |
Revision as of 17:11, 18 December 2021
Навигация: Главная страница/Система ejudge/Использование/Изоляция недоверенных процессов в контейнерах
Изоляция компиляции и выполнения программ в контейнерах доступна с версии 3.9.0.
Это — руководство по настройке компиляции и запуска программ в контейнерах.
Контейнеры решают следующие проблемы предыдущих версий:
- Больше не требуется компиляция и инсталляция модифицированной версии ядра Linux.
- Поддерживается безопасное выполнение программ на языках программирования, которые ранее были "небезопасными", например, C#.
- Поддерживается безопасная компиляция программ на C/C++ (includebin хак не работает).
Contents
Конфигурирование ejudge
При конфигурировании укажите опции для задания пользователей для компиляции и выполнения.
./configure --with-primary-user=ejudge --with-exec-user=ejexec --with-compile-user=ejcompile ...
Здесь основной пользователь, под которым работает система — ejudge
,
пользователь для исполнения — ejexec
,
пользователь для компиляции — ejcompile
.
Создайте этих пользователей (если они еще не созданы).
adduser -c 'ejudge executor' -d / -M -s /sbin/nologin ejexec adduser -c 'ejudge executor 1' -d / -M -s /sbin/nologin ejexec1 adduser -c 'ejudge executor 2' -d / -M -s /sbin/nologin ejexec2 adduser -c 'ejudge executor 3' -d / -M -s /sbin/nologin ejexec3 adduser -c 'ejudge compiler' -d /home/judges/compile -M -s /sbin/nologin ejcompile
Пользователи ejexec1, ejexec2, ejexec3 потребуются, если на одном хосте будет запускаться паралельная проверка.
Скомпилируйте ejudge.
Инсталляция ejudge
Установка выполняется с помощью команды
make install
Однако эта команда не устанавливает правильные права доступа на привилегированные программы, в частности, ej-suid-container. Поэтому под пользователем root выполните команду
/opt/ejudge/bin/ejudge-suid-setup
Если ejudge установлен в другое место, измените путь соответствующим образом.
Затем под обычным пользователем ejudge обновите конфигурацию языков программирования с помощью
/opt/ejudge/bin/ejudge-configure-compilers
После чего под обычным пользователем ejudge выполните команду
/opt/ejudge/libexec/ejudge/bin/ej-suid-update-scripts all
если программа ej-suid-update-scripts не найдена, запускайте ее из
/opt/ejudge/bin/ej-suid-update-scripts all
TODO: запускать из ejudge-configure-compilers автоматически
Подготовка образов системных каталогов
На этом шаге нужно подготовить каталоги, которые будут отображаться в контейнеры вместо системных каталогов. Все операции выполняйте пользователем root. Дальнейшие действия выполняются в предположении, что ejudge проинсталлирован в /opt/ejudge. Если ejudge проинсталлирован в другой каталог, измените пути соответствующим образом.
1. Создайте каталог /opt/ejudge/share/ejudge/container:
mkdir -p /opt/ejudge/share/ejudge/container
2. Перейдите в него
cd /opt/ejudge/share/ejudge/container
3. Создайте пустой каталог empty
mkdir empty
4. Создайте необходимые каталоги для подмены /home:
mkdir -p home/judges/compile
5. Создайте копии системных каталогов /dev, /etc, /root, /var
tar cf - /etc | tar xf - tar cf - /dev | tar xf - tar cf - /root | tar xf - tar cf - /var | tar xf -
6. Теперь почистите эти каталоги, удалив из них каталоги и файлы, которые не должны быть доступны запускаемой программе. Отредактируйте файлы etc/passwd, etc/shadow, etc/group, etc/gshadow, чтобы оставить минимальное количество пользователей.
Настройка конфигурационных файлов ejudge
Для компиляции программ в контейнерах добавьте атрибут enable_compile_container
в элемент config
файла ejudge.xml.
<config enable_compile_container="yes" ... >
Чтобы включить выполнение программ в контейнерах для всех турниров принудительно добавьте атрибут force_container
в элемент config
файла ejudge.xml.
<config force_container="yes" ... >
Скорее всего, потребуется добавить и первый, и второй атрибут.
Если атрибут force_container
установлен, то запуск программ в контейнерах нельзя отключить
в турнирах.
Если force_container
не установлен, то в турнирах в конфигурационных параметрах задач
добавьте параметр enable_container
.
Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки.
Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции
исполнения в контейнерах с помощью container_options
.