как создать собственную метку SELinux

11

Я написал сервис / отдельное двоичное приложение, которое пытаюсь запустить на Fedora 24, оно запускается с использованием systemd, двоичный файл развернут на /srv/bot

эта служба / приложение, которое я написал, должно создавать / открывать / читать и переименовывать файлы в этом каталоге.

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

но когда мое приложение нужно было переименовать, вывод имел предупреждение:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

Я погуглил и обнаружил, что должен использовать более конкретную метку SELinux, чем базовый тип, но во всех онлайн-примерах показаны существующие метки из httpd / nginx / etc.

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

Моя идея состоит в том, чтобы создать что-то вроде myapp_var_t, используйте

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

и пользовательский .ppфайл, который будет использовать этот пользовательский тип

Если есть лучший способ решить эту проблему, это тоже работает.

Спасибо

Обновить

После долгих поисков я думаю, что правильный термин для того, что я хочу сделать, - это создать новый, typesкоторый привел меня к https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

который в основном говорит, беги

sepolgen /path/to/binary

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

Если я заставлю это работать, я обновлю этот пост

fmpwizard
источник

Ответы:

11

С начальной точки бега

sepolgen /path/to/binary

что дает вам:

app.fc
app.sh
app.if
app.spec
app.te

Чтобы создать новый SELinux file contextдля применения к родительскому каталогу, содержащему файлы, которые будет изменять ваша программа / демон, вы редактируете файл app.te и добавляете:

type app_var_t;
files_type(app_var_t)

Первая строка объявляет новый тип и вторая строка вызывает макрос , который делает некоторые магии и делает это тип файла (оказывается, вы не можете использовать строки app_exec_t контекста процесса на файл или каталог), см «SELinux Типы Revisited» для более информация о различных типах

Как только вы определили тип, вы должны сообщить SELinux, что вашему приложению разрешено использовать его, в моем случае я добавил

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

Эти две строки в основном говорят, позволяют типу app_t, который является доменом моего приложения, писать / искать / etc каталоги с контекстом app_var_tи разрешать ему создавать / открывать / удалять / etc файлы с контекстом app_var_t

Последняя часть головоломки состоит в том, чтобы как-то сказать SELinux, какие папки и файлы должны получать каждый тип, вы делаете это путем редактирования app.fcфайла (fc => file context)

этот файл имеет только две строки в моем случае:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

первая строка указывает на двоичный файл, развернутый на моих серверах, поэтому этот получает контекст app_exec_t.

Вторая строка означает:

Применить app_var_t к каталогу / srv / bot, а также ко всем файлам внутри dir / srv / bot

Обратите внимание, как проходит первая строка --между путем и вызовом gen_context. --значит, применить это только к файлам. во втором случае у нас нет ничего (только пробелы), что означает применение ко всем соответствующим каталогам и файлам, что я и хотел, другой вариант - -dприменять только каталоги.

Теперь у меня есть рабочая политика, я могу развернуть свое приложение с пользовательской политикой, и все это работает. (моя политика содержит намного больше записей в .teфайле, но это выходит за рамки этого вопроса.)

Дополнительный материал для чтения, который помог мне получить это решение:

Делать вещи проще с sepolgen

Подумайте, прежде чем просто вслепую aud2allow -M mydomain

SELinux для разработчиков Red Hat (длинный PDF)

Модуль SElinux (1): типы и правила

Пример политики (особенно postgresql)

Понимание файлов контекстов файлов

fmpwizard
источник
Или используйте CIL
Jakuje
sepolgen /path/to/binaryвыплевывает синтаксическую ошибку для меня. Я на RHEL 7.6. Я думаю, sepolgen --application /path/to/binaryправильный синтаксис, если ваша цель написать политику для конкретного приложения?
Jayhendren
Ваш .teфайл также вызывает ошибку синтаксиса для меня при компиляции модуля: app.te:5:ERROR 'This block has no require section.' at token 'files_type' on line 5:. И если я добавлю requireраздел, я получу:ERROR 'syntax error' at token 'files_type' on line 13:
Jayhendren
Извините, у меня больше нет доступа к машине Fedora для ее тестирования, но, возможно, начиная с версии 24 они изменили синтаксис.
fmpwizard