chmodding файлы с контекстом безопасности SELinux / ACL

Итак, у меня есть куча bash & python Сценарии, которые я написал, все просто объединяются в один большой каталог. Ну, на самом деле есть отдельные подкаталоги, но все они вложены в этот основной каталог.
Итак, ради аргумента, структура каталогов выглядит примерно так:

find . -type d
.
./scripts/sh
./scripts/sh/a
./scripts/sh/b
./scripts/sh/c
./scripts/py
./scripts/py/x
./scripts/py/y
./scripts/py/z

Во всяком случае, я пытался сделать всю коллекцию сценариев исполняемыми, все одним махом с find а также chmod:

find . -type f -exec chmod +x {} +

Обычно это все, что мне нужно сделать, но я заметил +x бит был еще не установлен. Все их разрешения все еще выглядят так:

ls -l ./scripts/py/z
-rw-rw----.  1 root 1015  801 May  7 12:00 script_name.py

Возможно. . символ (завершающий флаги разрешений) подразумевает некоторый контекст безопасности SELinux со списком контроля доступа или подобным. Я проверил с getfaclне очень зная, для чего лол; первый - это каталог, второй - один из файлов сценария:

getfacl -acp ./scripts/py/z &&
getfacl -acp ./scripts/py/z/*
user::rwx
group::rwx
other::--x

user::rw-
group::rw-
other::---

Я экспериментировал со следующим setfacl варианты, безрезультатно:

setfacl --help | grep 'remove'
  -x, --remove=acl        remove entries from the ACL(s) of file(s)
  -X, --remove-file=file  read ACL entries to remove from file
  -b, --remove-all        remove all extended ACL entries
  -k, --remove-default    remove the default ACL

Итак, в ситуации, когда root авторитет пользователей не соблюдается, и sudo бесполезно, я должен спросить; Как я могу восстановить контроль доступа к своим файлам?

Перенос с сайта https://security.stackexchange.com/

1 ответ

ACL и контексты SELinux совершенно разные. Здесь есть хорошее руководство для CentOS

Чтобы увидеть, действительно ли SELinux блокирует ваш доступ sestatus

$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

Enforcing в моем выводе говорится, что SELinux активно блокирует неконтекстный доступ.

Временно установите SELinux для разрешения, используя # sudo setenforce Permissive

$ sudo setenforce Permissive
[sudo] password for trogdor: 
$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

Разрешительный режим все равно предупредит вас о нарушениях контекста SELinux, но не заблокирует их. Это хороший способ проверить, действительно ли проблема в SELinux. Если это было, и теперь все работает, установите SELinux обратно в Enforcing с помощью sudo setenforce Enforcing, (В дополнение к изменениям SELinux с setenforce перезагрузка не переживет).

Если проблема в SELinux, вы должны найти правильный контекст, которым должны быть сценарии, или, может быть, это простое исправление с логическим значением.

Если вы находитесь в своем домашнем каталоге, это может быть так же просто, как установить логическое значение SELinux. Для просмотра логических значений здесь есть описание логических значений CentOS, но я заметил, что моего примера user_exec_content там нет в списке, более удобным инструментом для распознавания логических значений является semanage boolean -l

# getsebool -a | grep exec
...
user_exec_content --> off
...

#sudo semanage boolean -l
...
user_exec_content              (off  ,   off)  Allow user to exec content
...

Первое выключение показывает его текущее состояние, что в данный момент оно выключено; следующее отключение показывает значение по умолчанию, означающее, что оно все еще будет отключено после перезагрузки или перемаркировки файловой системы.

В этом случае используйте #setsebool -P user_exec_content on Флаг -P делает логическое изменение постоянным при перезагрузке

Если это проблема контекста, хорошо, с контекстами гораздо приятнее работать, потому что они более интуитивны. Кажется, что это проба, ошибка и опыт относительно того, что на самом деле делает то, что с булевыми значениями SELinux, например, понятия не имею, что на самом деле делает user_exec_content.

Используйте флаг -Z с ls для просмотра контекста ваших файлов, например. ls -alZ.

$ ls -alZ
-rwxrwxr-x. trogdor trogdor unconfined_u:object_r:user_home_t:s0 backup.sh

Здесь user_home_t является контекстом для backup.sh. Допустим, у вас есть другой каталог с правильными контекстами для выполнения сценариев, вы можете отразить этот контекст в каталоге./scripts, используя:

# chcon -R --reference /onethatworks ./scripts

Чтобы перепроверить изменения были использованы ls -alZ ./scripts

restorecon -Rv ./scripts 

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

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

# semanage fcontext -a -s system_u -t <context_that_worked> "./scripts(/.*)?

Другой вариант управления SELinux - установить policycoreutils-gui так что у вас есть доступ к графическому интерфейсу конфигурации selinux, введя # system-config-selinux, С помощью фильтрации с использованием 'script' я обнаружил, что многие сценарии используют bin_t в качестве контекста. Вы также можете изменить режим принуждения с ним. Мои сценарии в моем домашнем каталоге успешно выполняются user_home_t но я подозреваю, что вы где-то еще, если у вас есть эти проблемы.

Другие вопросы по тегам