Security-Enhanced Linux für ThingWorx Docker verwenden
Security-Enhanced Linux (SELinux) ist ein Satz von Kernel-Änderungen und Tools für den Benutzerbereich, die verschiedenen Linux-Verteilungen hinzugefügt werden. Die SELinux-Architektur ermöglicht die Trennung der Erzwingung von Sicherheitsentscheidungen von der Sicherheitsrichtlinie und optimiert den Umfang an Software, die mit der Erzwingung von Sicherheitsrichtlinien verbunden ist. Die Schlüsselkonzepte, die SELinux zugrunde liegen, können von der United States National Security Agency (NSA) auf mehrere frühere Projekte zurückverfolgt werden.
SELinux-Benutzer und -Rollen müssen nicht mit den tatsächlichen Systembenutzern und -rollen verknüpft sein. Für jeden aktuellen Benutzer oder Prozess weist SELinux einen Kontext mit drei Zeichenfolgen zu, der einen Benutzernamen, eine Rolle und eine Domäne (oder einen Typ) umfasst. Dieses System ist flexibler als normalerweise erforderlich. In der Regel verwenden die meisten echten Benutzer denselben SELinux-Benutzernamen, und die gesamte Zugriffssteuerung wird über das dritte Tag, die Domäne, verwaltet. Sie müssen die Umstände für das Zulassen eines Prozesses in einer bestimmten Domäne in den Richtlinien konfigurieren. Obwohl Sie den Befehl runcon verwenden können, um einen Prozess in einem explizit angegebenen Kontext (Benutzer, Rolle und Domäne) zu starten, kann SELinux den Übergang verweigern, wenn er nicht durch die Richtlinie genehmigt wird.
Dateien, Netzwerkports und andere Hardware haben auch einen SELinux-Kontext, der einen Namen, eine Rolle (selten verwendet) und einen Typ umfasst. Im Falle von Dateisystemen wird die Zuordnung zwischen Dateien und Sicherheitskontexten als Beschriftung bezeichnet. Die Beschriftung ist in Richtliniendateien definiert, Sie können sie jedoch auch manuell anpassen, ohne die Richtlinien zu ändern. Hardwaretypen werden ebenfalls angegeben, beispielsweise bin_t (alle Dateien im Ordner /bin) oder postgresql_port_t (PostgreSQL-Port, 5432). Sie können den SELinux-Kontext für ein Remote-Dateisystem explizit zur Bereitstellungszeit angeben.
SELinux fügt den -Z-Switch den Shell-Befehlen ls, ps und einigen anderen hinzu, sodass der Sicherheitskontext der Dateien oder des Prozesses angezeigt werden kann.
In der Regel bestehen Richtlinienregeln aus expliziten Berechtigungen, z.B. welche Domänen der Benutzer besitzen muss, um bestimmte Aktionen für das angegebene Ziel ausführen zu können. Beispiele für diese Aktionen sind lesen, ausführen und – im Falle von Netzwerk-Ports – binden oder verbinden. Auch komplexere Zuordnungen, die Rollen und Sicherheitsebenen umfassen, sind möglich.
Eine typische Richtlinie besteht aus einer Zuordnungsdatei (Beschriftungsdatei), einer Regeldatei und einer Schnittstellendatei, die den Domänenübergang definieren. Diese drei Dateien müssen mit den SELinux-Tools kompiliert werden, um eine einzelne Richtliniendatei zu erstellen. Die resultierende Richtliniendatei kann in den Kernel geladen werden, sodass sie aktiv wird. Das Laden und Entladen von Richtlinien erfordert keinen Neustart. Die Richtliniendateien werden entweder manuell entwickelt oder können aus dem benutzerfreundlicheren SELinux-Verwaltungstool generiert werden. Diese Dateien werden in der Regel zuerst im freizügigen Modus getestet, in dem Verstöße protokolliert werden, aber zulässig sind. Sie können später das audit2allow-Tool verwenden, um zusätzliche Regeln zur Erweiterung der Richtlinie zu erstellen und alle legitimen Aktivitäten der eingeschränkten Anwendung zuzulassen.
Häufige SELinux-Probleme
Das häufigste Problem bei SELinux besteht darin, dass die Berechtigung verweigert wird, was darauf hinweist, dass SELinux nicht funktioniert. Fehlermeldungen aufgrund von verweigerter Berechtigung werden angezeigt, wenn Sie versuchen, auf ein Systemobjekt zuzugreifen, das dem Programm oder den Benutzeranmeldeinformationen, die Sie für den Zugriff auf dieses Objekt verwenden, nicht zugeordnet ist. Diese Fehler sind schwierig zu lösen. Es gibt jedoch Tools, die Ihnen bei der Problembehandlung behilflich sein können.
Installieren von Setools und Setroubleshoot
So installieren Sie diese Tools auf Ihrem System:
1. Melden Sie sich über ein Konto mit Administratorrechten bei Ihrem Server oder Desktop an.
2. Öffnen Sie eine Command Shell.
3. Installieren Sie setroubleshoot-Pakete mit Yum:
yum install setroubleshoot setools
SELinux-Warnungen
Verwenden Sie das sealert-Tool, um das von SELinux verwendete Überwachungsprotokoll zu analysieren. Dieses Tool scannt die Protokolldatei und den Bericht und generiert dann einen Bericht mit allen festgestellten SELinux-Problemen.
Um sealert über die Befehlszeile auszuführen, verweisen Sie es auf das SELinux-Überwachungsprotokoll. Siehe das folgende Beispiel:
sealert -a /var/log/audit/audit.log
In einem Bericht wird jedes Problem beschrieben, und es wird erläutert, wie es gelöst wird. Nachfolgend sehen Sie ein gekürztes Beispiel für die Ausgabe, die von sealert generiert wurde:
100% done found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing /usr/sbin/httpd from getattr access on the file
/myapps/app1/html/index.html.
***** Plugin catchall_labels (83.8 confidence) suggests ********************
If you want to allow httpd to have getattr access on the index.html file
Then you need to change the label on /myapps/app1/html/index.html
Do
# semanage fcontext -a -t FILE_TYPE '/myapps/app1/html/index.html'
where FILE_TYPE is one of the following: sssd_var_lib_t, public_content_t, anon_inodefs_t,
[..truncated..]
httpd_sys_ra_content_t, httpd_sys_rw_content_t, httpd_sys_rw_content_t,
httpd_w3c_validator_content_t.
Then execute:
restorecon -v '/myapps/app1/html/index.html'
***** Plugin catchall (17.1 confidence) suggests ***************************
If you believe that httpd should be allowed getattr access on the index.html file by
default. Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
Der wichtigste Teil des Berichts mit der Erläuterung der Problemlösung wird am Ende jeder Warnung angezeigt. Der obige Bericht zeigt z.B. die folgende Lösung:
If you believe that httpd should be allowed getattr access on the index.html file by
default. Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
Die vorgeschlagene Lösung erstellt eine SELinux-Richtlinie, die auf die problematische Datei angewendet wird. In diesem Beispiel wurde einer HTML-Datei der falsche SELinux-Dateikontext zugewiesen.
Im Folgenden finden Sie weitere Beispiele für mögliche Probleme mit den ThingWorx Docker-Containern.
Dieses Beispiel zeigt ein Problem mit PostgreSQL. In diesem Fall erzeugt sealert die folgende Warnung:
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing /bin/chown from setattr access on the directory data.
***** Plugin catchall_labels (83.8 confidence) suggests *******************
If you want to allow chown to have setattr access on the data directory
Then you need to change the label on data
Do
# semanage fcontext -a -t FILE_TYPE 'data'
where FILE_TYPE is one of the following: cgroup_t, nfs_t, svirt_home_t,
svirt_sandbox_file_t.
Then execute:
restorecon -v 'data'

