Zum Inhalt springen

Linux/SELinux/04/10 Labels beibehalten: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
K Textersetzung - „ z. B. “ durch „ beispielsweise “
 
(12 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Debian =
{{navigation|Linux/SELinux/04/09 Dateisysteme|Linux/SELinux/04/11 Informationsbeschaffung}}
'''Linux/SELinux/04/10 Labels beibehalten''' - Labels beibehalten


== Beschreibung ==
== Kopieren/Verschieben ==
== Kopieren/Verschieben ==
; Verhalten beim Kopieren (cp) und Verschieben (mv)
; Verhalten beim Kopieren (cp) und Verschieben (mv)
In diesem Abschnitt wird das Verhalten des Kontexts beim Kopieren und Verschieben von Dateien gezeigt
Verhalten des Kontexts beim Kopieren und Verschieben von Dateien gezeigt


Zunächst ist wichtig zu verstehen, dass bei der Beibehaltung des Kontexts bei der Arbeit mit Dateien — zum Beispiel beim Verschieben — ein normaler Benutzer nur den Namensraum user.* überträgt, während der Superuser alle Namensräume außer system.* kopiert
Zunächst ist wichtig zu verstehen, dass bei der Beibehaltung des Kontexts bei der Arbeit mit Dateien — zum Beispiel beim Verschieben — ein normaler Benutzer nur den Namensraum user
* überträgt, während der Superuser alle Namensräume außer system
* kopiert


In der Praxis bedeutet das, dass die Beibehaltung von SELinux-Labels über xattr in der Regel Root-Rechte erfordert
In der Praxis bedeutet das, dass die Beibehaltung von SELinux-Labels über xattr in der Regel Root-Rechte erfordert
Zeile 12: Zeile 16:
=== Kopieren einer Datei ===
=== Kopieren einer Datei ===
Für einen sauberen Versuch erstellen wir ein temporäres Verzeichnis, das ein Webserver-Verzeichnis simuliert, und weisen ihm den passenden Kontext zu
Für einen sauberen Versuch erstellen wir ein temporäres Verzeichnis, das ein Webserver-Verzeichnis simuliert, und weisen ihm den passenden Kontext zu
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
mkdir /tmp/web_root
mkdir /tmp/web_root
chcon -t httpd_sys_content_t /tmp/web_root
chcon -t httpd_sys_content_t /tmp/web_root
ls -Zd /tmp/web_root
ls -Zd /tmp/web_root
</syntaxhighlight>
</syntaxhighlight>


Nun erstellen wir zwei identische Testdateien im gewöhnlichen Verzeichnis /tmp (wo Dateien standardmäßig mit dem Kontext user_tmp_t angelegt werden)
Nun erstellen wir zwei identische Testdateien im gewöhnlichen Verzeichnis /tmp (wo Dateien standardmäßig mit dem Kontext user_tmp_t angelegt werden)
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
touch /tmp/file_to_copy
touch /tmp/file_to_copy
touch /tmp/file_to_move
touch /tmp/file_to_move
ls -Z -1 /tmp/file_to_*
ls -Z -1 /tmp/file_to_*
</syntaxhighlight>
</syntaxhighlight>


; Ausgabe
; Ausgabe
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
sudo ls -Z -1 /tmp/file_to_*
sudo ls -Z -1 /tmp/file_to_*
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_to_copy
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_to_copy
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_to_move
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_to_move
</syntaxhighlight>
</syntaxhighlight>


Wir kopieren die erste Datei in unser „Web-Verzeichnis“ und sehen uns das Ergebnis an
Wir kopieren die erste Datei in unser „Web-Verzeichnis“ und sehen uns das Ergebnis an
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
cp /tmp/file_to_copy /tmp/web_root/
cp /tmp/file_to_copy /tmp/web_root/
ls -Z /tmp/web_root/file_to_copy
ls -Z /tmp/web_root/file_to_copy
</syntaxhighlight>
</syntaxhighlight>


; Ausgabe
; Ausgabe
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
sudo ls -Z /tmp/web_root/file_to_copy
sudo ls -Z /tmp/web_root/file_to_copy
unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/web_root/file_to_copy
unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/web_root/file_to_copy
</syntaxhighlight>
</syntaxhighlight>


Zeile 53: Zeile 57:
=== Verschieben einer Datei ===
=== Verschieben einer Datei ===
Nun verschieben wir die zweite Datei und prüfen ihren Kontext
Nun verschieben wir die zweite Datei und prüfen ihren Kontext
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
mv /tmp/file_to_move /tmp/web_root/
mv /tmp/file_to_move /tmp/web_root/
ls -Z /tmp/web_root/file_to_move
ls -Z /tmp/web_root/file_to_move
</syntaxhighlight>
</syntaxhighlight>


; Ausgabe
; Ausgabe
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
sudo ls -Z /tmp/web_root/file_to_move
sudo ls -Z /tmp/web_root/file_to_move
unconfined_u:object_r:user_tmp_t:s0 /tmp/web_root/file_to_move
unconfined_u:object_r:user_tmp_t:s0 /tmp/web_root/file_to_move
</syntaxhighlight>
</syntaxhighlight>


Zeile 79: Zeile 83:


Wir erstellen eine Testdatei
Wir erstellen eine Testdatei
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
touch /tmp/important_file
touch /tmp/important_file
chcon -t shadow_t /tmp/important_file
chcon -t shadow_t /tmp/important_file
</syntaxhighlight>
</syntaxhighlight>


Wir kopieren sie mit ausdrücklicher Anweisung, den SELinux-Kontext beizubehalten
Wir kopieren sie mit ausdrücklicher Anweisung, den SELinux-Kontext beizubehalten
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
cp --preserve=context /tmp/important_file /tmp/web_root/important_backup
cp --preserve=context /tmp/important_file /tmp/web_root/important_backup
</syntaxhighlight>
</syntaxhighlight>


oder
oder
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
cp -a /tmp/important_file /tmp/web_root/important_backup
cp -a /tmp/important_file /tmp/web_root/important_backup
</syntaxhighlight>


Prüfung
Prüfung
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
ls -Z /tmp/web_root/important_backup
ls -Z /tmp/web_root/important_backup
</syntaxhighlight>
</syntaxhighlight>


Zeile 111: Zeile 116:


Wir bereiten die benötigte Datei vor
Wir bereiten die benötigte Datei vor
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
touch /tmp/site_index.html
touch /tmp/site_index.html
</syntaxhighlight>


Wir verschieben sie mit dem Flag -Z
Wir verschieben sie mit dem Flag -Z
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
mv -Z /tmp/site_index.html /var/www/html/
mv -Z /tmp/site_index.html /var/www/html/
</syntaxhighlight>
</syntaxhighlight>


Prüfung
Prüfung
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
ls -Z /var/www/html/site_index.html
ls -Z /var/www/html/site_index.html
</syntaxhighlight>
</syntaxhighlight>


Ausgabe
Ausgabe
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
sudo ls -Z /var/www/html/site_index.html
sudo ls -Z /var/www/html/site_index.html
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/site_index.html
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/site_index.html
</syntaxhighlight>
</syntaxhighlight>


Zeile 137: Zeile 143:


Wir erstellen eine weitere Datei und verschieben sie auf klassische Weise, also ohne Vererbung
Wir erstellen eine weitere Datei und verschieben sie auf klassische Weise, also ohne Vererbung
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
touch /tmp/another_file.html
touch /tmp/another_file.html
ls -Z /tmp/another_file.html
ls -Z /tmp/another_file.html
mv /tmp/another_file.html /var/www/html/
mv /tmp/another_file.html /var/www/html/
</syntaxhighlight>
</syntaxhighlight>


Wiederherstellung des Labels
Wiederherstellung des Labels
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
restorecon -v /var/www/html/another_file.html
restorecon -v /var/www/html/another_file.html
</syntaxhighlight>
</syntaxhighlight>


Ausgabe
Ausgabe
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="" copy line>
sudo restorecon -v /var/www/html/another_file.html
sudo restorecon -v /var/www/html/another_file.html
Relabeled /var/www/html/another_file.html from unconfined_u:object_r:user_tmp_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /var/www/html/another_file.html from unconfined_u:object_r:user_tmp_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
</syntaxhighlight>
</syntaxhighlight>


Zeile 163: Zeile 169:


Zur Festigung erstellen wir ein Dateipaar
Zur Festigung erstellen wir ein Dateipaar
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
touch rsynced1 && touch rsynced2
touch rsynced1 && touch rsynced2
</syntaxhighlight>
</syntaxhighlight>


Wir versuchen, sie auf verschiedene Arten in das Verzeichnis /tmp/web_root zu verschieben
Wir versuchen, sie auf verschiedene Arten in das Verzeichnis /tmp/web_root zu verschieben
<syntaxhighlight lang="bash" highlight="1" copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
rsync -a rsynced1 /tmp/web_root/
rsync -a rsynced1 /tmp/web_root/
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
rsync -aX rsynced2 /tmp/web_root/
rsync -aX rsynced2 /tmp/web_root/
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
ls -Z -1 /tmp/web_root/rsy*
ls -Z -1 /tmp/web_root/rsy*
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
sudo ls -Z -1 /tmp/web_root/rsy*
sudo ls -Z -1 /tmp/web_root/rsy*
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="" line>
<syntaxhighlight lang="bash" highlight="" copy line>
unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/web_root/rsynced1
unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/web_root/rsynced1
unconfined_u:object_r:user_home_t:s0 /tmp/web_root/rsynced2
unconfined_u:object_r:user_home_t:s0 /tmp/web_root/rsynced2
Zeile 201: Zeile 207:
* Abschließend ist wichtig zu erwähnen, dass security.selinux von NFS möglicherweise nicht unterstützt wird, da dort eine ältere xattr-Semantik verwendet wird
* Abschließend ist wichtig zu erwähnen, dass security.selinux von NFS möglicherweise nicht unterstützt wird, da dort eine ältere xattr-Semantik verwendet wird


== Archivierung und chcon ==
== Archivierung ==
=== Archivierung ===
=== Archivierung ===
; Archivierungsprogramme ignorieren standardmäßig xattr
; Archivierungsprogramme ignorieren standardmäßig xattr
Zeile 210: Zeile 216:


Erstellen eines Backups unter Beibehaltung der Kontexte
Erstellen eines Backups unter Beibehaltung der Kontexte
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
tar --xattrs --selinux -cvf website_backup.tar /var/www/html
tar --xattrs --selinux -cvf website_backup.tar /var/www/html
</syntaxhighlight>
</syntaxhighlight>


Prüfen, ob xattr vorhanden ist
Prüfen, ob xattr vorhanden ist
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
tar --selinux -tvf website_backup.tar
tar --selinux -tvf website_backup.tar
</syntaxhighlight>
</syntaxhighlight>


Entpacken
Entpacken
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
tar --xattrs --selinux -xvf website_backup.tar -C /tmp/restore_dir/
tar --xattrs --selinux -xvf website_backup.tar -C /tmp/restore_dir/
</syntaxhighlight>
</syntaxhighlight>
Wichtig: Das Dienstprogramm zip sowie viele andere Archivierungsprogramme unterstützen SELinux nicht
Wichtig: Das Dienstprogramm zip sowie viele andere Archivierungsprogramme unterstützen SELinux nicht


Für die Arbeit mit Labels sollte daher tar (oder alternativ star) verwendet werden
Für die Arbeit mit Labels sollte daher tar (oder alternativ star) verwendet werden


=== change context (chcon) ===
== RHEL ==
SELinux-Kontext einer Datei oder eines Verzeichnisses ändern
=== SELinux-Labels beibehalten ===
Diese Abschnitte beschreiben, was mit SELinux-Kontexten geschieht, wenn Dateien und Verzeichnisse kopiert, verschieben und archivieren von Dateien und Verzeichnissen
* Außerdem wird erklärt, wie Kontexte beim Kopieren und Archivieren beibehalten werden können


; Funktionen
==== Kopieren von Dateien und Verzeichnissen ====
* vollständigen Kontext auf einmal setzen
Wenn eine Datei oder ein Verzeichnis kopiert wird, wird eine neue Datei oder ein neues Verzeichnis erstellt, falls diese noch nicht existieren
* einzelne Kontextfelder (etwa den Typ) ändern
* Der Kontext dieser neuen Datei oder dieses neuen Verzeichnisses basiert auf den Standard-Labeling-Regeln und nicht auf dem Kontext der ursprünglichen Datei oder des ursprünglichen Verzeichnisses, es sei denn, es wurden Optionen verwendet, um den ursprünglichen Kontext beizubehalten
* Kontext einer anderen Datei übernehmen (--reference)


Zuvor wurden setfattr und chcon verwendet
Beispielsweise werden Dateien, die in Benutzer-Home-Verzeichnissen erstellt werden, mit dem Typ ''user_home_t'' gekennzeichnet
* Wie man sehen kann, ist chcon komfortabler, da sich damit einzelne Felder gezielt ändern lassen
<syntaxhighlight lang="bash" highlight="" copy line>
* Außerdem wird chcon als primäres Werkzeug für die Arbeit mit SELinux-Kontexten empfohlen, während setfattr ein Low-Level-Werkzeug ist, das mit Nicht-SELinux-xattr arbeitet
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
</syntaxhighlight>


Die wichtigste Einschränkung von chcon (genauso wie von setfattr) besteht darin, dass die Änderungen '''nicht dauerhaft''' sind
Wenn eine solche Datei in ein anderes Verzeichnis kopiert wird, beispielsweise ''/etc'', wird die neue Datei gemäß den Standard-Kennzeichnungsregeln für ''/etc'' erstellt
* Sie können nach restorecon oder nach einem vollständigen Relabeling des Dateisystems verloren gehen
* Das Kopieren einer Datei ohne zusätzliche Optionen bewahrt möglicherweise den ursprünglichen Kontext nicht
<syntaxhighlight lang="bash" highlight="" copy line>
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
sudo cp file1 /etc/
ls -Z /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
</syntaxhighlight>


Daher wird dieses Werkzeug hauptsächlich verwendet für
Wenn ''file1'' nach ''/etc'' kopiert wird und ''/etc/file1'' nicht existiert, wird ''/etc/file1'' als neue Datei erstellt
* Laborübungen
* Wie im obigen Beispiel gezeigt, wird ''/etc/file1'' gemäß den Standard-Labeling-Regeln mit dem Typ ''etc_t'' gekennzeichnet
* schnelle Diagnose
* temporäre Überprüfung von Richtlinien


Die dauerhafte Konfiguration von Labels erfolgt mit dem Werkzeug semanage und einem anschließenden Aufruf von restorecon
Wenn eine Datei über eine bereits vorhandene Datei kopiert wird, bleibt der Kontext der vorhandenen Datei erhalten, es sei denn, der Benutzer hat ''cp''-Optionen angegeben, um den Kontext der Originaldatei zu erhalten, wie beispielsweise ''--preserve=context''
* Näheres zum Werkzeug semanage folgt in den nächsten Lektionen
* Die SELinux-Richtlinie kann verhindern, dass Kontexte beim Kopieren erhalten bleiben


==== Verwendung ====
; Kopieren ohne Beibehaltung von SELinux-Kontexten
Zur Demonstration erstellen wir die erforderlichen Dateien und Verzeichnisse und prüfen den Kontext des Verzeichnisses sowie der Dateien
Dieses Verfahren zeigt, dass beim Kopieren einer Datei mit dem Befehl ''cp'', und keine Optionen angegeben werden, der Typ vom Zielverzeichnis, dem übergeordneten Verzeichnis, übernommen wird
<syntaxhighlight lang="bash" highlight="1" copy>
1.&nbsp;Erstellen einer Datei im Home-Verzeichnis eines Benutzers
mkdir -p /tmp/web_content/images
* Die Datei wird mit dem Typ ''user_home_t'' gekennzeichnet
<syntaxhighlight lang="bash" highlight="" copy line>
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
 
cd /tmp/web_content/
2.&nbsp;Das Verzeichnis ''/var/www/html/'' ist mit dem Typ ''httpd_sys_content_t'' gekennzeichnet, wie der folgende Befehl zeigt
<syntaxhighlight lang="bash" highlight="" copy line>
ls -dZ /var/www/html/
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
 
touch manual
3.&nbsp;Wenn ''file1'' nach ''/var/www/html/'' kopiert wird, erbt sie den Typ ''httpd_sys_content_t''
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="" copy line>
<syntaxhighlight lang="bash" highlight="1" copy>
sudo cp file1 /var/www/html/
touch test.conf
ls -Z /var/www/html/file1
</syntaxhighlight>
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
<syntaxhighlight lang="bash" highlight="1" copy>
touch images/image.png
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
ls -Zd /tmp/web_content/
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
ls -Z -1 /tmp/web_content/
</syntaxhighlight>
</syntaxhighlight>


Diesem Verzeichnis wurde der Typ '''user_tmp_t''' vererbt, ebenso den darin enthaltenen Dateien
; Beibehaltung von SELinux-Kontexten beim Kopieren
Dieses Verfahren zeigt, wie man die Option ''--preserve=context'' verwendet, um Kontexte beim Kopieren beizubehalten.


Versuchen wir, den vollständigen Kontext manuell zu setzen
4.&nbsp;Erstellen einer Datei im Home-Verzeichnis eines Benutzers
<syntaxhighlight lang="bash" highlight="1" copy>
* Die Datei wird mit dem Typ ''user_home_t'' gekennzeichnet
chcon system_u:object_r:httpd_sys_content_t:s0 manual
<syntaxhighlight lang="bash" highlight="" copy line>
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
 
ls -Z -1
5.&nbsp;Das Verzeichnis ''/var/www/html/'' ist mit dem Typ ''httpd_sys_content_t'' gekennzeichnet, wie der folgende Befehl zeigt
<syntaxhighlight lang="bash" highlight="" copy line>
ls -dZ /var/www/html/
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
</syntaxhighlight>
</syntaxhighlight>


Diese Methode wird nur selten verwendet, da für SELinux in der Regel das Feld type am wichtigsten ist
6.&nbsp;Durch die Verwendung der Option ''--preserve=context'' bleiben die SELinux-Kontexte bei Kopiervorgängen erhalten
 
* Wie unten gezeigt, wurde der Typ ''user_home_t'' von ''file1'' beibehalten, als die Datei nach ''/var/www/html/'' kopiert wurde
Um das Feld type zu ändern, wird der Parameter -t verwendet
<syntaxhighlight lang="bash" highlight="" copy line>
<syntaxhighlight lang="bash" highlight="1" copy>
sudo cp --preserve=context file1 /var/www/html/
chcon -t shadow_t manual
ls -Z /var/www/html/file1
-rw-r--r-- root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
</syntaxhighlight>
</syntaxhighlight>


Zum Ändern der Felder user und role werden entsprechend die Optionen '''-u''' und '''-r''' verwendet
; Kopieren und Ändern des Kontexts
Dieses Verfahren zeigt, wie man die Option ''--context'' verwendet, um den Kontext der Zielkopie zu ändern
* Das folgende Beispiel wird im Home-Verzeichnis des Benutzers ausgeführt


Der Parameter -R erlaubt die rekursive Verarbeitung von Verzeichnissen
7.&nbsp;Erstellen Sie eine Datei im Home-Verzeichnis eines Benutzers
* Die Datei ist mit dem Typ ''user_home_t'' gekennzeichnet
<syntaxhighlight lang="bash" highlight="" copy line>
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
</syntaxhighlight>


Weisen wir dem gesamten Verzeichnis web_content den Typ httpd_sys_content_t zu und verwenden dabei den Parameter '''-v''', um Details anzuzeigen
8.&nbsp;Verwenden Sie die Option ''--context'', um den SELinux-Kontext zu definieren
<syntaxhighlight lang="bash" highlight="1" copy>
<syntaxhighlight lang="bash" highlight="1" copy line>
chcon -R -v -t httpd_sys_content_t /tmp/web_content
cp --context=system_u:object_r:samba_share_t:s0 file1 file2
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
ls -Z -1
</syntaxhighlight>
</syntaxhighlight>


Um den Kontext von einem bereits korrekt gelabelten Objekt zu kopieren, kann die Option '''--reference=RFILE''' verwendet werden
9.&nbsp;Ohne ''--context'' würde ''file2'' mit dem ''unconfined_u:object_r:user_home_t''-Kontext gekennzeichnet
<syntaxhighlight lang="bash" highlight="1" copy>
<syntaxhighlight lang="bash" highlight="" copy line>
touch /tmp/ref
ls -Z file1 file2
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
-rw-rw-r-- user1 group1 system_u:object_r:samba_share_t:s0 file2
</syntaxhighlight>
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
chcon -R --reference=/tmp/ref /tmp/web_content
</syntaxhighlight>
<syntaxhighlight lang="bash" highlight="1" copy>
ls -Z -1
</syntaxhighlight>
; Parameter für den Umgang mit Symlinks
{| class="wikitable sortable options gnu big"
|-
! Unix !! GNU  !! Beschreibung
|-
| || --dereference || (standardmäßig verwendet) wirkt nicht auf den symbolischen Link selbst, sondern auf das Objekt, auf das er verweist
|-
| -h || --no-dereference || ändert den symbolischen Link selbst und nicht das Zielobjekt
|}


= RHEL =
; Kopieren einer Datei über eine vorhandene Datei
=== SELinux-Labels beibehalten ===
Dieses Verfahren zeigt, dass beim Kopieren einer Datei über eine vorhandene Datei der Kontext der vorhandenen Datei beibehalten wird, sofern keine Option zur Beibehaltung von Kontexten verwendet wird.
Diese Abschnitte beschreiben, was mit SELinux-Kontexten geschieht, wenn Dateien und Verzeichnisse kopiert, verschieben und archivieren von Dateien und Verzeichnissen
* Außerdem wird erklärt, wie Kontexte beim Kopieren und Archivieren beibehalten werden können


==== Kopieren von Dateien und Verzeichnissen ====
10.&nbsp;Erstellen Sie als root eine neue Datei, ''file1'', im Verzeichnis ''/etc''
Wenn eine Datei oder ein Verzeichnis kopiert wird, wird eine neue Datei oder ein neues Verzeichnis erstellt, falls diese noch nicht existieren
* Wie unten gezeigt, wird die Datei mit dem Typ ''etc_t'' gekennzeichnet
* Der Kontext dieser neuen Datei oder dieses neuen Verzeichnisses basiert auf den Standard-Labeling-Regeln und nicht auf dem Kontext der ursprünglichen Datei oder des ursprünglichen Verzeichnisses, es sei denn, es wurden Optionen verwendet, um den ursprünglichen Kontext beizubehalten
<syntaxhighlight lang="bash" highlight="" copy line>
*
sudo touch /etc/file1
ls -Z /etc/file1
Beispielsweise werden Dateien, die in Benutzer-Home-Verzeichnissen erstellt werden, mit dem Typ [[user_home_t]] gekennzeichnet
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
touch file1
</syntaxhighlight>


$ ls -Z file1
11.&nbsp;Erstellen Sie eine weitere Datei, ''file2'', im Verzeichnis ''/tmp''
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
* Wie unten gezeigt, wird die Datei mit dem Typ ''user_tmp_t'' gekennzeichnet
<syntaxhighlight lang="bash" highlight="" copy line>
touch /tmp/file2
ls -Z /tmp/file2
-rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
</syntaxhighlight>


Wenn eine solche Datei in ein anderes Verzeichnis kopiert wird, beispielsweise [[/etc]], wird die neue Datei gemäß den Standard-Kennzeichnungsregeln für [[/etc]] erstellt
12.&nbsp;''file1'' mit ''file2'' überschreiben
* Das Kopieren einer Datei ohne zusätzliche Optionen bewahrt möglicherweise den ursprünglichen Kontext nicht
<syntaxhighlight lang="bash" highlight="1" copy line>
ls -Z file1
sudo cp /tmp/file2 /etc/file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
</syntaxhighlight>


sudo cp file1 /etc/
13.&nbsp;Nach dem Kopieren zeigt der folgende Befehl, dass ''file1'' mit dem Typ ''etc_t'' gekennzeichnet ist, nicht mit dem Typ ''user_tmp_t'' aus ''/tmp/file2'', der ''/etc/file1'' ersetzt hat
<syntaxhighlight lang="bash" highlight="" copy line>
$ ls -Z /etc/file1
ls -Z /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
 
</syntaxhighlight>
Wenn [[file1]] nach [[/etc]] kopiert wird und [[/etc/file1]] nicht existiert, wird [[/etc/file1]] als neue Datei erstellt
* Wie im obigen Beispiel gezeigt, wird [[/etc/file1]] gemäß den Standard-Labeling-Regeln mit dem Typ [[etc_t]] gekennzeichnet
 
Wenn eine Datei über eine bereits vorhandene Datei kopiert wird, bleibt der Kontext der vorhandenen Datei erhalten, es sei denn, der Benutzer hat [[cp]]-Optionen angegeben, um den Kontext der Originaldatei zu erhalten, wie z. B. [[--preserve=context]]
* Die SELinux-Richtlinie kann verhindern, dass Kontexte beim Kopieren erhalten bleiben
 
; Kopieren ohne Beibehaltung von SELinux-Kontexten
Dieses Verfahren zeigt, dass beim Kopieren einer Datei mit dem Befehl [[cp]], und keine Optionen angegeben werden, der Typ vom Zielverzeichnis, dem übergeordneten Verzeichnis, übernommen wird
# Erstellen einer Datei im Home-Verzeichnis eines Benutzers
* Die Datei wird mit dem Typ [[user_home_t]] gekennzeichnet
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
# Das Verzeichnis [[/var/www/html/]] ist mit dem Typ [[httpd_sys_content_t]] gekennzeichnet, wie der folgende Befehl zeigt
ls -dZ /var/www/html/drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
# Wenn [[file1]] nach [[/var/www/html/]] kopiert wird, erbt sie den Typ [[httpd_sys_content_t]]
sudo cp file1 /var/www/html/
ls -Z /var/www/html/file1-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
 
; Beibehaltung von SELinux-Kontexten beim Kopieren
Dieses Verfahren zeigt, wie man die Option [[--preserve=context]] verwendet, um Kontexte beim Kopieren beizubehalten. # Erstellen einer Datei im Home-Verzeichnis eines Benutzers
* Die Datei wird mit dem Typ [[user_home_t]] gekennzeichnet
touch file1
ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1# Das Verzeichnis [[/var/www/html/]] ist mit dem Typ [[httpd_sys_content_t]] gekennzeichnet, wie der folgende Befehl zeigt ls -dZ /var/www/html/ drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/# Durch die Verwendung der Option [[--preserve=context]] bleiben die SELinux-Kontexte bei Kopiervorgängen erhalten* Wie unten gezeigt, wurde der Typ [[user_home_t]] von [[file1]] beibehalten, als die Datei nach [[/var/www/html/]] kopiert wurde sudo cp --preserve=context file1 /var/www/html/ ls -Z / var/www/html/file1-rw-r--r-- root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1; Kopieren und Ändern des KontextsDieses Verfahren zeigt, wie man die Option [[--context]] verwendet, um den Kontext der Zielkopie zu ändern* Das folgende Beispiel wird im Home-Verzeichnis des Benutzers ausgeführt# Erstellen Sie eine Datei im Home-Verzeichnis eines Benutzers* Die Datei ist mit dem Typ [[user_home_t]] gekennzeichnet touch file1 ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1# Verwenden Sie die Option [[--context]], um den SELinux-Kontext zu definieren cp --context=system_u:object_r:samba_share_t:s0 file1 file2# Ohne [[--context]] würde [[file2]] mit dem [[unconfined_u:object_r:user_home_t]]-Kontext gekennzeichnet ls -Z file1 file2-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1-rw-rw-r-- user1 group1 system_u:object_r:samba_share_t:s0 file2; Kopieren einer Datei über eine vorhandene DateiDieses Verfahren zeigt, dass beim Kopieren einer Datei über eine vorhandene Datei der Kontext der vorhandenen Datei beibehalten wird, sofern keine Option zur Beibehaltung von Kontexten verwendet wird. # Erstellen Sie als root eine neue Datei, [[file1]], im Verzeichnis [[/etc]]* Wie unten gezeigt, wird die Datei mit dem Typ [[etc_t]] gekennzeichnet sudo touch /etc/file1 ls -Z /etc/file1-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1# Erstellen Sie eine weitere Datei, [[file2]], im Verzeichnis [ [/tmp]]-Verzeichnis* Wie unten gezeigt, wird die Datei mit dem Typ [[user_tmp_t]] gekennzeichnet touch /tmp/file2 ls -Z /tmp/file2-rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
 
# [[file1]] mit [[file2]] überschreiben
sudo cp /tmp/file2 /etc/file1
 
# Nach dem Kopieren zeigt der folgende Befehl, dass [[file1]] mit dem Typ [[etc_t]] gekennzeichnet ist, nicht mit dem Typ [[user_tmp_t]] aus [[/tmp/file2]], der [[/etc/file1]] ersetzt hat
ls -Z /etc/file1-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1


; Wichtig
; Wichtig
Kopieren Sie Dateien und Verzeichnisse, anstatt sie zu verschieben
Kopieren Sie Dateien und Verzeichnisse, anstatt sie zu verschieben
* Dies trägt dazu bei, dass sie mit den richtigen SELinux-Kontexten gekennzeichnet werden
* Dies trägt dazu bei, dass sie mit den richtigen SELinux-Kontexten gekennzeichnet werden
Zeile 391: Zeile 376:
Dateien und Verzeichnisse behalten ihren aktuellen SELinux-Kontext bei, wenn sie verschoben werden
Dateien und Verzeichnisse behalten ihren aktuellen SELinux-Kontext bei, wenn sie verschoben werden
* In vielen Fällen ist dieser für den Zielort, an den sie verschoben werden, falsch
* In vielen Fällen ist dieser für den Zielort, an den sie verschoben werden, falsch
* Das folgende Beispiel zeigt das Verschieben einer Datei aus dem Home-Verzeichnis eines Benutzers in das Verzeichnis [[/var/www/html/]], das vom Apache-HTTP-Server verwendet wird
* Das folgende Beispiel zeigt das Verschieben einer Datei aus dem Home-Verzeichnis eines Benutzers in das Verzeichnis ''/var/www/html/'', das vom Apache-HTTP-Server verwendet wird
* Da die Datei verschoben wird, erbt sie nicht den richtigen SELinux-Kontext
* Da die Datei verschoben wird, erbt sie nicht den richtigen SELinux-Kontext


; Verschieben von Dateien und Verzeichnissen
; Verschieben von Dateien und Verzeichnissen
# Wechseln Sie in Ihr Home-Verzeichnis und erstellen Sie dort eine Datei
# Wechseln Sie in Ihr Home-Verzeichnis und erstellen Sie dort eine Datei
* Die Datei ist mit dem Typ [[user_home_t]] gekennzeichnet
* Die Datei ist mit dem Typ ''user_home_t'' gekennzeichnet
touch file1
<syntaxhighlight lang="bash" highlight="" copy line>
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
</syntaxhighlight>


ls -Z file1
# Geben Sie den folgenden Befehl ein, um den SELinux-Kontext des Verzeichnisses ''/var/www/html/'' anzuzeigen
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
<syntaxhighlight lang="bash" highlight="" copy line>
ls -dZ /var/www/html/
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
</syntaxhighlight>


# Geben Sie den folgenden Befehl ein, um den SELinux-Kontext des Verzeichnisses [[/var/www/html/]] anzuzeigen
Standardmäßig ist ''/var/www/html/'' mit dem Typ ''httpd_sys_content_t'' gekennzeichnet
ls -dZ /var/www/html/
* Dateien und Verzeichnisse, die unter ''/var/www/html/'' erstellt werden, erben diesen Typ und sind somit mit diesem Typ gekennzeichnet
drwxr-xr-x root root system_u:object_r:httpd _sys_content_t:s0 /var/www/html/


Standardmäßig ist [[/var/www/html/]] mit dem Typ [[httpd_sys_content_t]] gekennzeichnet
# Verschieben Sie als root ''file1'' nach ''/var/www/html/''
* Dateien und Verzeichnisse, die unter [[/var/www/html/]] erstellt werden, erben diesen Typ und sind somit mit diesem Typ gekennzeichnet
* Da diese Datei verschoben wird, behält sie ihren aktuellen Typ ''user_home_t''
# Verschieben Sie als root [[file1]] nach [[/var/www/html/]]
<syntaxhighlight lang="bash" highlight="" copy line>
* Da diese Datei verschoben wird, behält sie ihren aktuellen Typ [[user_home_t]]
sudo mv file1 /var/www/html/
sudo mv file1 /var/www/html/
sudo ls -Z /var/www/html/file1
sudo ls -Z /var/www/html/file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
</syntaxhighlight>


Standardmäßig kann der Apache-HTTP-Server keine Dateien lesen, die mit dem Typ [[user_home_t]] ] gekennzeichnet sind
Standardmäßig kann der Apache-HTTP-Server keine Dateien lesen, die mit dem Typ ''user_home_t'' gekennzeichnet sind
* Wenn alle Dateien, aus denen eine Webseite besteht, mit dem Typ [[user_home_t]] gekennzeichnet sind oder einem anderen Typ, den der Apache-HTTP-Server nicht lesen kann, wird der Zugriff verweigert, wenn versucht wird, über Webbrowser wie ‚‘'Mozilla Firefox'‚‘
* Wenn alle Dateien, aus denen eine Webseite besteht, mit dem Typ ''user_home_t'' gekennzeichnet sind oder einem anderen Typ, den der Apache-HTTP-Server nicht lesen kann, wird der Zugriff verweigert, wenn versucht wird, über Webbrowser wie ''Mozilla Firefox''


