3

Я не могу заставить Apache переходить по символическим ссылкам за пределы корневого веб-каталога, даже если разрешения выглядят нормально, а FollowSymLinks включен. Подробности ниже.

У меня есть два текстовых файла для чтения: /tmp/hello и /var/www/html/hello . Также в webroot у меня есть символические ссылки на оба этих файла. Оба кажутся в порядке.

$ ll /tmp
drwxrwxrwt. 27 root   root       4096 Jul  8 13:55 ./
dr-xr-xr-x. 23 root   root       4096 Jul  4 23:24 ../
-rw-r--r--.  1 root   root          6 Jul  8 13:55 hello

$ ll /var/www/html
drwxr-xr-x. 3 root   root   4096 Jul  8 13:56 ./
drwxr-xr-x. 6 root   root   4096 Apr  4 12:57 ../
-rw-r--r--. 1 root   root     20 Jul  8 14:03 hello
lrwxrwxrwx. 1 root   root      5 Jul  8 14:04 link-local -> /var/www/html/hello
lrwxrwxrwx. 1 root   root     10 Jul  8 13:56 link-tmp -> /tmp/hello

$ cat /var/www/html/link-local 
/VAR/WWW/HTML/HELLO

$ cat /var/www/html/link-tmp 
/TMP/HELLO

Apache может перейти по ссылке в корневой каталог:

$ curl http://localhost/link-local
/VAR/WWW/HTML/HELLO

Но Apache не пойдет по символической ссылке на /tmp/:

$ curl http://localhost/link-tmp
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /hellolink on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at localhost Port 80</address>
</body></html>

Это на CentOS 6; http запускается как пользователь apache, группа apache.

Почему это происходит? Как я могу это исправить?

2 ответа2

1

Вы устанавливаете FollowSymlinks в файле .htaccess? или в блоке <Directory> ?

Документация по параметрам Apache 2.2 предполагает, что FollowSymlinks будет работать только в этих контекстах - не могли бы вы опубликовать соответствующий конфиг?

(публикация в качестве ответа из-за недостаточного количества комментариев)

1

Да, похоже, что SELinux является виновником:

Ключ -Z будет работать с большинством утилит для отображения контекста безопасности SELinux (например, 'ls -Z', 'ps axZ' и т.д.).

$ ll -Z /var/www/html/hello
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/hello

$ ll -Z /tmp/hello
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/hello

Два целевых файла имеют разные типы (httpd_sys_content_t vs user_tmp_t), что объясняет разницу в доступности.

Страница SELinux на centos.org объясняет ключ -Z и многое, многое другое.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .