В RHEL / CentOS 7 я пытаюсь создать новый контекст безопасности SELinux для файлов, чтобы поддерживать новую службу, которую я пишу.
Я создал файл принудительного применения типов для своей новой службы, но мне не удается создать новый тип, который система распознает как тип файла.
Я работаю на основе этого Документ CentOS 5 "Создание модуля локальной политики", который инструктирует меня создать файл TE, а затем использовать checkmodule
и semodule_package
скомпилировать его.
Если я просто напишу в своем TE-файле:
type myservice_spool_t;
тогда TE компилируется нормально, но когда я пытаюсь semanage fcontext
Я получаю это:
$ sudo semanage fcontext -a -t myservice_spool_t "/var/spool/myservice(/.*)?"
ValueError: Type myservice_spool_t is invalid, must be a file or device type
Я читал различные руководства, но не нашел работающего примера - все, на что я смотрю:
type myservice_spool_t, file_type;
но checkmodule
говорит: ERROR 'attribute file_type is not declared'
file_type()
но checkmodule
говорит: ERROR 'This block has no require section.' at token 'files_type'
audit2allow
.В Проект SELinux сайт совершенно бесполезен, так как мне не удалось найти ни одного рабочего примера
Я был бы признателен за простой краткий пример того, как написать файл TE, который вводит новый тип, который semanage fcontext
одобрит.
[Обновить]
я нашел это Документация Gentoo для создания файлов политик, где есть несколько полезных объяснений и примеров.
Я обнаружил, что проблема в том, что я неправильно скомпилировал модуль. В результате макросы скорее всего не "взяли" и checkmodule
Сообщения об ошибках компилятора политики не очень помогли понять это.
Чтобы все эти макросы развернулись должным образом, необходимо скомпилировать политику, используя файлы Makefile, предоставленные SELinux - с файлом TE с именем myservice_spool.te следует выполнить:
make -f /usr/share/selinux/devel/Makefile myservice_spool.pp
Это создаст временный TE-файл со всеми расширенными макросами, а затем вызовет соответствующие компиляторы для создания myservice_spool.pp
.
Документация Gentoo, ссылка на которую есть в OP, содержит немного больше информации, хотя пути к файлам неверны для систем CentOS.
Если вы просмотрите сгенерированный шаблон TE в tmp
каталог (который make-файл SELinux услужливо оставляет на месте), вы можете видеть, что «атрибуты» действительно являются правильным способом обработки указания типа как файла, но мы должны require
чтобы заставить их работать - похоже, что файлы SELinux TE работают так, что вы не получаете никаких символов, волшебным образом импортированных в файл конфигурации - вы должны require
все, что вы используете.
Итак, правильный немакроифицированный способ настройки нового типа файла выглядит примерно так (скопировано из шаблона, созданного TE):
type myservice_spool_t;
require {
attribute spoolfile;
attribute file_type, non_security_file_type, non_auth_file_type;
} # end require
typeattribute myservice_spool_t file_type, non_security_file_type, non_auth_file_type, spoolfile;
Вам необходимо объявить его членом атрибута files, чтобы у него были права на изменение метки.
Пытаться
type myservice_spool_t;
files_type(myservice_spool_t)
Или лучше в твоем случае ..
type myservice_spool_t;
files_spool_file(myservice_spool_t)
Учитывая, что вы действительно создаете файл спула. Это дает другим макросам возможность работать с этой буфером, если в их политике есть привилегии «управлять буфером».
Вот полный пример модуля политики.
policy_module(`myservice', 1.0.0)
type myservice_spool_t;
files_spool_file(myservice_spool_t)
Это сработает, но только объявит тип и все. Вам понадобятся некоторые разрешающие правила, чтобы сделать что-то стоящее.
https://selinuxproject.org/page/TypeStatements имеет правильный ответ:
# Using the typeattribute statement to associate a type of
# setroubleshootd_exec_t to two attributes file_type and
# non_security_file_type.
# These are the previously declared attributes:
attribute file_type;
attribute non_security_file_type;
# The previously declared type:
type setroubleshootd_exec_t;
# These are the associations using the typeattribute statement:
typeattribute setroubleshootd_exec_t file_type, non_security_file_type;
Но да, ваш вопрос поднимает интересный момент.
SELinux изначально знает три языка, и есть один сторонний язык абстракции, называемый «Справочная политика».
Каждый из вышеперечисленных родных языков имеет свои специфические свойства, и это может сбивать с толку.
Справочная политика - это, по сути, оболочка вокруг «языка политики модуля», цель которой - упростить сопровождение политики.