Я переформатировал для удобства чтения на основе предложений в комментариях.
У меня есть сервер 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