Назад | Перейти на главную страницу

SELinux: как создать новый тип файла

В 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

Я читал различные руководства, но не нашел работающего примера - все, на что я смотрю:

В Проект 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 изначально знает три языка, и есть один сторонний язык абстракции, называемый «Справочная политика».

  1. Монолитный язык политик (checkpolicy используется для компиляции policy.conf - man checkpolicy)
  2. Язык политики модуля (checkmodule используется для компиляции $ MODULE. {Te.fc} - man checkmodule)
  3. Общий промежуточный язык (secilc используется для компиляции $ MODULE.cil - man secilc)

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

Справочная политика - это, по сути, оболочка вокруг «языка политики модуля», цель которой - упростить сопровождение политики.