kaepten: Sicherheit für (PDF-)Dateien in einem Verzeichnis

Hallo Self-Freunde

Ich mache mir gerade über die Zugriffsicherheit von PDF Dateien in einem Folder meines Webservers Gedanken.

Es ist so, dass ich einen Satz von 10 an PDF's habe, davon aber nur 5 für die allgemeine Öffentlichkeit bestimmt sind. Ein "Sicherheitskonzept" muss her. Nur welches?

Die Liste mit den PDF-Links wird dynamisch erzeugt, ich kann die 5 Stück die nicht aufrufbar sein sollen einfach nicht anzeigen. Was aber wenn ein "Kunde" den Folder direkt ansurft, oder halt einen Link bekommt der auf ein PDF in diesem Folder zeigt?

Ich stelle mir zwei Konzepte vor:
1. Der Webserver / Dateisystem verwaltet die Sicherheit
2. Ich verwalte die Sicherheit applikatorisch indem der Folder generell geschützt ist gegen aussen und ich die Dateien durch die Applikation "streamen" lasse.

Geht das mit dem Punkt 1 (ich kenn mich da zu wenig aus)? Welches ist die einfachere Variante? Auf welche Punkte kommt es noch an? Gibt es noch einfachere Möglichkeiten?

Vielen Dank für Ideen und Anregugen
kaepten

  1. Hi,

    HTTP ist nicht dazu ausgelegt Berechtigungen zu verwalten. Sicherlich kannst Du über .htaccess Dateien einiges Regeln. Aber das würde dann so aussehen:

    Struktur:
    /documents/pdf/global <= Hier alle öffentlichen Dokumente
    /documents/pdf/secure <= Hier alle geschützten Dokumente

    Problem hierbei ist:
    Du kannst den Zugriff immer nur für das ganze Verzeichnis gewähren / verweigern. Daher auch die Aufteilung in 2 Verzeichnisse.

    Ich halte das nicht für wirklich sinnvoll.
    Andere Idee:

    Erstell Dir ein User-Verwaltungssystem mit Loginbereich für die User. Dann hast Du die Authentifizierung der User in der DB.

    Nun kannst Du Dir für alle Dokumente ein Berechtigungssystem wie im System aufbauen (User, Gruppenabhängig).

    Die Dokumente legst Du alle _oberhalb_ des DocumentRoots ab, so dass das Verzeichnis nicht über eine URL "erreichbar" ist, oder Du schützt es vor ALLEN Zugriffen via .htaccess (Vielleicht mit Ausnahme von einem Account für Dich ;o)). Die Liste mit den PDF-Downloads verlinkst Du dann auf eine Datei "pdf_download.php?fileid=xy". Diese geht dann über das Filesystem und liest die PDF-Datei ein und gibt sie mittels entsprechenden HEADER aus.

    Das ist denke ich dann Bombenfest ;o)
    Also ohne Auth in Deiner erstellten Userverwaltung kommt dann keiner an ein Dokument ran, sei denn Du erlaubst es (Standarduser / -gruppe)

    Gruss
    Stefan

    1. Hallo Stefan

      Danke für die ausführliche Antwort.

      Andere Idee:

      Die Dokumente legst Du alle _oberhalb_ des DocumentRoots ab, so dass das Verzeichnis nicht über eine URL "erreichbar" ist, oder Du schützt es vor ALLEN Zugriffen via .htaccess (Vielleicht mit Ausnahme von einem Account für Dich ;o)). Die Liste mit den PDF-Downloads verlinkst Du dann auf eine Datei "pdf_download.php?fileid=xy". Diese geht dann über das Filesystem und liest die PDF-Datei ein und gibt sie mittels entsprechenden HEADER aus.

      Wie erwähnt versteh ich davon zu wenig. Versteh ich das richtig, dass ich ein Folder soweit abriegeln kann, dass nur z.B. PHP auf den Folder zugreifen kann?

      kaepten

      1. Hallo,

        er meint, die Dateien _außerhalb_ des webverzeichnisses zu lagern, sprich wenn wir jetzt mal davon ausgehen, dein webverzeichnis wäre /user/local/www/, bzw. aus sicht des webservers einfach nur / (root), dann könntest du die dateien z.B. in einem ordner /usr/local/pdf lagern. dieser ordner ist über den webserver nicht zu erreichen, da er aus sicht des webservers _über_ dem root verzeichnis liegt. php wiederum als serverseitiges scripting kann dateien aus dem gesamten dateisystem auslesen, sprich auch aus /usr/local/pdf.

        du kannst so also die dateien außerhalb des zugriffs bereiches des webservers lagern. damit sind sie defeinitv über URL _nicht_ erreichbar.
        nun schreibst du ein download php script, welches dann z.B. über download.php?file=xyz.pdf aufgerufen wird. das php script weiß, oder kriegt mittgeteilt, wo sich datei xyz.pdf befindet, liest sie aus dem dateisystem aus, und überträgt sie. auf diese art und weise sind bestimmst du, welche der pdfs vom web aus aufgerufen werden können.

        wenn dir kein zugriff auf andere verzeichnisse als dein webserver verzeichniss zur verfügung steht, gibt es auch die möglichkeit, den kompletten ordner via .htaccess zu sichern, und die pdf die öffentlich sind, genau wie bei der anderen lösung zu übertragen, da php übers dateisystem drankommt, nicht jedoch der user übers http protokoll.

        Ich hoffe, das war halbwegs verständlich (woran ich ehrlich gesagt meine zweifel hab)

        Lange rede kurzer sinn:

        es gibt tausend möglichkeiten des restriktiven zugriffs, allerdinsg eine generelle frage, wenn niemand auf diese 5 pdfs zugreifen können soll, _wieso_ stellst du sie dann ins inet? :o)

        Gruß

        Phil

        1. hoi Phil

          Ich hoffe, das war halbwegs verständlich (woran ich ehrlich gesagt meine zweifel hab)

          Klaro, hab durchaus verstanden, Danke für die ausführlichen Erklärungen!

          Das mit dem PHP wäre dann so, dass ich an den Client einen (selbst geschriebenen) POST-Request losschicke, also Header und dann die Datei streame?

          es gibt tausend möglichkeiten des restriktiven zugriffs, allerdinsg eine generelle frage, wenn niemand auf diese 5 pdfs zugreifen können soll, _wieso_ stellst du sie dann ins inet? :o)

          Es wäre ja nicht so dass ich mir darüber keine Gedanken gemacht hätte. Logischerweise gibts zwei Benutzergruppen. Der "Poweruser" kommt an den ganzen Satz von 10 PDF's ran. (Das Beispiel ist eh exemplarisch. 1. Gibts einige PDF's mehr und 2. gibts auch mehr als zwei unterschiedliche Benutzergruppen!)

          kaepten

          1. Moin,

            Das mit dem PHP wäre dann so, dass ich an den Client einen (selbst geschriebenen) POST-Request losschicke, also Header und dann die Datei streame?

            äh, ja, inetwa, wie du das wirklich lößt, bleibt ganz dir überlassen.

            wenn du möglichkeit zwei bevorzugst, also dateien schon im webverzeichnis, aber durhc .htaccess geschützt, ja.

            die eigentlich aufgerufene url ist die der php datei. diese streamed dann das pdf. nicht vergessen natürlich, wie du schon geschrieben hast, den header.

            also alles in allem, kein prob.

            Wie genau sich das unter windows und iis verhält, kann ich dir nicht sagen, auch wenn man heutzutage aufpassen muss, nicht gleich als radikal hingestellt zu werden, ich bin apache unter linux nutzer ;)

            Gruß

            Phil

            1. Hoi Phil

              Wie genau sich das unter windows und iis verhält, kann ich dir nicht sagen, auch wenn man heutzutage aufpassen muss, nicht gleich als radikal hingestellt zu werden, ich bin apache unter linux nutzer ;)

              Ich benutze beide Systeme: für mich gibts reinen Pragmatismus - Idealismus liegt mir im technischen Bereich fern. Soweit wäre das geklärt :-))

              Es geht mir ja rein ums Konzept. Ich werds auch nicht mit PHP machen, sondern mit ASP.NET. Doch die Konzepte dahinter sind für diese Problemstellung bei beiden Scripten die gleichen!

              cheers und Danke für die Antworten.
              kaepte

  2. Hallo,

    Ich mache mir gerade über die Zugriffsicherheit von PDF Dateien in einem Folder meines Webservers Gedanken.

    Betriebssystem, Server, verwendetes Dateisystem?

    Gruss
    Thomas

    1. Hoi Thomas

      Betriebssystem, Server, verwendetes Dateisystem?

      Win2000/Win2003, IIS, NTFS

      Das soweit ich informiert bin, auf jeden Fall ist es ein Windows 2000 Umfeld mit IIS. (Nun aber bitte keine Sprüche von wegen "Sicherheit", es ist nun mal so gegeben.)

      kaepten

      1. Hallo,

        Betriebssystem, Server, verwendetes Dateisystem?
        Win2000/Win2003, IIS, NTFS
        Das soweit ich informiert bin, auf jeden Fall ist es ein Windows 2000 Umfeld mit IIS. (Nun aber bitte keine Sprüche von wegen "Sicherheit", es ist nun mal so gegeben.)

        Tja, da muss ich passen, denn damit kenne ich mich nicht aus. Unter *nix mit Apache haettest Du die Zugriffsrechte des Dateisystems ausnutzen koennen (was der Apache nicht lesen darf, kann er auch nicht ausliefern). Inwieweit Du das mit NTFS (das ja auch eine Rechteverwaltung hat) nachbauen kannst, muss Dir jemand sagen, der sich damit besser auskennt.

        Gruss
        Thomas