Zum Inhalt springen

Linux/SELinux/10 Systemd: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
== SELinux systemd Access Control ==
== SELinux-Zugriffskontrolle mit systemd ==
; System services are controlled by the '''systemd''' daemon
; Systemdienste werden vom ‚‘'systemd'‚‘-Daemon gesteuert
Earlier daemons could be started in two ways
Frühere Daemons konnten auf zwei Arten gestartet werden
* At boot time, the System V '''init''' daemon launched an '''init.rc''' script and then this script launched the required daemon
* Beim Systemstart führte der System-V-Daemon ‚‘'init'‚‘ ein Skript namens ‚‘'init.rc'‚‘ aus, woraufhin dieses Skript den erforderlichen Daemon startete


For example, the Apache server, which was started at boot, got the following SELinux label:  
Beispielsweise erhielt der Apache-Server, der beim Systemstart gestartet wurde, das folgende SELinux-Label:  
  system_u:system_r:httpd_t:s0
  system_u:system_r:httpd_t:s0


An administrator launched the '''init.rc''' script manually, causing the daemon to run
Ein Administrator startete das ‚‘'init.rc'‚‘ Skript manuell, wodurch der Daemon ausgeführt wurde


For example, when the '''service httpd restart''' command was invoked on the Apache server, the resulting SELinux label looked as follows:  
Wenn beispielsweise der Befehl ‚‘'service httpd restart'‚‘ auf dem Apache-Server aufgerufen wurde, sah das resultierende SELinux-Label wie folgt aus:  
  unconfined_u:system_r:httpd_t:s0
  unconfined_u:system_r:httpd_t:s0


When launched manually, the process adopted the user portion of the SELinux label that started it, making the labeling in the two scenarios above inconsistent
Bei manuellem Start übernahm der Prozess den Benutzerteil des SELinux-Labels, das ihn gestartet hatte, was die Labeling-Praktiken in den beiden oben genannten Szenarien inkonsistent machte
* With the '''systemd''' daemon, the transitions are very different
* Beim ‚‘'systemd'‚‘-Daemon verlaufen die Übergänge ganz anders
* As '''systemd''' handles all the calls to start and stop daemons on the system, using the '''init_t''' type, it can override the user part of the label when a daemon is restarted manually
* Da ‚‘'systemd'‚‘ alle Aufrufe zum Starten und Beenden von Daemons auf dem System unter Verwendung des Typs ‚‘'init_t'‚‘ verarbeitet, kann es den Benutzerteil des Labels überschreiben, wenn ein Daemon manuell neu gestartet wird
* As a result, the labels in both scenarios above are '''system_u:system_r:httpd_t:s0''' as expected and the SELinux policy could be improved to govern which domains are able to control which units
* Infolgedessen lauten die Labels in beiden oben genannten Szenarien wie erwartet ‚‘'system_u:system_r:httpd_t:s0'‚‘ und die SELinux-Richtlinie könnte verbessert werden, um zu regeln, welche Domänen welche Einheiten steuern dürfen


== SELinux Access Permissions for Services ==
== SELinux-Zugriffsberechtigungen für Dienste ==
In previous versions of Red Hat Enterprise Linux, an administrator was able to control, which users or applications were able to start or stop services based on the label of the System V Init script
In früheren Versionen von Red Hat Enterprise Linux konnte ein Administrator anhand des Labels des System V-Init-Skripts steuern, welche Benutzer oder Anwendungen Dienste starten oder stoppen durften
* Now, '''systemd''' starts and stops all services, and users and processes communicate with '''systemd''' using the '''systemctl''' utility
* Jetzt startet und stoppt ‚‘'systemd'‚‘ alle Dienste, und Benutzer und Prozesse kommunizieren mit ‚‘'systemd'‚‘ über das Dienstprogramm ‚‘'systemctl'‚‘
* The '''systemd''' daemon has the ability to consult the SELinux policy and check the label of the calling process and the label of the unit file that the caller tries to manage, and then ask SELinux whether or not the caller is allowed the access
* Der ‚‘'systemd'‚‘-Daemon kann die SELinux-Richtlinie abfragen und die Kennzeichnung des aufrufenden Prozesses sowie die Kennzeichnung der Unit-Datei, die der Aufrufer zu verwalten versucht, überprüfen und anschließend bei SELinux erfragen, ob dem Aufrufer der Zugriff gestattet ist
* This approach strengthens access control to critical system capabilities, which include starting and stopping system services
* Dieser Ansatz stärkt die Zugriffskontrolle auf kritische Systemfunktionen, zu denen das Starten und Beenden von Systemdiensten gehört


For example, previously, administrators had to allow NetworkManager to execute '''systemctl''' to send a D-Bus message to '''systemd''', which would in turn start or stop whatever service NetworkManager requested
Beispielsweise mussten Administratoren zuvor dem NetworkManager erlauben, ‚‘'systemctl'‚‘ auszuführen, um eine D-Bus-Nachricht an ‚‘'systemd'‚‘ zu senden, das daraufhin den vom NetworkManager angeforderten Dienst startete oder stoppte
* In fact, NetworkManager was allowed to do everything '''systemctl''' could do
* Tatsächlich durfte der NetworkManager alles tun, was ‚‘'systemctl'‚‘ tun konnte
* It was also impossible to setup confined administrators so that they could start or stop just particular services
* Es war zudem unmöglich, Administratoren mit eingeschränkten Rechten so einzurichten, dass sie nur bestimmte Dienste starten oder stoppen konnten