***** Plugin catchall (17.1 confidence) suggests **************************
If you believe that chown should be allowed setattr access on the data directory by
default. Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'chown' --raw | audit2allow -M my-chown
# semodule -i my-chown.pp

Additional Information:
Source Context system_u:system_r:svirt_lxc_net_t:s0:c459,c1008
Target Context unconfined_u:object_r:usr_t:s0
Target Objects data [ dir ]
Source chown
Source Path /bin/chown
Port <Unknown>
Host <Unknown>
Source RPM Packages
Target RPM Packages
Policy RPM selinux-policy-3.13.1-166.el7_4.9.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name ip-10-99-0-109.ec2.internal
Platform Linux ip-10-99-0-109.ec2.internal
3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20
20:32:50 UTC 2017 x86_64 x86_64
Alert Count 9
First Seen 2018-04-02 17:08:08 UTC
Last Seen 2018-04-02 17:08:27 UTC
Local ID 65bb52e5-bde9-4ec5-ba44-f0752ffef319
Raw Audit Messages
type=AVC msg=audit(1522688907.927:619): avc: denied { setattr } for pid=12142
comm="initdb" name="data" dev="nvme0n1p1" ino=826278009 scontext=system_u:system_r:
svirt_lxc_net_t:s0:c459,c1008 tcontext=unconfined_u:object_r:usr_t:s0 tclass=dir

