“Link simbólico não permitido ou destino do link não acessível” / Apache no CentOS 6

30

Eu tenho uma nova instalação do CentOS 6, que possui um link simbólico na raiz do documento para meus arquivos de desenvolvimento:

[root@localhost html]# ls -l
total 4
-rwxrwxrwx. 1 root root  0 Sep 18 20:16 index.html
-rwxrwxrwx. 1 root root 17 Sep 18 20:16 index.php
lrwxrwxrwx. 1 root root 24 Sep 18 20:19 refresh-app -> /home/billy/refresh-app/

Meu httpd.conf tem isso:

<Directory "/">
    Options All
    AllowOverride None
    Order allow,deny
    Allow from all
</directory>

O destino do link simbólico tem permissões que devem permitir que o apache leia o que quiser:

 [root@localhost billy]# ls -l
total 40 (Some entries were omitted because the list was too long
drwxr-xr-x. 7 billy billy 4096 Sep 18 20:03 refresh-app

Eu também tentei desativar o SELinux alterando /etc/selinux/conf:

SELINUX=disabled

No entanto, não importa o que eu faça, quando alguém tenta acessar esse link, http://localhost/refresh-app/recebo uma página de erro 403 FORBIDDEN e isso está escrito em /var/log/httpd/error_log:

Symbolic link not allowed or link target not accessible

Por que o Apache não pode acessar o destino do link simbólico?

Billy ONeal
fonte
Qual usuário está executando o apache? Você pode realmente ler esse recurso como esse usuário?
draeath 19/09/11
Além disso, é melhor executar o selinux no modo permissivo e depois usar o sealert para analisar o log de auditoria - isso permite que você veja por que / como o SELinux o está negando e, muitas vezes, até fornece uma resolução.
draeath 19/09/11
@ Draeath: Eu não tenho idéia de como verificar isso.
Billy ONeal
@draeath: 1. Esta não é uma caixa de produção; Não me importo se o SELinux está desativado. 2. De qualquer forma, estou apenas solucionando problemas neste momento - provavelmente restaurarei quando descobrir a causa raiz.
Billy ONeal
Não se preocupe, isso é uma supervisão comum. Na primeira vez em que o fiz, fiquei preso por dias, serverfault.com/questions/313485/… :: É um desses erros. : D
whoami

Respostas:

44

Encontrei o problema. Acontece que, Apache quer acesso a não apenas o diretório estou servindo, /home/billy/refresh-app/mas também todos os diretórios acima disso, ou seja /home/billy/, /home, e /. (Não sei por que ... conceder acesso a um subdiretório a alguém não deve exigir permissões para tudo acima desse subdiretório ...)

Eu acho que ele está procurando .htaccessou algo assim, ou talvez * nix seja estranho sobre como trata as permissões para o diretório transversal.

Billy ONeal
fonte
15
Isso não é estranho. É assim que funciona. Você precisa ter + x para todo o caminho que está tentando acessar.
bahamat 24/09/11
4
@bahamat: Isso não faz nenhum sentido. Por que alguém precisaria executar privilégios para arquivos que não são executados? (Isso desconsidera completamente que não é necessário ceder direitos a /... quase sempre) Os sistemas com ACLs geralmente têm uma opção transversal de diretório separada. Você pensaria que, após 30 anos desde que o Unix foi projetado, e com ampla disponibilidade de sistemas ACL, essas ACLs seriam o padrão. : suspiro:
Billy ONeal
11
Eu acredito que ele quis dizer + x nos diretórios. Tente mudar para o usuário e fazer o cd-in para o diretório w / o + x. De memória + x permite-lhe o acesso, mas não vê o diretório enquanto + r permite arquivos de lista e + w permite alterar arquivos no referido diretório
11
@ BillyONeal: a frase "caminho inteiro" implica diretórios.
bahamat 26/09/11
5
Esse é o comportamento correto no unix. Você precisa executar privilégios (+ x para g ou o) nos diretórios principais que você está tentando transformar em subdiretórios abaixo deles.
slm
11

Eu tive um problema semelhante em que eu tinha a seguinte configuração que costumava funcionar com o Ubuntu 10, mas parou de funcionar com o Ubuntu 14 (Apache 2.4):

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +FollowSymLinks
</Directory>

Mudar para isso resolveu o problema (mesmo que o usuário do servidor da Web não tenha conseguido acessar diretamente o link simbólico)

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
</Directory>

Pelo que sei, é apenas a -SymLinksIfOwnerMatchconfiguração e tem algo a ver com as alterações no Apache 2.4, mas não tentei pesquisar a causa exata.

Eu também pensei que poderia ser devido a openbase_dirrestrições no PHP, mas não era isso.

icc97
fonte
6

Este erro também pode ser causado se você estiver vinculando a uma pasta criptografada.

cherrysoft
fonte
4

Parece que "FollowSymLinks" é a opção que você precisa no httpd.conf. É detalhado aqui . Parece que você também pode precisar de uma regra nos htdocs ... mas é a opção que você precisa.

RobotHumans
fonte
3
Ver Options All- FollowSymLinksjá está especificado.
Billy ONeal
2

Você também pode verificar se o selinux é aplicado ou não. No RedHat / Fedora, execute o seguinte:

getenforce

Se a resposta for 'Executando', convém executar

setenforce 0

e tente o URL novamente no seu navegador.

Observe que não estou dizendo que desabilitar o selinux é a melhor maneira de resolver esse problema, mas pode ajudar a identificar a causa.

botkop
fonte
isso corrigiu o problema do link simbólico, mas existem efeitos negativos?
Digz6666 #
2
Options +FollowSymLinks

Criar um arquivo .htaccess com isso fez o truque para mim (coloque-o em um diretório antes do link simbólico).

Codebeat
fonte
No meu caso, eu estava fazendo /var/wwwum link simbólico para outro link simbólico intermediário. Se você precisar usar links simbólicos, faça dele um link simbólico DIRETAMENTE para o seu destino.
Sridhar Sarnobat 27/06
0

que o que resolve meu problema depois de permitir toda a permissão e permitir o followymlink "No caso do FollowSymLinks especificamente, DEVE estar dentro de uma estrutura de diretórios quando estiver dentro de um arquivo .conf. No manual atual do Apache

As opções FollowSymLinks e SymLinksIfOwnerMatch funcionam apenas em seções ou arquivos .htaccess.

responda daqui

yoni333
fonte
0

Minha solução foi criar uma pasta compartilhada para todos os repositórios nomeados /home/repo.

Em seguida, faça o link simbólico da minha própria casa como: ln -s /home/repo ~/Code so ~/Code/www.xxxx.com/public aponta para /home/repo/www.xxxx.com/public

e também um link para os /var/www/html pontos raiz da web do apache para /home/repo/www.xxxx.com/public

Encontre-o aqui: https://github.com/alghanmi/ubuntu-desktop_setup/wiki/Git-Local-Repository-Setup-Guide

Com algumas acrobacias de symlink + groups, você pode ter vários usuários / versões implantados.

também Malbarez
fonte
0

@Billey ONeil @Flion Eu não conseguia responder na linha (baixa contagem de repetições)
Aqui estava o que eu tinha que fazer:
( nota: aliás ll = 'ls $ LS_OPTIONS -lh')

root@Bellach:/var/www/html# ll lego
lrwxrwxrwx 1 root root 43 Sep 10 21:21 lego -> /home/DATA/Documents/Chris/Synced/web/lego/

Agora observe todos os diretórios no link de origem

root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/web/
drwxr-xr-x 9 chris chris 4.0K Sep 12  2017 /home/DATA/Documents/Chris/Synced/web/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/
drwxr-xr-x 20 chris chris 4.0K Mar 27 18:52 /home/DATA/Documents/Chris/Synced/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/
drwxr-xr-x 36 chris chris 4.0K Jun 17 23:31 /home/DATA/Documents/Chris/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/
drwxr-xr-x 21 chris chris 4.0K Aug  7 18:22 /home/DATA/Documents/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-- 10 root users 4.0K Sep 10 11:17 /home/DATA/
root@Bellach:/var/www/html# ll -d /home/
drwxr-xr-x 5 root root 4.0K Sep 10 10:37 /home/

O diretório / home / DATA é o culpado.
Corrija com isso:

root@Bellach:/var/www/html# chmod +x /home/DATA/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-x 10 root users 4.0K Sep 10 11:17 /home/DATA/

A correção é imediata - não há necessidade de reiniciar o apache.

ausinch
fonte
-1

Você também pode ajustar as configurações do SELinux e o setenforce pode não estar no seu caminho. Então tente o seguinte:

sudo /usr/sbin/setenforce 0

e fazer com que isso persista entre as reinicializações

sudo vi /etc/sysconfig/selinux
Rami Jaamour
fonte