To fix these issues, '''systemd''' also works as an SELinux Access Manager
Um diese Probleme zu beheben, fungiert ‚‘'systemd'‚‘ auch als SELinux-Zugriffsmanager
* It can retrieve the label of the process running '''systemctl''' or the process that sent a D-Bus message to '''systemd'''
* Es kann das Label des Prozesses abrufen, der ‚‘'systemctl'‚‘ ausführt, oder des Prozesses, der eine D-Bus-Nachricht an ‚‘'systemd'‚‘ gesendet hat
* The daemon then looks up the label of the unit file that the process wanted to configure
* Der Daemon sucht dann nach dem Label der Unit-Datei, die der Prozess konfigurieren wollte
* Finally, '''systemd''' can retrieve information from the kernel if the SELinux policy allows the specific access between the process label and the unit file label
* Schließlich kann ‚‘'systemd'‚‘ Informationen vom Kernel abrufen, wenn die SELinux-Richtlinie den spezifischen Zugriff zwischen dem Prozess-Label und dem Unit-Datei-Label erlaubt
* This means a compromised application that needs to interact with '''systemd''' for a specific service can now be confined by SELinux
* Das bedeutet, dass eine kompromittierte Anwendung, die für einen bestimmten Dienst mit ‚‘'systemd'‚‘ interagieren muss, nun durch SELinux eingeschränkt werden kann
* Policy writers can also use these fine-grained controls to confine administrators
* Richtlinienentwickler können diese fein abgestimmten Steuerungen auch nutzen, um Administratoren einzuschränken


Policy changes involve a new class called '''service''', with the following permissions
Die Richtlinienänderungen beinhalten eine neue Klasse namens ‚‘'service'‚‘, mit den folgenden Berechtigungen
  class service
  class service
  {
  {
Zeile 47: Zeile 47:
  }
  }


For example, a policy writer can now allow a domain to get the status of a service or start and stop a service, but not enable or disable a service
Beispielsweise kann ein Richtlinienentwickler nun einer Domäne erlauben, den Status eines Dienstes abzurufen oder einen Dienst zu starten und zu stoppen, jedoch nicht, einen Dienst zu aktivieren oder zu deaktivieren
* Access control operations in SELinux and '''systemd''' do not match in all cases
* Zugriffskontrolloperationen in SELinux und ‚‘'systemd'‚‘ stimmen nicht in allen Fällen überein
* A mapping was defined to line up '''systemd''' method calls with SELinux access checks
* Es wurde eine Zuordnung definiert, um ‚‘'systemd'‚‘-Methodenaufrufe mit SELinux-Zugriffsprüfungen abzugleichen
* Table 10.1, “Mapping of systemd unit file method calls on SELinux access checks” maps access checks on unit files while Table 10.2, “Mapping of systemd general system calls on SELinux access checks” covers access checks for the system in general
* Tabelle 10.1, „Zuordnung von Methodenaufrufen in systemd-Unit-Dateien zu SELinux-Zugriffsprüfungen“, ordnet Zugriffsprüfungen für Unit-Dateien zu, während Tabelle 10.2, „Zuordnung von allgemeinen systemd-Systemaufrufen zu SELinux-Zugriffsprüfungen“, Zugriffsprüfungen für das System im Allgemeinen abdeckt
* If no match is found in either table, then the '''undefined''' system check is called
* Wird in keiner der beiden Tabellen eine Übereinstimmung gefunden, wird die Systemprüfung „undefined“ aufgerufen


; Mapping of systemd unit file method calls on SELinux access checks
; Zuordnung von systemd-Unit-Datei-Methodenaufrufen zu SELinux-Zugriffsprüfungen
{| class="wikitable options big"
{| class="wikitable options big"
|-  
|-  
! align=center| systemd unit file method
! align=center| systemd-Unit-Datei-Methode
! align=center| SELinux access check
! align=center| SELinux-Zugriffsprüfung
|-  
|-  
|| DisableUnitFiles
|| DisableUnitFiles
Zeile 91: Zeile 91:
|| MaskUnitFiles
|| MaskUnitFiles
|| disable
|| disable
|-  
|-
|| PresetUnitFiles
|| PresetUnitFiles
|| enable
|| aktivieren
|-  
|-
|| ReenableUnitFiles
|| ReenableUnitFiles
|| enable
|| aktivieren
|-  
|-
|| Reexecute
|| Reexecute
|| start
|| starten
|-  
|-
|| Reload
|| Reload
|| reload
|| neu laden
|-  
|-
|| ReloadOrRestart
|| ReloadOrRestart
|| start
|| starten
|-  
|-
|| ReloadOrRestartUnit
|| ReloadOrRestartUnit
|| start
|| starten
|-  
|-
|| ReloadOrTryRestart
|| ReloadOrTryRestart
|| start
|| starten
|-  
|-
|| ReloadOrTryRestartUnit
|| ReloadOrTryRestartUnit
|| start
|| start
|-  
|-
|| ReloadUnit
|| ReloadUnit
|| reload
|| reload
|-  
|-
|| ResetFailed
|| ResetFailed
|| stop
|| stop
|-  
|-
|| ResetFailedUnit
|| ResetFailedUnit
|| stop
|| stop
|-  
|-
|| Restart
|| Restart
|| start
|| start
|-  
|-
|| RestartUnit
|| RestartUnit
|| start
|| start
|-  
|-
|| Start
|| Start
|| start
|| start
|-  
|-
|| StartUnit
|| StartUnit
|| start
|| start
|-  
|-
|| StartUnitReplace
|| StartUnitReplace
|| start
|| start
|-  
|-
|| Stop
|| Stop
|| stop
|| stop
|-  
|-
|| StopUnit
|| StopUnit
|| stop
|| stop
|-  
|-
|| TryRestart
|| TryRestart
|| start
|| start
|-  
|-
|| TryRestartUnit
|| TryRestartUnit
|| start
|| start
|-  
|-
|| UnmaskUnitFiles
|| UnmaskUnitFiles
|| enable
|| enable
Zeile 157: Zeile 158:
|}
|}


