Search code examples
phppermissionsreadfile

PHP - readfile() failed to open stream: Permission denied - but why?


I have Ubuntu 16.04 with Apache2 and php7 on it. I wan't to read some log files with php and print them. Therefore I do a simple

readfile("/var/log/apache2/access.log");

But that does not work. I get this error:

Warning: readfile(/var/log/apache2/access.log): failed to open stream: Permission denied in /var/www/test.php on line 2

I'm quite sure I've set the permissions right, Apache and php runs as www-data, so I added the user www-data to the groups 'adm' and 'syslog', as these groups have read permissions for the whole file path and the file itself. Permissions are 640 by default, but only if I set it to 647 for example, the file is readable for php/apache.Even 644 or 646 is not enough.

Why is that? Do I have to change something in the Apache vhost config?

Addition: ls -alp /var/log/apache2

drw-r----- 2 root adm     4096 Oct 25 11:07 ./
drwxr-xr-x 9 root syslog  4096 Oct 25 10:39 ../
-rw-r----- 1 root adm    47861 Oct 25 14:01 access.log
-rw-r----- 1 root adm    12014 Oct 25 14:01 error.log
-rw-r----- 1 root adm        0 Oct 25 10:40 other_vhosts_access.log

Solution

  • Since this is clearly a permissions error, ensure each parent folder leading to access.log definitely have the group set to either adm or syslog.

    Each folder leading up to access.log must have at least a group permission of read and execute (g+rx) to allow PHP to descend into each sub-directory.


    If I were you, I would change the apache config to write the file to a publicly inaccessible folder in your web root (since the log file is clearly essential in your application). This saves you from modifying system folder permissions which can be dangerous especially in web applications.