CKeditor verhindert private File-Downloads in Drupal7
Das Problem: Für eine Firmenwebsite soll eine Möglichkeit geschaffen werden, dass eingeloggte Kunden Beiträge schreiben können, an die sie Dateien (hier Sprachdateien in den Formaten mp3, wav u.a.) anhängen können. Diese Dateien sollten dann überarbeitet werden und die Arbeitsergebnisse wieder an den Beitrag agehängt werden, damit der Kunde sie sich wieder herunterladen kann. Da die Dateien natürlich vertraulich sind, soll jeder nur seine Dateien sehen und herunterladen können. Nach dem Einrichten des privaten Modus in Drupal kann zwar jeder seine Dateien hochladen und an die Beiträge hängen, aber keiner kann eine Datei herunterladen – nicht einmal der Admin! Stattdessen erscheint nur die Fehlermeldung "Zugriff verweigert. Sie haben keine Zugriffsberechtigung für diese Seite."
Zum besseren Verständnis: Drupal bietet zwei verschiedene Möglichkeiten, um Dateien – z.B. als Anhänge von Beiträgen – zum Download bereitzustellen. Die erste ist die sogenannte public (oder öffentliche) Methode. Hierbei werden die Dateien direkt vom Apache Webserver ausgeliefert. Der Vorteil ist, dass diese Methode schneller ist und auch bei größeren Zugriffszahlen ordenliche Leistung bietet. Der entscheidende Nachteil: Jeder, der die vollständige URL der Datei kennt, kann sie herunterladen – auch wenn er den Beitrag, an den sie angehängt ist, gar nicht lesen kann, weil er nicht die entsprechenden Rechte in Drupal besitzt.
Beispiel: Auf der Webseite www.die-firmenwebseite.de wird eine Datei namens interview.mp3 an einen Beitrag mit dem Titel "Das Interview" angehängt. Der Beitrag selbst ist nur für eingeloggte User sichtbar und nur diese sollen auch die Datei herunterladen bzw. anhören dürfen. Drupal speichert diese Datei nun im Verzeichneis ../sites/all/file/. Damit lautet der vollständige Pfad zu der Datei www.die-firmenwebseite.de/sites/all/files/interview.mp3. Wer nun in seinem Browser diese URL einträgt, bekommt die Datei zum Download oder zum Öffnen angeboten. Das ist aus Sicherheitsgründen natürlich völlig inakzeptabel!
Die zweite Methode, die private, löst dieses Sicherheitsproblem. Hier werden die Dateien von Drupal verwaltet und von diesem an den Webserver zur Auslieferung übergeben. Das Verzeichnis, in dem sie abgespeichert sind, wird mittels einer htaccess-Datei gesichert, so dass ein direkter Zugriff durch den Webserver (gilt für den Apache, andere Webserver verwenden ggf. andere Sicherungsmethoden) nicht mehr möglich ist. So kann man auch bei Kenntnis der URL die Datei nicht herunterladen.
Nach dem Einrichten trat dann jedoch das oben bereits geschilderte Phänomen auf, dass überhaupt kein User mehr in der Lage war, irgendeine der privaten Dateien herunterzuladen. Die Ursache lag in einer Einstellung im Drupalmodul CKeditor: Hier gibt es im Global Profile eine Option "Enable access to files located in the private folder ". Sie ist standardmäßig nach der Installation des Moduls deaktiviert und verhindert so jeglichen Zugriff auf Dateien innerhalb des privaten Dateisystems! Nachdem man die Option angekreuzt hat, funktioniert der Zugriff wie gewünscht.
Beachten sollte man noch den Sicherheitshinweis, dass CKeditor keiner Zugriffskontrolle zu den Dateien innerhalb des privaten Dateisystems besitzt. D.h. Dateien, die dort liegen und über die Drupal keinen Eintrag in seiner Datenbank hat, können bei Kenntnis der vollständigen URL von jedem berechtigten Benutzer des CKeditors eingesehen werden.