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

Контекст пути к файлу SELinux не работает с регулярным выражением

Я переформатировал для удобства чтения на основе предложений в комментариях.

У меня есть сервер RADIUS, который использует аутентификатор Google, и SELinux блокирует доступ RADIUS к файлам .google_authenticator в домашних каталогах пользователей (это также пользователи winbind с домашними каталогами в /home/API). Я попытался предоставить ему доступ, построив следующие файлы политики:

$ cat ./google-authenticator.fc 
/home/API(/.*)?/\.google_authenticator      gen_context(system_u:object_r:radiusd_google_authenticator_t,s0)
$ cat ./google-authenticator.te
policy_module(radiusd_google_authenticator, 0.0.10)

require {
  type radiusd_t;
  type user_home_dir_t;
  type admin_home_t;
}

type radiusd_google_authenticator_t;

role object_r types radiusd_google_authenticator_t;

allow radiusd_t radiusd_google_authenticator_t:file { rename create unlink rw_file_perms };

files_type(radiusd_google_authenticator_t)
filetrans_pattern(radiusd_t, user_home_dir_t, radiusd_google_authenticator_t, file, ".google_authenticator")
filetrans_pattern(radiusd_t, admin_home_t, radiusd_google_authenticator_t, file, ".google_authenticator")

Их установка показывает путь в semanage fcontext -l, но это не работает:

 $ sudo semanage fcontext -l | grep google_authenticator
 /home/API(/.*)?/\.google_authenticator             all files          system_u:object_r:radiusd_google_authenticator_t:s0 
 $ matchpathcon /home/API/tcr/.google_authenticator
 /home/API/tcr/.google_authenticator    unconfined_u:object_r:user_home_t:s0

Как ни странно, когда я меняю его так, чтобы путь точно совпадал (даже с экранированной точкой), он работает:

$ sudo semanage fcontext -l | grep google_authenticator
/home/API/tcr/\.google_authenticator               all files          system_u:object_r:radiusd_google_authenticator_t:s0 
$ matchpathcon /home/API/tcr/.google_authenticator
/home/API/tcr/.google_authenticator system_u:object_r:radiusd_google_authenticator_t:s0

Еще более странно, регулярное выражение работает, когда, как было предложено в ответе Иана, я добавляю путь напрямую с помощью semanage вместо файлов политики (сначала удаляя путь политики, чтобы не было конфликта):

$ sudo semanage fcontext -l | grep google_authenticator
$ matchpathcon /home/API/tcr/.google_authenticator
/home/API/tcr/.google_authenticator unconfined_u:object_r:user_home_t:s0
$ sudo semanage fcontext -a -t radiusd_google_authenticator_t '/home/API(/.*)?/\.google_authenticator'
$ sudo semanage fcontext -l | grep google_authenticator
/home/API(/.*)?/\.google_authenticator             all files          system_u:object_r:radiusd_google_authenticator_t:s0 
$ matchpathcon /home/API/tcr/.google_authenticator
/home/API/tcr/.google_authenticator system_u:object_r:radiusd_google_authenticator_t:s0

Я также пробовал различные настройки с использованием HOME_DIR, но и там не повезло.

Попробуйте использовать

HOME_DIR/\.google_authenticator -- gen_context(system_u:object_r:radiusd_google_authenticator_t,s0)

Вместо. Домашние каталоги не обязательно находятся в / home, и это действует как макрос при перестроении политики.

РЕДАКТИРОВАТЬ

Итак, я проверил исходный код, и он дает следующий текст, который, вероятно, указывает на то, что здесь происходит.

label_file.c
680     /*
681      * Check for matching specifications in reverse order, so that
682      * the last matching specification is used.
683      */

Регулярное выражение последнего матча - победа. Библиотека SELinux использует следующий порядок поиска файлов для соответствия:

/etc/selinux/targeted/contexts/files/file_contexts.subs_dist
/etc/selinux/targeted/contexts/files/file_contexts.subs
/etc/selinux/targeted/contexts/files/file_contexts
/etc/selinux/targeted/contexts/files/file_contexts.homedirs
/etc/selinux/targeted/contexts/files/file_contexts.local

Соответствующее регулярное выражение, которое выигрывает в вашем случае, таково:

grep user_home_t /etc/selinux/targeted/contexts/files/file_contexts.homedirs
/home/[^/]+/.+  user_u:object_r:user_home_t:s0

При добавлении записи в качестве локального контекста она вместо этого извлекается из этого файла: /etc/selinux/targeted/contexts/files/file_contexts.local который появляется после файл, соответствующий в данный момент.

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

В качестве альтернативы я попытался добавить это как переопределение HOME_DIR (как я изначально предлагал, но с использованием audio_home_t для проверки принципала), выполнив следующие действия:

HOME_DIR/(tcr)?/\.google_authenticator          --      gen_context(system_u:object_r:audio_home_t)

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

Фактически он изменил регулярное выражение на это в файле:

grep tcr /etc/selinux/targeted/contexts/files/*
/etc/selinux/targeted/contexts/files/file_contexts.homedirs:/home/[^/]+/(tcr)?/\.google_authenticator   --  user_u:object_r:audio_home_t:s0

Я бы посоветовал сначала попробовать опцию HOME_DIR (это фактический способ реализации политики, который вы должны реализовать) или, в качестве альтернативы, использовать локальное переопределение.

Я не совсем уверен, что вы пытаетесь сделать, но если у него есть подстановочный знак * после API, чтобы, например,

/home/API/one/.google_authenticator
/home/API/two/.google_authenticator
...

у всех есть тип radiusd_google_authenticator_t тогда это, кажется, работает

sudo semanage fcontext -a -t mysqld_db_t  "/home/API(/.*)?/.google_authenticator"

Обратите внимание: я использовал mysqld_db_t, так как у меня нет radiusd_google_authenticator_t

matchpathcon /home/API/one/.google_authenticator
/home/API/one/.google_authenticator     system_u:object_r:mysqld_db_t:s0
matchpathcon /home/API/two/.google_authenticator
/home/API/two/.google_authenticator     system_u:object_r:mysqld_db_t:s0