; Mapping of systemd unit file method calls on SELinux access checks
; Zuordnung von Methodenaufrufen in systemd-Unit-Dateien zu SELinux-Zugriffsprüfungen
{| class="wikitable options big"
{| class="wikitable options big"
|-  
|-  
! align=center| systemd unit file method
! align=center| Methode in systemd-Unit-Datei
! align=center| SELinux access check
! align=center| SELinux-Zugriffsprüfung
|-  
|-  
|| DisableUnitFiles
|| DisableUnitFiles
|| disable
|| deaktivieren
|-  
|-  
|| EnableUnitFiles
|| EnableUnitFiles
|| enable
|| aktivieren
|-  
|-  
|| GetUnit
|| GetUnit
|| status
|| Status
|-  
|-
|| GetUnitByPID
|| GetUnitByPID
|| status
|| status
|-  
|-
|| GetUnitFileState
|| GetUnitFileState
|| status
|| status
|-  
|-
|| Kill
|| Kill
|| stop
|| stop
|-  
|-
|| KillUnit
|| KillUnit
|| stop
|| stop
|-  
|-
|| LinkUnitFiles
|| LinkUnitFiles
|| enable
|| enable
|-  
|-
|| ListUnits
|| ListUnits
|| status
|| status
|-  
|-
|| LoadUnit
|| LoadUnit
|| status
|| status
|-  
|-
|| MaskUnitFiles
|| MaskUnitFiles
|| disable
|| deaktivieren
|-  
|-
|| PresetUnitFiles
|| PresetUnitFiles
|| enable
|| aktivieren
|-  
|-
|| ReenableUnitFiles
|| ReenableUnitFiles
|| enable
|| aktivieren
|-  
|-
|| Reexecute
|| Reexecute
|| start
|| starten
|-  
|-
|| Reload
|| Reload
|| reload
|| neu laden
|-  
|-
|| ReloadOrRestart
|| ReloadOrRestart
|| start
|| starten
|-  
|-
|| ReloadOrRestartUnit
|| ReloadOrRestartUnit
|| start
|| starten
|-  
|-
|| ReloadOrTryRestart
|| start
|| Neu laden oder Neustart versuchen
|-  
|| starten
|| ReloadOrTryRestartUnit
|-
|| start
|| Neu laden oder Neustart versuchen (Einheit)
|-  
|| starten
|| ReloadUnit
|-
|| reload
|| Einheit neu laden
|-  
|| neu laden
|| ResetFailed
|-
|| stop
|| Zurücksetzen fehlgeschlagen
|-  
|| stoppen
|| ResetFailedUnit
|-
|| stop
|| Zurücksetzen fehlgeschlagen (Einheit)
|-  
|| stoppen
|| Restart
|-
|| start
|| Neustart
|-  
|| starten
|| RestartUnit
|-
|| start
|| Einheit neu starten
|-  
|| starten
|-
|| Start
|| Start
|| start
|| start
|-  
|-
|| StartUnit
|| StartUnit
|| start
|| start
|-  
|-
|| StartUnitReplace
|| StartUnitReplace
|| start
|| start
|-  
|-
|| Stop
|| Stop
|| stop
|| stop
|-  
|-
|| StopUnit
|| StopUnit
|| stop
|| stop
|-  
|-
|| TryRestart
|| TryRestart
|| start
|| start
|-  
|-
|| TryRestartUnit
|| TryRestartUnit
|| start
|| start
|-  
|-
|| UnmaskUnitFiles
|| UnmaskUnitFiles
|| enable
|| enable
Zeile 261: Zeile 263:
|}
|}