type=SYSCALL msg=audit(1522688907.927:619): arch=x86_64 syscall=chmod success=no
exit=EACCES a0=5633eefb7310 a1=1c0 a2=0 a3=7f3c78d1d6a0 items=0 ppid=12116 pid=12142
auid=4294967295 uid=1001 gid=0 euid=1001 suid=1001 fsuid=1001 egid=0 sgid=0 fsgid=0
tty=(none) ses=4294967295 comm=initdb exe=/usr/lib/postgresql/9.4/bin/initdb
subj=system_u:system_r:svirt_lxc_net_t:s0:c459,c1008 key=(null)
Hash: chown,svirt_lxc_net_t,usr_t,dir,setattr
Dieser Bericht zeigt die folgende vorgeschlagene Lösung:
If you want to allow chown to have setattr access on the data directory
Then you need to change the label on data
Do
# semanage fcontext -a -t FILE_TYPE 'data'
where FILE_TYPE is one of the following: cgroup_t, nfs_t, svirt_home_t,
svirt_sandbox_file_t.
Then execute:
restorecon -v 'data'
Es folgt der Befehl, den Sie eingeben würden, um diese Lösung zu implementieren:
semanage fcontext -a -t svirt_sandbox_file_t "/opt/postgresql-storage(/.*)?" restorecon -R /opt/postgresql-storage
Beachten Sie, dass die vorgeschlagene Lösung darin bestand, die Berechtigungen nur auf den Datenordner für PostgreSQL anzuwenden. Da Sie jedoch Schreibzugriff für den ThingWorx Tablespace benötigen, müssen Sie allen Elementen in diesem Ordner dieselben Berechtigungen gewähren.
Dieses Beispiel zeigt ein Problem mit der ThingWorx Plattform. In diesem Fall erzeugt sealert die folgende Warnung:
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing /bin/mv from write access on the directory ThingworxStorage.
***** Plugin catchall_labels (83.8 confidence) suggests *******************
If you want to allow mv to have write access on the ThingworxStorage directory
Then you need to change the label on ThingworxStorage
Do
# semanage fcontext -a -t FILE_TYPE 'ThingworxStorage'
where FILE_TYPE is one of the following: cgroup_t, container_var_lib_t, nfs_t,
svirt_home_t, svirt_sandbox_file_t, tmpfs_t, virt_home_t.
Then execute:
restorecon -v 'ThingworxStorage'

***** Plugin catchall (17.1 confidence) suggests **************************
If you believe that mv should be allowed write access on the ThingworxStorage
directory by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'mv' --raw | audit2allow -M my-mv
# semodule -i my-mv.pp

Additional Information:
Source Context system_u:system_r:svirt_lxc_net_t:s0:c320,c876
Target Context unconfined_u:object_r:usr_t:s0
Target Objects ThingworxStorage [ dir ]
Source mv
Source Path /bin/mv
Port <Unknown>
Host <Unknown>
Source RPM Packages
Target RPM Packages
Policy RPM selinux-policy-3.13.1-166.el7_4.9.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name ip-10-99-0-109.ec2.internal
Platform Linux ip-10-99-0-109.ec2.internal
3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20
20:32:50 UTC 2017 x86_64 x86_64
Alert Count 13
First Seen 2018-04-02 17:13:18 UTC
Last Seen 2018-04-02 17:13:23 UTC
Local ID 1759a007-f347-4d80-99e8-ee414eae7602
Raw Audit Messages
type=AVC msg=audit(1522689203.86:708): avc: denied { write } forpid=14905
comm="java" name="ThingworxStorage" dev="nvme0n1p1" ino=864027929
scontext=system_u:system_r:svirt_lxc_net_t:s0:c320,c876
tcontext=unconfined_u:object_r:usr_t:s0 tclass=dir

type=SYSCALL msg=audit(1522689203.86:708): arch=x86_64 syscall=mkdir success=no
exit=EACCES a0=7f6480f76e80 a1=1ff a2=7f6480f76e80 a3=b items=0 ppid=14734
pid=14905 auid=4294967295 uid=1337 gid=1337 euid=1337 suid=1337 fsuid=1337
egid=1337 sgid=1337 fsgid=1337 tty=(none) ses=4294967295 comm=java exe=/opt/
jdk1.8.0_121/bin/java subj=system_u:system_r:svirt_lxc_net_t:s0:c320,c876 key=(null)
Hash: mv,svirt_lxc_net_t,usr_t,dir,write
Dieser Bericht zeigt die folgende vorgeschlagene Lösung:
# semanage fcontext -a -t FILE_TYPE 'ThingworxStorage'
where FILE_TYPE is one of the following: cgroup_t, container_var_lib_t, nfs_t,
svirt_home_t, svirt_sandbox_file_t, tmpfs_t, virt_home_t.
Then execute:
restorecon -v 'ThingworxStorage'
Nachfolgend finden Sie den Befehl, mit dem Sie diese Lösung implementieren:
semanage fcontext -a -t svirt_sandbox_file_t "/opt/thingworx-storage(/.*)?"
restorecon -R /opt/thingworx-storage
War dies hilfreich?