Difference between revisions of "Изоляция недоверенных процессов в контейнерах"

From EjudgeWiki
(Created page with "Навигация: Главная страница/Система ejudge/Использование/Изоляция недоверенных проц...")
 
(...)
 
(One intermediate revision by the same user not shown)
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 ...
 +
 +
Здесь основной пользователь, под которым работает система &mdash; <code>ejudge</code>,
 +
пользователь для исполнения &mdash; <code>ejexec</code>,
 +
пользователь для компиляции &mdash; <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:language:disable_security|disable_security]]</code>,
 +
<code>[[serve.cfg:language:insecure|insecure]]</code>.
 +
 +
Механизм запуска в контейнерах отключает действие следующих
 +
конфигурационных переменных задачи:
 +
<code>[[serve.cfg:problem:disable_security|disable_security]]</code>,
 +
<code>[[serve.cfg:problem:enable_kill_all|enable_kill_all]]</code>,
 +
<code>[[serve.cfg:problem:enable_process_group|enable_process_group]]</code>,
 +
<code>[[serve.cfg:problem:enable_suid_run|enable_suid_run]]</code>.
 +
 +
Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки.
 +
Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции
 +
исполнения в контейнерах с помощью <code>[[serve.cfg:problem:container_options|container_options]]</code>.

Latest revision as of 09:18, 24 December 2021

Навигация: Главная страница/Система ejudge/Использование/Изоляция недоверенных процессов в контейнерах

Изоляция компиляции и выполнения программ в контейнерах доступна с версии 3.9.0.

Это — руководство по настройке компиляции и запуска программ в контейнерах.

Контейнеры решают следующие проблемы предыдущих версий:

  • Больше не требуется компиляция и инсталляция модифицированной версии ядра Linux.
  • Поддерживается безопасное выполнение программ на языках программирования, которые ранее были "небезопасными", например, C#.
  • Поддерживается безопасная компиляция программ на C/C++ (includebin хак не работает).

Конфигурирование 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.

Механизм запуска в контейнерах отключает действие следующих конфигурационных переменных языка программирования: disable_security, insecure.

Механизм запуска в контейнерах отключает действие следующих конфигурационных переменных задачи: disable_security, enable_kill_all, enable_process_group, enable_suid_run.

Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки. Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции исполнения в контейнерах с помощью container_options.