chmodding von Dateien mit einem SELinux-Sicherheitskontext / einer ACL

1156
tjt263

Okay, ich habe also eine Reihe von bash& pythonSkripten, die ich geschrieben habe, die alle zusammen in einem großen Verzeichnis chillen. Tatsächlich gibt es separate Unterverzeichnisse, aber alle sind in diesem Hauptverzeichnis verschachtelt.
Aus Gründen der Argumentation sieht die Verzeichnisstruktur also etwa so aus:

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

Wie auch immer, ich habe versucht, die gesamte Sammlung von Skripts ausführbar zu machen, alles auf einen Schlag mit findund chmod:

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

Normalerweise ist das alles, was ich tun müsste, aber ich bemerkte, dass das +xStück immer noch nicht festgelegt war. Alle ihre Berechtigungen sehen immer noch so aus:

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

Angeblich. Das .Zeichen (hinter den Berechtigungskennzeichen) impliziert eine Art SELinux-Sicherheitskontext mit einer Zugriffssteuerungsliste oder ähnlichem. Ich überprüfte mit getfacl, nicht wirklich wissend, worauf ich lachen sollte; Zuerst ist ein Verzeichnis, zweitens ist eine der Skriptdateien:

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

Ich habe mit folgenden setfaclOptionen experimentiert, ohne Erfolg:

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

In einer Situation, in der die rootBenutzerautorität nicht respektiert wird und sudokeine Verwendung findet, muss ich fragen; Wie soll ich die Zugriffskontrolle meiner eigenen Dateien wiedererlangen?

Migriert von security.stackexchange.com

1
Wenn diese Frage woanders gehört, leiten Sie sie bitte an die entsprechende Website weiter, anstatt sie zu schließen. Vielen Dank. tjt263 vor 5 Jahren 0
Die Schließung kann neben der Migration verwendet werden (es gibt einen Abstimmungsgrund "Gehört auf einer anderen Website"). forest vor 5 Jahren 0
Normalerweise macht das seuid-Bit nur für ausführbare Dateien und nicht für Skripts Sinn. Was für ein Python-Skript ausgeführt wird, ist die ausführbare Python-Datei. vor 5 Jahren 0

1 Antwort auf die Frage

1
trogdor

ACLs und SELinux-Kontexte sind völlig unterschiedlich. Es gibt ein gutes Tutorial hier für CentOS

Um zu sehen, ob SELinux tatsächlich Ihren Zugriff blockiert, verwenden Sie dies 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 In meiner Ausgabe heißt es, dass SELinux Out-of-Context-Zugriffe aktiv blockiert.

Stellen Sie SELinux vorübergehend auf permissive using ein # 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 

Der permissive Modus weist Sie immer noch auf Verstöße gegen den SELinux-Kontext hin, blockiert sie jedoch nicht. Dies ist ein guter Weg, um zu prüfen, ob SELinux tatsächlich das Problem ist. Wenn dies der Fall war und jetzt alles funktioniert, setzen Sie SELinux wieder auf Erzwingen mit sudo setenforce Enforcing. (Nebenbei bemerkt ändern Änderungen an SELinux mit setenforce den Neustart nicht).

Wenn SELinux das Problem ist, müssen Sie den richtigen Kontext für die Skripts finden oder vielleicht eine einfache Korrektur mit einem Boolean.

Wenn Sie sich in Ihrem Home-Verzeichnis befinden, kann es genauso einfach sein, einen SELinux-Boolean einzustellen. Zum Anzeigen von Booleschen Objekten gibt es hier eine Beschreibung von CentOS-Booleans , aber ich stelle fest, dass das unten stehende Beispiel für user_exec_content nicht dort aufgeführt ist. Ein praktischeres Werkzeug für boolesche Beschreibungen ist 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 ... 

Das erste Aus zeigt seinen aktuellen Status an, dass es derzeit deaktiviert ist. Beim nächsten Ausschalten wird der Standardwert angezeigt. Dies bedeutet, dass er nach dem Neustart oder der Neusprache des Dateisystems immer noch deaktiviert ist.

In diesem Fall verwenden Sie #setsebool -P user_exec_content on das Flag -P, um die boolesche Änderung auch nach Neustarts zu übernehmen

Wenn es sich um ein Kontextproblem handelt, sind gute Kontexte viel angenehmer, da sie intuitiver sind. Es scheint Versuch, Irrtum und Erfahrung zu sein, was mit den SELinux-Booleschen tatsächlich was tut, zum Beispiel keine Ahnung, was user_exec_content tatsächlich tut.

Verwenden Sie das Flag -Z mit ls, um den Kontext Ihrer Dateien anzuzeigen, z. ls -alZ.

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

Hier ist user_home_t der Kontext für backup.sh. Angenommen, Sie haben ein anderes Verzeichnis mit den richtigen Kontexten zum Ausführen von Skripts. Sie können diesen Kontext mithilfe des folgenden Befehls in das Verzeichnis ./scripts spiegeln:

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

Um zu überprüfen, wurde die Änderung verwendet ls -alZ ./scripts

restorecon -Rv ./scripts 

sollte das Dateisystem neu benennen und alle Dateien und Verzeichnisse rekursiv in die aktualisierten Kontexte umbenennen. In diesem Fall werden lediglich das Skriptverzeichnis und dessen Inhalt erstellt.

Wenn dies funktioniert, überstehen die hier vorgenommenen Änderungen den Neustart nicht, und Sie können die folgenden Änderungen verwenden, um die Änderungen dauerhaft zu machen.

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

Eine weitere Option zum Verwalten von SELinux ist die Installation, policycoreutils-guidamit Sie durch Eingabe auf eine Selinux-Konfigurations-GUI zugreifen können # system-config-selinux. Durch das Filtern mit 'script' habe ich festgestellt, dass viele Skripte bin_t als Kontext verwenden. Sie können damit auch den Erzwingungsmodus ändern. Meine Skripte in meinem Home-Verzeichnis user_home_tlaufen problemlos mit, aber ich vermute, Sie sind woanders, wenn Sie diese Probleme haben.