CentOS 7 - Verzeichnisse, die über VSFTPD erstellt wurden und keine SELinux-Kontexte erben

8

Unser Unternehmen verfügt über einen Webserver mit CentOS 7 und unsere Kunden verwalten ihre Websites über FTP (vsftpd). SELinux befindet sich im Durchsetzungsmodus.

Das Problem ist, dass über VSFTPD erstellte / hochgeladene Daten nicht den entsprechenden SELinux-Kontext erben. Lassen Sie mich erklären.

Für WordPress-Sites verfügt der Server beispielsweise bereits über einige Regeln, die mithilfe folgender Regeln angezeigt werden können semanage fcontext -l |grep '/var/www':

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0

Wenn ich also eine WordPress-Site kopiere, sagen wir von einem anderen Server in ein Verzeichnis /var/www/html/von SSH, die Ordner wp-content/und wp-content/uploads/den richtigen httpd_sys_rw_content_tSicherheitskontext. Wenn diese Ordner jedoch über FTP erstellt werden, erhalten sie den Kontext httpd_sys_content_t(no rw ). Dies bedeutet, dass die Websites, die unsere Kunden auf den Server hochladen, nicht in diese Verzeichnisse schreiben können, selbst wenn sie dem Apache-Benutzer / der Apache-Gruppe Schreibberechtigungen erteilen, sodass der WordPress-Administrator nicht funktioniert. Wenn sie eine Website hochladen, müssen sie uns um Unterstützung bitten, um dies zu beheben. Dies ist Zeitverschwendung für alle Beteiligten.

Nehmen wir an, der Kunde hat seine Website in hochgeladen httpdocs. Wenn mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -frdas Problem durch SSH behoben wird, ist an den Daten nichts auszusetzen.

Ich kann auch tun restorecon -Rv httpdocs/, um das Problem zu beheben.

Die Frage ist also: Wie kann ich die über VSFTPD erstellten / hochgeladenen Verzeichnisse die richtigen SELinux-Kontexte erben lassen, so wie sie geerbt werden, wenn die Verzeichnisse über SSH erstellt / hochgeladen werden?

Juan Pablo Barrios
quelle
Aus Sicherheitsgründen ist es eine schlechte Idee, FTP überhaupt zu unterstützen. Ziehen Sie in Betracht, es loszuwerden und Kunden anzuweisen, wie sie ihre Dateiübertragungsclients so konfigurieren sollen, dass stattdessen SFTP verwendet wird ... wodurch auch dieses Problem behoben wird.
Michael Hampton
Danke Michael. Ich stimme Ihnen zu, aber in unserem Fall verwenden wir "ftp.domain.com" nicht für unsere Kunden und legen auch nicht die öffentliche IP-Adresse des Servers offen (Server befindet sich hinter dem NginX-Proxy), sodass die FTP-Sicherheit kein Problem darstellt für uns. Nur diejenigen, an die wir die FTP-Adresse senden, können sogar die IP-Adresse des Servers finden, um eine Verbindung über FTP herzustellen.
Juan Pablo Barrios

Antworten:

6

Es gibt einen Unterschied zwischen der Standardbeschriftung zur Laufzeit und der auf regulären Ausdrücken basierenden Nachbeschriftungsrichtlinie, die auf dem Server gilt.

Was Sie hier bemerken:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0

Ist die Post-Labeling-Richtlinie.

Was Sie in Ihrem Problem besprechen, bezieht sich tatsächlich auf die Laufzeitrichtlinie.

Wenn ein Eintrag in einem Verzeichnis mit SELinux erstellt wird, werden die Regeln für die Bezeichnung der Datei oder des Verzeichnisses nicht durch die von Ihnen zitierten regulären Ausdrücke bestimmt, sondern durch andere Regeln wie folgt (ich glaube, dies ist die richtige Reihenfolge, hat aber möglicherweise etwas übersehen). .

  1. Es gibt eine explizit benannte type_transitionRegel.
  2. Es gibt eine explizite nicht benannte type_transitionRegel.
  3. Erben Sie denselben Kontext wie das übergeordnete Verzeichnis.
  4. Wenden Sie die an default_context.

Wenn ich also eine WordPress-Site von einem anderen Server in ein Verzeichnis in / var / www / html / von SSH kopiere, haben die Ordner wp-content / und wp-content / uploads / den richtigen Sicherheitskontext httpd_sys_rw_content_t.

Also, ja, das tut es, aber nicht aus dem Grund, den Sie denken. Sicherlich nicht wegen der Post-Labeling-Richtlinie.

Dies liegt daran, dass eine bestimmte benannte type_transitionRegel vorhanden ist, die dieses Verhalten bereitstellt.

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 

Das heißt im Grunde.

  • Wenn du bist unconfined_t und
  • Wenn Sie eine Aktion im Zieltyp und ausführenhttpd_sys_content_t
  • Wenn die Klasse des neuen Eintrags ein Verzeichnis ist und
  • Wenn der Name des neuen Eintrags "Uploads" lautet, dann
  • Der neue Typ ist httpd_sys_rw_content_t

Der Grund, warum dies für SSHD funktioniert, ist, dass Sie nach dem Anmelden den Quellkontext erhalten, unconfined_tfür den diese Regel gilt.

Dies funktioniert für den FTP-Dienst nicht, da der Quellkontext dieses Dienstes höchstwahrscheinlich ftpd_tkeine Übereinstimmungsregel enthält.

Daher müssen Sie die Richtlinie ändern, um das Verhalten von SELinux zu ändern und auch die benannten Dateiregeln zu berücksichtigen, die Sie auch in den anderen Einträgen für FTP sehen.

Zumindest in Fedora 23 gibt es eine Schnittstelle, um dies zu ermöglichen. Ein Richtlinienmodul wie dieses würde dies tun.

policy_module(local_ftpd, 7.2.0)

require {
  type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)

Sie können dies laden, indem Sie sicherstellen, dass das selinux-policy-develPaket installiert ist und ausgeführt wird make -f /usr/share/selinux/devel/Makefile load.

Matthew Ife
quelle
1
Hallo Matthew, das hat den Trick gemacht !! Vielen Dank für Ihre Hilfe, da ich damit verrückt geworden bin. Ich war mir nicht sicher, was ich mit dem von Ihnen geschriebenen Richtlinienmodul tun soll, da ich SELinux noch nie angepasst hatte. Deshalb habe ich ein bisschen gegoogelt und Folgendes getan: Ich habe die Datei local_ftpd.temit Ihrem Richtlinienmodul erstellt, dann habe ich es getan make -f /usr/share/selinux/devel/Makefile local_ftpd.ppund dann semodule -i local_ftpd.pp. Ist das ok? Jetzt erben die über FTP erstellten Dateien die gewünschten Kontexte. Danke noch einmal!
Juan Pablo Barrios