Mapping of systemd general system calls on SELinux access checks
Zuordnung von allgemeinen systemd-Systemaufrufen zu SELinux-Zugriffsprüfungen
{| class="wikitable options big"
{| class="wikitable options big"
|-  
|-  
! align=center| systemd general system call
! align=center| Allgemeiner systemd-Systemaufruf
! align=center| SELinux access check
! align=center| SELinux-Zugriffsprüfung
|-  
|-  
|| ClearJobs
|| ClearJobs
Zeile 278: Zeile 280:
|| GetAll
|| GetAll
|| status
|| status
|-  
|-
|| GetJob
|| GetJob
|| status
|| status
|-  
|-
|| GetSeat
|| GetSeat
|| status
|| status
|-  
|-
|| GetSession
|| GetSession
|| status
|| status
|-  
|-
|| GetSessionByPID
|| GetSessionByPID
|| status
|| status
|-  
|-
|| GetUser
|| GetUser
|| status
|| status
|-  
|-
|| Halt
|| Halt
|| halt
|| halt
|-  
|-
|| Introspect
|| Introspect
|| status
|| status
|-  
|-
|| KExec
|| KExec
|| reboot
|| reboot
|-  
|-
|| KillSession
|| KillSession
|| halt
|| halt
|-  
|-
|| KillUser
|| KillUser
|| halt
|| halt
|-  
|-
|| ListJobs
|| ListJobs
|| status
|| status
|-  
|-
|| ListSeats
|| ListSeats
|| status
|| status
|-  
|-
|| ListSessions
|| ListSessions
|| status
|| status
|-  
|-
|| ListUsers
|| ListUsers
|| status
|| status
|-  
|-
|| LockSession
|| LockSession
|| halt
|| halt
|-  
|-
|| PowerOff
|| PowerOff
|| halt
|| halt
|-  
|-
|| Reboot
|| Reboot
|| reboot
|| reboot
|-  
|-
|| SetUserLinger
|| SetUserLinger
|| halt
|| halt
|-  
|-
|| TerminateSeat
|| TerminateSeat
|| halt
|| halt
|-  
|-
|| TerminateSession
|| TerminateSession
|| halt
|| halt
|-  
|-
|| TerminateUser
|| TerminateUser
|| halt
|| halt
Zeile 344: Zeile 347:
|}
|}


; Mapping of systemd general system calls on SELinux access checks
; Zuordnung von allgemeinen systemd-Systemaufrufen zu SELinux-Zugriffsprüfungen
{| class="wikitable options big"
{| class="wikitable options big"
|-  
|-  
! align=center| systemd general system call
! align=center| Allgemeiner systemd-Systemaufruf
! align=center| SELinux access check
! align=center| SELinux-Zugriffsprüfung
|-  
|-  
|| ClearJobs
|| ClearJobs
Zeile 391: Zeile 394:
|| KillUser
|| KillUser
|| halt
|| halt
|-  
|-
|| ListJobs
|| ListJobs
|| status
|| Status
|-  
|-
|| ListSeats
|| ListSeats
|| status
|| Status
|-  
|-
|| ListSessions
|| ListSessions
|| status
|| Status
|-  
|-
|| ListUsers
|| ListUsers
|| status
|| Status
|-  
|-
|| LockSession
|| LockSession
|| halt
|| Stopp
|-  
|-
|| PowerOff
|| PowerOff
|| halt
|| Stopp
|-  
|-
|| Reboot
|| Reboot
|| reboot
|| Neustart
|-  
|-
|| SetUserLinger
|| SetUserLinger
|| halt
|| Stopp
|-  
|-
|| TerminateSeat
|| TerminateSeat
|| halt
|| halt
|-  
|-
|| TerminateSession
|| TerminateSession
|| halt
|| halt
|-  
|-
|| TerminateUser
|| TerminateUser
|| halt
|| halt
Zeile 427: Zeile 430:
|}
|}


; SELinux Policy for a System Service
; SELinux-Richtlinie für einen Systemdienst
By using the '''sesearch''' utility, you can list policy rules for a system service
Mit dem Dienstprogramm ‚‘'sesearch'‚‘ können Sie Richtlinienregeln für einen Systemdienst auflisten


For example, calling the '''sesearch -A -s NetworkManager_t -c service''' command returns
Beispielsweise gibt der Befehl ‚‘'sesearch -A -s NetworkManager_t -c service'‚‘ Folgendes zurück
  allow NetworkManager_t dnsmasq_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t dnsmasq_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t nscd_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t nscd_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t ntpd_unit_file_t : service { start stop status reload kill load } ;
   
allow NetworkManager_t ntpd_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t pppd_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t pppd_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t polipo_unit_file_t : service { start stop status reload kill load } ;
  allow NetworkManager_t polipo_unit_file_t : service { start stop status reload kill load } ;


== SELinux and journald ==
== SELinux und journald ==
In '''systemd''', the '''journald''' daemon (also known as '''systemd-journal''') is the alternative for the '''syslog''' utility, which is a system service that collects and stores logging data
In ‚‘'systemd'‚‘ ist der ‚‘'journald'‚‘ Daemon (auch bekannt als ‚‘'systemd-journal'‚‘) die Alternative zum ‚‘'syslog'‚‘ Dienst, einem Systemdienst, der Protokolldaten sammelt und speichert
* It creates and maintains structured and indexed journals based on logging information that is received from the kernel, from user processes using the '''libc''' '''syslog()''' function, from standard and error output of system services, or using its native API
* Er erstellt und verwaltet strukturierte und indizierte Journale auf der Grundlage von Protokollinformationen, die vom Kernel, von Benutzerprozessen über die ‚‘'libc'‚‘ ''syslog()'' -Funktion, aus der Standard- und Fehlerausgabe von Systemdiensten oder über seine native API empfangen werden
* It implicitly collects numerous metadata fields for each log message in a secure way
* Er sammelt implizit zahlreiche Metadatenfelder für jede Protokollmeldung auf sichere Weise


