Почему политики selinux применяются к командам (например, logrotate), запускаемым из cronjobs, но не применяются непосредственно из командной строки?

El controlador Linux Kernel NTFS solo admite montajes de lectura -. Para el acceso de escritura -de lectura, necesita instalar y usar el controlador FUSE ntfs-3g. Para usar explícitamente ntfs -3g en lugar del controlador Kernel, especifíquelo en la opción de tipo de montaje:

mount -t ntfs-3g...

5
06.05.2019, 12:59
4 ответа

Когда cronзапускает logrotate, SELinux ограничивает его logrotate _t "type". Этот «тип» не может модифицировать другие типы файлов (, также известный как «выход из заключения» ).

Когда вы запускаете logrotate, вы (скорее всего )начинаете с "неограниченного" типа, что означает то, что он говорит --процессу logrotateразрешено изменять файлы. Вы также можете захотеть, чтобы logrotateперезапускал или сигнализировал процессам (через постротацию, например ); эта активность также может быть ограничена SELinux.

Мое предложение состоит в том, чтобы сообщить SELinux («разрешить» )типу logrotate _t выйти из ограничения с помощью:

semanage permissive -a logrotate_t

Это умеренное решение, в -между отключением SELinux и точной -настройкой политики, позволяющей точно выполнять побеги из заключения, которые вам нужны (, возможно, с пользовательской маркировкой ). Чтобы отменить это изменение, используйте semanage permissive -d logrotate_t.

Лучший способ смоделировать процесс, -инициируемый cron, — поместить задания в cron. Кроме того, я знаю о runcon, хотя я не смог успешно его использовать.

8
27.01.2020, 20:34

У меня нет глубоких знаний в SElinux, и я не уверен, что это то же самое, что и другой ответ. Вот как я это сделал :Внутри каталога. из crontab semanage fcontext -a -t 'myCronTab' logrotate_exec_tэто делает cronjob и logrotateв одном контексте, поэтому он должен выполняться через командную строку.

0
27.01.2020, 20:34

Просто чтобы добавить к хорошему ответу @JeffSchaller по конкретному вопросу:

how can I simulate it running from the cronjob to test?

Я могу поделиться работающей альтернативой запуску тестовых команд из cronjob.

Для начала стоит упомянуть одну тонкую деталь:

В традиционной среде, отличной от -SELinux, когда вы работаете как root (эффективный UID = 0 ), вы обычно можете переключиться на любой другой UID, который вам нравится, чтобы «получить» ограничения этого UID.

Это совсем не похоже на контексты SELinux :быть root (эффективным UID = 0 )обычно помещает вас в «неограниченный» контекст, но не позволяет автоматически свободно переключаться в другие контексты. Вам скорее нужно явное правило политики SELinux, которое предоставляет «неограниченному» контексту разрешение на выполнение этой конкретной операции «перехода». После того, как вы установили такое правило, команда runconуспешно поместит вас в этот контекст.

С практической точки зрения, для вашего случая вам, вероятно, понадобится политика SELinux, подобная простой:

allow unconfined_t crond_t:process transition;

(в предположении, что crond_t— это домен SELinux, под которым работает ваш демон crond)

Правило компиляции и установки полного модуля:

module unconfined-trans-crond 1.0;

require {
        type unconfined_t;
        type crond_t;
        class process transition;
}

allow unconfined_t crond_t:process transition;

После компиляции и установки этого модуля будет работать runcon, нацеленный на домен crond_tиз unconfined_t.Например:

# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# runcon $(ps -q $(pgrep crond) -o context --no-header) sh
# id
uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:crond_t:s0
#

Также обратите внимание, что для использования runconвам не обязательно иметь UID 0, вам «только» нужно правильное правило политики, которое разрешает переход от вашего текущего контекста SELinux к целевому контексту SELinux.

На самом деле, полная команда, которую я обычно запускаю от имени пользователя root для проверки доступности демона (, например crond),:

runuser $(ps -q $(pgrep crond) -o user --no-header) -c 'runcon $(ps -q $(pgrep crond) -o context --no-header) /bin/bash'

, который дает оболочку, работающую с пользователем crond, а также с его контекстом SELinux.

Чтобы отменить эту политику после завершения тестирования, просто удалите пользовательский модуль.

Это, конечно, не принимает во внимание возможные другие ограничения, такие как различные виды пространств имен, ограничения ресурсов (, ulimits ), контрольные группы или возможности Linux. Это потребует последовательного запуска дополнительных команд, чтобы воссоздать эти дополнительные ограничения, если только конфигурация PAM для runuserне является последовательной при повторном -их создании для вас.

ХТХ

3
27.01.2020, 20:34

Вдохновленный ответами @Jeff _Schaller и @LL3, вот способ придумать правильный модуль sepolicy для этого процесса:

:; sudo semanage permissive -a logrotate_t
# turn off selinux for logrotate temporarily to allow the logrotate command to go through, while still logging the denied messages in audit.log

:; sudo runcon -u system_u -r system_r -t logrotate_t logrotate -f /etc/logrotate.conf
:; sudo semanage permissive -d logrotate_t # re-enable selinux

:; sudo grep denied /var/log/audit/audit.log | audit2allow -M logrotate
# create a selinux policy based on the denied messages

:; sudo semodule -i logrotate.pp

Содержимое logrotate.teвыглядит примерно так

module logrotate 1.0;

require {
        type initrc_exec_t;
        type default_t;
        type policykit_t;
        type logrotate_t;
        class dbus send_msg;
        class file { create getattr ioctl open read setattr unlink write };
        class dir { add_name read remove_name write };
        class service reload;
}

#============= logrotate_t ==============
allow logrotate_t default_t:dir { add_name read remove_name write };

#!!!! WARNING: 'default_t' is a base type.
allow logrotate_t default_t:file { create getattr ioctl open read setattr unlink write };
allow logrotate_t initrc_exec_t:service reload;
allow logrotate_t policykit_t:dbus send_msg;
3
27.01.2020, 20:34

Теги

Похожие вопросы