Artikel

SQLite Datenbanken absichern

SQLite ist, als Alternative zu MySQL, seit PHP 5.0 in PHP enthalten. Dieser Artikel beschreibt, wie man SQLite Datenbankdateien in seinem Webspace vor Zugriff von Aussen schützen kann.

Das Problem

Im Gegensatz zu MySQL oder PostgreSQL handelt es sich bei SQLite um keinen Datenbankserver im engeren Sinne, der über TCP/IP angesprochen wird, sondern um eine dateibasierte Datenbank, ähnlich wie MS Access. Aus diesem Grund gibt es auch keine Zugriffkontrolle wie bei MySQL. Jeder der auf eine SQLite Datenbankdatei zugreifen kann, kommt auch an deren Inhalt. In Webumgebungen kann dies ein großes Problem sein. Auf der einen Seite muß die PHP Applikation die Möglichkeit haben, nicht nur lesend, sondern auch schreibend auf die Datenbankdatei zuzugreifen, auf der anderen Seite soll niemand der Webseitenbesucher auch nur lesenden Zugriff auf die Datenbankdatei haben oder diese herunter laden können. Die hier beschriebenen Lösungsansätze basieren alle auf der Annahme, das es sich um einen Webserver auf einem unixartigen Betriebssystem, wie z. B. Linux oder FreeBSD handelt.

Lösungsansatz 1: PHP als CGI

Am einfachsten läßt sich dies lösen, wenn PHP als CGI arbeitet. In diesem Fall läuft ein PHP-Script mit den gleichen Rechten, wie der Benutzer, der das Script angelegt hat. Der Webserver hingegen läuft im Normalfall mit einer anderen Benutzerkennung, beim Apache z. B. häufig wwwrun oder auch nobody. In diesem Fall kann man die Datenbankdatei sehr gut schützen, in dem man allen anderen Benutzern ausser einem selbst jegliche Rechte auf die Datei entzieht. Dies entspräche dem oktalen Zugriffmodus 0600 (bzw. -rw-------) für die einzelne Datei. Für ein Verzeichnis welches nur Datenbankdateien enthält und auf das man diesen Zugriffsschutz anwenden will müßte man 0700, bzw. drwx------, vergeben.

Lösungsansatz 2: PHP als Apachemodul

Etwas komplizierter wird es leider, wenn PHP als Modul des Apache konfiguriert ist, was generell aus Sicherheitsgründen in Shared Webhosting Umgebungen nicht sehr ratsam ist. Sollte man auf einem Shared Webhosting-System als ein Benutzer von vielen PHP als Apache-Modul nutzen, so kann man diese Lösung leider nur umsetzen, wenn dabei der Webhoster mitmacht. Ist man selbst Herr (root) über das System, so ist diese Lösung jedoch ein problemlos gangbarer Weg.

Wenn PHP als Modul des Apache läuft, ist es eng mit diesem verzahnt und läuft daher auch unter der Benutzerkennung des Apache. PHP darf also nur auf die Dateien zugreifen, auf die auch der Apache zugreifen darf. Dies sind jedoch leider auch genau die Dateien, auf die auch Webseitenbesucher zugreifen können. In diesem Fall liegt daher die Lösung in einer kleinen Umkonfiguration des Apache. Dazu muß in der httpd.conf innerhalb einer Directory-Direktive folgendes eingetragen werden:


<Files ~ "\.sqlite$">
Order allow,deny
Deny from all
</Files>


Die Directory-Direktive in der dies steht sollte dabei jene Verzeichnise betreffen, in denen SQLite-Datenbanken vorkommen. Die SQLite-Datenbanken müssen jetzt nur noch alle die Endung .sqlite haben (die Kleinschreibung ist dabei zwingend). Alle Dateien mit dieser Endung werden dadurch nicht mehr vom Apache ausgeliefert. Damit auf der anderen Seite Schreibrecht für PHP auf die Datenbank besteht, sollte noch der Besitzer oder die Gruppe der Datei auf die Apache-Benutzerkennung, bzw. die Gruppe des Apache geändert werden und dann auf diesen Benutzer, bzw. diese Gruppe Schreibrecht gewährt werden. So vermeidet man Schreibrecht für jedermann auf die Datei.

Autor des Artikels: René Maroufi, php2009@maroufi.net

Zurück

Nach Oben
Newsletter

Wenn Sie stets über Updates meiner Scripte informiert werden wollen, können Sie den Newsletter bestellen. Der Newsletter informiert ausschließlich nur über das neueste zu meinen PHP-Scripts und erscheint daher unregelmäßig, je nachdem wie häufig es Updates gibt.

Wenn Sie den Newsletter bekommen wollen, können Sie sich hier eintragen:

Ihre E-Mailadresse:

Aus dem Newsletter wieder austragen.

Valid XHTML 1.0

Wer macht diese Seite?

© php.maroufi.net 2009