The '''systemd-journal''' service can be used with SELinux to increase security
Der ‚‘'systemd-journal'‚‘ -Dienst kann zusammen mit SELinux verwendet werden, um die Sicherheit zu erhöhen
* SELinux controls processes by only allowing them to do what they were designed to do; sometimes even less, depending on the security goals of the policy writer
* SELinux kontrolliert Prozesse, indem es ihnen nur erlaubt, das zu tun, wofür sie vorgesehen sind; manchmal sogar noch weniger, je nach den Sicherheitszielen des Policy-Autors
* For example, SELinux prevents a compromised '''ntpd''' process from doing anything other than handle Network Time
* Beispielsweise verhindert SELinux, dass ein kompromittierter ‚‘'ntpd'‚‘ -Prozess etwas anderes tut, als die Netzwerkzeit zu verwalten
* However, the '''ntpd''' process sends '''syslog''' messages, so that SELinux would allow the compromised process to continue to send those messages
* Der ‚‘'ntpd'‚‘ -Prozess sendet jedoch ‚‘'syslog'‚‘ -Meldungen, sodass SELinux dem kompromittierten Prozess erlauben würde, diese Meldungen weiterhin zu senden
* The compromised '''ntpd''' could format '''syslog''' messages to match other daemons and potentially mislead an administrator, or even worse, a utility that reads the '''syslog''' file into compromising the whole system
* Der kompromittierte ‚‘'ntpd'‚‘ könnte ‚‘'syslog'‚‘-Meldungen so formatieren, dass sie denen anderer Daemons entsprechen, und damit möglicherweise einen Administrator irreführen oder, schlimmer noch, ein Dienstprogramm, das die ‚‘'syslog'‚‘ -Datei ausliest, dazu bringen, das gesamte System zu kompromittieren


The '''systemd-journal''' daemon verifies all log messages and, among other things, adds SELinux labels to them
Der ‚‘'systemd-journal'‚‘ -Daemon überprüft alle Protokollmeldungen und fügt ihnen unter anderem SELinux-Labels hinzu
* It is then easy to detect inconsistencies in log messages and prevent an attack of this type before it occurs
* So lassen sich Unstimmigkeiten in Protokollmeldungen leicht erkennen und Angriffe dieser Art verhindern, bevor sie stattfinden
* You can use the '''journalctl''' utility to query logs of '''systemd''' journals
* Mit dem Dienstprogramm ‚‘'journalctl'‚‘ können Sie die Protokolle der ‚‘'systemd'‚‘ Journale abfragen
* If no command-line arguments are specified, running this utility lists the full content of the journal, starting from the oldest entries
* Wenn keine Befehlszeilenargumente angegeben werden, listet dieses Dienstprogramm den vollständigen Inhalt des Journals auf, beginnend mit den ältesten Einträgen
* To see all logs generated on the system, including logs for system components, execute '''journalctl''' as root
* Um alle auf dem System erzeugten Protokolle anzuzeigen, einschließlich der Protokolle für Systemkomponenten, führen Sie ‚‘'journalctl'‚‘ als Root aus
* If you execute it as a non-root user, the output will be limited only to logs related to the currently logged-in user
* Wenn Sie es als Nicht-Root-Benutzer ausführen, beschränkt sich die Ausgabe nur auf Protokolle, die sich auf den aktuell angemeldeten Benutzer beziehen


; Example
; Beispiel
Listing Logs with '''journalctl'''
Auflisten von Protokollen mit ‚‘'journalctl'‚‘


It is possible to use '''journalctl''' for listing all logs related to a particular SELinux label
Es ist möglich, ‚‘'journalctl'‚‘ zu verwenden, um alle Protokolle aufzulisten, die sich auf ein bestimmtes SELinux-Label beziehen


For example, the following command lists all logs logged under the '''system_u:system_r:policykit_t:s0''' label
Beispielsweise listet der folgende Befehl alle Protokolle auf, die unter dem Label ‚‘'system_u:system_r:policykit_t:s0'‚‘ protokolliert wurden
  sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
  sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
   Oct 21 10:22:42 localhost.localdomain polkitd[647]: Started polkitd version 0.112
    
   Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /etc/polkit-1/rules.d
