karlo: mit PHP apache log-file auslesen?

Hallo,
ich würde gern irgendwie (am besten mit PHP) mein log file vom Apache auslesen. Dazu habe ich folgenede Code-Zeile:

<?php
$handle = fopen ("/var/log/apache/access.log", "r");
?>

Wenn ich das nun aufrufe kommt folgende Fehlermeldung:
Warning: fopen(/var/log/apache/access.log): failed to open stream: Permission denied

Was mache ich falsch? Muss/kann ich die Rechte ändern? Oder "darf" man das nicht, weil sonst *jeder* das log-file sehen könnte?

danke, karlo

  1. Hello,

    Hallo,
    ich würde gern irgendwie (am besten mit PHP) mein log file vom Apache auslesen. Dazu habe ich folgenede Code-Zeile:

    <?php
    $handle = fopen ("/var/log/apache/access.log", "r");
    ?>

    Wenn ich das nun aufrufe kommt folgende Fehlermeldung:
    Warning: fopen(/var/log/apache/access.log): failed to open stream: Permission denied

    Was mache ich falsch? Muss/kann ich die Rechte ändern? Oder "darf" man das nicht, weil sonst *jeder* das log-file sehen könnte?

    Zur Beantwortung der Frage müsstest Du uns erst noch etwas mehr über Deine Beziehung zum Server mitteilen...
    Ist es Deiner? Hast Du eine Konsole dafür?

    Oder bist Du bei einem Hoster untergebracht?

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hello,

      Hallo,
      ich würde gern irgendwie (am besten mit PHP) mein log file vom Apache auslesen. Dazu habe ich folgenede Code-Zeile:

      <?php
      $handle = fopen ("/var/log/apache/access.log", "r");
      ?>

      Wenn ich das nun aufrufe kommt folgende Fehlermeldung:
      Warning: fopen(/var/log/apache/access.log): failed to open stream: Permission denied

      Was mache ich falsch? Muss/kann ich die Rechte ändern? Oder "darf" man das nicht, weil sonst *jeder* das log-file sehen könnte?

      Zur Beantwortung der Frage müsstest Du uns erst noch etwas mehr über Deine Beziehung zum Server mitteilen...
      Ist es Deiner? Hast Du eine Konsole dafür?

      Oder bist Du bei einem Hoster untergebracht?

      Hallo, das ist der private Server eines Freundes.

      1. Hello,

        Ist es Deiner? Hast Du eine Konsole dafür?

        Oder bist Du bei einem Hoster untergebracht?

        Hallo, das ist der private Server eines Freundes.

        <wurmausdernasezieh>Also kannst Du darauf einrichten, was Du willst?
        es besteht also voller Zugriff auf alles?</wurmausdernasezieh>

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Hello,

          Ist es Deiner? Hast Du eine Konsole dafür?

          Oder bist Du bei einem Hoster untergebracht?

          Hallo, das ist der private Server eines Freundes.

          <wurmausdernasezieh>Also kannst Du darauf einrichten, was Du willst?
          es besteht also voller Zugriff auf alles?</wurmausdernasezieh>

          Hallo,
          ich kann so erstmal nix verändern, aber alles erforderliche an ihn weitergeben :)
          IST es ein Serverseitiges Einstellungsproblem?

          1. Hello,

            IST es ein Serverseitiges Einstellungsproblem?

            Das muss man eben herausfinden.
            Es macht nur keinen Spaß, wenn Du dann mittendrin sagst: "...alles schön und gut, aber ich kann da sowieso nix ändern ..."

            Besorg Dir mal die Einstellungen für PHP:

            phpinfo()    http://www.php.net/manual/en/function.phpinfo.php

            hilft dabei

            Und dann schaust Du als erstes nach

            - Läuft PHP als Modul oder als CGI
              - http://www.php.net/manual/en/features.safe-mode.php#ini.open-basedir
              - http://www.php.net/manual/en/features.safe-mode.php#ini.safe-mode
              - http://www.php.net/manual/en/features.safe-mode.php#ini.disable-functions

            das soll fürs erste genügen

            Die Ergebnisse für die globale und die lokale Einstellung postest Du dann.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

  2. hallo,

    <?php
    $handle = fopen ("/var/log/apache/access.log", "r");
    ?>

    Auch PHP kann normalerweise nicht auf _beliebige_ Verzeichnisse des Server-Rechners zugreifen. Es wäre eine enorme Sicherheitslücke,wenn das so einfach ginge. Alles, was _unterhalb_ der DocumentRoot des Apache liegt, ist natürlich zugänglich. Aber /var/log liegt weit _außerhalb_ (mal ganz abgesehen davon, daß die Protokolldatei "access_log" heißen dürfte und es sich offenbar um einen in Ehren ergrauten Apache 1.3.x handelt).

    Du kannst allerdings versuchen, mit einem SymLink zu arbeiten. Wenn die DocumentRoot /var/www/localhost/htdocs ist, könnte das mit
      cd /var/www/localhost/htdocs
      ln -s /var/log/apache/access_log access.log
    probiert werden. Dann liegt ein Symlink innerhalb der DocumentRoot, und Apache muß lediglich mit der Option "FollowSymLinks" instruiert werden, daß solche Symlinks benutzt werden dürfen.

    Eine weitere Möglichkeit besteht darin, die php.ini wunschgemäß zu bearbeiten.

    Besonders glücklich ist das allerdings nicht, und ob es funktioniert, ist fraglich und sowohl vom Rechnersystem (welches Linux ist da im Einsatz?) wie auch von der Apache-Version und der PHP-Version abhängig. Und du solltest eventuell erklären, was du denn aus dem Zugriffsprotokoll mit PHP auslesen möchtest und ob es nicht Alternativen außerhalb von PHP gibt.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hello,

      ln -s /var/log/apache/access_log access.log

      soweit ich weiß, folgen sowohl der Apache als auch PHP den symbolischen Links nur, wenn diese _nach_ _Auflösung_ zum Real-Pfad noch die passenden Rechte aufweisen.

      Wenn also ohne SymLink keine Rechte dür den Zugriff vorhanden sind, dürften demnach mit SymLink auch keine vorhanden sein.

      Wäre dies möglich, könnte sich jeder User jederzeit Rechte auf Alles verschaffen!

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

      1. hallo Tom,

        soweit ich weiß, folgen sowohl der Apache als auch PHP den symbolischen Links nur, wenn diese _nach_ _Auflösung_ zum Real-Pfad noch die passenden Rechte aufweisen.

        Jaein. Ein Symlink hat im Prinzip immer diejenigen Rechte, die für das Linkziel gelten. Es müßte also dafür gesorgt werden, daß /var/log/apache/access_log demselben user gehört, unter dessen Kennung der Apache läuft, oder daß zumindest
          rw-r--r--
        gesetzt ist.

        Wenn also ohne SymLink keine Rechte dür den Zugriff vorhanden sind, dürften demnach mit SymLink auch keine vorhanden sein.

        Richtig.

        Wäre dies möglich, könnte sich jeder User jederzeit Rechte auf Alles verschaffen!

        Und genau das ist hier ja beabsichtigt. Noch einmal: /var/log liegt weit außerhalb der DocumentRoot (und übrigens ebenso weit außerhalb der ServerRoot), die vermutlich irgendwo unterhalb von /var/www angesiedelt ist. - Man kann mir nun entgegenhalten, daß es ja diverse Programme (wie den guten alten Webalizer) gibt, die solche log-Auswertung machen können. Dazu muß man sich aber mal anschauen, wie webalizer arbeitet ...

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
        1. Hello,

          Und genau das ist hier ja beabsichtigt.

          Dazu muss man nur, sofern man das darf, das Verzeichnis für die Logs zur Domain in

          open_basedir     http://www.php.net/manual/en/features.safe-mode.php#ini.open-basedir

          eintragen

          Das hat natürlich nur Zweck, wenn PHP als Modul läuft.

          Das kann man feststellen mit

          http://www.php.net/manual/en/function.php-sapi-name.php

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

          1. hallo Tom,

            Dazu muss man nur, sofern man das darf, das Verzeichnis für die Logs zur Domain in
            open_basedir eintragen

            Ich habe ja schon als "Alternative" benannt, daß die php.ini entsprechend eingerichtet werden könnte. Aber das funktioniert alles nicht "grundsätzlich", sondern ist von Apache-Version, PHP-Version und noch ein paar anderen Sächelchen abhängig.

            Das hat natürlich nur Zweck, wenn PHP als Modul läuft.

            Das sollte sich auf einer Linux-Kiste von selbst verstehen.

            Grüße aus Berlin

            Christoph S.

            --
            Visitenkarte
            ss:| zu:) ls:& fo:) va:) sh:| rl:|
        2. echo $begrüßung;

          Jaein. Ein Symlink hat im Prinzip immer diejenigen Rechte, die für das Linkziel gelten. Es müßte also dafür gesorgt werden, daß /var/log/apache/access_log demselben user gehört, unter dessen Kennung der Apache läuft, oder daß zumindest
            rw-r--r--
          gesetzt ist.

          Wenn du der Datei weltweite Leserechte gibst, kann auch PHP prinzipiell darauf zugreifen, egal ob die Datei nun innherhalb oder außerhalb des Documentroot liegt. Eine Ausnahme wären künstliche von PHP zu verantwortende Einschränkungen, die ja grad Tom herauszufragen versucht.

          Ich halte es auch nicht für besonders sinnvoll, Symlinks ins Documentroot zu setzen, kann man doch so nun die Datei auch über HTTP einsehen. Es sei denn, man mach noch eine zusätzliche Verbotskonfiguration mittels Apache-Zugriffsschutz. Aber warum so kompliziert, wenn ein einfaches Lese-Recht reicht?

          echo "$verabschiedung $name";

    2. Moin!

      <?php
      $handle = fopen ("/var/log/apache/access.log", "r");
      ?>

      Auch PHP kann normalerweise nicht auf _beliebige_ Verzeichnisse des Server-Rechners zugreifen.

      Das ist komplett falsch. PHP kann normalerweise auf ALLE Dateien des Servers zugreifen. Nur mit Einrichtungen wie safe_mode und open_basedir wird durch PHP selbst eine Restriktion auferlegt, die aber absolut nicht zwingend gelten muß.

      Es wäre eine enorme Sicherheitslücke,wenn das so einfach ginge.

      Works as designed!

      Aber /var/log liegt weit _außerhalb_ (mal ganz abgesehen davon, daß die Protokolldatei "access_log" heißen dürfte und es sich offenbar um einen in Ehren ergrauten Apache 1.3.x handelt).

      Wie die Logdatei heißt, dürfte irrelevant sein für die Problematik. Ebenso ist die Apache-Version irrelevant.

      Relevant ist, ob die User-ID, mit der PHP zugreift, überhaupt das Recht hat, die Logdatei zu lesen.

      Du kannst allerdings versuchen, mit einem SymLink zu arbeiten. Wenn die DocumentRoot /var/www/localhost/htdocs ist, könnte das mit
        cd /var/www/localhost/htdocs
        ln -s /var/log/apache/access_log access.log
      probiert werden. Dann liegt ein Symlink innerhalb der DocumentRoot, und Apache muß lediglich mit der Option "FollowSymLinks" instruiert werden, daß solche Symlinks benutzt werden dürfen.

      Bullshit. Symbolische Links bringen in diesem Zusammenhang gar nichts. Die Apache-Option wirkt auf die Auslieferung von Ressourcen, man könnte also mit Symlinks Verzeichnisse irgendwo auf der Platte ins Document-Root einbinden. Oder auch PHP-Skripte.

      Aber beim Öffnen von Dateien durch PHP hat die FollowSymLinks-Option des Apachen keinerlei Auswirkung. Das ist wirklich nur eine reine Dateisystemoperation.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."