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

предположительно. the . символ (замыкающий флаги разрешений) подразумевает какой-то контекст безопасности 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 бесполезно, я должен спросить; как я должен восстановить контроль доступа к своим собственным файлам?

перенесен из security.stackexchange.com

5
задан tjt263
источник

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 в permissive с помощью # 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 обратно в принудительное с sudo setenforce Enforcing. (в стороне изменения в SELinux с setenforce не переживут перезагрузки).

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

если вы находитесь в своем домашнем каталоге, это может быть так же просто, как установка SELinux логический. Для просмотра booleans, есть описание CentOS booleans здесь но я заметил, что мой пример 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
...

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

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

1
отвечен trogdor 2018-05-10 16:05:03
источник

Другие вопросы access-control administration permissions root selinux