21. Okt. 10:22:42 localhost.localdomain polkitd[647]: polkitd Version 0.112 gestartet
   Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /usr/share/polkit-1/rules.d
   21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Regeln aus dem Verzeichnis /etc/polkit-1/rules.d werden geladen
   Oct 21 10:22:44 localhost.localdomain polkitd[647]: Finished loading, compiling and executing 5 rules
    
   Oct 21 10:22:44 localhost.localdomain polkitd[647]: Acquired the name org.freedesktop.PolicyKit1 on the system bus Oct 21 10:23:10 localhost polkitd[647]: Registered Authentication Agent for unix-session:c1 (system bus name :1.49, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Lade Regeln aus dem Verzeichnis /usr/share/polkit-1/rules.d
   Oct 21 10:23:35 localhost polkitd[647]: Unregistered Authentication Agent for unix-session:c1 (system bus name :1.80 [/usr/bin/gnome-shell --mode=classic], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.utf8)
   21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Laden, Kompilieren und Ausführen von 5 Regeln abgeschlossen
   21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Name org.freedesktop.PolicyKit1 auf dem Systembus abgerufen 21. Okt. 10:23:10 localhost polkitd [647]: Authentifizierungsagent für unix-session:c1 registriert (Systembus-Name: 1.49, Objektpfad /org/freedesktop/PolicyKit1/AuthenticationAgent, Locale en_US.UTF-8) (vom Bus getrennt)
   21. Okt. 10:23:35 localhost polkitd[647]: Authentifizierungsagent für unix-session:c1 abgemeldet (Systembusname :1.80 [/usr/bin/gnome-shell --mode=classic], Objektpfad /org/freedesktop/PolicyKit1/AuthenticationAgent, Locale en_US.utf8)
 
Weitere Informationen zu ‚‘'journalctl'‚‘ finden Sie auf der Manpage journalctl(1)


For more information about '''journalctl''', see the journalctl(1) manual page
[[Kategorie:SELinux/DOC]]


[[Kategorie:SELinux/DOC]]
[[Kategorie:SELinux/DOC]]

Version vom 25. März 2026, 11:19 Uhr

SELinux-Zugriffskontrolle mit systemd

Systemdienste werden vom ‚‘'systemd'‚‘-Daemon gesteuert

Frühere Daemons konnten auf zwei Arten gestartet werden

  • Beim Systemstart führte der System-V-Daemon ‚‘'init'‚‘ ein Skript namens ‚‘'init.rc'‚‘ aus, woraufhin dieses Skript den erforderlichen Daemon startete

Beispielsweise erhielt der Apache-Server, der beim Systemstart gestartet wurde, das folgende SELinux-Label:

system_u:system_r:httpd_t:s0

Ein Administrator startete das ‚‘'init.rc'‚‘ Skript manuell, wodurch der Daemon ausgeführt wurde

Wenn beispielsweise der Befehl ‚‘'service httpd restart'‚‘ auf dem Apache-Server aufgerufen wurde, sah das resultierende SELinux-Label wie folgt aus:

unconfined_u:system_r:httpd_t:s0

Bei manuellem Start übernahm der Prozess den Benutzerteil des SELinux-Labels, das ihn gestartet hatte, was die Labeling-Praktiken in den beiden oben genannten Szenarien inkonsistent machte

  • Beim ‚‘'systemd'‚‘-Daemon verlaufen die Übergänge ganz anders
  • Da ‚‘'systemd'‚‘ alle Aufrufe zum Starten und Beenden von Daemons auf dem System unter Verwendung des Typs ‚‘'init_t'‚‘ verarbeitet, kann es den Benutzerteil des Labels überschreiben, wenn ein Daemon manuell neu gestartet wird
  • Infolgedessen lauten die Labels in beiden oben genannten Szenarien wie erwartet ‚‘'system_u:system_r:httpd_t:s0'‚‘ und die SELinux-Richtlinie könnte verbessert werden, um zu regeln, welche Domänen welche Einheiten steuern dürfen

SELinux-Zugriffsberechtigungen für Dienste

In früheren Versionen von Red Hat Enterprise Linux konnte ein Administrator anhand des Labels des System V-Init-Skripts steuern, welche Benutzer oder Anwendungen Dienste starten oder stoppen durften

  • Jetzt startet und stoppt ‚‘'systemd'‚‘ alle Dienste, und Benutzer und Prozesse kommunizieren mit ‚‘'systemd'‚‘ über das Dienstprogramm ‚‘'systemctl'‚‘
  • Der ‚‘'systemd'‚‘-Daemon kann die SELinux-Richtlinie abfragen und die Kennzeichnung des aufrufenden Prozesses sowie die Kennzeichnung der Unit-Datei, die der Aufrufer zu verwalten versucht, überprüfen und anschließend bei SELinux erfragen, ob dem Aufrufer der Zugriff gestattet ist
  • Dieser Ansatz stärkt die Zugriffskontrolle auf kritische Systemfunktionen, zu denen das Starten und Beenden von Systemdiensten gehört

Beispielsweise mussten Administratoren zuvor dem NetworkManager erlauben, ‚‘'systemctl'‚‘ auszuführen, um eine D-Bus-Nachricht an ‚‘'systemd'‚‘ zu senden, das daraufhin den vom NetworkManager angeforderten Dienst startete oder stoppte

  • Tatsächlich durfte der NetworkManager alles tun, was ‚‘'systemctl'‚‘ tun konnte
  • Es war zudem unmöglich, Administratoren mit eingeschränkten Rechten so einzurichten, dass sie nur bestimmte Dienste starten oder stoppen konnten

Um diese Probleme zu beheben, fungiert ‚‘'systemd'‚‘ auch als SELinux-Zugriffsmanager

  • Es kann das Label des Prozesses abrufen, der ‚‘'systemctl'‚‘ ausführt, oder des Prozesses, der eine D-Bus-Nachricht an ‚‘'systemd'‚‘ gesendet hat
  • Der Daemon sucht dann nach dem Label der Unit-Datei, die der Prozess konfigurieren wollte
  • Schließlich kann ‚‘'systemd'‚‘ Informationen vom Kernel abrufen, wenn die SELinux-Richtlinie den spezifischen Zugriff zwischen dem Prozess-Label und dem Unit-Datei-Label erlaubt
  • Das bedeutet, dass eine kompromittierte Anwendung, die für einen bestimmten Dienst mit ‚‘'systemd'‚‘ interagieren muss, nun durch SELinux eingeschränkt werden kann
  • Richtlinienentwickler können diese fein abgestimmten Steuerungen auch nutzen, um Administratoren einzuschränken

Die Richtlinienänderungen beinhalten eine neue Klasse namens ‚‘'service'‚‘, mit den folgenden Berechtigungen

class service
{
       start
       stop
       status
       reload
       kill
       load
       enable
       disable
}

Beispielsweise kann ein Richtlinienentwickler nun einer Domäne erlauben, den Status eines Dienstes abzurufen oder einen Dienst zu starten und zu stoppen, jedoch nicht, einen Dienst zu aktivieren oder zu deaktivieren

  • Zugriffskontrolloperationen in SELinux und ‚‘'systemd'‚‘ stimmen nicht in allen Fällen überein
  • Es wurde eine Zuordnung definiert, um ‚‘'systemd'‚‘-Methodenaufrufe mit SELinux-Zugriffsprüfungen abzugleichen
  • Tabelle 10.1, „Zuordnung von Methodenaufrufen in systemd-Unit-Dateien zu SELinux-Zugriffsprüfungen“, ordnet Zugriffsprüfungen für Unit-Dateien zu, während Tabelle 10.2, „Zuordnung von allgemeinen systemd-Systemaufrufen zu SELinux-Zugriffsprüfungen“, Zugriffsprüfungen für das System im Allgemeinen abdeckt
  • Wird in keiner der beiden Tabellen eine Übereinstimmung gefunden, wird die Systemprüfung „undefined“ aufgerufen
Zuordnung von systemd-Unit-Datei-Methodenaufrufen zu SELinux-Zugriffsprüfungen
systemd-Unit-Datei-Methode SELinux-Zugriffsprüfung
DisableUnitFiles disable
EnableUnitFiles enable
GetUnit status
GetUnitByPID status
GetUnitFileState status
Kill stop
KillUnit stop
LinkUnitFiles enable
ListUnits status
LoadUnit status
MaskUnitFiles disable
PresetUnitFiles aktivieren
ReenableUnitFiles aktivieren
Reexecute starten
Reload neu laden
ReloadOrRestart starten
ReloadOrRestartUnit starten
ReloadOrTryRestart starten
ReloadOrTryRestartUnit start
ReloadUnit reload
ResetFailed stop
ResetFailedUnit stop
Restart start
RestartUnit start
Start start
StartUnit start
StartUnitReplace start
Stop stop
StopUnit stop
TryRestart start
TryRestartUnit start
UnmaskUnitFiles enable
Zuordnung von Methodenaufrufen in systemd-Unit-Dateien zu SELinux-Zugriffsprüfungen
Methode in systemd-Unit-Datei SELinux-Zugriffsprüfung
DisableUnitFiles deaktivieren
EnableUnitFiles aktivieren
GetUnit Status
GetUnitByPID status
GetUnitFileState status
Kill stop
KillUnit stop
LinkUnitFiles enable
ListUnits status
LoadUnit status
MaskUnitFiles deaktivieren
PresetUnitFiles aktivieren
ReenableUnitFiles aktivieren
Reexecute starten
Reload neu laden
ReloadOrRestart starten
ReloadOrRestartUnit starten
Neu laden oder Neustart versuchen starten
Neu laden oder Neustart versuchen (Einheit) starten
Einheit neu laden neu laden
Zurücksetzen fehlgeschlagen stoppen
Zurücksetzen fehlgeschlagen (Einheit) stoppen
Neustart starten
Einheit neu starten starten
Start start
StartUnit start
StartUnitReplace start
Stop stop
StopUnit stop
TryRestart start
TryRestartUnit start
UnmaskUnitFiles enable

Zuordnung von allgemeinen systemd-Systemaufrufen zu SELinux-Zugriffsprüfungen

Allgemeiner systemd-Systemaufruf SELinux-Zugriffsprüfung
ClearJobs reboot
FlushDevices halt
Get status
GetAll status
GetJob status
GetSeat status
GetSession status
GetSessionByPID status
GetUser status
Halt halt
Introspect status
KExec reboot
KillSession halt
KillUser halt
ListJobs status
ListSeats status
ListSessions status
ListUsers status
LockSession halt
PowerOff halt
Reboot reboot
SetUserLinger halt
TerminateSeat halt
TerminateSession halt
TerminateUser halt
Zuordnung von allgemeinen systemd-Systemaufrufen zu SELinux-Zugriffsprüfungen
Allgemeiner systemd-Systemaufruf SELinux-Zugriffsprüfung
ClearJobs reboot
FlushDevices halt
Get status
GetAll status
GetJob status
GetSeat status
GetSession status
GetSessionByPID status
GetUser status
Halt halt
Introspect status
KExec reboot
KillSession halt
KillUser halt
ListJobs Status
ListSeats Status
ListSessions Status
ListUsers Status
LockSession Stopp
PowerOff Stopp
Reboot Neustart
SetUserLinger Stopp
TerminateSeat halt
TerminateSession halt
TerminateUser halt
SELinux-Richtlinie für einen Systemdienst

Mit dem Dienstprogramm ‚‘'sesearch'‚‘ können Sie Richtlinienregeln für einen Systemdienst auflisten

Beispielsweise gibt der Befehl ‚‘'sesearch -A -s NetworkManager_t -c service'‚‘ Folgendes zurück

allow NetworkManager_t dnsmasq_unit_file_t : service { start stop status reload kill load } ;
allow NetworkManager_t nscd_unit_file_t : service { start stop status reload kill load } ;

allow NetworkManager_t ntpd_unit_file_t : service { start stop status reload kill load } ;

allow NetworkManager_t pppd_unit_file_t : service { start stop status reload kill load } ;
allow NetworkManager_t polipo_unit_file_t : service { start stop status reload kill load } ;

SELinux und journald

In ‚‘'systemd'‚‘ ist der ‚‘'journald'‚‘ Daemon (auch bekannt als ‚‘'systemd-journal'‚‘) die Alternative zum ‚‘'syslog'‚‘ Dienst, einem Systemdienst, der Protokolldaten sammelt und speichert

  • Er erstellt und verwaltet strukturierte und indizierte Journale auf der Grundlage von Protokollinformationen, die vom Kernel, von Benutzerprozessen über die ‚‘'libc'‚‘ '‚'syslog()‘ -Funktion, aus der Standard- und Fehlerausgabe von Systemdiensten oder über seine native API empfangen werden
  • Er sammelt implizit zahlreiche Metadatenfelder für jede Protokollmeldung auf sichere Weise

Der ‚‘'systemd-journal'‚‘ -Dienst kann zusammen mit SELinux verwendet werden, um die Sicherheit zu erhöhen

  • SELinux kontrolliert Prozesse, indem es ihnen nur erlaubt, das zu tun, wofür sie vorgesehen sind; manchmal sogar noch weniger, je nach den Sicherheitszielen des Policy-Autors
  • Beispielsweise verhindert SELinux, dass ein kompromittierter ‚‘'ntpd'‚‘ -Prozess etwas anderes tut, als die Netzwerkzeit zu verwalten
  • Der ‚‘'ntpd'‚‘ -Prozess sendet jedoch ‚‘'syslog'‚‘ -Meldungen, sodass SELinux dem kompromittierten Prozess erlauben würde, diese Meldungen weiterhin zu senden
  • Der kompromittierte ‚‘'ntpd'‚‘ könnte ‚‘'syslog'‚‘-Meldungen so formatieren, dass sie denen anderer Daemons entsprechen, und damit möglicherweise einen Administrator irreführen oder, schlimmer noch, ein Dienstprogramm, das die ‚‘'syslog'‚‘ -Datei ausliest, dazu bringen, das gesamte System zu kompromittieren

Der ‚‘'systemd-journal'‚‘ -Daemon überprüft alle Protokollmeldungen und fügt ihnen unter anderem SELinux-Labels hinzu

  • So lassen sich Unstimmigkeiten in Protokollmeldungen leicht erkennen und Angriffe dieser Art verhindern, bevor sie stattfinden
  • Mit dem Dienstprogramm ‚‘'journalctl'‚‘ können Sie die Protokolle der ‚‘'systemd'‚‘ Journale abfragen
  • Wenn keine Befehlszeilenargumente angegeben werden, listet dieses Dienstprogramm den vollständigen Inhalt des Journals auf, beginnend mit den ältesten Einträgen
  • Um alle auf dem System erzeugten Protokolle anzuzeigen, einschließlich der Protokolle für Systemkomponenten, führen Sie ‚‘'journalctl'‚‘ als Root aus
  • Wenn Sie es als Nicht-Root-Benutzer ausführen, beschränkt sich die Ausgabe nur auf Protokolle, die sich auf den aktuell angemeldeten Benutzer beziehen
Beispiel

Auflisten von Protokollen mit ‚‘'journalctl'‚‘

Es ist möglich, ‚‘'journalctl'‚‘ zu verwenden, um alle Protokolle aufzulisten, die sich auf ein bestimmtes SELinux-Label beziehen

Beispielsweise listet der folgende Befehl alle Protokolle auf, die unter dem Label ‚‘'system_u:system_r:policykit_t:s0'‚‘ protokolliert wurden

sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
 

21. Okt. 10:22:42 localhost.localdomain polkitd[647]: polkitd Version 0.112 gestartet

 21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Regeln aus dem Verzeichnis /etc/polkit-1/rules.d werden geladen
 

21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Lade Regeln aus dem Verzeichnis /usr/share/polkit-1/rules.d

 21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Laden, Kompilieren und Ausführen von 5 Regeln abgeschlossen
 21. Okt. 10:22:44 localhost.localdomain polkitd[647]: Name org.freedesktop.PolicyKit1 auf dem Systembus abgerufen 21. Okt. 10:23:10 localhost polkitd [647]: Authentifizierungsagent für unix-session:c1 registriert (Systembus-Name: 1.49, Objektpfad /org/freedesktop/PolicyKit1/AuthenticationAgent, Locale en_US.UTF-8) (vom Bus getrennt)
 21. Okt. 10:23:35 localhost polkitd[647]: Authentifizierungsagent für unix-session:c1 abgemeldet (Systembusname :1.80 [/usr/bin/gnome-shell --mode=classic], Objektpfad /org/freedesktop/PolicyKit1/AuthenticationAgent, Locale en_US.utf8)

Weitere Informationen zu ‚‘'journalctl'‚‘ finden Sie auf der Manpage journalctl(1)