Defindit Docs and Howto Home

This page last modified: Apr 09 2005
title:Apache Explanation of (13)Permission denied: cannot read directory for multi:
keywords:apache,httpd,permissions,multiview,multi,view,error,apache 2,apache2
description:When permissions are NOT the problem, a common cause of the 13 error explained.

The error:

(13)Permission denied: cannot read directory for multi: /home/mst3k/public_html/

is caused my having the MultiViews enabled when public_html
permissions are 711.

Normally for security reasons your home directory and web accessible
directories will be permissions 711 (rwx--x--x). Execute on a directory
means that if you know a filename in that directory, you can read
it. However, you cannot get a listing of the directory. The x
(execute) permissions for directories have this special meaning. This
meaning is different from the meaning of x for files (where it means
the file is executable).

In order to get a listing of a directory, the permissions must be set
to r (read). For security reasons you *do not* want web accessible
directories to have read permissions. In other words, if someone
doesn't know the file they want, then they can't have a
listing. Listings of web accessible directories are a (minor) security
hazard. As a webmaster you *only* want people getting to web pages
that you have explicitly linked to.

However, the Apache MultiViews option makes a listing, and therefore
it needs r (read) permissions. MultiViews is only useful if you are
lazy and have web content but you do not want to create a home page.

I run scripts out of my public_html, and I've got some other stuff
going on. This is my Options line from my .htaccess file (the same
line works just as well in a <Directory> directive in your httpd.conf

Options +ExecCGI +FollowSymLinks -Indexes -MultiViews

Given the example case where you serve web pages from a public_html
directory in the user's home directory, here are the following
ownership and permissions for a mythical user "mst3k" on a machine
named "example".

[mst3k@example mst3k]$ ls -ld /home /home/mst3k
drwx--x--x  111 root     root           4096 Mar 11 18:56 /home
drwx--x--x   24 mst3k    mst3k          4096 Apr  9 10:19 /home/mst3k
drwx--x--x   32 mst3k    mst3k          8192 Apr  9 11:05 /home/mst3k/public_html
[mst3k@example mst3k]$

1) root owns /home and users are not allowed to get a listing of
   /home. This prevents users from listing all the home directories.
   This is a security feature. (see footnote A)

2) User home directory contentes cannot be listed. Known files and/or
   directories in the home directory can be read. This is required to
   allow access to public_html.  However, other users can guess file
   names in your home directory, which is a small security flaw. Any
   critical information should be in a subdirectory in your home
   directory, and that subdirectory should have permissions 700

3) The public_html also cannot be listed. However, like the home
   directory, known files in public_html are readable. Web pages have
   known file names (that's what is in a URL). 

Footnote A. On all the unix systems I know, anyone can read
/etc/passwd and see all the user ids. However, not all user ids have
home directories. Any time you hide information, you raise the level
of security.