mit PHP apache log-file auslesen?
karlo
- php
0 Tom0 Christoph Schnauß0 Tom0 Christoph Schnauß
0 Sven Rautenberg
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
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 deniedWas 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
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 deniedWas 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.
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
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?
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
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.
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
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.
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
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.
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";
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