Вопрос: 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

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

  • устаревший - т.е. Эта Страница документации RHEL 4 SELinux говорит, что следует использовать 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'
  • или полностью отсутствует - например, в новом руководстве SELinux для RHEL 7 нет никакой информации о том, как создавать новые политики, за исключением использования audit2allow,

Проект SELinux сайт абсолютно бесполезен, так как мне не удалось найти один рабочий пример

Я бы оценил простой краткий пример того, как написать файл TE, который вводит новый тип, который semanage fcontext одобрит.

[Обновить]

я нашел это Документация Gentoo для создания файлов политик, в котором приведены некоторые полезные объяснения и примеры.


7
2017-10-02 09:27


Источник


Пытаться fedoraproject.org/wiki/PackagingDrafts/..., или блог Дэна Уолша danwalsh.livejournal.com, - Iain


Ответы:


Вам нужно объявить его членом атрибута files, чтобы он имел привилегии перемаркировки.

Пытаться

type myservice_spool_t;
files_type(myservice_spool_t)

Или лучше в вашем случае ..

type myservice_spool_t;
files_spool_file(myservice_spool_t)

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


2
2017-10-02 19:56



Как я уже упоминал в вопросе, я пробовал это, и он не работает. С новым макросом я все еще получаю эту ошибку: myservice_spool.te:4:ERROR 'This block has no require section.' at token 'files_spool_file' on line 4: - Guss
BTW: где можно найти документацию для всех этих макросов или даже источник? Googling для очень специфического files_spool_file Я получаю только несколько результатов, которые являются либо исходными дампами скриптов, использующих его, отчеты об ошибках, либо списки рассылки. Похоже, что политика SELinux - это коллекция волшебных заклинаний, скрепленных с помощью шлемов, клейкой ленты и «ее работа, не трогайте». - Guss
Я нашел свою проблему - это было не о том, какой макрос писать, но как скомпилировать модуль. - Guss
Это не сработало. # checkmodule mailcaptcha.te checkmodule: loading policy configuration from mailcaptcha.te mailcaptcha.te:1:ERROR 'syntax error' at token 'type' on line 1: checkmodule: error(s) encountered while parsing configuration # cat mailcaptcha.te type mailcaptcha_t; files_type(mailcaptcha_t); - Chloe
Учитывая, что вы не объявили его модулем политики, я не удивлен. Вы должны заполнить файл принудительного ввода в соответствии с нормальными стандартами и добавить это. - Matthew Ife


Я узнал, что проблема, с которой я столкнулась, заключается в том, что я не правильно скомпилировал модуль. В результате макросы, вероятно, не «взяли», а checkmodule сообщения об ошибках компилятора политики действительно не помогли понять это.

Чтобы все эти макросы были расширены правильно, нужно скомпилировать политику, используя Make-файлы, предоставленные SELinux, - с файлом TE, называемым myservice_spool.te, который должен выполняться:

make -f /usr/share/selinux/devel/Makefile myservice_spool.pp

Это создаст временный файл TE со всеми расширенными макросами, затем вызовет соответствующие компиляторы для создания myservice_spool.pp,

Документация Gentoo, связанная в OP, содержит немного больше информации, хотя пути файлов не подходят для систем CentOS.

Если вы просмотрите созданный шаблон TE в tmp directory (что 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;

1
2017-10-03 06:30



Это не сработало. # make -f /usr/share/selinux/devel/Makefile  mailcaptcha.pp Compiling targeted mailcaptcha module /usr/bin/checkmodule: loading policy configuration from tmp/mailcaptcha.tmp mailcaptcha.te":2:ERROR 'Building a policy module, but no module specification found. - Chloe
Похоже, у вас нет te файл, или он не отформатирован должным образом. Вы не разделяете свой файл? - Guss
У меня нет исходного файла, который я пробовал, но вот моя последняя попытка и последняя ошибка: pastebin.com/JyEEi6dP - Chloe
Проблема заключается в вашем коде в строке 9, а не в отчете об ошибке. Я не уверен, почему он ведет себя таким образом, это может быть порядок порядка объявления типа и require что в моем примере отличается. Но в любом случае я предлагаю, чтобы вы не использовали мой пример, потому что, как я писал, это не код, а выход из препроцессора. вы должны использовать макрос, как ответил Матвей в своем комментарии к вашему вопросу. - Guss


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. Common Intermediate Language (secilc используется для компиляции $ MODULE.cil - man secilc)

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

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


-1
2017-10-10 10:38



Мое недоразумение состояло в основном в том, что в системе что-то было определено, например file_type атрибут, не означает, что он определен для моего файла политики - я должен в основном переопределить его (или он «ссылается на него») в файле политики, чтобы я мог его использовать. И этого я не видел нигде, в том числе в ответах Stack Exchange. - Guss
Это не объясняет, как скомпилировать его. ни make ни checkmodule работает. # make -f /usr/share/selinux/devel/Makefile \n mailcaptcha.pp Compiling targeted mailcaptcha module /usr/bin/checkmodule: loading policy configuration from tmp/mailcaptcha.tmp mailcaptcha.te":2:ERROR 'Building a policy module, but no module specification found. - Chloe