Проблема с вашим первым модулем :пользователь root в unconfined _t все еще имеет разрешения и правила, позволяющие изменять политику selinux. Ваша настраиваемая политика применяет только новые автоматические переходы для semanage _exec _t на пользователя _t . Процесс в домене пользователя _t не может изменить политику, поэтому semodule
, semanage
и т. д. завершаются ошибкой. Однако любая программа в неподтвержденном домене по-прежнему может изменять политику. Кроме того, root может просто переименовать эти semanage _exec _t помеченные двоичные файлы в любой неограниченный тип для их запуска.
Ваш второй модуль политики ничего не делает, потому чтоneverallowправила проверяются компилятором -и не приводят ни к каким правилам в скомпилированной политике.Вы не можете использовать neverallow для удаления/черного списка правил, уже включенных в загруженную политику (, и в языке политики SELinux нет инструкции deny , которую вы могли бы использовать таким образом ).
Компиляция политики должна выдавать ошибку и завершаться сбоем, если существуют конфликтующие правила allow и neverallow . Согласно документации , neverallow правила могут использоваться в модулях политик, но для того, чтобы проверки были эффективными, expand-check
должно быть установлено на 1 в semanage.conf
(, возможно, причина, по которой ваш модуль успешно скомпилировано ).
Некоторые способы решения вашей проблемы для предотвращения изменений загруженной политики SELinux:
Использоватьsecure_mode_policyload
логическое значение:
Boolean to determine whether the system permits loading policy, setting enforcing mode, and changing boolean values.
Подобным образомsecure_mode_insmod
логическое значение предотвратит загрузку дополнительных модулей ядра. Эти логические значения нельзя отключить в работающей системе, после включения (требуется перезагрузка для отключения ).
Настройте пользователей на более ограниченные домены (, например пользователя _t ), что не позволяет изменять загруженную политику. Переключение на root с помощью su
/ sudo
не приведет к повышению уровня до более привилегированного пользователя SELinux и сохранит те же принудительные ограничения SELinux.
Создайте собственного пользователя SELinux. Вы можете основывать его на пользователе SELinux, предоставленном вашим дистрибутивом (загрузить исходники политик вашего дистрибутива ). Вероятно, вам следует рассмотреть возможность использования какого-либо ограниченного пользователя в качестве шаблона вместо неограниченного пользователя и добавлять только те разрешения, которые вам нужны, чтобы избежать предоставления чрезмерно широких разрешений.
Кроме того, если вам нужно предоставить только некоторые (переходы/правила с ограниченным доступом ), вы можете написать модуль политики, предоставляющий необходимый доступ ограниченному пользователю.
с awk
, который является подходящим инструментом для форматирования текста -:
awk '/^Grp:/ { OFS=" "; $1= "Reporting"; mg=$2; print; next}
{ OFS=","; print mg, $0}' infile
Использованиеsed
:
$ cat script.sed
/^Grp: / { ;# A "Grp: " line
s/// ;# Remove "Grp: "
h ;# Save in hold space
s/^/Reporting /p ;# Insert "Reporting " at start, print
d ;# Delete, start next cycle
}
# Any other line:
G ;# Append the hold space
s/\(.*\)\n\(.*\)/\2,\1/ ;# Swap strings around \n, insert comma
$ sed -f script.sed file
Reporting MG1
MG1,user1
MG1,user2
MG1,user3
Reporting MG2
MG2,user7
MG2,user1
MG2,user9
MG2,user6
MG2,user2
Как «один -лайнер»:
sed -e '/^Grp: /{s///;h;s/^/Reporting /p;d;}' \
-e 'G;s/\(.*\)\n\(.*\)/\2,\1/' file
Аналогичный подход к описанному выше сawk
:
awk '/^Grp: / { sub("^Grp: ", ""); group = $0; print "Reporting " $0; next }
{ print group "," $0 }' file
Оба варианта sed
и awk
в этом ответе (, а также вариант sh
в конце ниже )справятся с пробелами в данных либо в строках MG
, либо в строках user
:
$ cat file
Grp: some group ID
line 1
the other line
$ sed -e '/^Grp: /{s///;h;s/^/Reporting /p;d;}' -e 'G;s/\(.*\)\n\(.*\)/\2,\1/' file
Reporting some group ID
some group ID,line 1
some group ID,the other line
В качестве забавного упражнения, используя/bin/sh
:
while IFS= read -r line; do
case $line in
'Grp: '*)
group=${line#Grp: }
printf 'Reporting %s\n' "$group"
;;
*)
printf '%s,%s\n' "$group" "$line"
esac
done
Выполнить с
sh script.sh <file