; Wichtig
; Wichtig
Das Verschieben von Dateien und Verzeichnissen mit dem Befehl ''mv'' kann zu einem falschen SELinux-Kontext führen, wodurch Prozesse wie der Apache-HTTP-Server und Samba daran gehindert werden, auf solche Dateien und Verzeichnisse zuzugreifen


Das Verschieben von Dateien und Verzeichnissen mit dem Befehl [[mv]] kann zu einem falschen SELinux-Kontext führen, wodurch Prozesse wie der Apache-HTTP-Server und Samba daran gehindert werden, auf solche Dateien und Verzeichnisse zuzugreifen
==== Überprüfen des Standard-SELinux-Kontexts ====
Verwenden Sie das Dienstprogramm ''matchpathcon'', um zu überprüfen, ob Dateien und Verzeichnisse den richtigen SELinux-Kontext haben
* Dieses Dienstprogramm fragt die ''Systemrichtlinie'' ab und gibt dann den mit dem Dateipfad verbundenen Standard-Sicherheitskontext aus. Das folgende Beispiel zeigt, wie man mit ''matchpathcon'' überprüft, ob Dateien im Verzeichnis ''/var/www/html/'' korrekt gekennzeichnet sind


==== Überprüfen des Standard-SELinux-Kontexts ====
; Überprüfen des Standard-SELinux-Kontexts mit ''matchpathcon''
Verwenden Sie das Dienstprogramm [[matchpathcon]], um zu überprüfen, ob Dateien und Verzeichnisse den richtigen SELinux-Kontext haben
# Erstellen Sie als Root-Benutzer drei Dateien (''file1'', ''file2'' und ''file3'') im Verzeichnis ''/var/www/html/''
* Dieses Dienstprogramm fragt die [[Systemrichtlinie]] ab und gibt dann den mit dem Dateipfad verbundenen Standard-Sicherheitskontext aus.[6] Das folgende Beispiel zeigt, wie man mit [[matchpathcon]] überprüft, ob Dateien im Verzeichnis [[/var/www/html/]] korrekt gekennzeichnet sind
* Diese Dateien erben den Typ ''httpd_sys_content_t'' von ''/var/www/html/''
; Überprüfen des Standard-SELinux-Kontexts mit [[matchpathcon'‚‘]]
<syntaxhighlight lang="bash" highlight="" copy line>
# Erstellen Sie als Root-Benutzer drei Dateien ([[file1]], [[file2]] und [[file3]]) im Verzeichnis [[/var/www/html/]]
sudo touch /var/www/html/file{1,2,3}
* Diese Dateien erben den Typ [[httpd_sys_content_t]] von [[/var/www/html/]]
sudo touch /var/www/html/file{1,2,3}
sudo ls -Z /var/www/html/
sudo ls -Z /var/www/html/
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u: object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
</syntaxhighlight>


# Ändern Sie als root den Typ von [[file1]] in [[samba_share_t]]
# Ändern Sie als root den Typ von ''file1'' in ''samba_share_t''
* Beachten Sie, dass der Apache-HTTP-Server keine Dateien oder Verzeichnisse lesen kann, die mit dem Typ [[samba_share_t]] ] gekennzeichnet sind
* Beachten Sie, dass der Apache-HTTP-Server keine Dateien oder Verzeichnisse lesen kann, die mit dem Typ ''samba_share_t'' gekennzeichnet sind
<syntaxhighlight lang="bash" highlight="1" copy line>
sudo chcon -t samba_share_t /var/www/html/file1
</syntaxhighlight>


sudo chcon -t samba_share_t /var/www/html/file1
# Die Option ''-V'' von ''matchpathcon'' vergleicht den aktuellen SELinux-Kontext mit dem korrekten Standardkontext in der SELinux-Richtlinie
 
* Geben Sie den folgenden Befehl ein, um alle Dateien im Verzeichnis ''/var/www/html/'' zu überprüfen
# Die Option [[-V]] von [[matchpathcon]] vergleicht den aktuellen SELinux-Kontext mit dem korrekten Standardkontext in der SELinux-Richtlinie
<syntaxhighlight lang="bash" highlight="" copy line>
* Geben Sie den folgenden Befehl ein, um alle Dateien im Verzeichnis [[/var/www/html/]] zu überprüfen
matchpathcon -V /var/www/html/*
matchpathcon -V /var/www/html/ *
/var/www/html/file1 hat den Kontext unconfined_u:object_r:samba_share_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein
/var/www/html/file1 hat den Kontext unconfined_u:object_r:samba_share_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein
/var/www/html/file2 verifiziert
/var/www/html/file2 verifiziert
/var/www/html/file3 verifiziert
/var/www/html/file3 verifiziert
</syntaxhighlight>


Die folgende Ausgabe des Befehls [[matchpathcon]] erklärt, dass [[file1]] mit dem Typ [[samba_share_t]] gekennzeichnet ist, aber mit dem Typ [[httpd_sys_content_t]] gekennzeichnet sein sollte
Die folgende Ausgabe des Befehls ''matchpathcon'' erklärt, dass ''file1'' mit dem Typ ''samba_share_t'' gekennzeichnet ist, aber mit dem Typ ''httpd_sys_content_t'' gekennzeichnet sein sollte
<syntaxhighlight lang="bash" highlight="1" copy line>
/var/www/html/file1 hat den Kontext unconfined_u:object_r:samba_share_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein
/var/www/html/file1 hat den Kontext unconfined_u:object_r:samba_share_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein
</syntaxhighlight>


Um das Label-Problem zu beheben und dem Apache-HTTP-Server als root Zugriff auf [[file1]] zu gewähren, verwenden Sie das Dienstprogramm [[restorecon]]
Um das Label-Problem zu beheben und dem Apache-HTTP-Server als root Zugriff auf ''file1'' zu gewähren, verwenden Sie das Dienstprogramm ''restorecon''
sudo restorecon -v /var/www/ html/file1
<syntaxhighlight lang="bash" highlight="" copy line>
restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t: s0
sudo restorecon -v /var/www/html/file1
restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
</syntaxhighlight>


==== Dateien mit tar archivieren ====
==== Dateien mit tar archivieren ====
Das Dienstprogramm [[tar]] behält standardmäßig keine erweiterten Attribute bei
Das Dienstprogramm ''tar'' behält standardmäßig keine erweiterten Attribute bei
* Da SELinux-Kontexte in erweiterten Attributen gespeichert sind, können Kontexte beim Archivieren von Dateien verloren gehen
* Da SELinux-Kontexte in erweiterten Attributen gespeichert sind, können Kontexte beim Archivieren von Dateien verloren gehen
* Verwenden Sie den Befehl [[tar --selinux]], um Archive zu erstellen, die Kontexte beibehalten, und um Dateien aus den Archiven wiederherzustellen
* Verwenden Sie den Befehl ''tar --selinux'', um Archive zu erstellen, die Kontexte beibehalten, und um Dateien aus den Archiven wiederherzustellen
* Wenn ein [[tar]] Archiv Dateien ohne erweiterte Attribute enthält oder wenn Sie möchten, dass die erweiterten Attribute den Systemstandardwerten entsprechen, verwenden Sie das Dienstprogramm [[restorecon]]
* Wenn ein ''tar'' Archiv Dateien ohne erweiterte Attribute enthält oder wenn Sie möchten, dass die erweiterten Attribute den Systemstandardwerten entsprechen, verwenden Sie das Dienstprogramm ''restorecon''
tar -xvf 'archive.tar‘' | restorecon -f -
<syntaxhighlight lang="bash" highlight="1" copy line>
tar -xvf ''archive.tar'' | restorecon -f -
</syntaxhighlight>


Beachten Sie, dass Sie je nach Verzeichnis möglicherweise Root-Rechte benötigen, um das [ [restorecon]]
Beachten Sie, dass Sie je nach Verzeichnis möglicherweise Root-Rechte benötigen, um das ''restorecon'' auszuführen.
 
Das folgende Beispiel zeigt, wie ein ''tar''-Archiv erstellt wird, das SELinux-Kontexte beibehält


Das folgende Beispiel zeigt, wie ein [[tar]]-Archiv erstellt wird, das SELinux-Kontexte beibehält
; Erstellen eines tar-Archivs
; Erstellen eines tar-Archivs
# Wechseln Sie in das Verzeichnis [[/var/www/html/]] und zeigen Sie dessen SELinux-Kontext an
# Wechseln Sie in das Verzeichnis ''/var/www/html/'' und zeigen Sie dessen SELinux-Kontext an
cd /var/www/html/
<syntaxhighlight lang="bash" highlight="" copy line>
cd /var/www/html/
ls -dZ /var/www/html/
ls -dZ /var/www/html/
drwxr-xr-x
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
* root root system_u:object_r:httpd_sys_content_t:s0  
</syntaxhighlight>
 
# Erstellen Sie als Root drei Dateien ([[file1]], [ [file2] und [[file3]]) im Verzeichnis [[/var/www/html/]]
* Diese Dateien erben den Typ [[httpd_sys_content_t]] vom Verzeichnis [[/var/www/html/]]
html]# touch file{1,2,3}


ls -Z /var/www/html/
# Erstellen Sie als Root drei Dateien (''file1'', ''file2'' und ''file3'') im Verzeichnis ''/var/www/html/''
* Diese Dateien erben den Typ ''httpd_sys_content_t'' vom Verzeichnis ''/var/www/html/''
<syntaxhighlight lang="bash" highlight="" copy line>
touch file{1,2,3}
ls -Z /var/www/html/
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw -r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
</syntaxhighlight>


# Geben Sie als root den folgenden Befehl ein, um ein [[tar]]-Archiv mit dem Namen [[test.tar]] zu erstellen
# Geben Sie als root den folgenden Befehl ein, um ein ''tar''-Archiv mit dem Namen ''test.tar'' zu erstellen
* Verwenden Sie die Option [[--selinux]], um den SELinux-Kontext beizubehalten
* Verwenden Sie die Option ''--selinux'', um den SELinux-Kontext beizubehalten
sudo tar --selinux -cf test.tar file{1,2,3}
<syntaxhighlight lang="bash" highlight="1" copy line>
sudo tar --selinux -cf test.tar file{1,2,3}
</syntaxhighlight>


# Erstellen Sie als root ein neues Verzeichnis namens [[test/]] und gewähren Sie anschließend allen Benutzern vollen Zugriff darauf
# Erstellen Sie als root ein neues Verzeichnis namens ''test/'' und gewähren Sie anschließend allen Benutzern vollen Zugriff darauf
sudo mkdir /test
<syntaxhighlight lang="bash" highlight="" copy line>
sudo chmod 777 /test/
sudo mkdir /test
sudo chmod 777 /test/
</syntaxhighlight>


# Kopieren Sie die Datei [[test.tar]] in [[test/]]
# Kopieren Sie die Datei ''test.tar'' in ''test/''
cp /var/www/html/test.tar /test/
<syntaxhighlight lang="bash" highlight="1" copy line>
cp /var/www/html/test.tar /test/
</syntaxhighlight>


# Wechseln Sie in das Verzeichnis [[test/]]
# Wechseln Sie in das Verzeichnis ''test/''
* Geben Sie in diesem Verzeichnis den folgenden Befehl ein, um das [[tar]]-Archiv zu entpacken
* Geben Sie in diesem Verzeichnis den folgenden Befehl ein, um das ''tar''-Archiv zu entpacken
* Geben Sie die Option [[--selinux]] erneut an, da sonst der SELinux-Kontext auf [[default_t]] geändert wird
* Geben Sie die Option ''--selinux'' erneut an, da sonst der SELinux-Kontext auf ''default_t'' geändert wird
cd /test/
<syntaxhighlight lang="bash" highlight="" copy line>
 
cd /test/
tar --selinux -xvf test.tar
tar --selinux -xvf test.tar
</syntaxhighlight>


# SELinux-Kontexte anzeigen
# SELinux-Kontexte anzeigen
* Der Typ [[httpd_sys_content_t]] wurde beibehalten und nicht in [[default_t]] geändert, was geschehen wäre, wenn [[--selinux]] nicht verwendet worden wäre
* Der Typ ''httpd_sys_content_t'' wurde beibehalten und nicht in ''default_t'' geändert, was geschehen wäre, wenn ''--selinux'' nicht verwendet worden wäre
test]$ ls -lZ /test/
<syntaxhighlight lang="bash" highlight="" copy line>
-rw -r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
ls -lZ /test/
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t: s0 file3
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.tar
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.tar
</syntaxhighlight>


# Wenn das Verzeichnis [[test/]] nicht mehr benötigt wird, geben Sie als root den folgenden Befehl ein, um es sowie alle darin enthaltenen Dateien zu entfernen
# Wenn das Verzeichnis ''test/'' nicht mehr benötigt wird, geben Sie als root den folgenden Befehl ein, um es sowie alle darin enthaltenen Dateien zu entfernen
sudo rm -ri /test/
<syntaxhighlight lang="bash" highlight="1" copy line>
sudo rm -ri /test/
</syntaxhighlight>


Weitere Informationen zu [[tar]], wie beispielsweise die Option [[- -xattrs]], die alle erweiterten Attribute beibehält
Weitere Informationen zu ''tar'', wie beispielsweise die Option ''--xattrs'', die alle erweiterten Attribute beibehält


==== Dateien mit star archivieren ====
==== Dateien mit star archivieren ====
Das Dienstprogramm [[star]] behält standardmäßig keine erweiterten Attribute bei
Das Dienstprogramm ''star'' behält standardmäßig keine erweiterten Attribute bei
* Da SELinux-Kontexte in erweiterten Attributen gespeichert sind, können Kontexte beim Archivieren von Dateien verloren gehen
* Da SELinux-Kontexte in erweiterten Attributen gespeichert sind, können Kontexte beim Archivieren von Dateien verloren gehen
* Verwenden Sie den Befehl [[star -xattr -H=exustar]], um Archive zu erstellen, die Kontexte beibehalten
* Verwenden Sie den Befehl ''star -xattr -H=exustar'', um Archive zu erstellen, die Kontexte beibehalten
* Das star-Paket ist standardmäßig nicht installiert
* Das star-Paket ist standardmäßig nicht installiert
* Um [[star]] zu installieren, führen Sie als Root-Benutzer den Befehl [[yum install star]] aus
* Um ''star'' zu installieren, führen Sie als Root-Benutzer den Befehl ''yum install star'' aus


Das folgende Beispiel zeigt die Erstellung eines [[star]]-Archivs, das SELinux-Kontexte beibehält
Das folgende Beispiel zeigt die Erstellung eines ''star''-Archivs, das SELinux-Kontexte beibehält
; Erstellen eines [ [star]]-Archiv
# Erstellen Sie als Root drei Dateien ([[file1]], [[file2]] und [[file3]]) im Verzeichnis [[/var/www/html/]]
* Diese Dateien erben den Typ [[httpd_sys_content_t]] von [[/var/www/html/]]
sudo touch /var/www/html/file{1,2,3}


sudo ls -Z / var/www/html/
; Erstellen eines ''star''-Archiv
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
# Erstellen Sie als Root drei Dateien (''file1'', ''file2'' und ''file3'') im Verzeichnis ''/var/www/html/''
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
* Diese Dateien erben den Typ ''httpd_sys_content_t'' von ''/var/www/html/''
<syntaxhighlight lang="bash" highlight="" copy line>
sudo touch /var/www/html/file{1,2,3}
sudo ls -Z /var/www/html/
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
</syntaxhighlight>


# Wechseln Sie in das Verzeichnis [[/var/www/html/]]
# Wechseln Sie in das Verzeichnis ''/var/www/html/''
* Geben Sie in diesem Verzeichnis als root den folgenden Befehl ein, um ein [[star]]-Archiv mit dem Namen [[test.star]] zu erstellen
* Geben Sie in diesem Verzeichnis als root den folgenden Befehl ein, um ein ''star''-Archiv mit dem Namen ''test.star'' zu erstellen
cd /var/www/html
<syntaxhighlight lang="bash" highlight="" copy line>
cd /var/www/html
star -xattr -H=exustar -c -f=test.star file{1,2,3}
star 1 blocks + 0 bytes (total of 10240 bytes = 10.00k)
</syntaxhighlight>


html]# star -xattr -H=exustar -c -f=test.star file{1,2,3}
# Erstellen Sie als Root ein neues Verzeichnis namens ''test/'' und gewähren Sie allen Benutzern vollständigen Zugriff darauf
star
<syntaxhighlight lang="bash" highlight="" copy line>
1 Blöcke + 0 Bytes (insgesamt 10240 Bytes = 10,00 k)
sudo mkdir /test
sudo chmod 777 /test/
</syntaxhighlight>


# Erstellen Sie als Root ein neues Verzeichnis namens [[test/]] und gewähren Sie allen Benutzern vollständigen Zugriff darauf
# Geben Sie den folgenden Befehl ein, um die Datei ''test.star'' in ''test/'' zu kopieren
sudo mkdir /test
<syntaxhighlight lang="bash" highlight="1" copy line>
cp /var/www/html/test.star /test/
</syntaxhighlight>


sudo chmod 777 /test/
# Wechseln Sie in das Verzeichnis ''test/''
* Sobald Sie sich in diesem Verzeichnis befinden, geben Sie den folgenden Befehl ein, um das ''star''-Archiv zu extrahieren
<syntaxhighlight lang="bash" highlight="" copy line>
cd /test/
star -x -f=test.star
star 1 blocks + 0 bytes (total of 10240 bytes = 10.00k)
</syntaxhighlight>


# Geben Sie den folgenden Befehl ein, um die Datei [[test.star]] in [[test/]] zu kopieren
# Zeigen Sie die SELinux-Kontexte an
cp /var/www/html/test.star /test/
* Der Typ ''httpd_sys_content_t'' wurde beibehalten und nicht in ''default_t'' geändert, was geschehen wäre, wenn die Option ''-xattr -H=exustar'' nicht verwendet worden wäre
<syntaxhighlight lang="bash" highlight="" copy line>
ls -lZ /test/
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.star
</syntaxhighlight>


# Wechseln Sie in das Verzeichnis [[test/]]
# Wenn das Verzeichnis ''test/'' nicht mehr benötigt wird, geben Sie als root den folgenden Befehl ein, um es sowie alle darin enthaltenen Dateien zu entfernen
* Sobald Sie sich in diesem Verzeichnis befinden, geben Sie den folgenden Befehl ein, um das [[star]]-Archiv zu extrahieren
<syntaxhighlight lang="bash" highlight="1" copy line>
cd /test/
sudo rm -ri /test/
</syntaxhighlight>


test]$ star -x -f=test.star
# Wenn ''star'' nicht mehr benötigt wird, entfernen Sie das Paket als root
star
<syntaxhighlight lang="bash" highlight="1" copy line>
1 Blöcke + 0 Bytes (insgesamt 10240 Bytes = 10,00 kB)
sudo yum remove star
 
</syntaxhighlight>
# Zeigen Sie die SELinux-Kontexte an
* Der Typ [[httpd_sys_content_t]] wurde beibehalten und nicht in [ [default_t] geändert worden wäre, was geschehen wäre, wenn die Option [[-xattr -H=exustar]] nicht verwendet worden wäre
ls -lZ /test/
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r --r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.star
 
# Wenn das Verzeichnis [[test/]] Verzeichnis nicht mehr benötigt wird, geben Sie als root den folgenden Befehl ein, um es sowie alle darin enthaltenen Dateien zu entfernen
sudo rm -ri /test/


# Wenn [[star]] nicht mehr benötigt wird, entfernen Sie das Paket als root
Weitere Informationen zu ''star'' finden Sie auf der Handbuchseite star(1)
sudo yum remove star


Weitere Informationen zu [[star]] finden Sie auf der Handbuchseite star(1)
{{navigation|Linux/SELinux/04/09 Dateisysteme|Linux/SELinux/04/11 Informationsbeschaffung}}


[[Kategorie:Linux/SELinux/04]]
[[Kategorie:Linux/SELinux/04]]

Aktuelle Version vom 16. Juni 2026, 09:24 Uhr

Linux/SELinux/04/10 Labels beibehalten - Labels beibehalten

Beschreibung

Kopieren/Verschieben

Verhalten beim Kopieren (cp) und Verschieben (mv)

Verhalten des Kontexts beim Kopieren und Verschieben von Dateien gezeigt

Zunächst ist wichtig zu verstehen, dass bei der Beibehaltung des Kontexts bei der Arbeit mit Dateien — zum Beispiel beim Verschieben — ein normaler Benutzer nur den Namensraum user

  • überträgt, während der Superuser alle Namensräume außer system
  • kopiert

In der Praxis bedeutet das, dass die Beibehaltung von SELinux-Labels über xattr in der Regel Root-Rechte erfordert

  • In dieser Lektion arbeiten wir ausschließlich als Benutzer root

Kopieren einer Datei

Für einen sauberen Versuch erstellen wir ein temporäres Verzeichnis, das ein Webserver-Verzeichnis simuliert, und weisen ihm den passenden Kontext zu

mkdir /tmp/web_root
chcon -t httpd_sys_content_t /tmp/web_root
ls -Zd /tmp/web_root

Nun erstellen wir zwei identische Testdateien im gewöhnlichen Verzeichnis /tmp (wo Dateien standardmäßig mit dem Kontext user_tmp_t angelegt werden)

touch /tmp/file_to_copy
touch /tmp/file_to_move
ls -Z -1 /tmp/file_to_*
Ausgabe
sudo ls -Z -1 /tmp/file_to_*
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_to_copy
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_to_move

Wir kopieren die erste Datei in unser „Web-Verzeichnis“ und sehen uns das Ergebnis an

cp /tmp/file_to_copy /tmp/web_root/
ls -Z /tmp/web_root/file_to_copy
Ausgabe
sudo ls -Z /tmp/web_root/file_to_copy
unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/web_root/file_to_copy

Die Datei hat ihren Typ auf httpd_sys_content_t geändert

Das Werkzeug cp erstellt auf dem Datenträger eine vollständig neue Datei (einen neuen inode)

  • Nach den SELinux-Regeln erbt jede neue Datei standardmäßig den Kontext ihres Elternverzeichnisses
  • Das Verzeichnis /tmp/web_root/ hat den Typ für Web-Inhalte, deshalb wurde auch die neue Datei als Web-Inhalt markiert
  • Der Webserver wird sie lesen können

Verschieben einer Datei

Nun verschieben wir die zweite Datei und prüfen ihren Kontext

mv /tmp/file_to_move /tmp/web_root/
ls -Z /tmp/web_root/file_to_move
Ausgabe
sudo ls -Z /tmp/web_root/file_to_move
unconfined_u:object_r:user_tmp_t:s0 /tmp/web_root/file_to_move

Die Datei hat ihren alten Typ user_tmp_t beibehalten

Das Werkzeug mv erstellt (bei einem Verschieben innerhalb desselben Dateisystems) keine neue Datei

  • Es ändert lediglich den Verzeichniseintrag, also die Zuordnung der Datei von einem Verzeichnis in ein anderes
  • Die Datei bleibt physisch dieselbe, und alle ihre erweiterten Attribute (einschließlich des SELinux-Labels) „wandern“ zusammen mit ihr
  • Der Webserver wird sie nicht lesen können und einen Zugriffsfehler liefern

Verhalten steuern

Attribute beibehalten

Kopieren unter Beibehaltung der Attribute

Für verschiedene Zwecke, zum Beispiel zum Schutz wichtiger Daten oder für Backups, kann es erforderlich sein, den Kontext beim Kopieren vollständig beizubehalten

Dafür wird das Flag --preserve=context (oder der Archivmodus -a) verwendet

Wir erstellen eine Testdatei

touch /tmp/important_file
chcon -t shadow_t /tmp/important_file

Wir kopieren sie mit ausdrücklicher Anweisung, den SELinux-Kontext beizubehalten

cp --preserve=context /tmp/important_file /tmp/web_root/important_backup

oder

cp -a /tmp/important_file /tmp/web_root/important_backup

Prüfung

ls -Z /tmp/web_root/important_backup

Damit zwingen wir cp, nicht nur den Dateiinhalt, sondern auch die erweiterten Sicherheitsattribute zu kopieren

  • Das ist bei der Erstellung von Backups von entscheidender Bedeutung

Verschieben mit Vererbung

Wir haben die Dateien einer Website nach /tmp heruntergeladen und wollen sie nach /var/www/html verschieben, damit sie sofort den korrekten Web-Kontext erhalten und die Website ohne 403-Forbidden-Fehler funktioniert

Variante 1 Flag -Z

Werkzeuge aus der coreutils-Familie sind in modernen Linux-Distributionen gut über SELinux informiert

  • Ein großes -Z veranlasst den Befehl mv, das System unmittelbar zu fragen: „Welcher Kontext sollte hier standardmäßig gesetzt werden?“ und diesen dann anzuwenden.

Die Standardkontexte für Verzeichnisse werden in einer Datenbank gespeichert und mit dem Werkzeug semanage verwaltet;

  • In diesem Beispiel verwenden wir das Verzeichnis /var/www/html mit dem Standardkontext httpd_sys_content_t anstelle von /tmp/web_root, weil die SELinux-Datenbank keinen Eintrag dafür hat, welcher Standardkontext für /tmp/web_root gesetzt werden soll.

Wir bereiten die benötigte Datei vor

touch /tmp/site_index.html

Wir verschieben sie mit dem Flag -Z

mv -Z /tmp/site_index.html /var/www/html/

Prüfung

ls -Z /var/www/html/site_index.html

Ausgabe

sudo ls -Z /var/www/html/site_index.html
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/site_index.html

Die Datei wurde physisch verschoben, aber ihr SELinux-Label wurde automatisch gemäß den Standardregeln des neuen Verzeichnisses neu gesetzt

Variante 2 Kontext wiederherstellen

Das Flag -Z kann man leicht einmal vergessen

  • Für solche Fälle gibt es die Möglichkeit, den Kontext mit dem Werkzeug restorecon (restore context) auf das Standardlabel zurückzusetzen

Wir erstellen eine weitere Datei und verschieben sie auf klassische Weise, also ohne Vererbung

touch /tmp/another_file.html
ls -Z /tmp/another_file.html
mv /tmp/another_file.html /var/www/html/

Wiederherstellung des Labels

restorecon -v /var/www/html/another_file.html

Ausgabe

sudo restorecon -v /var/www/html/another_file.html
Relabeled /var/www/html/another_file.html from unconfined_u:object_r:user_tmp_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

Das Werkzeug restorecon ist in Systemen mit SELinux ein nützliches Hilfsmittel zur Diagnose von Problemen nach dem Verschieben von Dateien in Systemverzeichnisse

  • Der Parameter -v wird verwendet, um Details auf der Konsole auszugeben

Verschieben mit rsync

Zunächst ist wichtig zu beachten, dass rsync -a weder ACLs noch erweiterte Attribute xattr einschließt

Die Option -X veranlasst rsync, erweiterte Attribute beizubehalten

Zur Festigung erstellen wir ein Dateipaar

touch rsynced1 && touch rsynced2

Wir versuchen, sie auf verschiedene Arten in das Verzeichnis /tmp/web_root zu verschieben

rsync -a rsynced1 /tmp/web_root/
rsync -aX rsynced2 /tmp/web_root/
ls -Z -1 /tmp/web_root/rsy*
sudo ls -Z -1 /tmp/web_root/rsy*
unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/web_root/rsynced1
unconfined_u:object_r:user_home_t:s0 /tmp/web_root/rsynced2
Befehl Beschreibung
rsync -a überträgt Standardattribute
rsync -A überträgt ACLs
rsync -X überträgt xattrs

In der Praxis wird für Backups am häufigsten der universelle Befehl rsync -aHAX verwendet, der alle Attributarten einschließt; dabei steht die Option H für Hardlinks

Die häufigsten Probleme bei der Arbeit von rsync mit Attributen hängen mit einer Ausführung ohne ausreichende Privilegien zusammen

  • Abschließend ist wichtig zu erwähnen, dass security.selinux von NFS möglicherweise nicht unterstützt wird, da dort eine ältere xattr-Semantik verwendet wird

Archivierung

Archivierung

Archivierungsprogramme ignorieren standardmäßig xattr

Wenn man versucht, mit dem üblichen Befehl tar -cvf ein Backup einer Website zu erstellen und dieses anschließend auf einem anderen Server zu entpacken, gehen alle Labels verloren

  • Die entpackten Dateien erhalten einen zufälligen Kontext des aktuellen Verzeichnisses, und der Webserver gibt einen Fehler 403 zurück

Damit tar Dateien zusammen mit ihren Sicherheitslabels archiviert und wieder entpackt, muss dies explizit über die entsprechenden Parameter angegeben werden

Erstellen eines Backups unter Beibehaltung der Kontexte

tar --xattrs --selinux -cvf website_backup.tar /var/www/html

Prüfen, ob xattr vorhanden ist

tar --selinux -tvf website_backup.tar

Entpacken

tar --xattrs --selinux -xvf website_backup.tar -C /tmp/restore_dir/

Wichtig: Das Dienstprogramm zip sowie viele andere Archivierungsprogramme unterstützen SELinux nicht

Für die Arbeit mit Labels sollte daher tar (oder alternativ star) verwendet werden

RHEL

SELinux-Labels beibehalten

Diese Abschnitte beschreiben, was mit SELinux-Kontexten geschieht, wenn Dateien und Verzeichnisse kopiert, verschieben und archivieren von Dateien und Verzeichnissen

  • Außerdem wird erklärt, wie Kontexte beim Kopieren und Archivieren beibehalten werden können

Kopieren von Dateien und Verzeichnissen

Wenn eine Datei oder ein Verzeichnis kopiert wird, wird eine neue Datei oder ein neues Verzeichnis erstellt, falls diese noch nicht existieren

  • Der Kontext dieser neuen Datei oder dieses neuen Verzeichnisses basiert auf den Standard-Labeling-Regeln und nicht auf dem Kontext der ursprünglichen Datei oder des ursprünglichen Verzeichnisses, es sei denn, es wurden Optionen verwendet, um den ursprünglichen Kontext beizubehalten

Beispielsweise werden Dateien, die in Benutzer-Home-Verzeichnissen erstellt werden, mit dem Typ user_home_t gekennzeichnet

touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1

Wenn eine solche Datei in ein anderes Verzeichnis kopiert wird, beispielsweise /etc, wird die neue Datei gemäß den Standard-Kennzeichnungsregeln für /etc erstellt

  • Das Kopieren einer Datei ohne zusätzliche Optionen bewahrt möglicherweise den ursprünglichen Kontext nicht
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
sudo cp file1 /etc/
ls -Z /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1

Wenn file1 nach /etc kopiert wird und /etc/file1 nicht existiert, wird /etc/file1 als neue Datei erstellt

  • Wie im obigen Beispiel gezeigt, wird /etc/file1 gemäß den Standard-Labeling-Regeln mit dem Typ etc_t gekennzeichnet

Wenn eine Datei über eine bereits vorhandene Datei kopiert wird, bleibt der Kontext der vorhandenen Datei erhalten, es sei denn, der Benutzer hat cp-Optionen angegeben, um den Kontext der Originaldatei zu erhalten, wie beispielsweise --preserve=context

  • Die SELinux-Richtlinie kann verhindern, dass Kontexte beim Kopieren erhalten bleiben
Kopieren ohne Beibehaltung von SELinux-Kontexten

Dieses Verfahren zeigt, dass beim Kopieren einer Datei mit dem Befehl cp, und keine Optionen angegeben werden, der Typ vom Zielverzeichnis, dem übergeordneten Verzeichnis, übernommen wird 1. Erstellen einer Datei im Home-Verzeichnis eines Benutzers

  • Die Datei wird mit dem Typ user_home_t gekennzeichnet
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1

2. Das Verzeichnis /var/www/html/ ist mit dem Typ httpd_sys_content_t gekennzeichnet, wie der folgende Befehl zeigt

ls -dZ /var/www/html/
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

3. Wenn file1 nach /var/www/html/ kopiert wird, erbt sie den Typ httpd_sys_content_t

sudo cp file1 /var/www/html/
ls -Z /var/www/html/file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
Beibehaltung von SELinux-Kontexten beim Kopieren

Dieses Verfahren zeigt, wie man die Option --preserve=context verwendet, um Kontexte beim Kopieren beizubehalten.

4. Erstellen einer Datei im Home-Verzeichnis eines Benutzers

  • Die Datei wird mit dem Typ user_home_t gekennzeichnet
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1

5. Das Verzeichnis /var/www/html/ ist mit dem Typ httpd_sys_content_t gekennzeichnet, wie der folgende Befehl zeigt

ls -dZ /var/www/html/
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

6. Durch die Verwendung der Option --preserve=context bleiben die SELinux-Kontexte bei Kopiervorgängen erhalten

  • Wie unten gezeigt, wurde der Typ user_home_t von file1 beibehalten, als die Datei nach /var/www/html/ kopiert wurde
sudo cp --preserve=context file1 /var/www/html/
ls -Z /var/www/html/file1
-rw-r--r-- root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
Kopieren und Ändern des Kontexts

Dieses Verfahren zeigt, wie man die Option --context verwendet, um den Kontext der Zielkopie zu ändern

  • Das folgende Beispiel wird im Home-Verzeichnis des Benutzers ausgeführt

7. Erstellen Sie eine Datei im Home-Verzeichnis eines Benutzers

  • Die Datei ist mit dem Typ user_home_t gekennzeichnet
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1

8. Verwenden Sie die Option --context, um den SELinux-Kontext zu definieren

cp --context=system_u:object_r:samba_share_t:s0 file1 file2

9. Ohne --context würde file2 mit dem unconfined_u:object_r:user_home_t-Kontext gekennzeichnet

ls -Z file1 file2
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
-rw-rw-r-- user1 group1 system_u:object_r:samba_share_t:s0 file2
Kopieren einer Datei über eine vorhandene Datei

Dieses Verfahren zeigt, dass beim Kopieren einer Datei über eine vorhandene Datei der Kontext der vorhandenen Datei beibehalten wird, sofern keine Option zur Beibehaltung von Kontexten verwendet wird.

10. Erstellen Sie als root eine neue Datei, file1, im Verzeichnis /etc

  • Wie unten gezeigt, wird die Datei mit dem Typ etc_t gekennzeichnet
sudo touch /etc/file1
ls -Z /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1

11. Erstellen Sie eine weitere Datei, file2, im Verzeichnis /tmp

  • Wie unten gezeigt, wird die Datei mit dem Typ user_tmp_t gekennzeichnet
touch /tmp/file2
ls -Z /tmp/file2
-rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2

12. file1 mit file2 überschreiben

sudo cp /tmp/file2 /etc/file1

13. Nach dem Kopieren zeigt der folgende Befehl, dass file1 mit dem Typ etc_t gekennzeichnet ist, nicht mit dem Typ user_tmp_t aus /tmp/file2, der /etc/file1 ersetzt hat

ls -Z /etc/file1
-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
Wichtig

Kopieren Sie Dateien und Verzeichnisse, anstatt sie zu verschieben

  • Dies trägt dazu bei, dass sie mit den richtigen SELinux-Kontexten gekennzeichnet werden
  • Falsche SELinux-Kontexte können verhindern, dass Prozesse auf solche Dateien und Verzeichnisse zugreifen

Verschieben von Dateien und Verzeichnissen

Dateien und Verzeichnisse behalten ihren aktuellen SELinux-Kontext bei, wenn sie verschoben werden

  • In vielen Fällen ist dieser für den Zielort, an den sie verschoben werden, falsch
  • Das folgende Beispiel zeigt das Verschieben einer Datei aus dem Home-Verzeichnis eines Benutzers in das Verzeichnis /var/www/html/, das vom Apache-HTTP-Server verwendet wird
  • Da die Datei verschoben wird, erbt sie nicht den richtigen SELinux-Kontext
Verschieben von Dateien und Verzeichnissen
  1. Wechseln Sie in Ihr Home-Verzeichnis und erstellen Sie dort eine Datei
  • Die Datei ist mit dem Typ user_home_t gekennzeichnet
touch file1
ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
  1. Geben Sie den folgenden Befehl ein, um den SELinux-Kontext des Verzeichnisses /var/www/html/ anzuzeigen
ls -dZ /var/www/html/
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

Standardmäßig ist /var/www/html/ mit dem Typ httpd_sys_content_t gekennzeichnet

  • Dateien und Verzeichnisse, die unter /var/www/html/ erstellt werden, erben diesen Typ und sind somit mit diesem Typ gekennzeichnet
  1. Verschieben Sie als root file1 nach /var/www/html/
  • Da diese Datei verschoben wird, behält sie ihren aktuellen Typ user_home_t
sudo mv file1 /var/www/html/
sudo ls -Z /var/www/html/file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1

Standardmäßig kann der Apache-HTTP-Server keine Dateien lesen, die mit dem Typ user_home_t gekennzeichnet sind

  • Wenn alle Dateien, aus denen eine Webseite besteht, mit dem Typ user_home_t gekennzeichnet sind oder einem anderen Typ, den der Apache-HTTP-Server nicht lesen kann, wird der Zugriff verweigert, wenn versucht wird, über Webbrowser wie Mozilla Firefox
Wichtig

Das Verschieben von Dateien und Verzeichnissen mit dem Befehl mv kann zu einem falschen SELinux-Kontext führen, wodurch Prozesse wie der Apache-HTTP-Server und Samba daran gehindert werden, auf solche Dateien und Verzeichnisse zuzugreifen

Überprüfen des Standard-SELinux-Kontexts

Verwenden Sie das Dienstprogramm matchpathcon, um zu überprüfen, ob Dateien und Verzeichnisse den richtigen SELinux-Kontext haben

  • Dieses Dienstprogramm fragt die Systemrichtlinie ab und gibt dann den mit dem Dateipfad verbundenen Standard-Sicherheitskontext aus. Das folgende Beispiel zeigt, wie man mit matchpathcon überprüft, ob Dateien im Verzeichnis /var/www/html/ korrekt gekennzeichnet sind
Überprüfen des Standard-SELinux-Kontexts mit matchpathcon
  1. Erstellen Sie als Root-Benutzer drei Dateien (file1, file2 und file3) im Verzeichnis /var/www/html/
  • Diese Dateien erben den Typ httpd_sys_content_t von /var/www/html/
sudo touch /var/www/html/file{1,2,3}
sudo ls -Z /var/www/html/
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
  1. Ändern Sie als root den Typ von file1 in samba_share_t
  • Beachten Sie, dass der Apache-HTTP-Server keine Dateien oder Verzeichnisse lesen kann, die mit dem Typ samba_share_t gekennzeichnet sind
sudo chcon -t samba_share_t /var/www/html/file1
  1. Die Option -V von matchpathcon vergleicht den aktuellen SELinux-Kontext mit dem korrekten Standardkontext in der SELinux-Richtlinie
  • Geben Sie den folgenden Befehl ein, um alle Dateien im Verzeichnis /var/www/html/ zu überprüfen
matchpathcon -V /var/www/html/*
/var/www/html/file1 hat den Kontext unconfined_u:object_r:samba_share_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein
/var/www/html/file2 verifiziert
/var/www/html/file3 verifiziert

Die folgende Ausgabe des Befehls matchpathcon erklärt, dass file1 mit dem Typ samba_share_t gekennzeichnet ist, aber mit dem Typ httpd_sys_content_t gekennzeichnet sein sollte

/var/www/html/file1 hat den Kontext unconfined_u:object_r:samba_share_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein

Um das Label-Problem zu beheben und dem Apache-HTTP-Server als root Zugriff auf file1 zu gewähren, verwenden Sie das Dienstprogramm restorecon

sudo restorecon -v /var/www/html/file1
restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0

Dateien mit tar archivieren

Das Dienstprogramm tar behält standardmäßig keine erweiterten Attribute bei

  • Da SELinux-Kontexte in erweiterten Attributen gespeichert sind, können Kontexte beim Archivieren von Dateien verloren gehen
  • Verwenden Sie den Befehl tar --selinux, um Archive zu erstellen, die Kontexte beibehalten, und um Dateien aus den Archiven wiederherzustellen
  • Wenn ein tar Archiv Dateien ohne erweiterte Attribute enthält oder wenn Sie möchten, dass die erweiterten Attribute den Systemstandardwerten entsprechen, verwenden Sie das Dienstprogramm restorecon
tar -xvf ''archive.tar'' | restorecon -f -

Beachten Sie, dass Sie je nach Verzeichnis möglicherweise Root-Rechte benötigen, um das restorecon auszuführen.

Das folgende Beispiel zeigt, wie ein tar-Archiv erstellt wird, das SELinux-Kontexte beibehält

Erstellen eines tar-Archivs
  1. Wechseln Sie in das Verzeichnis /var/www/html/ und zeigen Sie dessen SELinux-Kontext an
cd /var/www/html/
ls -dZ /var/www/html/
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
  1. Erstellen Sie als Root drei Dateien (file1, file2 und file3) im Verzeichnis /var/www/html/
  • Diese Dateien erben den Typ httpd_sys_content_t vom Verzeichnis /var/www/html/
touch file{1,2,3}
ls -Z /var/www/html/
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
  1. Geben Sie als root den folgenden Befehl ein, um ein tar-Archiv mit dem Namen test.tar zu erstellen
  • Verwenden Sie die Option --selinux, um den SELinux-Kontext beizubehalten
sudo tar --selinux -cf test.tar file{1,2,3}
  1. Erstellen Sie als root ein neues Verzeichnis namens test/ und gewähren Sie anschließend allen Benutzern vollen Zugriff darauf
sudo mkdir /test
sudo chmod 777 /test/
  1. Kopieren Sie die Datei test.tar in test/
cp /var/www/html/test.tar /test/
  1. Wechseln Sie in das Verzeichnis test/
  • Geben Sie in diesem Verzeichnis den folgenden Befehl ein, um das tar-Archiv zu entpacken
  • Geben Sie die Option --selinux erneut an, da sonst der SELinux-Kontext auf default_t geändert wird
cd /test/
tar --selinux -xvf test.tar
  1. SELinux-Kontexte anzeigen
  • Der Typ httpd_sys_content_t wurde beibehalten und nicht in default_t geändert, was geschehen wäre, wenn --selinux nicht verwendet worden wäre
ls -lZ /test/
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.tar
  1. Wenn das Verzeichnis test/ nicht mehr benötigt wird, geben Sie als root den folgenden Befehl ein, um es sowie alle darin enthaltenen Dateien zu entfernen
sudo rm -ri /test/

Weitere Informationen zu tar, wie beispielsweise die Option --xattrs, die alle erweiterten Attribute beibehält

Dateien mit star archivieren

Das Dienstprogramm star behält standardmäßig keine erweiterten Attribute bei

  • Da SELinux-Kontexte in erweiterten Attributen gespeichert sind, können Kontexte beim Archivieren von Dateien verloren gehen
  • Verwenden Sie den Befehl star -xattr -H=exustar, um Archive zu erstellen, die Kontexte beibehalten
  • Das star-Paket ist standardmäßig nicht installiert
  • Um star zu installieren, führen Sie als Root-Benutzer den Befehl yum install star aus

Das folgende Beispiel zeigt die Erstellung eines star-Archivs, das SELinux-Kontexte beibehält

Erstellen eines star-Archiv
  1. Erstellen Sie als Root drei Dateien (file1, file2 und file3) im Verzeichnis /var/www/html/
  • Diese Dateien erben den Typ httpd_sys_content_t von /var/www/html/
sudo touch /var/www/html/file{1,2,3}
sudo ls -Z /var/www/html/
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
  1. Wechseln Sie in das Verzeichnis /var/www/html/
  • Geben Sie in diesem Verzeichnis als root den folgenden Befehl ein, um ein star-Archiv mit dem Namen test.star zu erstellen
cd /var/www/html
star -xattr -H=exustar -c -f=test.star file{1,2,3}
star 1 blocks + 0 bytes (total of 10240 bytes = 10.00k)
  1. Erstellen Sie als Root ein neues Verzeichnis namens test/ und gewähren Sie allen Benutzern vollständigen Zugriff darauf
sudo mkdir /test
sudo chmod 777 /test/
  1. Geben Sie den folgenden Befehl ein, um die Datei test.star in test/ zu kopieren
cp /var/www/html/test.star /test/
  1. Wechseln Sie in das Verzeichnis test/
  • Sobald Sie sich in diesem Verzeichnis befinden, geben Sie den folgenden Befehl ein, um das star-Archiv zu extrahieren
cd /test/
star -x -f=test.star
star 1 blocks + 0 bytes (total of 10240 bytes = 10.00k)
  1. Zeigen Sie die SELinux-Kontexte an
  • Der Typ httpd_sys_content_t wurde beibehalten und nicht in default_t geändert, was geschehen wäre, wenn die Option -xattr -H=exustar nicht verwendet worden wäre
ls -lZ /test/
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
-rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.star
  1. Wenn das Verzeichnis test/ nicht mehr benötigt wird, geben Sie als root den folgenden Befehl ein, um es sowie alle darin enthaltenen Dateien zu entfernen
sudo rm -ri /test/
  1. Wenn star nicht mehr benötigt wird, entfernen Sie das Paket als root
sudo yum remove star

Weitere Informationen zu star finden Sie auf der Handbuchseite star(1)