як створити власну мітку 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 / тощо.

Чи є спосіб я створити власну мітку лише для власного додатка?

Моя ідея - створити щось на зразок 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 і завантажити, все ж отримую деякі помилки, але схоже, що я ближче до того, що хочу зробити.

Якщо я змушу його працювати, я оновлю цю посаду

Відповіді:


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, який є доменом мого додатка, писати / шукати / тощо каталоги з контекстом app_var_tі дозволяти йому створювати / відкривати / видаляти / тощо файли з контекстом app_var_t

Остання частина головоломки полягає в тому, щоб якось сказати SELinux, які папки та файли повинні отримувати кожен тип, ви робите це, редагуючи app.fcфайл (fc => контекст файлу)

у цьому файлі є лише два рядки:

/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файлі, але це поза межами цього питання.)

Додатковий матеріал для читання, який допоміг мені досягти цього рішення:

Здійснення спрощення за допомогою сепольгену

Подумайте, перш ніж просто наосліп завірити аудиторію2 дозволити мій домен

SELinux для розробників червоних капелюхів (довгий PDF)

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

Зразок політики (особливо postgresql)

Розуміння файлів контекстів файлів


Або скористайтеся 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.